]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Disqus/DisqusPlugin.php
Merge branch 'testing' of gitorious.org:statusnet/mainline into testing
[quix0rs-gnu-social.git] / plugins / Disqus / DisqusPlugin.php
index 96bfb4e09f8f2c0ee307baca3bf80a350dfcbc8a..add089e77f5a9aeef2aba1be8ac38f693614e5ce 100644 (file)
@@ -45,13 +45,28 @@ if (!defined('STATUSNET')) {
  * To enable the plugin, put the following in you config.php:
  *
  * addPlugin(
- *   'Disqus', array(
- *       'shortname' => 'YOURSHORTNAME',
- *      'div_style' => 'width:675px; padding-top:10px; position:relative; float:left;'
- *   )
+ *     'Disqus', array(
+ *         'shortname' => 'YOURSHORTNAME',
+ *         'divStyle'  => 'width:675px; padding-top:10px; position:relative; float:left;'
+ *     )
  * );
  *
- * NOTE: the 'div_style' in an optional parameter that passes in some
+ * If you only want to allow commenting on a specific user's notices or
+ * a specific set of users' notices initialize the plugin with the "restricted"
+ * parameter and grant the "richedit" role to those users. E.g.:
+ *
+ * addPlugin(
+ *     'Disqus', array(
+ *         'shortname'  => 'YOURSHORTNAME',
+ *         'divStyle'   => 'width:675px; padding-top:10px; position:relative; float:left;',
+ *         'restricted' => true
+ *     )
+ * );
+ *
+ * $ php userrole.php -s#### -nusername -rrichedit
+ *
+ *
+ * NOTE: the 'divStyle' in an optional parameter that passes in some
  * inline CSS when creating the Disqus widget. It's a shortcut to make
  * the widget look OK with the default StatusNet theme. If you leave
  * it out you'll have to edit your theme CSS files to make the widget
@@ -60,6 +75,7 @@ if (!defined('STATUSNET')) {
  *
  * See: http://help.disqus.com/entries/100878-css-customization
  *
+ *
  * @category Plugin
  * @package  StatusNet
  * @author   Zach Copley <zach@status.net>
@@ -70,58 +86,82 @@ if (!defined('STATUSNET')) {
  */
 class DisqusPlugin extends Plugin
 {
-    public $shortname; // Required 'shortname' for actually triggering Disqus.
-    public $div_style; // Optional CSS chunk for the main <div>
-
+    public $shortname; // Required 'shortname' for actually triggering Disqus
+    public $divStyle;  // Optional CSS chunk for the main <div>
+
+    // By default, Disqus commenting will be available to all users.
+    // With restricted on, only users who have been granted the
+    // "richedit" role get it.
+    public $restricted = false;
+
+    /**
+     * Add a Disqus commenting section to the end of an individual
+     * notice page's content block
+     *
+     * @param Action $action The current action
+     */
     function onEndShowContentBlock($action)
     {
         if (get_class($action) == 'ShownoticeAction') {
 
-            $attrs = array();
-            $attrs['id'] = 'disqus_thread';
+            $profile = Profile::staticGet('id', $action->notice->profile_id);
 
-            if ($this->div_style) {
-                $attrs['style'] = $this->div_style;
-            }
+            if ($this->isAllowedRichEdit($profile)) {
+
+                $attrs = array();
+                $attrs['id'] = 'disqus_thread';
+
+                if ($this->divStyle) {
+                    $attrs['style'] = $this->divStyle;
+                }
 
-            $action->element('div', $attrs, null);
+                $action->element('div', $attrs, null);
 
-            $script = <<<ENDOFSCRIPT
-var disqus_identifier = %d;
-  (function() {
-   var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-   dsq.src = 'http://%s.disqus.com/embed.js';
-   (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-  })();
+                $script = <<<ENDOFSCRIPT
+    var disqus_identifier = %d;
+      (function() {
+       var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+       dsq.src = 'http://%s.disqus.com/embed.js';
+       (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+      })();
 ENDOFSCRIPT;
 
-            $action->inlineScript(sprintf($script, $action->notice->id, $this->shortname));
+                $action->inlineScript(sprintf($script, $action->notice->id, $this->shortname));
 
-            $attrs = array();
+                $attrs = array();
 
-            $attrs['id'] = 'disqus_thread_footer';
+                $attrs['id'] = 'disqus_thread_footer';
 
-            if ($this->div_style) {
-                $attrs['style'] = $this->div_style;
-            }
+                if ($this->divStyle) {
+                    $attrs['style'] = $this->divStyle;
+                }
 
-            $action->elementStart('div', $attrs);
-            $action->elementStart('noscript');
+                $action->elementStart('div', $attrs);
+                $action->elementStart('noscript');
 
-            $noScriptMsg = sprintf(_m("Please enable JavaScript to view the [comments powered by Disqus](http://disqus.com/?ref_noscript=%s)."), $this->shortname);
-            $output = common_markup_to_html($noScriptMsg);
-            $action->raw($output);
+                // TRANS: User notification that JavaScript is required for Disqus comment display.
+                $noScriptMsg = sprintf(_m("Please enable JavaScript to view the [comments powered by Disqus](http://disqus.com/?ref_noscript=%s)."), $this->shortname);
+                $output = common_markup_to_html($noScriptMsg);
+                $action->raw($output);
 
-            $action->elementEnd('noscript');
+                $action->elementEnd('noscript');
 
-            $action->elementStart('a', array('href' => 'http://disqus.com', 'class' => 'dsq-brlink'));
-            $action->raw(_m('Comments powered by '));
-            $action->element('span', array('class' => 'logo-disqus'), 'Disqus');
-            $action->elementEnd('a');
-            $action->elementEnd('div');
+                $action->elementStart('a', array('href' => 'http://disqus.com', 'class' => 'dsq-brlink'));
+                // TRANS: This message is followed by a Disqus logo. Alt text is "Disqus".
+                $action->raw(_m('Comments powered by '));
+                $action->element('span', array('class' => 'logo-disqus'), 'Disqus');
+                $action->elementEnd('a');
+                $action->elementEnd('div');
+            }
         }
     }
 
+    /**
+     * Add Disqus comment count script to the end of the scripts section
+     *
+     * @param Action $action the current action
+     *
+     */
     function onEndShowScripts($action)
     {
         // fugly
@@ -135,31 +175,65 @@ var disqus_shortname = '%s';
 ENDOFSCRIPT;
         $action->inlineScript(sprintf($script, $this->shortname, $this->shortname));
 
-        return true;
     }
 
-    function onStartShowNoticeItem($noticeListItem)
+    /**
+     * Tack on a Disqus comments link to the notice options stanza
+     * (the link displays the total number of comments for each notice)
+     *
+     * @param NoticeListItem $noticeListItem
+     *
+     */
+    function onEndShowNoticeInfo($noticeListItem)
     {
+        // Don't enable commenting for remote notices
         if (empty($noticeListItem->notice->is_local)) {
-            return true;
+            return;
         }
 
-        $noticeListItem->showNotice();
-        $noticeListItem->showNoticeInfo();
-
-        $noticeUrl = $noticeListItem->notice->bestUrl();
-        $noticeUrl .= '#disqus_thread';
+        $profile = Profile::staticGet('id', $noticeListItem->notice->profile_id);
 
-        $noticeListItem->out->element(
-            'a', array('href' => $noticeUrl, 'class' => 'disqus_count'), 'Comments'
-        );
+        if ($this->isAllowedRichEdit($profile)) {
+            $noticeUrl = $noticeListItem->notice->bestUrl();
+            $noticeUrl .= '#disqus_thread';
 
-        $noticeListItem->showNoticeOptions();
-        Event::handle('EndShowNoticeItem', array($noticeListItem));
+            $noticeListItem->out->element(
+                'a',
+                array('href' => $noticeUrl, 'class' => 'disqus_count'),
+                // TRANS: Plugin supplied feature for Disqus comments to notices.
+                _m('Comments')
+            );
+        }
+    }
 
-        return false;
+    /**
+     * Does the current user have permission to use the Disqus plugin?
+     * Always true unless the plugin's "restricted" setting is on, in which
+     * case it's limited to users with the "richedit" role.
+     *
+     * @fixme make that more sanely configurable :)
+     *
+     * @param Profile $profile the profile to check
+     *
+     * @return boolean
+     */
+    private function isAllowedRichEdit($profile)
+    {
+        if ($this->restricted) {
+            $user = User::staticGet($profile->id);
+            return !empty($user) && $user->hasRole('richedit');
+        } else {
+            return true;
+        }
     }
 
+    /**
+     * Plugin details
+     *
+     * @param &$versions Array of current plugins
+     *
+     * @return boolean true
+     */
     function onPluginVersion(&$versions)
     {
         $versions[] = array('name' => 'Disqus',
@@ -167,6 +241,7 @@ ENDOFSCRIPT;
                             'author' => 'Zach Copley',
                             'homepage' => 'http://status.net/wiki/Plugin:Disqus',
                             'rawdescription' =>
+                            // TRANS: Plugin description.
                             _m('Use <a href="http://disqus.com/">Disqus</a>'.
                                ' to add commenting to notice pages.'));
         return true;