Watchlist for Wikka Pages
This patch is based on the code
published at wakkawiki∞ by
MattPeperell∞ and
SilBaer∞.
registered users can put any page on a watchlist and can optionally choose to get an email on changes.
first we need a separate database table that holds the watches:
CREATE TABLE `wikka_watches` (
`user` varchar(80) NOT NULL default '',
`tag` varchar(50) NOT NULL default '',
`mail` enum('N','Y') NOT NULL default 'N',
`time` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`user`, `tag`)
) TYPE=MyISAM;
additional functions to be used when saving pages (notifywatchers()) and in the page footer... or header, of course (watchlink())
wikka.php inside
class Wakka {
<?
// WATCHES
function IsWatched
($user,
$tag) { return $this->
LoadSingle("select * from ".
$this->
config["table_prefix"].
"watches where user = '".mysql_real_escape_string
($user).
"' and tag = '".mysql_real_escape_string
($tag).
"'");
}
function WatchLink
($delimiter =
"::",
$unwatch =
"unwatch",
$watch =
"watch") {
if ($this->
GetUser()) {
echo ($this->
IsWatched($this->
GetUserName(),
$this->
tag) ?
$delimiter.
" <a href='".
$this->
href("watch").
"'>".
$unwatch.
"</a>" :
$delimiter.
":: <a href='".
$this->
href("watch").
"'>".
$watch.
"</a>");
}
}
function NotifyWatchers
($tag) {
$w =
$this->
config["table_prefix"].
"watches";
$u =
$this->
config["table_prefix"].
"users";
$sql =
"select $w.user, $u.email from $w, $u".
" where $w.user = $u.name and $w.mail = 'Y'".
" and $w.tag = '".mysql_real_escape_string
($tag).
"'";
$notify =
$this->
LoadAll($sql);
foreach ($notify as $watcher) $watchers[$notify["user"]] =
$notify["email"];
//needs group management
//add chief editors, a group that always will be notified
// if ($chiefeditors = $this->GetMembers($this->config["always_notify"]) {
// foreach ($chiefeditors as $chiefeditor) {
// if ($editor = $this->LoadSingle("select * from $u where user='".mysql_real_escape_string($chiefeditor)."'")) {
// $watchers[$editor["user"]] = $editor["email"];
// }
// }
// }
foreach ($watchers as $watcher =>
$email) {
if ($watcher !=
$user &&
preg_match("/^.+@.+$/",
$email)) {
$subject =
$this->
config["wakka_name"].
": watched page ".
$tag.
" changed";
$message =
"Hello ".
$watcher.
"\n\n";
$message .=
"The following page has been changed: ".
$this->
Href("",
$tag).
"\n\n";
$message .=
"You can remove this page from your watchlist with the following link:\n\n";
$message .=
$this->
Href("watch",
$tag).
"\n\n";
$message .=
"Regards\n\nYour Wikka watchdog";
$headers =
"From: Wikka watchdog <".
$this->
config["admin_mail"].
">\n";
mail($email,
$subject,
$message,
$headers);
}
}
}
?>
the watchlist itself is designed as an action. every user will see another list that contains only his own watches.
actions/watches.php
<?php
$p =
$this->
config["table_prefix"].
"pages";
$w =
$this->
config["table_prefix"].
"watches";
$sql =
"select $p.tag, $w.user, $p.time, $p.user, $p.changelog from $p, $w ".
"where $p.tag = $w.tag and $p.latest='Y' and $w.user='".
$this->
GetUserName().
"' ".
"order by $p.time desc";
if ($pages =
$this->
LoadAll($sql)) {
$s =
"";
$cur =
"";
foreach ($pages as $page) {
list
($day,
$time) =
explode(" ",
$page["time"]);
if ($day !=
$curday) {
print("<br />\n<b>".
$day.
"</b><br />\n");
$curday =
$day;
}
print("<span class='indent'>".
$time.
" (".
$this->
Link($page["tag"],
"revisions",
"history",
0).
") ".
$this->
Link($page["tag"],
"",
"",
0).
" ⇒ ".
$this->
Link($page["user"],
"",
"",
0).
" (".
$page["note"].
")</span><br />\n");
}
} else print("<i>None</i><br>\n");
?>
the handler controls the watchlist and toggles page watching when called.
handlers/page/watch.php
<?php
$tag =
$this->
GetPageTag();
$mail =
$_POST["mail"] ==
"Y" ?
"Y" :
"N";
if ($this->
GetUser()) {
$user =
$this->
GetUserName();
if ($this->
IsWatched($user,
$tag)) {
return $this->
Query("delete from ".
$this->
config["table_prefix"].
"watches where user = '".mysql_real_escape_string
($user).
"' and tag = '".mysql_real_escape_string
($tag).
"'");
$this->
Redirect($this->
href("",
$tag));
} else {
if ($_POST) {
if ($_POST["submit"] ==
"watch") {
return $this->
Query("insert into ".
$this->
config["table_prefix"].
"watches set user='".mysql_real_escape_string
($user).
"', tag='".mysql_real_escape_string
($tag).
"', mail='".
$mail.
"'");
}
$this->
Redirect($this->
href("",
$tag));
} else {
print("<div class='page'>".
$this->
FormOpen("watch"));
print($this->
Format("You have chosen to put the page **".
$tag.
"** onto your [[watchlist]].\n"));
print("If you don't want to watch this page, hit cancel\n");
print("<p>Aditionally you can be notified by mail every time this page is changed until you put it off your watchlist.<br />");
print("<input type='checkbox' name='mail' value='Y' /> send mail on changes<br />");
print("<input type='submit' name='submit' value='watch' /><input type='submit' name='submit' value='cancel' />\n");
print($this->
FormClose().
"</div>");
}
}
} else $this->
Redirect($this->
href("",
$tag));
?>
finally hook in the notify feature in the savepage() function by calling
<? $this->NotifyWatchers($tag); ?>
at the end of that function and place a call to
<? $this->WatchLink(); ?>
wherever you want in the header or footer.
Back Links
DreckFehler
LukaV
PeeJay
RemovingUsers
RyeBreadDraftsEventNotification
UserAccountModules
CategoryDevelopmentActions CategoryDevelopmentHandlers