/** * Allows user to bookmark or unbookmark a discussion. * * If the discussion isn't bookmarked by the user, this bookmarks it. * If it is already bookmarked, this unbookmarks it. * * @since 2.0.0 * @access public * * @param int $DiscussionID Unique discussion ID. */ public function bookmark($DiscussionID = null) { // Make sure we are posting back. if (!$this->Request->isAuthenticatedPostBack()) { throw permissionException('Javascript'); } $Session = Gdn::session(); if (!$Session->UserID) { throw permissionException('SignedIn'); } // Check the form to see if the data was posted. $Form = new Gdn_Form(); $DiscussionID = $Form->getFormValue('DiscussionID', $DiscussionID); $Bookmark = $Form->getFormValue('Bookmark', null); $UserID = $Form->getFormValue('UserID', $Session->UserID); // Check the permission on the user. if ($UserID != $Session->UserID) { $this->permission('Garden.Moderation.Manage'); } $Discussion = $this->DiscussionModel->getID($DiscussionID); if (!$Discussion) { throw notFoundException('Discussion'); } $Bookmark = $this->DiscussionModel->bookmark($DiscussionID, $UserID, $Bookmark); // Set the new value for api calls and json targets. $this->setData(array('UserID' => $UserID, 'DiscussionID' => $DiscussionID, 'Bookmarked' => (bool) $Bookmark)); setValue('Bookmarked', $Discussion, (int) $Bookmark); // Update the user's bookmark count $CountBookmarks = $this->DiscussionModel->setUserBookmarkCount($UserID); $this->jsonTarget('.User-CountBookmarks', (string) $CountBookmarks); // Short circuit if this is an api call. if ($this->deliveryType() === DELIVERY_TYPE_DATA) { $this->render('Blank', 'Utility', 'Dashboard'); return; } // Return the appropriate bookmark. require_once $this->fetchViewLocation('helper_functions', 'Discussions'); $Html = bookmarkButton($Discussion); // $this->jsonTarget(".Section-DiscussionList #Discussion_$DiscussionID .Bookmark,.Section-Discussion .PageTitle .Bookmark", $Html, 'ReplaceWith'); $this->jsonTarget("!element", $Html, 'ReplaceWith'); // Add the bookmark to the bookmarks module. if ($Bookmark) { // Grab the individual bookmark and send it to the client. $Bookmarks = new BookmarkedModule($this); if ($CountBookmarks == 1) { // When there is only one bookmark we have to get the whole module. $Target = '#Panel'; $Type = 'Append'; $Bookmarks->getData(); $Data = $Bookmarks->toString(); } else { $Target = '#Bookmark_List'; $Type = 'Prepend'; $Loc = $Bookmarks->fetchViewLocation('discussion'); ob_start(); include $Loc; $Data = ob_get_clean(); } $this->jsonTarget($Target, $Data, $Type); } else { // Send command to remove bookmark html. if ($CountBookmarks == 0) { $this->jsonTarget('#Bookmarks', null, 'Remove'); } else { $this->jsonTarget('#Bookmark_' . $DiscussionID, null, 'Remove'); } } $this->render('Blank', 'Utility', 'Dashboard'); }
/** * Render options that the user has for this discussion. */ function writeOptions($Discussion) { if (!Gdn::session()->isValid() || !Gdn::controller()->ShowOptions) { return; } echo '<span class="Options">'; // Options list. echo optionsList($Discussion); // Bookmark button. echo bookmarkButton($Discussion); // Admin check. echo adminCheck($Discussion); echo '</span>'; }