WikiPageWatch

By Chumang Sango 2009 for V1.1.6.2
Ported IanHayhurst 2018 for V1.3.7 pluginsystem

ToDo:
  • code assumes table prefix wikka_ in parts and needs $prefix = $this->GetConfigValue('table_prefix'); inserting in some of the sql
  • Functions in Wikka.class.php not really in a plugin friendly place not sure what best practice should be here

Troubleshooting:
SELinux Http can't send mail
var/log/maillog shows:
postfix/sendmail[29013]: fatal: open /etc/postfix/main.cf: Permission denied
Fix with:
setsebool -P httpd_can_sendmail=1

Yet another email notification plugin allows users to watch / unwatch a page by opting in or out of email notification for page changes or comments. Uses an additional table to track pages and watchers. I'm including it here as I modified the original work by Chumang Sango to use the plugin system.

Files Added / Modified

image

WikiRoot
|-- libs
|   \-- Wakka.class.php
|-- plugins
|-- actions
| |-- watchlink
|   \-- watchlink.php
|-- config
| \-- options_menu.inc
| |-- options_menu.user.inc
| |-- options_menu.admin.inc
|-- handlers
   \-- addcomment
       | \--addcomment.php
   |--edit
      | \-- edit.php
   |--pagewatch
   | \--pagewatch.php
   |-- unpagewatch
   \-- unpagewatch.php

 

Database

A new table was added to the underlying database. The table name is wikka_page_watch and it will serve as the watch list. The structure of the table is shown below:
Field Type Null
page_tag VARCHAR(75) No
user_name VARCHAR(75) No

The PRIMARY key for the table is a combination of page_tag and user_name. Examples of page_tag values include WelcomePage, RecentChanges, etc. Examples of user_name values include JohnSmith, JohnDoe, etc. When a user subscribes to a page, his name and the tag of the page will be added to this table. The opposite happens when a user decides to unsubscribe.

My table Prefix was wikka_ The table is referred to in the code
CREATE TABLE 'wikka_page_watch' (
 'page_tag'  VARCHAR(75) NOT NULL,
 'user_name'  VARCHAR(75) NOT NULL,
 PRIMARY KEY  ('page_tag','user_name') )
 ENGINE=MyISAM DEFAULT CHARSET utf8 COLLATE  utf8_unicode_ci;


Functions

Two new functions are added to the Wakka.Class.php file. These functions are :
WatchWiki ( ): This function constructs a module that will be displayed on a wiki page. This module has a link in it which will allow a user to watch the page (if the user does not already exist in the watch list of the page), or to stop watching a page (if the user is already watching the page). altered just to return bool if page is watched or not

NotifyWatchers ($tag, $type=''): This function will send out an email message to all users that are on the watch list of a page when a change is made on the page. The $tag parameter is used to specify the tag of the page whose watchers need to be notified. The $type parameter is used to specify the type of notification. There are currently two types of notification – ‘comment’ (used when a new comment is made on a page) and ‘edit’ (used when page content is changed). The $type parameter is option, and a generic change message will be generated if it is not specified.

Append the following functions to wikiroot/libs/Wakka.class.php just before the final closing } (which you can delete as it is included in the insert )
AppendTo-Wakka.class.php
/**
  * Function to produce a module that allows a user to watch/unwatch a wiki.
  * Watching a wiki involves subscribing to receive email notifications when
  * the wiki changes i.e. page edits and comments
  *
  * @name   WatchWiki
  * @param   None
  * @author  <chumang.sango@syngenta.com> Chumang Sango
  * @access  public
  * @return  string
  * @version 0.0.2 Beta
  *
  * History
  * ---------------------------------------------------------------------
  * Date       | Changed By | Description
  * ---------------------------------------------------------------------
  * 09/12/2009 | C.Sango    | Created
  * 12/07/2018 | I.Hayhurst | Return changed to bool. Handler redirect moved to watchlink menu action
  *
  */


 function WatchWiki()
 {
        $user = $this->GetUserName();
        $tag  = $this->GetPageTag();
        $url  = $this->Href();

        $table = "page_watch";
        $where = "user_name = '".$user."'
                  and    page_tag = '"
.$tag."' ";

        $count = $this->getCount($table, $where);

        if($count == 0) {return false;}
        else {return true;}
 }

        /**
        * Function to send an email to the list of all the users watching a particular wiki
        * This function should be used in handlers and actions that modify a page i.e. page edits and comments
        *
        * @name    NotifyWatchers
        * @@param  string $tag The tag of the page whose watchers you want to notify
        * @author  <chumang.sango@syngenta.com> Chumang Sango
        * @access  public
        * @version 0.0.1 Beta
        * @@return void
        *
        * History
        * ---------------------------------------------------------------------
        * Date       | Changed By | Description
        * ---------------------------------------------------------------------
        * 09/12/2009 | C.Sango   | Created
        * 15/12/2009 | C.Sango    | Added code to set sender's email
        */

        function NotifyWatchers($tag, $type=''){

            $url = $this->Href();
            $subject = "WikiWatch Alert for $tag";

            // Load the email of the person sending the email
            $senderQuery = "
                select u.email
                from   wikka_users u
                where  u.name = '"
.$this->GetUserName()."'";

            $res = $this->LoadSingle($senderQuery);
            $sender = $res['email'];

            // construct email message based on change type
            switch($type){

                case 'comment': {
                    $message = '
                        <div id="mail" style="font-family: Calibri;">
                                <p> Hi </p>
                                <p>
                                        <span style="width: 100%"> A new comment was made on the <strong>'
.$tag.'</strong> wiki.</span>
                                        <span> Follow the link below to view it. </span>
                                </p>
                                <p> &nbsp;&nbsp;&nbsp;&nbsp;'
.$url.'</p>
                        </div>'
;
                    break;
                }
                case 'edit': {
                    $message = '
                        <div id="mail" style="font-family: Calibri;">
                                <p> Hi </p>
                                <p>
                                        <span> The wiki page <strong>'
.$tag.'</strong> has been recently edited. </br></span>
                                        <span> Follow the link below to view the new content. </span>
                                </p>
                                <p> &nbsp;&nbsp;&nbsp;&nbsp;'
.$url.'</p>
                        </div>'
;
                    break;
                }
                default: {
                    $message = '
                        <div id="mail" style="font-family: Calibri;">
                                <p> Hi </p>
                                <p>
                                        <span> Content on the <strong>'
.$tag.'</strong> wiki has been recently updated. </br></span>
                                        <span> Follow the link below to view it. </span>
                                </p>
                                <p> &nbsp;&nbsp;&nbsp;&nbsp; '
.$url.'</p>
                        </div>'
;
                }

            }
            // select watch list of page from database
            $watchListQuery =   "
                select u.email
                from   wikka_users u,
                       wikka_page_watch w
                where  w.user_name = u.name
                and    w.page_tag = '"
.$tag."' ";

            $result = $this->LoadAll($watchListQuery);

            // send email to list
            for ($i = 0; $i < sizeof($result); ++$i) {
                $email = $result[$i]['email'];
                $headers = "From: WikiWatch <$sender>\r\n";
                $headers .= "Content-type: text/html\r\n";
                mail($email, $subject, $message, $headers);
            }

        }
}
?>


Plugin Integration


Actions
watchlink.php
/**
 * Watch / Unwatch  link menulet
 *
 * Displays a link to watch / unwatch the current page (depending on user privileges).
 *
 * Syntax: {{watchlink}}
 *
 * @package            Actions
 * @subpackage     Menulets
 * @name                Watch link
 *
 * @author              {@link Chumang Sango, Ian Hayhurst}
 */


if ($this->WatchWiki()){
        echo  '<a href="'.$this->Href('unpagewatch').'" title="'.T_("Click to stop receiving email on page edits or comments").'">'.T_("[Unwatch this  page]").'</a>'; #i18n
        }
else {
      echo  '<a href="'.$this->Href('pagewatch').'" title="'.T_("Click to receive email on page edits or comments").'">'.T_("[Watch this  page]").'</a>'; #i18n
        }

?>


Config

Handlers
The addcomment.php and edit.php handlers are modified to include a call to the Notify Watchers function of the main class. This is necessary to ensure that watchers are notified of changes the moment they are made.

addcomment.php (line 53)
  1. // all is kosher: store new comment
  2.         else
  3.         {
  4.                 $body = nl2br($this->htmlspecialchars_ent($body));
  5.                 $this->SaveComment($this->GetPageTag(), $body, $parent_id);
  6.                 // notify watchers of new content
  7.                 $this->NotifyWatchers($this->tag, 'comment');
  8.         }

at the point where the edit is ready to be stored about line 155
edit.php (line 138)
  1.       {
  2.               // only save if new body differs from old body
  3.               if ($body != $this->page['body']) {
  4.  
  5.                       // add page (revisions)
  6.                       $this->SavePage($this->GetPageTag(), $body, $note);
  7.  
  8.                       // now we render it internally so we can write the updated link table.
  9.                       // if we no longer do link tracking for header and footer why are we creating dummy output?
  10.                       $this->ClearLinkTable();
  11.                       $dummy = $this->Header();               // @@@
  12.                       $this->StartLinkTracking();
  13.                       $dummy .= $this->Format($body);
  14.                       $this->StopLinkTracking();
  15.                       $dummy .= $this->Footer();              // @@@
  16.                       $this->WriteLinkTable();
  17.                       $this->ClearLinkTable();
  18.               }
  19.               // notify page watchers of recent change
  20.               $this->NotifyWatchers($this->tag, 'edit');
  21.  
  22.               // forward
  23.               $this->Redirect($this->Href());

pagewatch.php
<?php
        /**
         * This handler will add the current user to the watch list for the
         * page he is currently on
         *
         * @author <chumang.sango@syngenta.com>
         *
         * Date: 09 Decemeber 2009
         * CHANGES
         * 20180710 Ian M. Hayhurst wrap in check for logged on user
         */



        $user = $this->GetUserName();
        $tag  = $this->GetPageTag();
        $redirectmessage = "";

        if  ($this->GetUser())
        {
        $watch_cmd = "
                insert into wikka_page_watch (user_name, page_tag)
                values ('"
.$user."', '".$tag."') ";

        $success = mysql_query($watch_cmd, $this->dblink);
        $redirectmessage = "You are now watching this page.";
        }
        else
        {$redirectmessage = "You need to be logged in!";
        }

        // redirect to parent page
        $this->Redirect($this->Href(), $redirectmessage);
?>

unpagewatch.php
<?php
        /**
         * This handler will remove the current user from the watch list for the
         * page he is currently on
         *
         * @author <chumang.sango@syngenta.com>
         *
         * Date: 09 Decemeber 2009
         */


        $user = $this->GetUserName();
        $tag  = $this->GetPageTag();
        $redirectmessage = "";

        $unwatch_cmd = "
                  delete  from wikka_page_watch
                  where   user_name = '"
.$user."'
                  and     page_tag = '"
.$tag."' ";

        $success = mysql_query($unwatch_cmd, $this->dblink);
        $redirectmessage = "You are no longer watching this page.";

        // redirect to parent page
        $this->Redirect($this->Href(), $redirectmessage);
?>




CategoryUserContributions
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki