/ */ class Comment_View_Helper_Comments extends Zend_View_Helper_Abstract { /** * Render comments for the given path and show a comment form. * Options can influence whether or not comments are displayed * and whether or not the comment form appears. * * @param string $path the path to the set of comments to display * @param array $options optional - options to control: * allowComments - if new comments can be posted * requireLoginPost - if login required to post comments * requireApproval - if comments are to be pended first * showComments - if existing comments are shown * requireLoginView - if login required to view comments * allowVoting - enable up/down voting of comments * oneVotePerUser - limit users to one vote per comment * (and no anonymous voting) * * @param string $template optional - name of template file to render to. * @return string the rendered comments and comment form. */ public function comments($path, array $options = null, $template = 'comments.phtml') { // normalize options against default values. $options = Comment_Form_Content::getNormalizedOptions($options); // if we're not showing or allowing comments, nothing to do. if (!$options['allowComments'] && !$options['showComments']) { return; } // determine if we have an anonymous user // so that we can enforce require-login options. $anonymous = P4Cms_User::hasActive() ? P4Cms_User::fetchActive()->isAnonymous() : true; // determine if we should show comments. $showComments = $options['showComments']; if ($options['requireLoginView'] && $anonymous) { $showComments = false; } // determine if we should allow new comments. $allowComments = $options['allowComments']; if ($options['requireLoginPost'] && $anonymous) { $allowComments = false; } // determine if we should show/allow votes on comments. // if one vote per user, disallow anonymous voting. $showVotes = $options['allowVoting']; $allowVoting = $options['allowVoting']; $oneVotePerUser = $options['oneVotePerUser']; $votedCommentIds = array(); // if there is only one vote allowed per user, and we have // an authenticated user, build a list of all the comments // the user voted on -- if the user is anonymous, no voting. if ($oneVotePerUser && !$anonymous) { $votedComments = Comment_Model_Comment::fetchVotedComments( P4Cms_User::fetchActive()->getId(), $path ); $votedCommentIds = $votedComments->invoke('getId'); } else if ($oneVotePerUser) { $allowVoting = false; } // if we're showing comments, fetch them. $comments = null; if ($showComments) { $filter = new P4Cms_Record_Filter; $filter->add('status', Comment_Model_Comment::STATUS_APPROVED); $comments = Comment_Model_Comment::fetchAll( array( 'paths' => array($path . '/...'), 'filter' => $filter ) ); // comments with most votes first, post-time is the tie-breaker. $numeric = P4Cms_Model_Iterator::SORT_NUMERIC; $descending = P4Cms_Model_Iterator::SORT_DESCENDING; $ascending = P4Cms_Model_Iterator::SORT_ASCENDING; $comments->sortBy( array( 'votes' => array($numeric, $descending), 'postTime' => array($numeric, $ascending) ) ); } // render comments via template in private scope // to avoid polluting the primary view object. $view = $this->view; $view->addScriptPath(dirname(__DIR__) . '/scripts'); return $view->partial( $template, array( 'path' => $path, 'comments' => $comments, 'showComments' => $showComments, 'allowComments' => $allowComments, 'showVotes' => $showVotes, 'allowVoting' => $allowVoting, 'oneVotePerUser' => $oneVotePerUser, 'votedCommentIds' => $votedCommentIds ) ); } }