/** * 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->IsPostBack()) { 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'); }