/** * Add a method to the ModerationController to handle merging discussions. */ public function ModerationController_MergeDiscussions_Create($Sender) { $Session = Gdn::Session(); $Sender->Form = new Gdn_Form(); $Sender->Title(T('Merge Discussions')); $DiscussionModel = new DiscussionModel(); $CheckedDiscussions = Gdn::UserModel()->GetAttribute($Session->User->UserID, 'CheckedDiscussions', array()); if (!is_array($CheckedDiscussions)) $CheckedDiscussions = array(); $DiscussionIDs = $CheckedDiscussions; $Sender->SetData('DiscussionIDs', $DiscussionIDs); $CountCheckedDiscussions = count($DiscussionIDs); $Sender->SetData('CountCheckedDiscussions', $CountCheckedDiscussions); $DiscussionData = $DiscussionModel->GetIn($DiscussionIDs); $Sender->SetData('DiscussionData', $DiscussionData); // Perform the merge if ($Sender->Form->AuthenticatedPostBack()) { // Create a new discussion record $MergeDiscussion = FALSE; $MergeDiscussionID = $Sender->Form->GetFormValue('MergeDiscussionID'); foreach ($DiscussionData->Result() as $Discussion) { if ($Discussion->DiscussionID == $MergeDiscussionID) { $MergeDiscussion = $Discussion; break; } } if ($MergeDiscussion) { // Verify that the user has permission to perform the merge $Sender->Permission('Vanilla.Discussion.Edit', TRUE, 'Category', $MergeDiscussion->CategoryID); // Assign the comments to the new discussion record $DiscussionModel->SQL ->Update('Comment') ->Set('DiscussionID', $MergeDiscussionID) ->WhereIn('DiscussionID', $DiscussionIDs) ->Put(); $CommentModel = new CommentModel(); foreach ($DiscussionIDs as $DiscussionID) { // Add a new comment to each empty discussion if ($DiscussionID != $MergeDiscussionID) { // Add a comment to each one explaining the merge $DiscussionAnchor = Anchor( Gdn_Format::Text($MergeDiscussion->Name), 'discussion/'.$MergeDiscussionID.'/'.Gdn_Format::Url($MergeDiscussion->Name) ); $CommentModel->Save(array( 'DiscussionID' => $DiscussionID, 'Body' => sprintf(T('This discussion was merged into %s'), $DiscussionAnchor) )); // Close non-merge discussions $CommentModel->SQL->Update('Discussion')->Set('Closed', '1')->Where('DiscussionID', $DiscussionID)->Put(); } // Update counts on all affected discussions $CommentModel->UpdateCommentCount($DiscussionID); $CommentModel->UpdateUserCommentCounts($DiscussionID); } // Clear selections Gdn::UserModel()->SaveAttribute($Session->UserID, 'CheckedDiscussions', FALSE); ModerationController::InformCheckedDiscussions($Sender); $Sender->RedirectUrl = Url('discussion/'.$MergeDiscussionID.'/'.Gdn_Format::Url($MergeDiscussion->Name)); } } $Sender->Render($this->GetView('mergediscussions.php')); }