Index: branches/5.3.x/core/units/helpers/page_helper.php =================================================================== diff -u -N -r15928 -r15946 --- branches/5.3.x/core/units/helpers/page_helper.php (.../page_helper.php) (revision 15928) +++ branches/5.3.x/core/units/helpers/page_helper.php (.../page_helper.php) (revision 15946) @@ -1,6 +1,6 @@ getHistoryPermissionAndUser($page_id); - $where_clause = Array ( + $users = $this->getEditors($page_id, $user_id); + + return array( + 'current_revision' => $this->getCurrentRevisionInfo(), + 'editors' => $users, + 'editors_warning' => $this->getEditorsWarning($users), + 'revisions' => $history_permission ? $this->getPageRevisions($page_id) : array(), + ); + } + + /** + * Returns current admin user id (even, when called from front-end) and it's revision history view permission + * + * @param int $page_id + * @return Array + */ + protected function getHistoryPermissionAndUser($page_id) + { + $perm_helper = $this->Application->recallObject('PermissionsHelper'); + /* @var $perm_helper kPermissionsHelper */ + + $user_id = (int)$this->Application->RecallVar($this->Application->isAdmin ? 'user_id' : 'admin_user_id'); + $history_permission = $perm_helper->CheckUserPermission($user_id, 'CATEGORY.REVISION.HISTORY.VIEW', 0, $page_id); + + return Array ($user_id, $history_permission); + } + + /** + * Returns information about given page editors. + * + * @param integer $page_id Page, that is being edited. + * @param integer $user_id User, who is editing a page. + * + * @return array + */ + protected function getEditors($page_id, $user_id) + { + $where_clause = array( 'pr.PageId = ' . $page_id, 'pr.CreatedById <> ' . $user_id, 'pr.IsDraft = 1', @@ -36,85 +73,226 @@ FROM ' . $this->Application->getUnitConfig('page-revision')->getTableName() . ' pr LEFT JOIN ' . TABLE_PREFIX . 'Users u ON u.PortalUserId = pr.CreatedById WHERE (' . implode(') AND (', $where_clause) . ')'; - $users = $this->Conn->GetCol($sql); - $page_revisions = Array (); + return $this->Conn->GetCol($sql); + } - if ( $history_permission ) { - $tag_params = Array ('per_page' => -1, 'skip_parent_filter' => 1, 'requery' => 1, 'page_id' => $page_id); + /** + * Returns information about current revision. + * + * @return array + */ + protected function getCurrentRevisionInfo() + { + $revision = $this->Application->recallObject('page-revision.current'); + /* @var $revision kDBItem */ - $revisions = $this->Application->recallObject('page-revision.list', 'page-revision_List', $tag_params); - /* @var $revisions kDBList */ + $status_label = $this->getRevisionStatusText($revision); - $revisions->Query(); - $revisions->GoFirst(); + $draft = $revision->GetDBField('IsDraft'); + $title = $this->getAdminPhrase($draft ? 'la_title_EditingDraft' : 'la_title_ViewingRevision'); - $status_options = $revisions->GetFieldOptions('Status'); - $draft_label = $this->Application->Phrase('la_Draft', false, true); - $title_label = $this->Application->Phrase('la_RevisionNumber', false, true); - $by_label = $this->Application->Phrase('la_By', false, true); + $current_revision_info = array( + 'title' => sprintf($title, $revision->GetDBField('RevisionNumber'), $status_label), + 'status' => $revision->GetDBField('Status'), + 'saved' => '', + 'toolbar_state' => $this->getToolbarButtonsState($revision), + ); - while ( !$revisions->EOL() ) { - $status = $revisions->GetDBField('Status'); - $status_label = $this->Application->Phrase($status_options['options'][$status], false, true); + $auto_save_time = $revision->GetDBField('AutoSavedOn'); - $page_revisions[ 'r' . $revisions->GetDBField('RevisionNumber') ] = Array ( - 'title' => $revisions->GetDBField('IsDraft') ? $draft_label : sprintf($title_label, $revisions->GetDBField('RevisionNumber')), - 'status' => $status, - 'status_label' => mb_strtolower($status_label), - 'datetime' => $revisions->GetField('CreatedOn'), - 'author' => $by_label . ': ' . $revisions->GetField('CreatedById'), - 'draft' => (int)$revisions->GetDBField('IsDraft'), - ); + if ( $auto_save_time ) { + $phrase = $this->getAdminPhrase($draft ? 'la_DraftSavedAt' : 'la_SavedAt'); + $current_revision_info['saved'] = sprintf($phrase, $revision->GetField('AutoSavedOn_time') . ' (' . $this->getAgoTime($auto_save_time) . ')'); + } - $revisions->GoNext(); - } + return $current_revision_info; + } + + /** + * Returns state of all CMS revision toolbar buttons. + * + * @param kDBItem $revision Page Revision. + * + * @return array + */ + public function getToolbarButtonsState(kDBItem $revision) + { + $ret = array(); + + foreach ( $this->getToolbarButtons() as $toolbar_button ) { + $ret[$toolbar_button] = $this->isToolbarButtonEnabled($toolbar_button, $revision); } - $current_revision = $this->Application->recallObject('page-revision.current'); - /* @var $current_revision kDBItem */ + return $ret; + } - $revision_status = $current_revision->GetDBField('Status'); - $status_options = $current_revision->GetFieldOptions('Status'); - $status_label = $this->Application->Phrase($status_options['options'][$revision_status], false, true); + /** + * Returns list of CMS revision toolbar buttons. + * + * @return array + */ + protected function getToolbarButtons() + { + return array('select', 'delete', 'approve', 'decline', 'preview', 'history'); + } - $revision_phase = $current_revision->GetDBField('IsDraft') ? 'la_title_EditingDraft' : 'la_title_ViewingRevision'; - $revision_title = sprintf($this->Application->Phrase($revision_phase, false, true), $current_revision->GetDBField('RevisionNumber'), mb_strtolower($status_label)); - $current_revision_info = Array ('title' => $revision_title, 'status' => $revision_status, 'saved' => ''); + /** + * Checks if given CMS revision toolbar button is enabled for given revision. + * + * @param string $button_name Toolbar button name. + * @param kDBItem $revision Revision to check against. + * + * @return boolean + */ + protected function isToolbarButtonEnabled($button_name, kDBItem $revision) + { + $is_draft = $revision->GetDBField('IsDraft'); - $autosave_time = $current_revision->GetDBField('AutoSavedOn'); + if ( $button_name == 'select' || $button_name == 'delete' || $button_name == 'preview' ) { + return (bool)$is_draft; + } - if ( $autosave_time ) { - $phrase = $this->Application->Phrase($current_revision->GetDBField('IsDraft') ? 'la_DraftSavedAt' : 'la_SavedAt', false, true); - $current_revision_info['saved'] = sprintf($phrase, $current_revision->GetField('AutoSavedOn_time') . ' (' . $this->getAgoTime($autosave_time) . ')'); + if ( $button_name == 'approve' ) { + return $revision->GetDBField('Status') != STATUS_ACTIVE && !$is_draft; } + if ( $button_name == 'decline' ) { + return $revision->GetDBField('Status') != STATUS_DISABLED && !$revision->GetDBField('IsLive') && !$is_draft; + } + + return true; + } + + /** + * Returns warning to be shown in case of parallel editing attempts. + * + * @param array $users Users, that are editing a page. + * + * @return string + */ + protected function getEditorsWarning(array $users) + { $ml_helper = $this->Application->recallObject('kMultiLanguageHelper'); /* @var $ml_helper kMultiLanguageHelper */ - $currently_editing = $ml_helper->getPluralPhrase( + $ret = $ml_helper->getPluralPhrase( count($users), - Array ( + array( 'phrase1' => 'la_PageCurrentlyEditing1', 'phrase2' => 'la_PageCurrentlyEditing2', 'phrase5' => 'la_PageCurrentlyEditing5', ), false, true ); - $currently_editing = sprintf($currently_editing, implode(', ', $users)); + return sprintf($ret, implode(', ', $users)); + } - return Array ('current_revision' => $current_revision_info, 'editors' => $users, 'editors_warning' => $currently_editing, 'revisions' => $page_revisions); + /** + * Returns information about given page revisions. + * + * @param integer $page_id Page, that is being edited. + * + * @return array + */ + protected function getPageRevisions($page_id) + { + $ret = Array (); + + $tag_params = Array ('per_page' => -1, 'skip_parent_filter' => 1, 'requery' => 1, 'page_id' => $page_id); + + $revisions = $this->Application->recallObject('page-revision.list', 'page-revision_List', $tag_params); + /* @var $revisions kDBList */ + + $revisions->Query(); + $revisions->GoFirst(); + + while ( !$revisions->EOL() ) { + $ret[ 'r' . $revisions->GetDBField('RevisionNumber') ] = array( + 'title' => $this->getRevisionTitle($revisions), + 'status' => $revisions->GetDBField('Status'), + 'status_label' => $this->getRevisionStatusText($revisions), + 'datetime' => $revisions->GetField('CreatedOn'), + 'author' => $this->getRevisionAuthor($revisions), + 'draft' => (int)$revisions->GetDBField('IsDraft'), + ); + + $revisions->GoNext(); + } + + return $ret; } /** + * Returns title for given revision. + * + * @param kDBBase $revision Page Revision. + * + * @return string + */ + protected function getRevisionTitle(kDBBase $revision) + { + if ( $revision->GetDBField('IsDraft') ) { + return $this->getAdminPhrase('la_Draft'); + } + + $title = $this->getAdminPhrase('la_RevisionNumber'); + + return sprintf($title, $revision->GetDBField('RevisionNumber')); + } + + /** + * Returns status text for given revision. + * + * @param kDBBase $revision Page Revision. + * + * @return string + */ + protected function getRevisionStatusText(kDBBase $revision) + { + $status = $revision->GetDBField('Status'); + $options = $revision->GetFieldOptions('Status'); + + return mb_strtolower($this->getAdminPhrase($options['options'][$status])); + } + + /** + * Returns author of given revision. + * + * @param kDBBase $revision Page Revision. + * + * @return string + */ + protected function getRevisionAuthor(kDBBase $revision) + { + $by_label = $this->getAdminPhrase('la_By'); + + return $by_label . ': ' . $revision->GetField('CreatedById'); + } + + /** + * Returns Admin's non-editable translation of given phrase. + * + * @param string $label Phrase label. + * + * @return string + */ + protected function getAdminPhrase($label) + { + return $this->Application->Phrase($label, false, true); + } + + /** * Returns time passed between 2 given dates in "X minutes Y seconds ago" format * * @param int $from_date * @param int $to_date + * @param integer $max_levels + * * @return string */ - function getAgoTime($from_date, $to_date = null, $max_levels = 1) + public function getAgoTime($from_date, $to_date = null, $max_levels = 1) { $blocks = Array ( Array ('name' => 'year', 'amount' => 60*60*24*365), @@ -165,7 +343,7 @@ * @param string $table_name * @return string */ - function getRevsionWhereClause($page_id, $live_revision_number, $table_name = '') + public function getRevsionWhereClause($page_id, $live_revision_number, $table_name = '') { $revision = (int)$this->Application->GetVar('revision'); list ($user_id, $has_permission) = $this->getHistoryPermissionAndUser($page_id); @@ -186,26 +364,12 @@ } /** - * Returns current admin user id (even, when called from front-end) and it's revision history view permission - * - * @param int $page_id - * @return Array - */ - function getHistoryPermissionAndUser($page_id) - { - $user_id = (int)$this->Application->RecallVar($this->Application->isAdmin ? 'user_id' : 'admin_user_id'); - $history_permission = $this->Application->CheckAdminPermission('CATEGORY.REVISION.HISTORY.VIEW', 0, $page_id); - - return Array ($user_id, $history_permission); - } - - /** * Creates new content block in every revision that misses it. Plus creates first page revision * * @param int $page_id * @param int $num */ - function createNewContentBlock($page_id, $num) + public function createNewContentBlock($page_id, $num) { $sql = 'SELECT pc.PageContentId, pr.RevisionId FROM ' . TABLE_PREFIX . 'PageRevisions pr @@ -251,7 +415,7 @@ * * @return bool */ - function loadContentBlock(&$content_block, &$page, $num) + public function loadContentBlock(&$content_block, &$page, $num) { $page_id = $page->GetID();