Advertisement
azverin

vanillaforums.org/addon/resolved-plugin

Jan 10th, 2016
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.50 KB | None | 0 0
  1. <?php if (!defined('APPLICATION')) exit();
  2.  
  3. $PluginInfo['Resolved'] = array(
  4.    'Name' => 'Resolved Discussions',
  5.    'Description' => "Adds an option to mark discussions as Resolved with custom permission. Resolved discussions are Closed to new participants, however additional posts by the OP unresolve it. Only users with the custom permission see its Resolved status.",
  6.    'Version' => '1.0',
  7.    'RequiredApplications' => array('Vanilla' => '2.1'),
  8.    'RegisterPermissions' => array('Plugins.Resolved.Manage'),
  9.    'MobileFriendly' => TRUE,
  10.    'Author' => "Matt Lincoln Russell",
  11.    'AuthorEmail' => 'lincolnwebs@gmail.com',
  12.    'AuthorUrl' => 'http://lincolnwebs.com'
  13. );
  14.  
  15. class ResolvedPlugin extends Gdn_Plugin {
  16.    /**
  17.     * Add 'Resolved' columns
  18.     */
  19.    public function Setup() {
  20.       Gdn::Structure()
  21.          ->Table('Discussion')
  22.          ->Column('Resolved', 'int', '0')
  23.          ->Column('DateResolved', 'datetime', TRUE)
  24.          ->Column('ResolvedUserID', 'int', TRUE)
  25.          ->Set();
  26.    }
  27.    
  28.    /**
  29.     * Allow staff to Resolve via checkbox under comment form.
  30.     */
  31.    public function Base_AfterBodyField_Handler($Sender, $Args) {
  32.       if (CheckPermission('Plugins.Resolved.Manage'))
  33.          echo '<span class="ResolvedCheckbox">'.
  34.             $Sender->Form->CheckBox('Resolved', T('Resolved'), array('value' => '1')).'</span>';
  35.    }
  36.    
  37.    /**
  38.     * Allow staff to Resolve via discussion options.
  39.     */
  40.    public function Base_DiscussionOptions_Handler($Sender, $Args) {
  41.       $Discussion = $Args['Discussion'];
  42.       $Resolved = GetValue('Resolved', $Discussion);
  43.       $NewResolved = (int)!$Resolved;
  44.       if (CheckPermission('Plugins.Resolved.Manage')) {
  45.          $Label = T($Resolved ? 'Unresolve' : 'Resolve');
  46.          $Url = "/discussion/resolve?discussionid={$Discussion->DiscussionID}&resolve=$NewResolved";
  47.          // Deal with inconsistencies in how options are passed
  48.          if (isset($Sender->Options)) {
  49.             $Sender->Options .= Wrap(Anchor($Label, $Url, 'ResolveDiscussion Hijack'), 'li');
  50.          }
  51.          else {
  52.             $Args['DiscussionOptions']['ResolveDiscussion'] = array(
  53.                'Label' => $Label,
  54.                'Url' => $Url,
  55.                'Class' => 'ResolveDiscussion Hijack'
  56.             );
  57.          }
  58.       }
  59.    }
  60.    
  61.    /**
  62.     * Show Unresolved meta tag.
  63.     */
  64.    public function Base_BeforeDiscussionMeta_Handler($Sender, $Args) {
  65.       $Resolved = GetValue('Resolved', GetValue('Discussion', $Args));
  66.       if (CheckPermission('Plugins.Resolved.Manage') && !$Resolved) {
  67.          echo ' <span class="Tag Tag-Unresolved">'.T('Unresolved').'</span> ';
  68.       }
  69.    }
  70.    
  71.    /**
  72.     * Show [RESOLVED] in discussion title when viewing single.
  73.     */
  74.    public function DiscussionController_BeforeDiscussionOptions_Handler($Sender, $Args) {
  75.       $Discussion = $Sender->Data('Discussion');
  76.       if (CheckPermission('Plugins.Resolved.Manage') && $Discussion->Resolved) {
  77.          $NewName = '<span class="DiscussionResolved">[RESOLVED]</span> '.GetValue('Name', $Discussion);
  78.          SetValue('Name', $Discussion, $NewName);
  79.          $Sender->SetData('Discussion', $Discussion);
  80.       }
  81.    }
  82.    
  83.    /**
  84.     * Handle discussion option menu Resolve action.
  85.     */
  86.    public function DiscussionController_Resolve_Create($Sender, $Args) {
  87.       $Sender->Permission('Plugins.Resolved.Manage');  
  88.       $DiscussionID = $Sender->Request->Get('discussionid');
  89.       $Resolve = $Sender->Request->Get('resolve');
  90.      
  91.       // Make sure we are posting back.
  92.       if (!$Sender->Request->IsPostBack())
  93.          throw PermissionException('Javascript');
  94.      
  95.       $Discussion = $Sender->DiscussionModel->GetID($DiscussionID);
  96.      
  97.       if (!$Discussion)
  98.          throw NotFoundException('Discussion');
  99.      
  100.       // Resolve the discussion.
  101.       $Sender->DiscussionModel->SetField($DiscussionID, 'Resolved', $Resolve);
  102.       $Discussion->Resolved = $Resolve;
  103.      
  104.       $Sender->SendOptions($Discussion);
  105.      
  106.       if (!$Resolve) {
  107.          require_once $Sender->FetchViewLocation('helper_functions', 'Discussions');
  108.          $Sender->JsonTarget(".Section-DiscussionList #Discussion_$DiscussionID .Meta-Discussion",
  109.             '<span class="Tag Tag-Unresolved" title="Unresolved">'.T('Unresolved').'</span>', 'Prepend');
  110.          $Sender->JsonTarget(".Section-DiscussionList #Discussion_$DiscussionID", 'Unresolved', 'AddClass');
  111.       } else {
  112.          $Sender->JsonTarget(".Section-DiscussionList #Discussion_$DiscussionID .Tag-Unresolved", NULL, 'Remove');
  113.          $Sender->JsonTarget(".Section-DiscussionList #Discussion_$DiscussionID", 'Unresolved', 'RemoveClass');
  114.       }
  115.      
  116.       $Sender->JsonTarget("#Discussion_$DiscussionID", NULL, 'Highlight');
  117.       $Sender->JsonTarget(".Discussion #Item_0", NULL, 'Highlight');
  118.      
  119.       $Sender->Render('Blank', 'Utility', 'Dashboard');
  120.    }
  121.    
  122.    /**
  123.     * Handle comment form Resolved checkbox & new user comments.
  124.     */
  125.    public function CommentModel_AfterSaveComment_Handler($Sender, $Args) {
  126.       $Resolved = GetValueR('FormPostValues.Resolved', $Args);
  127.       if (!CheckPermission('Plugins.Resolved.Manage')) {
  128.          // Unset Resolved flag
  129.          $DiscussionModel = new DiscussionModel();
  130.          $DiscussionID = GetValue('DiscussionID', $Args['FormPostValues']);
  131.          $DiscussionModel->SetField($DiscussionID, 'Resolved', 0);
  132.       }
  133.       else if ($Resolved) {
  134.          // Set Resolved flag
  135.          $DiscussionModel = new DiscussionModel();
  136.          $DiscussionID = GetValue('DiscussionID', $Args['FormPostValues']);
  137.          $DiscussionModel->SetField($DiscussionID, 'Resolved', 1);
  138.       }
  139.    }
  140.  
  141.    /**
  142.     * Disallow comments in Resolved discussions by new participants.
  143.     *
  144.     * @param DiscussionController $Sender
  145.     */
  146.    public function DiscussionController_BeforeDiscussionRender_Handler($Sender, $Args) {
  147.       $Discussion = $Sender->Data('Discussion');
  148.       $Resolved = GetValue('Resolved', $Discussion);
  149.       $IsStarter = (GetValue('InsertUserID', $Discussion) == Gdn::Session()->UserID);
  150.       if (!CheckPermission('Plugins.Resolved.Manage') && $Resolved && !$IsStarter) {
  151.          // Pretend we're closed
  152.          SetValue('Closed', $Discussion, 1);  
  153.          $Sender->SetData('Discussion', $Discussion);
  154.       }
  155.    }
  156.    
  157.    /**
  158.     * Add 'Unresolved' discussions filter to menu.
  159.     */
  160.    public function Base_AfterDiscussionFilters_Handler($Sender) {
  161.       if (CheckPermission('Plugins.Resolved.Manage')) {
  162.          $Unresolved .= T('Unresolved') . FilterCountString(self::CountUnresolved());
  163.          echo '<li class="Unresolved">'.Anchor(Sprite('SpUnresolved').' '.$Unresolved, '/discussions/unresolved').'</li>';
  164.       }
  165.    }
  166.  
  167.    /**
  168.     * Count the number of unresolved discussions.
  169.     *
  170.     * @return int
  171.     */
  172.    public static function CountUnresolved() {
  173.       $NumUnresolved = Gdn::SQL()
  174.          ->Select('count(DISTINCT d.DiscussionID)', '', 'NumUnresolved')
  175.          ->From('Discussion d')
  176.          ->Where('d.Resolved', 0)
  177.          ->Get()
  178.          ->FirstRow()
  179.          ->NumUnresolved;
  180.  
  181.       return $NumUnresolved;
  182.    }
  183.    
  184.    /**
  185.     * Discussions filter: Unresolved.
  186.     */
  187.    public function DiscussionsController_Unresolved_Create($Sender, $Args) {
  188.       $Sender->Permission('Plugins.Resolved.Manage');
  189.       $Page = ArrayValue(0, $Args, 0);
  190.      
  191.       // Determine offset from $Page
  192.       list($Page, $Limit) = OffsetLimit($Page, C('Vanilla.Discussions.PerPage', 30));
  193.      
  194.       // Validate $Page
  195.       if (!is_numeric($Page) || $Page < 0)
  196.          $Page = 0;
  197.      
  198.       $DiscussionModel = new DiscussionModel();
  199.       $Wheres = array('d.Resolved' => '0');
  200.      
  201.       $Sender->DiscussionData = $DiscussionModel->Get($Page, $Limit, $Wheres);
  202.       $Sender->SetData('Discussions', $Sender->DiscussionData);
  203.       $CountDiscussions = $DiscussionModel->GetCount($Wheres);
  204.       $Sender->SetData('CountDiscussions', $CountDiscussions);
  205.       $Sender->Category = FALSE;
  206.      
  207.       $Sender->SetJson('Loading', $Page . ' to ' . $Limit);
  208.      
  209.       // Build a pager
  210.       $PagerFactory = new Gdn_PagerFactory();
  211.       $Sender->EventArguments['PagerType'] = 'Pager';
  212.       $Sender->FireEvent('BeforeBuildBookmarkedPager');
  213.       $Sender->Pager = $PagerFactory->GetPager($Sender->EventArguments['PagerType'], $Sender);
  214.       $Sender->Pager->ClientID = 'Pager';
  215.       $Sender->Pager->Configure(
  216.          $Page,
  217.          $Limit,
  218.          $CountDiscussions,
  219.          'discussions/unresolved/%1$s'
  220.       );
  221.      
  222.       if (!$Sender->Data('_PagerUrl'))
  223.          $Sender->SetData('_PagerUrl', 'discussions/unresolved/{Page}');
  224.       $Sender->SetData('_Page', $Page);
  225.       $Sender->SetData('_Limit', $Limit);
  226.       $Sender->FireEvent('AfterBuildBookmarkedPager');
  227.      
  228.       // Deliver JSON data if necessary
  229.       if ($Sender->DeliveryType() != DELIVERY_TYPE_ALL) {
  230.          $Sender->SetJson('LessRow', $Sender->Pager->ToString('less'));
  231.          $Sender->SetJson('MoreRow', $Sender->Pager->ToString('more'));
  232.          $Sender->View = 'discussions';
  233.       }
  234.      
  235.       // Add modules
  236.       $Sender->AddModule('DiscussionFilterModule');
  237.       $Sender->AddModule('NewDiscussionModule');
  238.       $Sender->AddModule('CategoriesModule');
  239.      
  240.       // Render default view
  241.       $Sender->SetData('Title', T('Unresolved'));
  242.       $Sender->SetData('Breadcrumbs', array(array('Name' => T('Unresolved'), 'Url' => '/discussions/unresolved')));
  243.       $Sender->Render('index');
  244.    }
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement