Name == 'OnItemBuild' ) { return true; } if ( $event->Name == 'OnGetInfo' || $event->Name == 'OnDiscard' ) { return $this->Application->isAdminUser; } /** @var kPermissionsHelper $perm_helper */ $perm_helper = $this->Application->recallObject('PermissionsHelper'); if ( $event->Name == 'OnSave' ) { $perm_status = $this->Application->CheckPermission('CATEGORY.REVISION.ADD', 0) || $this->Application->CheckPermission('CATEGORY.REVISION.ADD.PENDING', 0); return $perm_helper->finalizePermissionCheck($event, $perm_status); } if ( $event->Name == 'OnPublish' || $event->Name == 'OnDecline' ) { $perm_status = $this->Application->CheckPermission('CATEGORY.REVISION.MODERATE', 0); return $perm_helper->finalizePermissionCheck($event, $perm_status); } return parent::CheckPermission($event); } /** * Lists all current page revisions * * @param kEvent $event * @return void * @access protected */ protected function SetCustomQuery(kEvent $event) { parent::SetCustomQuery($event); /** @var kDBList $object */ $object = $event->getObject(); $page_id = $event->getEventParam('page_id'); if ( $this->Application->isAdmin ) { $user_id = $this->Application->RecallVar('user_id'); } else { $user_id = $this->Application->RecallVar('admin_user_id'); } $object->addFilter('draft_filter', 'IF(%1$s.IsDraft = 1, %1$s.CreatedById = ' . $user_id . ', TRUE)'); if ( $page_id !== false ) { $object->addFilter('parent_filter', '%1$s.PageId = ' . $page_id); } } /** * Returns current page revision * * @param kEvent $event * @return int * @access public */ public function getPassedID(kEvent $event) { if ( $event->Special == 'current' ) { /** @var kDBItem $page */ $page = $this->Application->recallObject('st.-virtual'); /** @var PageHelper $page_helper */ $page_helper = $this->Application->recallObject('PageHelper'); $page_id = $page->GetID(); $revision_clause = $page_helper->getRevsionWhereClause($page_id, $page->GetDBField('LiveRevisionNumber')); $sql = 'SELECT RevisionId FROM ' . TABLE_PREFIX . 'PageRevisions WHERE (PageId = ' . $page_id . ') AND (' . $revision_clause . ') ORDER BY IsDraft DESC, RevisionNumber DESC'; $id = $this->Conn->GetOne($sql); if ( $id ) { return $id; } // no revisions -> create live revision /** @var kDBItem $object */ $object = $event->getObject(); $object->SetDBField('PageId', $page_id); $object->SetDBField('RevisionNumber', 1); $object->SetDBField('Status', STATUS_ACTIVE); $object->Create(); return $object->GetID(); } return parent::getPassedID($event); } /** * Remembers, who created revision * * @param kEvent $event * @return void * @access protected */ protected function OnBeforeItemCreate(kEvent $event) { parent::OnBeforeItemCreate($event); /** @var kDBItem $object */ $object = $event->getObject(); if ( $this->Application->isAdmin ) { $object->SetDBField('CreatedById', $this->Application->RecallVar('user_id')); } else { $object->SetDBField('CreatedById', $this->Application->RecallVar('admin_user_id')); } } /** * Updates revision creation time * * @param kEvent $event * @return void * @access protected */ protected function OnBeforeItemUpdate(kEvent $event) { parent::OnBeforeItemUpdate($event); /** @var kDBItem $object */ $object = $event->getObject(); if ( $object->GetDBField('IsDraft') == 0 && $object->GetOriginalField('IsDraft') == 1 ) { $object->SetDBField('CreatedOn_date', adodb_mktime()); $object->SetDBField('CreatedOn_time', adodb_mktime()); } } /** * Creates new content blocks based on source revision * * @param kEvent $event * @return void * @access protected */ protected function OnAfterItemCreate(kEvent $event) { parent::OnAfterItemCreate($event); /** @var kDBItem $object */ $object = $event->getObject(); if ( !$object->GetDBField('FromRevisionId') ) { return ; } /** @var kDBItem $content */ $content = $this->Application->recallObject('content.-item', null, Array ('skip_autoload' => true)); $sql = $content->GetSelectSQL() . ' WHERE pr.RevisionId = ' . $object->GetDBField('FromRevisionId'); $content_blocks = $this->Conn->Query($sql); foreach ($content_blocks as $content_block) { $content->LoadFromHash($content_block); $content->SetDBField('RevisionId', $object->GetID()); $content->Create(); } } /** * Mark revision as current, once it's approved * * @param kEvent $event * @return void * @access protected */ protected function OnAfterItemUpdate(kEvent $event) { parent::OnAfterItemUpdate($event); /** @var kDBItem $object */ $object = $event->getObject(); $status = $object->GetDBField('Status'); if ( $status != $object->GetOriginalField('Status') && $status == STATUS_ACTIVE ) { /** @var kDBItem $page */ $page = $this->Application->recallObject('c.revision', null, Array ('skip_autoload' => true)); $page->Load($object->GetDBField('PageId')); $page->SetDBField('LiveRevisionNumber', $object->GetDBField('RevisionNumber')); $page->Update(); } } /** * Returns user, who are editing current page right now * * @param kEvent $event */ function OnGetInfo($event) { $event->status = kEvent::erSTOP; if ( $this->Application->GetVar('ajax') != 'yes' ) { return ; } /** @var PageHelper $page_helper */ $page_helper = $this->Application->recallObject('PageHelper'); $page_id = $this->Application->GetVar('m_cat_id'); echo json_encode( $page_helper->getPageInfo($page_id) ); } /** * Saves user draft into live revision * * @param kEvent $event * @return void * @access protected */ protected function OnSave(kEvent $event) { $revision_id = $this->getCurrentDraftRevision($event); if ( $revision_id ) { /** @var kDBItem $object */ $object = $event->getObject(Array ('skip_autoload' => true)); $object->Load($revision_id); $object->SetDBField('IsDraft', 0); $object->SetDBField('RevisionNumber', $this->getNextAvailableRevision($event)); if ( $this->Application->CheckPermission('CATEGORY.REVISION.ADD', 0) ) { $object->SetDBField('Status', STATUS_ACTIVE); } elseif ( $this->Application->CheckPermission('CATEGORY.REVISION.ADD.PENDING', 0) ) { $object->SetDBField('Status', STATUS_PENDING); } $object->Update(); } $event->SetRedirectParam('opener', 'u'); } /** * Discards user draft * * @param kEvent $event */ function OnDiscard($event) { $revision_id = $this->getCurrentDraftRevision($event); if ( $revision_id ) { /** @var kTempTablesHandler $temp_handler */ $temp_handler = $this->Application->recallObject($event->getPrefixSpecial() . '_TempHandler', 'kTempTablesHandler'); $temp_handler->DeleteItems($event->Prefix, $event->Special, Array ($revision_id)); } $event->SetRedirectParam('opener', 'u'); } /** * Makes revision live * * @param kEvent $event */ function OnPublish($event) { /** @var kDBItem $revision */ $revision = $this->Application->recallObject('page-revision.current'); if ( !$revision->isLoaded() || $revision->GetDBField('Status') == STATUS_ACTIVE || $revision->GetDBField('IsDraft') ) { return ; } $revision->SetDBField('Status', STATUS_ACTIVE); $revision->Update(); $event->SetRedirectParam('opener', 'u'); } /** * Denies changes made in revision * * @param kEvent $event */ function OnDecline($event) { /** @var kDBItem $revision */ $revision = $this->Application->recallObject('page-revision.current'); if ( !$revision->isLoaded() || $revision->GetDBField('Status') == STATUS_DISABLED || $revision->GetDBField('IsLive') || $revision->GetDBField('IsDraft') ) { return ; } $revision->SetDBField('Status', STATUS_DISABLED); $revision->Update(); $event->SetRedirectParam('opener', 'u'); } /** * Returns revision id of user's draft * * @param kEvent $event * @return int */ function getCurrentDraftRevision($event) { $where_clause = Array ( 'IsDraft = 1', 'PageId = ' . $this->Application->GetVar('m_cat_id'), 'CreatedById = ' . $this->Application->RecallVar('user_id'), ); $sql = 'SELECT ' . $this->Application->getUnitOption($event->Prefix, 'IDField') . ' FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName') . ' WHERE (' . implode(') AND (', $where_clause) . ')'; return $this->Conn->GetOne($sql); } /** * Returns next available revision number for current page * * @param kEvent $event * @return int */ function getNextAvailableRevision($event) { $sql = 'SELECT MAX(RevisionNumber) FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName') . ' WHERE PageId = ' . $this->Application->GetVar('m_cat_id'); $max_revision = (int)$this->Conn->GetOne($sql); return $max_revision + 1; } /** * Updates searchable page content * * @param kEvent $event Event. * * @return void */ protected function OnAfterPageContentChangedHook(kEvent $event) { /** @var kDBItem $content */ $content = $event->MasterEvent->getObject(); /** @var kDBItem $object */ $object = $event->getObject(array('skip_autoload' => true)); $revision_id = $content->GetDBField('RevisionId'); $object->Load($revision_id); /** @var PageHelper $page_helper */ $page_helper = $this->Application->recallObject('PageHelper'); $object->SetDBFieldsFromHash($page_helper->getRevisionContent($revision_id)); $object->Update(); } }