Revision [23614]

This is an old revision of WikiPageWatch made by IanHayhurst on 2018-07-13 09:11:46.

 

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: https:////c1.staticflickr.com/2/1823/43330485912_490c6b6a57_m.jpg)

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

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;



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 )
/**
  * 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);
            }

        }
}
?>


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.

destructions sectiondraft

Enable wiki for use of plugins detailed here: InstallingPlugins

Add menu action {{watchlink}} config/option_menu.inc
Create new table (mention table prefix)
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;




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




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