diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/account.module | 9 | ||||
-rw-r--r-- | modules/backend.module | 6 | ||||
-rw-r--r-- | modules/cron.module | 34 | ||||
-rw-r--r-- | modules/diary.module | 209 | ||||
-rw-r--r-- | modules/documentation.module | 33 | ||||
-rw-r--r-- | modules/watchdog.module | 9 | ||||
-rw-r--r-- | modules/watchdog/watchdog.module | 9 | ||||
-rw-r--r-- | modules/wishlist.module | 8 |
8 files changed, 275 insertions, 42 deletions
diff --git a/modules/account.module b/modules/account.module index 7169da5ff..11f69fb16 100644 --- a/modules/account.module +++ b/modules/account.module @@ -1,6 +1,11 @@ <? -$module = array("admin" => "account_admin"); +$module = array("cron" => "account_cron", + "admin" => "account_admin"); + +function account_cron() { + // clean-up user database +} function account_display($order = "username") { $sort = array("ID" => "id", "fake e-mail address" => "fake_email", "homepage" => "url", "hostname" => "last_host", "last access date" => "last_access", "real e-mail address" => "real_email", "real name" => "name", "status" => "status", "theme" => "theme", "timezone" => "timezone", "username" => "userid"); @@ -122,4 +127,4 @@ function account_admin() { } } -?>
\ No newline at end of file +?> diff --git a/modules/backend.module b/modules/backend.module index 003619e58..43a2211a6 100644 --- a/modules/backend.module +++ b/modules/backend.module @@ -1,6 +1,7 @@ <? $module = array("page" => "backend_page", + "cron" => "backend_cron", "admin" => "backend_admin"); include "includes/theme.inc"; @@ -42,6 +43,9 @@ function backend_page() { $theme->footer(); } +function backend_cron() { + // update backends +} function backend_admin_main() { global $theme; @@ -50,7 +54,7 @@ function backend_admin_main() { $result = db_query("SELECT * FROM channel ORDER BY id"); $output .= "<TABLE BORDER=\"1\" CELLSPADDING=\"2\" CELLSPACING=\"2\">\n"; - $output .= " <TH>Site</TH><TH>Contact</TH><TH>Last updated</TH><TH COLSPAN=\"2\">Operations</TH></TR>\n"; + $output .= " <TH>site</TH><TH>contact</TH><TH>last updated</TH><TH COLSPAN=\"2\">operations</TH></TR>\n"; while ($channel = db_fetch_object($result)) { // Load backend from database: diff --git a/modules/cron.module b/modules/cron.module index b54b1fdcb..b242388db 100644 --- a/modules/cron.module +++ b/modules/cron.module @@ -2,23 +2,37 @@ $module = array("admin" => "cron_admin"); -function cron_admin() { +include_once "includes/function.inc"; + + +function cron_reset($name) { + cron_delete($name); +} + +function cron_display() { // Perform query: $result = db_query("SELECT * FROM cron"); // Generate output: + $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n"; + $output .= " <TR><TH>module</TH><TH>interval</TH><TH>last exection</TH><TH COLSPAN=\"2\">operations</TH></TR>\n"; while ($cron = db_fetch_object($result)) { - $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n"; - $output .= " <TR><TH VALIGN=\"top\">Name:</TH><TD>". check_output($cron->name) ."</TD></TR>\n"; - $output .= " <TR><TH VALIGN=\"top\">Help:</TH><TD>". check_output($cron->help) ."</TD></TR>\n"; - $output .= " <TR><TH VALIGN=\"top\">Code:</TH><TD><CODE>". nl2br($cron->code) ."</CODE></TD></TR>\n"; - $output .= " <TR><TH VALIGN=\"top\">Last run:</TH><TD>". format_date($cron->timestamp) ."</TD></TR>\n"; - $output .= " <TR><TH VALIGN=\"top\">Scheduled:</TH><TD>every $cron->scheduled seconds</TD></TR>\n"; - $output .= "</TABLE>\n"; - $output .= "<BR><BR>\n"; + $output .= " <TR><TD>". check_output($cron->module) ."</TD><TD>every ". format_interval($cron->scheduled) ."</TD><TD>". format_interval(time() - $cron->timestamp) ." ago</TD><TD ALIGN=\"center\"><A HREF=\"cron.php\">execute</A></TD><TD><A HREF=\"admin.php?mod=cron&op=reset&name=$cron->module\">reset</A></TD></TR>\n"; } - + $output .= "</TABLE>\n"; print $output; } +function cron_admin() { + global $op, $name; + + switch($op) { + case "reset": + cron_reset($name); + break; + } + + cron_display(); +} + ?> diff --git a/modules/diary.module b/modules/diary.module index da92e746d..92c97d5f3 100644 --- a/modules/diary.module +++ b/modules/diary.module @@ -1,6 +1,197 @@ <? -function diary_edit($id) { +$module = array("page" => "diary_page", + "admin" => "diary_admin"); + + +include "includes/theme.inc"; + +function diary_page_overview($num = 20) { + global $theme, $user; + + $result = db_query("SELECT d.*, u.userid FROM diaries d LEFT JOIN users u ON d.author = u.id ORDER BY d.timestamp DESC LIMIT $num"); + + $output .= "<P>This part of the website is dedicated to providing easy to write and easy to read online diaries or journals filled with daily thoughts, poetry, boneless blather, spiritual theories, intimate details, valuable experiences, cynical rants, semi-coherent comments, writing experiments, artistic babblings, critics on actuality, fresh insights, diverse dreams, chronicles and general madness available for general human consumption.</P>"; + + while ($diary = db_fetch_object($result)) { + if ($time != date("F jS", $diary->timestamp)) { + $output .= "<B>". date("l, F jS", $diary->timestamp) ."</B>\n"; + $time = date("F jS", $diary->timestamp); + } + $output .= "<DL>\n"; + $output .= " <DD><P><B>$diary->userid wrote:</B></P></DD>\n"; + $output .= " <DL>\n"; + $output .= " <DD><P>". check_output($diary->text, 1) ."</P><P>[ <A HREF=\"module.php?mod=diary&op=view&name=$diary->userid\">more</A> ]</P></DD>\n"; + $output .= " </DL>\n"; + $output .= "</DL>\n"; + } + + $theme->header(); + $theme->box("Online diary", $output); + $theme->footer(); + +} + +function diary_page_entry($timestamp, $text, $id = 0) { + if ($id) { + $output .= "<DL>\n"; + $output .= " <DT><B>". date("l, F jS", $timestamp) .":</B> </DT>\n"; + $output .= " <DD><P>[ <A HREF=\"module.php?mod=diary&op=edit&id=$id\">edit</A> ]</P><P>". check_output($text, 1) ."</P></DD>\n"; + $output .= "</DL>\n"; + } + else { + $output .= "<DL>\n"; + $output .= " <DT><B>". date("l, F jS", $timestamp) .":</B></DT>\n"; + $output .= " <DD><P>". check_output($text, 1) ."</P></DD>\n"; + $output .= "</DL>\n"; + } + return $output; +} + +function diary_page_display($username) { + global $theme, $user; + + $result = db_query("SELECT d.*, u.userid FROM diaries d LEFT JOIN users u ON d.author = u.id WHERE u.userid = '$username' ORDER BY timestamp DESC"); + + if ($username == $user->userid) { + $output .= diary_page_entry(time(), "<BIG><A HREF=\"module.php?mod=diary&op=add\">Add new diary entry!</A></BIG><P>"); + while ($diary = db_fetch_object($result)) $output .= diary_page_entry($diary->timestamp, $diary->text, $diary->id); + } + else { + $output .= "<P>". format_username($username) ."'s diary:</P>\n"; + while ($diary = db_fetch_object($result)) $output .= diary_page_entry($diary->timestamp, $diary->text); + } + + $theme->header(); + $theme->box("$username's online diary", $output); + $theme->footer(); +} + +function diary_page_add() { + global $theme, $user, $allowed_html; + + $output .= "<FORM ACTION=\"module.php?mod=diary\" METHOD=\"post\">\n"; + + $output .= "<P>\n"; + $output .= " <B>Enter new diary entry:</B><BR>\n"; + $output .= " <TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"15\" NAME=\"text\" MAXLENGTH=\"20\"></TEXTAREA><BR>\n"; + $output .= " <SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL>\n"; + $output .= "</P>\n"; + + $output .= "<P>\n"; + $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Preview diary entry\">\n"; + $output .= "</P>\n"; + + $output .= "</FORM>\n"; + + $theme->header(); + $theme->box("Online diary", $output); + $theme->footer(); +} + +function diary_page_edit($id) { + global $theme, $user, $allowed_html; + + $result = db_query("SELECT * FROM diaries WHERE id = $id"); + $diary = db_fetch_object($result); + + $output .= diary_page_entry($diary->timestamp, $diary->text); + + $output .= "<FORM ACTION=\"module.php?mod=diary\" METHOD=\"post\">\n"; + + $output .= "<P>\n"; + $output .= " <B>Edit diary entry:</B><BR>\n"; + $output .= " <TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"15\" NAME=\"text\">". check_input($diary->text) ."</TEXTAREA><BR>\n"; + $output .= " <SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL>\n"; + $output .= "</P>\n"; + + $output .= "<P>\n"; + $output .= " <INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$diary->id\">\n"; + $output .= " <INPUT TYPE=\"hidden\" NAME=\"timestamp\" VALUE=\"$diary->timestamp\">\n"; + $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Preview diary entry\"> <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Submit diary entry\">\n"; + $output .= "</P>\n"; + + $output .= "</FORM>\n"; + + $theme->header(); + $theme->box("Online diary", $output); + $theme->footer(); +} + +function diary_page_preview($text, $timestamp, $id = 0) { + global $theme, $user, $allowed_html; + + $output .= diary_page_entry($timestamp, $text); + + $output .= "<FORM ACTION=\"module.php?mod=diary\" METHOD=\"post\">\n"; + + $output .= "<P>\n"; + $output .= " <B>Preview diary entry:</B><BR>\n"; + $output .= " <TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"15\" NAME=\"text\">". check_output($text) ."</TEXTAREA><BR>\n"; + $output .= " <SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL>\n"; + $output .= "</P>\n"; + + $output .= "<P>\n"; + $output .= " <INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$id\">\n"; + $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Preview diary entry\">\n"; + $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Submit diary entry\">\n"; + $output .= "</P>\n"; + + $output .= "</FORM>\n"; + + $theme->header(); + $theme->box("Online diary", $output); + $theme->footer(); +} + +function diary_page_submit($text, $id = 0) { + global $user, $theme; + + if ($id) { + watchdog("message", "old diary entry updated"); + db_query("UPDATE diaries SET text = '". check_input($text) ."' WHERE id = $id"); + } + else { + watchdog("diary", "new diary entry added"); + db_query("INSERT INTO diaries (author, text, timestamp) VALUES ('$user->id', '". check_input($text) ."', '". time() ."')"); + } + + header("Location: module.php?mod=diary&op=view&name=$user->userid"); +} + +function diary_page() { + global $op, $id, $name, $text, $timestamp; + + // Security check: + if (strstr($id, " ") || strstr($name, " ")) { + watchdog("error", "diary: attempt to provide malicious input through URI"); + exit(); + } + + switch($op) { + case "add": + diary_page_add(); + break; + case "edit": + diary_page_edit($id); + break; + case "view": + diary_page_display($name); + break; + case "Preview diary entry": + if ($id) diary_page_preview($text, $timestamp, $id); + else diary_page_preview($text, time()); + break; + case "Submit diary entry": + if ($id) diary_page_submit($text, $id); + else diary_page_submit($text); + break; + default: + diary_page_overview(); + } +} + +function diary_admin_edit($id) { $result = db_query("SELECT d.*, u.userid FROM diaries d LEFT JOIN users u ON d.author = u.id WHERE d.id = $id"); $diary = db_fetch_object($result); @@ -25,12 +216,12 @@ function diary_edit($id) { print $output; } -function diary_save($id, $text) { +function diary_admin_save($id, $text) { db_query("UPDATE diaries SET text = '". check_input($text) ."' WHERE id = $id"); watchdog("message", "modified diary entry #$id."); } -function diary_display($order = "date") { +function diary_admin_display($order = "date") { // Initialize variables: $fields = array("author" => "author", "date" => "timestamp DESC"); @@ -59,7 +250,7 @@ function diary_display($order = "date") { $output .= " </TR>\n"; while ($diary = db_fetch_object($result)) { - $output .= " <TR><TD><A HREF=\"diary.php?op=view&name=$diary->userid\">$diary->userid on ". format_date($diary->date, "small") ."</A></TD><TD>". format_username($diary->userid, 1) ."</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=diary&op=edit&id=$diary->id\">edit</A></TD></TR>\n"; + $output .= " <TR><TD><A HREF=\"module.php?mod=diary&op=view&name=$diary->userid\">$diary->userid on ". format_date($diary->date, "small") ."</A></TD><TD>". format_username($diary->userid, 1) ."</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=diary&op=edit&id=$diary->id\">edit</A></TD></TR>\n"; } $output .= "</TABLE>\n"; @@ -73,17 +264,17 @@ function diary_admin() { switch ($op) { case "edit": - diary_edit($id); + diary_admin_edit($id); break; case "Save diary entry": - diary_save($id, $text); - diary_edit($id); + diary_admin_save($id, $text); + diary_admin_edit($id); break; case "Update": - diary_display($order); + diary_admin_display($order); break; default: - diary_display(); + diary_admin_display(); } } diff --git a/modules/documentation.module b/modules/documentation.module index a72f2609b..268e49347 100644 --- a/modules/documentation.module +++ b/modules/documentation.module @@ -32,7 +32,7 @@ function documentation_page() { -rw-rw-r-- 1 drop drop includes/www.yourdomain1.com.conf -rw-rw-r-- 1 drop drop includes/www.yourdomain2.com.conf </PRE> - <P>The only thing left to be done is to setup the corresponding vhosts in your Apache configuration file. Note that the <CODE>DocumentRoot</CODE> points to the same source tree:</P> + <P>The only thing left to be done is to setup the corresponding vhosts in your Apache configuration file. Note that the <CODE>DocumentRoot</CODE> points to the same source tree twice:</P> <PRE> NameVirtualHost 127.0.0.1 @@ -70,15 +70,15 @@ function documentation_page() { </TR> <TR> <TD VALIGN="top"><CODE>page</CODE></TD> - <TD VALIGN="top">If a module requires it's own page, typically exported as <CODE>http://www.yourdomain.com/module.php?mod=module</CODE>, the engine will invoke <CODE>module_page</CODE> to generate a modules page.</TD> + <TD VALIGN="top">If a module requires it's own page it should provide a function named <CODE>module_page</CODE>. The page can then be publicly accessed via <CODE>http://www.yourdomain.com/module.php?mod=module</CODE> which will cause the engine to invoke <CODE>module_page</CODE> in order to generate the module's page.</TD> </TR> <TR> - <TD VALIGN="top"></TD> - <TD VALIGN="top"></TD> + <TD VALIGN="top"><CODE>cron</CODE></TD> + <TD VALIGN="top">Modules that require to schedule some commands to be executed on regular intervals can implement the <CODE>cron</CODE> interface: the engine will then call <CODE>module_cron</CODE> at the appropriate intervals defined by the administrator. This interface is particulary handy to implement timers or to automate certain tasks like for instance database maintainance, recalculation of settings or parameters, automatic mailings and so on.</TD> </TR> <TR> - <TD VALIGN="top"></TD> - <TD VALIGN="top"></TD> + <TD VALIGN="top"><CODE>admin</CODE></TD> + <TD VALIGN="top">If a module requires a spot in the administrator section it should implement <CODE>module_admin</CODE>. The engine will automatically add a link to the administration menus and will call <CODE>module_admin</CODE> when this link is followed. In order to make virtually any module maintainer's life easier, you don't have to worry about access rights or permissions for that matter. The engine will only allow priveleged users to call exported <CODE>admin</CODE> functions.</TD> </TR> <TR> <TD VALIGN="top"></TD> @@ -101,7 +101,7 @@ function documentation_page() { <P>The site can be almost entirely configured through a web interface by using <I>droplets</I>. Simply put, droplets are small bit of PHP code which will get plugged into the engine or modules powering the site. Droplets are typically used to link modules with the mainstream engine or to customize various aspects of the engine itself.</P> <P>If you know how to script in PHP, droplets are pretty simple to create. Don't get your panties in a knot if you are not confident with PHP: simply use the standard droplets (i.e. those available by default) as they are just fine or ask an expert dropletber to help you creating custom droplets that fit your need.</P> - <P>Each droplet consist of a key of maximum 255 characters and an associated block of PHP code which can be as long as you want it to be. You can use any piece of PHP code to make up a droplet. A droplet's code is stored in the database and the engine or a particular module will use the key to find the associated piece of PHP code which will then be dynamically embedded in the engine or the module just-in-time for execution.</P> + <P>Each droplet consists of a key of maximum 255 characters and an associated block of PHP code which can be as long as you want it to be. You can use any piece of PHP code to make up a droplet. A droplet's code is stored in the database and the engine or a particular module will use the key to find the associated piece of PHP code which will then be dynamically embedded in the engine or the module just-in-time for execution.</P> <P>There are however some factors to keep in mind when using and creating droplets: droplets can be extremly useful and flexible, yet be dangerous and insecure if not properly used. If you are not confident with PHP, SQL or even with the site engine for that matter, avoid experimenting with droplets because you can - and you probably will - corrupt your database or even break your site!</P> <P>Remember that the code within each droplet must be valid PHP code, including things like terminating statements with a semicolon so the parser won't die. Therefore, it is highly recommended to test your droplets seperatly using a simple test script on top of a test database before migrating to your production environment running your real database.</P> <P>Note that you can use any global variables, such as configuration parameters within the scope of a droplet and keep in mind that variables that have been given values in a droplet will retain these values in the engine or module afterwards.</P> @@ -122,7 +122,22 @@ function documentation_page() { </PRE> <P>For more in depth example, we recommand you to check any of the available modules and to go from there.</P> <P>As said above, you can virtually use any piece of PHP code in a droplet: you can declare and use functions, consult the SQL database, access configuration settings and so on.</P> - <? -} + + <H3>cron</H3> + + <P>Cron (wich stands for chronograph) is a periodic command scheduler: it executes commands at intervals specified in seconds. It can be used to control the execution of daily, weekly and monthly jobs (or anything with a period of n seconds). Automating tasks is one of the best ways to keep a system running smoothly, and if most of your administration does not require your direct involvement, cron is an ideal solution.</P> + <P>Note that cron does not guarantee that the commands will be executed at the specified interval. However, the engine will make sure that the commands are run at the specified intervals as closely as possible.</P> + <P>When <CODE>http://www.yourdomain.com/cron.php</CODE> is accessed, cron will run: it queries the database for the jobs cron controls, and their periods in seconds. If a certain task wasn't executed in the last n seconds, where n is the period of that job, it will be executed. It then records the date in the database so it can know when to run it again. When all the executed commands terminate, cron is done.</P> + <P>Cron is handy to run daily, weekly and monthly tasks that +take care of various "housekeeping chores" such as database maintainance, +recalculating settings, periodic mailings, scheduled backups and so on.</P> + <P>The recommanded way to setup drop.org's cron job is to setup a real UNIX <CODE>crontab</CODE> that frequently visits <CODE>http://www.yourdomain.com/cron.php</CODE>: the more you visit the <CODE>cron.php</CODE>, the more accurate cron can and will be. If your hosting company does not allow you to use <CODE>crontab</CODE>, you can always ask someone else to setup a <CODE>crontab</CODE> for you. Afterall, virtually any host machine with access to the internet can run the <CODE>crontab</CODE> for you.<P> + <P>For the <CODE>crontab</CODE>, use a browser like <CODE>lynx</CODE> or <CODE>wget</CODE> but make sure the process terminates: either use <CODE>/usr/bin/lynx -source http://www.yourdomain.com/cron.php</CODE> or <CODE>/usr/bin/wgeti -O /dev/null http://www.yourdomain.com/cron.php</CODE>. Take a look at the example scripts in the <CODE>scripts</CODE>-directory and make sure to adjust them to your needs.</P> + <P>A good <CODE>crontab</CODE>-line to run the <CODE>cron</CODE>-script once every hour would be:</P> + <PRE> + 00 * * * * /home/www/drop/scripts/cron-lynx + </PRE> + <? + } ?> diff --git a/modules/watchdog.module b/modules/watchdog.module index f60e4eaeb..1b10f672e 100644 --- a/modules/watchdog.module +++ b/modules/watchdog.module @@ -1,6 +1,11 @@ <? -$module = array("admin" => "watchdog_admin"); +$module = array("cron" => "watchdog_cron", + "admin" => "watchdog_admin"); + +function watchdog_cron() { + watchdog_clean(); +} function watchdog_display($order = "date") { $colors = array("#D8BFD8", "#6495ED", "#6A5ADF", "#FFFFFF", "#FFA500", "#FF3C3C"); @@ -31,7 +36,7 @@ function watchdog_display($order = "date") { $output .= " </TR>\n"; while ($watchdog = db_fetch_object($result)) { - $output .= " <TR BGCOLOR=\"". $colors[$watchdog->level] ."\"><TD>". format_date($watchdog->timestamp) ."</TD><TD>". substr(check_output($watchdog->message), 0, 44) ."</TD><TD ALIGN=\"center\">". format_username($watchdog->userid, 1) ."</A></TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=watchdog&op=view&id=$watchdog->id\">more</A></TD></TR>\n"; + $output .= " <TR BGCOLOR=\"". $colors[$watchdog->level] ."\"><TD>". format_date($watchdog->timestamp) ."</TD><TD>". substr(check_output($watchdog->message), 0, 44) ."</TD><TD ALIGN=\"center\">". format_username($watchdog->userid, 1) ."</A></TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=watchdog&op=view&id=$watchdog->id\">details</A></TD></TR>\n"; } $output .= "</TABLE>\n"; diff --git a/modules/watchdog/watchdog.module b/modules/watchdog/watchdog.module index f60e4eaeb..1b10f672e 100644 --- a/modules/watchdog/watchdog.module +++ b/modules/watchdog/watchdog.module @@ -1,6 +1,11 @@ <? -$module = array("admin" => "watchdog_admin"); +$module = array("cron" => "watchdog_cron", + "admin" => "watchdog_admin"); + +function watchdog_cron() { + watchdog_clean(); +} function watchdog_display($order = "date") { $colors = array("#D8BFD8", "#6495ED", "#6A5ADF", "#FFFFFF", "#FFA500", "#FF3C3C"); @@ -31,7 +36,7 @@ function watchdog_display($order = "date") { $output .= " </TR>\n"; while ($watchdog = db_fetch_object($result)) { - $output .= " <TR BGCOLOR=\"". $colors[$watchdog->level] ."\"><TD>". format_date($watchdog->timestamp) ."</TD><TD>". substr(check_output($watchdog->message), 0, 44) ."</TD><TD ALIGN=\"center\">". format_username($watchdog->userid, 1) ."</A></TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=watchdog&op=view&id=$watchdog->id\">more</A></TD></TR>\n"; + $output .= " <TR BGCOLOR=\"". $colors[$watchdog->level] ."\"><TD>". format_date($watchdog->timestamp) ."</TD><TD>". substr(check_output($watchdog->message), 0, 44) ."</TD><TD ALIGN=\"center\">". format_username($watchdog->userid, 1) ."</A></TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=watchdog&op=view&id=$watchdog->id\">details</A></TD></TR>\n"; } $output .= "</TABLE>\n"; diff --git a/modules/wishlist.module b/modules/wishlist.module index cef706ccd..bbc9e31bd 100644 --- a/modules/wishlist.module +++ b/modules/wishlist.module @@ -29,13 +29,6 @@ function wishlist_page() { <UL> <LI>blocks and flexible block placement strategies by means of "layout managers" (cfr. Java) and tightly integrated with the module support</LI> <LI>post/edit hash - magic cookie: to prevent malicious external access and to prevent duplicate posts because of hitting the "reload" button</LI> - <LI>cron job emulation:</LI> - <UL> - <LI>auto. set default theme according to popularity</LI> - <LI>auto. database clean-up (e.g. history field)</LI> - <LI>auto. recalculate adaptive/dynamic settings like thresholds</LI> - <LI>auto. mail digests</LI> - </UL> <LI>URL validator</LI> <LI>more adaptive submission queue</LI> <LI>archive function</LI> @@ -60,6 +53,7 @@ function wishlist_page() { <LI>messaging system between users</LI> <LI>voting polls</LI> <LI>daily/weekly e-mail digest - mailing list</LI> + <LI>story overview grouped by category</LI> <LI>e-commerce/shop</LI> </UL> |