Exemplo n.º 1
0
 /**
  * Constructs an options dropdown menu for a discussion.
  *
  * @param object|array|null $discussion The discussion to get the dropdown options for.
  * @return DropdownModule A dropdown consisting of discussion options.
  * @throws Exception
  */
 function getDiscussionOptionsDropdown($discussion = null)
 {
     $dropdown = new DropdownModule();
     $sender = Gdn::controller();
     $session = Gdn::session();
     if ($discussion == null) {
         $discussion = $sender->data('Discussion');
     }
     $categoryID = val('CategoryID', $discussion);
     if (!$categoryID && property_exists($sender, 'Discussion')) {
         trace('Getting category ID from controller Discussion property.');
         $categoryID = val('CategoryID', $sender->Discussion);
     }
     $discussionID = $discussion->DiscussionID;
     $categoryUrl = urlencode(categoryUrl(CategoryModel::categories($categoryID)));
     $permissionCategoryID = val('PermissionCategoryID', $discussion, val('PermissionCategoryID', $discussion));
     // Permissions
     $canEdit = DiscussionModel::canEdit($discussion, $timeLeft);
     $canAnnounce = $session->checkPermission('Vanilla.Discussions.Announce', true, 'Category', $permissionCategoryID);
     $canSink = $session->checkPermission('Vanilla.Discussions.Sink', true, 'Category', $permissionCategoryID);
     $canClose = $session->checkPermission('Vanilla.Discussions.Close', true, 'Category', $permissionCategoryID);
     $canDelete = $session->checkPermission('Vanilla.Discussions.Delete', true, 'Category', $permissionCategoryID);
     $canMove = $canEdit && $session->checkPermission('Garden.Moderation.Manage');
     $canRefetch = $canEdit && valr('Attributes.ForeignUrl', $discussion);
     $canDismiss = c('Vanilla.Discussions.Dismiss', 1) && $discussion->Announce == '1' && $discussion->Dismissed != '1' && $session->isValid();
     if ($canEdit && $timeLeft) {
         $timeLeft = ' (' . Gdn_Format::seconds($timeLeft) . ')';
     }
     $dropdown->addLinkIf($canDismiss, t('Dismiss'), "vanilla/discussion/dismissannouncement?discussionid={$discussionID}", 'dismiss', 'DismissAnnouncement Hijack')->addLinkIf($canEdit, t('Edit') . $timeLeft, '/post/editdiscussion/' . $discussionID, 'edit')->addLinkIf($canAnnounce, t('Announce'), '/discussion/announce?discussionid=' . $discussionID, 'announce', 'AnnounceDiscussion Popup')->addLinkIf($canSink, t($discussion->Sink ? 'Unsink' : 'Sink'), '/discussion/sink?discussionid=' . $discussionID . '&sink=' . (int) (!$discussion->Sink), 'sink', 'SinkDiscussion Hijack')->addLinkIf($canClose, t($discussion->Closed ? 'Reopen' : 'Close'), '/discussion/close?discussionid=' . $discussionID . '&close=' . (int) (!$discussion->Closed), 'close', 'CloseDiscussion Hijack')->addLinkIf($canRefetch, t('Refetch Page'), '/discussion/refetchpageinfo.json?discussionid=' . $discussionID, 'refetch', 'RefetchPage Hijack')->addLinkIf($canMove, t('Move'), '/moderation/confirmdiscussionmoves?discussionid=' . $discussionID, 'move', 'MoveDiscussion Popup')->addLinkIf($canDelete, t('Delete Discussion'), '/discussion/delete?discussionid=' . $discussionID . '&target=' . $categoryUrl, 'delete', 'DeleteDiscussion Popup');
     // DEPRECATED
     $options = [];
     $sender->EventArguments['DiscussionOptions'] =& $options;
     $sender->EventArguments['Discussion'] = $discussion;
     $sender->fireEvent('DiscussionOptions');
     // Backwards compatability
     $dropdown = discussionOptionsToDropdown($options, $dropdown);
     // Allow plugins to edit the dropdown.
     $sender->EventArguments['DiscussionOptionsDropdown'] =& $dropdown;
     $sender->EventArguments['Discussion'] = $discussion;
     $sender->fireEvent('DiscussionOptionsDropdown');
     return $dropdown;
 }