Files
selima-perl/lib/php/monica/process.inc.php
2026-03-10 21:31:43 +08:00

2566 lines
93 KiB
PHP

<?php
// File name: process.inc.php
// Description: PHP classes to process a form
// Date: 2005-06-28
// Author: imacat <imacat@pristine.com.tw>
// Copyright: Copyright (C) 2005-2011 Pristine Communications
// Set the include path
if (!defined("INCPATH_SET")) {
require_once dirname(__FILE__) . "/incpath.inc.php";
}
// Referenced subroutines
require_once "monica/actlog.inc.php";
require_once "monica/addcol.inc.php";
require_once "monica/cgiemu.inc.php";
require_once "monica/chkpriv.inc.php";
require_once "monica/commtext.inc.php";
require_once "monica/geoip.inc.php";
require_once "monica/getlang.inc.php";
require_once "monica/gettext.inc.php";
require_once "monica/guest.inc.php";
require_once "monica/hires.inc.php";
require_once "monica/http.inc.php";
require_once "monica/links.inc.php";
require_once "monica/lninfo.inc.php";
require_once "monica/login.inc.php";
require_once "monica/logout.inc.php";
require_once "monica/news.inc.php";
require_once "monica/pic.inc.php";
require_once "monica/requri.inc.php";
require_once "monica/scptpriv.inc.php";
require_once "monica/sql.inc.php";
require_once "monica/unicode.inc.php";
require_once "monica/username.inc.php";
require_once "monica/userpref.inc.php";
require_once "monica/usrconst.inc.php";
// Settings
// BaseProcessor: Base form processor class
class BaseProcessor
{
// Accessible by other processors
public $_sn = null;
protected $_form = array();
protected $_cur = array();
protected $_req = array();
protected $_table = null;
protected $_type = null;
protected $_step = null;
protected $_cols = null;
protected $_pres = array();
protected $_subs = array();
protected $_is_sql = true;
protected $_update_timestamp = true;
protected $_modified = null;
protected $_curshown = null;
protected $_newshown = null;
// __construct: Initialize the processor
function __construct(&$form, $table = null)
{
$this->_form =& $form;
$this->_table = $table;
$this->_pres = array();
$this->_subs = array();
if (!is_null($this->_form("form"))) {
$this->_type = $this->_form["form"];
}
if (!is_null($this->_form("step"))) {
$this->_step = $this->_form["step"];
}
if (!is_null($this->_form("sn"))) {
$this->_sn = $this->_form["sn"];
}
// The current item
if (array_key_exists("CURRENT", $GLOBALS)) {
$this->_cur =& $GLOBALS["CURRENT"];
}
// The user request
if (array_key_exists("REQUEST", $GLOBALS)) {
$this->_req =& $GLOBALS["REQUEST"];
}
return;
}
// process: Process the form, fully
function process()
{
// Submitted but not confirmed yet
if (is_null($this->_form("confirm"))) {
return array("preview"=>true);
}
// Save the column deposit
$this->_save_cols();
// Not modified
if (!$this->_modified()) {
return $this->_ret_status();
}
// Begin the SQL transaction
if ($this->_is_sql) {
sql_begin();
}
// Update the columns
$this->_update_cols();
// Rebuild a limited part of pages
$this->_rebuild_partial_pages();
// Send mails
$this->_send_mails();
// Perform tasks other than column updates
$this->_other_tasks();
// Commit the SQL transaction
if ($this->_is_sql) {
sql_commit();
}
// Log and return the process status
$this->_actlog();
return $this->_ret_status();
}
/////////////////////////
// Methods belows are private. Do not call them directly.
// Override them when needed.
/////////////////////////
// _save_cols: Save the column deposit
function _save_cols()
{
if (is_null($this->_type)) {
return;
}
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
break;
}
return;
}
// _update_cols: Update the columns
function _update_cols()
{
// Run the pre-processing sub-processors
for ($i = 0; $i < count($this->_pres); $i++) {
if ($this->_pres[$i]->_modified()) {
$this->_pres[$i]->_update_cols();
}
}
// Process the update
if ($this->_is_sql && !is_null($this->_type)) {
switch ($this->_type) {
// A form to create a new item
case "new":
if (!is_null($this->_cols)) {
$insert = "INSERT INTO " . $this->_table
. " " . $this->_cols->ret($this->_update_timestamp) . ";\n";
gsql_query($insert);
}
break;
// A form to edit a current item
case "cur":
if (!is_null($this->_cols) && !is_null($this->_sn)) {
$update = "UPDATE " . $this->_table
. " " . $this->_cols->ret($this->_update_timestamp)
. " WHERE sn=" . $this->_sn . ";\n";
gsql_query($update);
}
break;
// A form to delete a current item
case "del":
if (!is_null($this->_sn)) {
$delete = "DELETE FROM " . $this->_table
. " WHERE sn=" . $this->_sn . ";\n";
gsql_query($delete);
}
break;
}
}
// Run the sub-processors
for ($i = 0; $i < count($this->_subs); $i++) {
if ($this->_subs[$i]->_modified()) {
$this->_subs[$i]->_update_cols();
}
}
return;
}
// _rebuild_partial_pages: Rebuild a limited part of pages
// Empty by default. Put page building code here.
function _rebuild_partial_pages()
{
return;
}
// _send_mails: Send the mails
// Empty by default.
function _send_mails()
{
return;
}
// _other_tasks: Perform tasks other than column updates
// Empty by default.
function _other_tasks()
{
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a record with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the record with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the record with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This record was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This record has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This record has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This record has been successfully deleted."),
"isform"=>false);
}
}
// _form: Return a specific form value
// Return null if that column is empty
function _form($name)
{
return array_key_exists($name, $this->_form)?
$this->_form[$name]: null;
}
// _mcur: Return a specific current value, for use in e-mail notification
// Return (blank) if that column is empty
// Override it to obtain certain values for certain columns
function _mcur($name)
{
return array_key_exists($name, $this->_cur)
&& !is_null($this->_cur[$name])
&& $this->_cur[$name] != ""?
$this->_cur[$name]: t_blank();
}
// _mform: Return a specific form value, for use in e-mail notification
// Return (blank) if that column is empty
// Override it to obtain certain values for certain columns
function _mform($name)
{
return array_key_exists($name, $this->_form)
&& !is_null($this->_form[$name])
&& $this->_form[$name] != ""?
$this->_form[$name]: t_blank();
}
/////////////////////////
// Methods belows are private. Do not call them directly.
// Do not override them, either.
/////////////////////////
// _modified: If the item is modified
function _modified()
{
// Modification status checked before
if (!is_null($this->_modified)) {
return $this->_modified;
}
// Return true for addition and deletion processors
if (!is_null($this->_type) && $this->_type != "cur") {
$this->_modified = true;
return $this->_modified;
}
// Return true if the columns are modified
if (!is_null($this->_cols) && $this->_cols->modified()) {
$this->_modified = true;
return $this->_modified;
}
// Return true if any of the subprocessors is modified
for ($i = 0; $i < count($this->_pres); $i++) {
if ($this->_pres[$i]->_modified()) {
$this->_modified = true;
return $this->_modified;
}
}
for ($i = 0; $i < count($this->_subs); $i++) {
if ($this->_subs[$i]->_modified()) {
$this->_modified = true;
return $this->_modified;
}
}
// Not modified
$this->_modified = false;
return $this->_modified;
}
// _zhsync: Automatic Traditional Chinese to Simplified Chinese conversion
function _zhsync()
{
// Get the available languages list
global $ALL_LINGUAS;
// Skip unless multilingual
if (count($ALL_LINGUAS) == 1) {
return;
}
// Skip unless we are in Traditional Chinese, and there is Simplified Chinese
if (getlang() != "zh-tw" || !in_array("zh-cn", $ALL_LINGUAS)) {
return;
}
switch ($this->_type) {
// A form to create a new item
case "new":
foreach (sql_cols_ml($this->_table) as $col) {
if (!is_null($this->_form($col))) {
$this->_cols->addstr($col . "_zhcn", trad_to_simp($this->_form[$col]));
}
}
break;
// A form to edit a current item
case "cur":
foreach (sql_cols_ml($this->_table) as $col) {
if (!is_null($this->_form($col))) {
$this->_cols->addstr($col . "_zhcn", trad_to_simp($this->_form[$col]), $this->_cur[$col . "_zhcn"]);
}
}
break;
}
}
// _new_sn: Generate a new random serial number for an SQL table
function _new_sn()
{
// S/N is always 9 digits
do {
// Generate a random serial number
$sn = mt_rand(100000000, 999999999);
// Check if this serial number exists
$select = "SELECT sn FROM " . $this->_table
. " WHERE sn=$sn;\n";
$result = sql_query($select);
} while (sql_num_rows($result) > 0);
return $sn;
}
// _req_hostport: Find the host-port of the POSTer, to be used in the e-mail.
// This may not be the same as myself, since user may pass to
// an SSL handler from a non-SSL form.
function _req_hostport()
{
// Cache the resuit
static $cache;
// Return the cache
if (isset($cache)) {
return $cache;
}
if (!is_null($this->_form("referer"))) {
$ref = $this->_form["referer"];
} elseif (array_key_exists("HTTP_REFERER", $_SERVER)) {
$ref = $_SERVER["HTTP_REFERER"];
}
if ( isset($ref)
&& substr($ref, -strlen(REQUEST_PATH)) == REQUEST_PATH) {
$cache = substr($ref, 0, -strlen(REQUEST_PATH));
} else {
$cache = REQUEST_HOSTPORT;
}
return $cache;
}
}
// BaseCategoryProcessor: Base category form processor class
class BaseCategoryProcessor extends BaseProcessor
{
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This category was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This category has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This category has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This category has been successfully deleted."),
"isform"=>false);
}
}
}
// BaseCategorizationProcessor: Base categorization record form processor class
class BaseCategorizationProcessor extends BaseProcessor
{
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This categorization record was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This categorization record has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This categorization record has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This categorization record has been successfully deleted."),
"isform"=>false);
}
}
}
// DeletionProcessor: Deletion form processor class
// Deletion condition is the value of the "cond" column in the form
class DeletionProcessor extends BaseProcessor
{
protected $_cond = null;
// __construct: Initialize the processor
function __construct(&$form, $table = null)
{
$form["form"] = "del";
parent::__construct($form, $table);
$this->_cond = $this->_form["cond"];
}
// _update_cols: Update the columns
function _update_cols()
{
// Process the update
$delete = "DELETE FROM " . $this->_table
. " WHERE " . $this->_cond . ";\n";
gsql_query($delete);
return;
}
}
// ListPreferenceProcessor: List preference form processor class
class ListPreferenceProcessor extends BaseProcessor
{
protected $_names = array();
// __construct: Initialize the processor
function __construct(&$form, $table = null)
{
parent::__construct($form, $table);
if (is_guest()) {
$this->_is_sql = false;
}
$this->_names = array("listsize", "listcols");
}
// process: Process the form, fully
function process()
{
// Use the parent processor for ordinary users
// Users without Cookies turned on may have an empty log-in S/N
if (!is_null(get_login_sn()) && !is_guest()) {
return parent::process();
}
// Guest preferences are saved in $_SESSION
if (!array_key_exists("userpref", $_SESSION)) {
$_SESSION["userpref"] = array();
}
if (!array_key_exists($this->_form["domain"], $_SESSION["userpref"])) {
$_SESSION["userpref"][$this->_form["domain"]] = array();
}
foreach ($this->_names as $name) {
$_SESSION["userpref"][$this->_form["domain"]][$name] = $this->_prefval($name);
}
return;
}
// _save_cols: Save the column deposit
function _save_cols()
{
for ($i = 0; $i < count($this->_names); $i++) {
// Obtain the preference value
$val = $this->_prefval($this->_names[$i]);
// Only update if value is different
if (userpref($this->_names[$i], $this->_form["domain"]) == $val) {
continue;
}
// Check if there is already an existing user preference
$select = "SELECT * FROM userpref"
. " WHERE usr=" . get_login_sn()
. " AND domain='" . sql_esctext($this->_form["domain"]) . "'"
. " AND name='" . sql_esctext($this->_names[$i]) . "';\n";
$result = sql_query($select);
// There is an existing user preference
if (sql_num_rows($result) == 1) {
$row = sql_fetch_assoc($result);
unset($GLOBALS["CURRENT"]);
$GLOBALS["CURRENT"] = array(
"sn" => $row["sn"],
"usr" => $row["usr"],
"domain" => $row["domain"],
"name" => $row["name"],
"value" => $row["value"],
);
unset($FORM);
$FORM = array();
$FORM["form"] = "cur";
$FORM["sn"] = $row["sn"];
$FORM["usr"] = get_login_sn();
$FORM["domain"] = $this->_form("domain");
$FORM["name"] = $this->_names[$i];
$FORM["value"] = $val;
$processor = new UserPreferenceProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
unset($GLOBALS["CURRENT"]);
if (!is_null($this->_cur)) {
$GLOBALS["CURRENT"] =& $this->_cur;
}
// There is no existing user preference
} else {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["usr"] = get_login_sn();
$FORM["domain"] = $this->_form("domain");
$FORM["name"] = $this->_names[$i];
$FORM["value"] = $val;
$processor = new UserPreferenceProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
}
return;
}
// _actlog: Log the activity
function _actlog()
{
// Run the sub-processors
for ($i = 0; $i < count($this->_subs); $i++) {
if ($this->_subs[$i]->_modified()) {
$this->_subs[$i]->_actlog();
}
}
}
// _prefval: Obtain the preference value
function _prefval($name)
{
// Specified
if (!is_null($this->_form($name))) {
return $this->_form[$name];
}
// No need to check the validility. Invalids are simply ignored.
$cols = array();
foreach (array_keys($this->_form) as $key) {
if (preg_match("/^" . $name . "_(.+)$/", $key, $m)) {
$cols[] = $m[1];
}
}
// Compose the preference value
return implode(" ", $cols);
}
}
// UserProcessor: User form processor class
class UserProcessor extends BaseProcessor
{
// If it is a user editing herself (return from confirmation mail)
public $_is_self = false;
// If we should update the groups
public $_no_set_groups = false;
// If we need to purge the user's password
public $_purge_passwd = null;
// __construct: Initialize the processor
function __construct(&$form, $table = "users")
{
parent::__construct($form, $table);
// Non-super-users editing herself are not allowed to update the groups
if (!is_null($this->_sn) && !is_su() && $this->_sn == get_login_sn()) {
$this->_no_set_groups = true;
}
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
if ($this->_is_self && is_null(get_login_sn())) {
$this->_cols->login = $this->_sn;
}
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("id", $this->_form("id"));
$this->_cols->addpass("passwd", $this->_purge_passwd(), $this->_form("passwd"));
$this->_cols->addstr("name", $this->_form("name"));
$this->_cols->addbool("disabled", $this->_form("disabled"));
// Find the changed items
if (!$this->_no_set_groups) {
$additems = array();
for ($i = 0; !is_null($this->_form("supgroup$i" . "sn")); $i++) {
if (!is_null($this->_form("supgroup$i"))) {
$additems[] = $this->_form["supgroup$i" . "sn"];
}
}
// Super users can set the super-user privilege
if (is_su()) {
// Super user privilege is added
if (!is_null($this->_form("su"))) {
$additems[] = su_group_sn();
}
}
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $item;
$FORM["member"] = $this->_sn;
$processor = new UserMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
}
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
if ($this->_is_self && is_null(get_login_sn())) {
$this->_cols->login = $this->_sn;
}
// Skip for non-super-user editing a super-user
if (!(!is_su() && $this->_cur["su"])) {
$this->_cols->addstr("id", $this->_form("id"), $this->_cur["id"]);
$this->_cols->addpass("passwd", $this->_purge_passwd(), $this->_form("passwd"), $this->_cur["passwd"]);
}
$this->_cols->addstr("name", $this->_form("name"), $this->_cur["name"]);
// Skip for non-super-user editing herself or a super-user
if (!(!is_su() && ($this->_cur["su"] || $this->_sn == get_login_sn()))) {
$this->_cols->addbool("disabled", $this->_form("disabled"), $this->_cur["disabled"]);
}
if (!is_null($this->_form("failsreset"))) {
$this->_cols->addnum("fails", 0, $this->_cur["fails"]);
}
// Find the changed items
if (!$this->_no_set_groups) {
$olditems = array();
$newitems = array();
for ($i = 0; array_key_exists("supgroup$i" . "sn", $this->_cur); $i++) {
$olditems[] = $this->_cur["supgroup$i" . "sn"];
}
for ($i = 0; !is_null($this->_form("supgroup$i" . "sn")); $i++) {
if (!is_null($this->_form("supgroup$i"))) {
$newitems[] = $this->_form["supgroup$i" . "sn"];
}
}
$delitems = array_values(array_diff($olditems, $newitems));
$additems = array_values(array_diff($newitems, $olditems));
// Super users can set the super-user privilege
if (is_su()) {
// Super user privilege is added
if (!$this->_cur["su"] && !is_null($this->_form("su"))) {
$additems[] = su_group_sn();
// Super user privilege is removed
} elseif ($this->_cur["su"] && is_null($this->_form("su"))) {
$delitems[] = su_group_sn();
}
}
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $item;
$FORM["member"] = $this->_sn;
$processor = new UserMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
if (count($delitems) > 0) {
for ($i = 0; $i < count($delitems); $i++) {
$delitems[$i] = "grp=" . $delitems[$i];
}
$cond = implode(" OR ", $delitems);
if (count($delitems) > 1) {
$cond = "($cond)";
}
unset($FORM);
$FORM = array();
$FORM["cond"] = $cond . " AND member=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "usermem");
}
}
break;
// A form to delete a current item
case "del":
// Find the changed items
if ($this->_cur["supgroupcount"] > 0) {
unset($FORM);
$FORM = array();
$FORM["cond"] = "member=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "usermem");
}
unset($FORM);
$FORM = array();
$FORM["cond"] = "usr=" . $this->_sn;
$this->_pres[] = new DeletionProcessor($FORM, "userpref");
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a user account " . $this->_form["id"]
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the user account "
. (!is_null($this->_form("id"))? $this->_form["id"]: $this->_cur["id"])
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the user account " . $this->_cur["id"]
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This user account was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This user account has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This user account has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This user account has been successfully deleted."),
"isform"=>false);
}
}
// _purge_passwd: If we need to purge the password of the user
function _purge_passwd()
{
// Checked before
if (!is_null($this->_purge_passwd)) {
return $this->_purge_passwd;
}
// Purge password for guests
if (!$this->_no_set_groups) {
for ($i = 0; !is_null($this->_form("supgroup$i" . "sn")); $i++) {
// Skip unselected groups
if (is_null($this->_form("supgroup$i"))) {
continue;
}
// Check if this is the guest group
if (groupid($this->_form["supgroup$i" . "sn"]) == GUEST_GROUP) {
$this->_purge_passwd = true;
return true;
}
}
}
// No guest group was found
$this->_purge_passwd = false;
return false;
}
}
// GroupProcessor: Group form processor class
class GroupProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "groups")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("id", $this->_form("id"));
$this->_cols->addstr("dsc", $this->_form("dsc"));
// Find the changed items
$additems = array();
for ($i = 0; !is_null($this->_form("subuser$i" . "sn")); $i++) {
if (!is_null($this->_form("subuser$i"))) {
$additems[] = $this->_form["subuser$i" . "sn"];
}
}
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $this->_sn;
$FORM["member"] = $item;
$processor = new UserMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
$additems = array();
for ($i = 0; !is_null($this->_form("subgroup$i" . "sn")); $i++) {
if (!is_null($this->_form("subgroup$i"))) {
$additems[] = $this->_form["subgroup$i" . "sn"];
}
}
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $this->_sn;
$FORM["member"] = $item;
$processor = new GroupMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
$additems = array();
for ($i = 0; !is_null($this->_form("supgroup$i" . "sn")); $i++) {
if (!is_null($this->_form("supgroup$i"))) {
$additems[] = $this->_form["supgroup$i" . "sn"];
}
}
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $item;
$FORM["member"] = $this->_sn;
$processor = new GroupMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
// Skip for a non-super-user editing a super-user group
if (!(!is_su() && $this->_sn == su_group_sn())) {
$this->_cols->addstr("id", $this->_form("id"), $this->_cur["id"]);
}
$this->_cols->addstr("dsc", $this->_form("dsc"), $this->_cur["dsc"]);
// Find the changed items
$olditems = array();
$newitems = array();
// Skip for a non-super-user editing a super-user group
if (!(!is_su() && $this->_sn == su_group_sn())) {
for ($i = 0; array_key_exists("subuser$i" . "sn", $this->_cur); $i++) {
$olditems[] = $this->_cur["subuser$i" . "sn"];
}
for ($i = 0; !is_null($this->_form("subuser$i" . "sn")); $i++) {
if (!is_null($this->_form("subuser$i"))) {
$newitems[] = $this->_form["subuser$i" . "sn"];
}
}
}
$delitems = array_values(array_diff($olditems, $newitems));
$additems = array_values(array_diff($newitems, $olditems));
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $this->_sn;
$FORM["member"] = $item;
$processor = new UserMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
if (count($delitems) > 0) {
for ($i = 0; $i < count($delitems); $i++) {
$delitems[$i] = "member=" . $delitems[$i];
}
$cond = implode(" OR ", $delitems);
if (count($delitems) > 1) {
$cond = "($cond)";
}
unset($FORM);
$FORM = array();
$FORM["cond"] = $cond . " AND grp=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "usermem");
}
$olditems = array();
$newitems = array();
// Skip for a non-super-user editing a super-user group
if (!(!is_su() && $this->_sn == su_group_sn())) {
for ($i = 0; array_key_exists("subgroup$i" . "sn", $this->_cur); $i++) {
$olditems[] = $this->_cur["subgroup$i" . "sn"];
}
for ($i = 0; !is_null($this->_form("subgroup$i" . "sn")); $i++) {
if (!is_null($this->_form("subgroup$i"))) {
$newitems[] = $this->_form["subgroup$i" . "sn"];
}
}
}
$delitems = array_values(array_diff($olditems, $newitems));
$additems = array_values(array_diff($newitems, $olditems));
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $this->_sn;
$FORM["member"] = $item;
$processor = new GroupMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
if (count($delitems) > 0) {
for ($i = 0; $i < count($delitems); $i++) {
$delitems[$i] = "member=" . $delitems[$i];
}
$cond = implode(" OR ", $delitems);
if (count($delitems) > 1) {
$cond = "($cond)";
}
unset($FORM);
$FORM = array();
$FORM["cond"] = $cond . " AND grp=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "groupmem");
}
$olditems = array();
$newitems = array();
// Skip for a non-super-user editing a super-user group
if (!(!is_su() && $this->_sn == su_group_sn())) {
for ($i = 0; array_key_exists("supgroup$i" . "sn", $this->_cur); $i++) {
$olditems[] = $this->_cur["supgroup$i" . "sn"];
}
for ($i = 0; !is_null($this->_form("supgroup$i" . "sn")); $i++) {
if (!is_null($this->_form("supgroup$i"))) {
$newitems[] = $this->_form["supgroup$i" . "sn"];
}
}
}
$delitems = array_values(array_diff($olditems, $newitems));
$additems = array_values(array_diff($newitems, $olditems));
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["grp"] = $item;
$FORM["member"] = $this->_sn;
$processor = new GroupMembershipProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
if (count($delitems) > 0) {
for ($i = 0; $i < count($delitems); $i++) {
$delitems[$i] = "grp=" . $delitems[$i];
}
$cond = implode(" OR ", $delitems);
if (count($delitems) > 1) {
$cond = "($cond)";
}
unset($FORM);
$FORM = array();
$FORM["cond"] = $cond . " AND member=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "groupmem");
}
break;
// A form to delete a current item
case "del":
// Find the changed items
if ($this->_cur["subusercount"] > 0) {
unset($FORM);
$FORM = array();
$FORM["cond"] = "grp=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "usermem");
}
if ($this->_cur["subgroupcount"] + $this->_cur["supgroupcount"] > 0) {
unset($FORM);
$FORM = array();
$FORM["cond"] = "grp=" . $this->_sn . " OR member=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "groupmem");
}
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a group " . $this->_form["id"]
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the group " . $this->_form["id"]
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the group " . $this->_cur["id"]
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This group was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This group has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This group has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This group has been successfully deleted."),
"isform"=>false);
}
}
}
// UserMembershipProcessor: User membership form processor class
class UserMembershipProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "usermem")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addnum("grp", $this->_form("grp"));
$this->_cols->addnum("member", $this->_form("member"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addnum("grp", $this->_form("grp"), $this->_cur["grp"]);
$this->_cols->addnum("member", $this->_form("member"), $this->_cur["member"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a user membership record " . userid($this->_form["member"])
. " in group " . groupid($this->_form["grp"])
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the user membership record " . userid($this->_form["member"])
. " in group " . groupid($this->_form["grp"])
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the user membership record " . userid($this->_cur["member"])
. " in group " . groupid($this->_cur["grp"])
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This membership record was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This membership record has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This membership record has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This membership record has been successfully deleted."),
"isform"=>false);
}
}
}
// GroupMembershipProcessor Group membership form processor class
class GroupMembershipProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "groupmem")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addnum("grp", $this->_form("grp"));
$this->_cols->addnum("member", $this->_form("member"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addnum("grp", $this->_form("grp"), $this->_cur["grp"]);
$this->_cols->addnum("member", $this->_form("member"), $this->_cur["member"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a group membership record " . groupid($this->_form["member"])
. " in group " . groupid($this->_form["grp"])
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the group membership record " . groupid($this->_form["member"])
. " in group " . groupid($this->_form["grp"])
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the group membership record " . groupid($this->_cur["member"])
. " in group " . groupid($this->_cur["grp"])
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This membership record was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This membership record has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This membership record has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This membership record has been successfully deleted."),
"isform"=>false);
}
}
}
// ScriptPrivilegeProcessor: Script privilege form processor class
class ScriptPrivilegeProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "scptpriv")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("script", $this->_form("script"));
$this->_cols->addnum("grp", $this->_form("grp"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addstr("script", $this->_form("script"), $this->_cur["script"]);
$this->_cols->addnum("grp", $this->_form("grp"), $this->_cur["grp"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a script privilege record " . $this->_form["script"]
. " for group " . groupid($this->_form["grp"])
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the script privilege record " . $this->_form["script"]
. " for group " . groupid($this->_form["grp"])
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the script privilege record " . $this->_cur["script"]
. " for group " . groupid($this->_cur["grp"])
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This script privilege record was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This script privilege record has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This script privilege record has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This script privilege record has been successfully deleted."),
"isform"=>false);
}
}
}
// UserPreferenceProcessor: User preference form processor class
class UserPreferenceProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "userpref")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
if ($this->_type != "del") {
// Set the "everyone" user
if ( !is_null($this->_form("everyone"))
&& $this->_form["everyone"] == "true") {
unset($this->_form["usr"]);
}
// Set the "everywhere" domain
if ( !is_null($this->_form("everywhere"))
&& $this->_form["everywhere"] == "true") {
unset($this->_form["domain"]);
}
}
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addnum("usr", $this->_form("usr"));
$this->_cols->addstr("domain", $this->_form("domain"));
$this->_cols->addstr("name", $this->_form("name"));
$this->_cols->addstr_empty("value", $this->_form("value"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addnum("usr", $this->_form("usr"), $this->_cur["usr"]);
$this->_cols->addstr("domain", $this->_form("domain"), $this->_cur["domain"]);
$this->_cols->addstr("name", $this->_form("name"), $this->_cur["name"]);
$this->_cols->addstr_empty("value", $this->_form("value"), $this->_cur["value"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
if ( !is_null($this->_form("everyone"))
&& $this->_form["everyone"] == "true") {
$user = "everyone";
} elseif (is_null($this->_form("usr"))) {
$user = "everyone";
} else {
$user = userid($this->_form["usr"]);
}
if ( !is_null($this->_form("everywhere"))
&& $this->_form["everywhere"] == "true") {
$domain = "everywhere";
} elseif (is_null($this->_form("domain"))) {
$domain = "everywhere";
} else {
$domain = $this->_form["domain"];
}
return gactlog("Create a user preference \"" . $this->_form["name"] . "\""
. " of $user for $domain"
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
if ( !is_null($this->_form("everyone"))
&& $this->_form["everyone"] == "true") {
$user = "everyone";
} elseif (is_null($this->_form("usr"))) {
$user = "everyone";
} else {
$user = userid($this->_form["usr"]);
}
if ( !is_null($this->_form("everywhere"))
&& $this->_form["everywhere"] == "true") {
$domain = "everywhere";
} elseif (is_null($this->_form("domain"))) {
$domain = "everywhere";
} else {
$domain = $this->_form["domain"];
}
return gactlog("Update the user preference \"" . $this->_form["name"] . "\""
. " of $user for $domain"
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
$user = !is_null($this->_cur["usr"])?
userid($this->_cur["usr"]): "everyone";
$domain = !is_null($this->_cur["domain"])?
$this->_cur["domain"]: "everywhere";
return gactlog("Delete the user preference \"" . $this->_cur["name"] . "\""
. " of $user for $domain"
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This user preference was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This user preference has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This user preference has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This user preference has been successfully deleted."),
"isform"=>false);
}
}
}
// UserRequestProcessor: User request form processor class
class UserRequestProcessor extends BaseProcessor
{
public $_expire_is_expr = false;
// __construct: Initialize the processor
function __construct(&$form, $table = "userreq")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
if ($this->_type != "del") {
// Set the "anonymous" user
if ( !is_null($this->_form("anonymous"))
&& $this->_form["anonymous"] == "true") {
unset($this->_form["usr"]);
}
}
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
// Anonymous user joining the member
if ( is_null(get_login_sn())
&& in_array($this->_form["type"], array("join", "rstpwd"))) {
$this->_cols->login = usersn(ANONYMOUS_USER);
}
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("type", $this->_form("type"));
$this->_cols->addnum("usr", $this->_form("usr"));
$this->_cols->addstr("args", $this->_form("args"));
if ($this->_expire_is_expr) {
$this->_cols->addexpr("expire", $this->_form("expire"));
} else {
$this->_cols->adddate("expire", $this->_form("expire"));
}
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addstr("type", $this->_form("type"), $this->_cur["type"]);
$this->_cols->addnum("usr", $this->_form("usr"), $this->_cur["usr"]);
$this->_cols->addstr("args", $this->_form("args"), $this->_cur["args"]);
if ($this->_expire_is_expr) {
$this->_cols->addexpr("expire", $this->_form("expire"));
} else {
$this->_cols->adddate("expire", $this->_form("expire"), $this->_cur["expire"]);
}
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
if ( !is_null($this->_form("anonymous"))
&& $this->_form["anonymous"] == "true") {
$user = "anonymous";
} elseif (is_null($this->_form("usr"))) {
$user = "anonymous";
} else {
$user = userid($this->_form["usr"]);
}
return gactlog("Create a user request " . $this->_form["type"]
. " from $user"
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
if ( !is_null($this->_form("anonymous"))
&& $this->_form["anonymous"] == "true") {
$user = "anonymous";
} elseif (is_null($this->_form("usr"))) {
$user = "anonymous";
} else {
$user = userid($this->_form["usr"]);
}
return gactlog("Update the user request " . $this->_form["type"]
. " from $user"
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
$user = !is_null($this->_cur["usr"])?
userid($this->_cur["usr"]): "anonymous";
return gactlog("Delete the user request " . $this->_cur["type"]
. " from $user"
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This user request was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This user request has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This user request has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This user request has been successfully deleted."),
"isform"=>false);
}
}
}
// BasePageProcessor: Base page form processor class
class BasePageProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "pages")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
// Get the available languages list
global $ALL_LINGUAS;
// Obtain the picture deposit
$PICS =& pic_deposit();
switch ($this->_type) {
// A form to create a new item
case "new":
// Set the picture information
if (!is_null($this->_form("pic"))) {
$picratio = $PICS[$this->_form("pic")]["ratio"];
$piccap = $this->_form("piccap");
$picpos = $this->_form("picpos");
} else {
$picratio = null;
$piccap = null;
$picpos = null;
}
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("path", $this->_form("path"));
$this->_cols->addnum("ord", $this->_form("ord"));
$this->_cols->addstr("title", $this->_form("title"));
$this->_cols->addstr("body", $this->_form("body"));
$this->_cols->addstr("kw", $this->_form("kw"));
$this->_cols->addpic("pic", $this->_form("pic"));
$this->_cols->addnum("picratio", $picratio);
$this->_cols->addstr("piccap", $piccap);
$this->_cols->addstr("picpos", $picpos);
$this->_cols->addbool("html", $this->_form("html"));
$this->_cols->addbool("hid", $this->_form("hid"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addstr("path", $this->_form("path"), $this->_cur["path"]);
$this->_cols->addnum("ord", $this->_form("ord"), $this->_cur["ord"]);
$this->_cols->addstr("title", $this->_form("title"), $this->_cur["title"]);
$this->_cols->addstr("body", $this->_form("body"), $this->_cur["body"]);
$this->_cols->addstr("kw", $this->_form("kw"), $this->_cur["kw"]);
// Special rules to update the picture
$this->_cols->addpic("pic", $this->_form("pic"), $this->_cur["pic"]);
// Delete everything about this picture
if (is_null($this->_form("pic"))) {
$this->_cols->addstr("picratio", null, $this->_cur["picratio"]);
if (count($ALL_LINGUAS) > 1) {
for ($l = 0; $l < count($ALL_LINGUAS); $l++) {
$lndb = ln($ALL_LINGUAS[$l], LN_DATABASE);
$this->_cols->addstr("piccap_$lndb", null, $this->_cur["piccap_$lndb"]);
}
} else {
$this->_cols->addstr("piccap", null, $this->_cur["piccap"]);
}
$this->_cols->addstr("picpos", null, $this->_cur["picpos"]);
// Normal processing
} else {
$picratio = $PICS[$this->_form("pic")]["ratio"];
$this->_cols->addnum("picratio", $picratio, $this->_cur["picratio"]);
$this->_cols->addstr("piccap", $this->_form("piccap"), $this->_cur["piccap"]);
$this->_cols->addstr("picpos", $this->_form("picpos"), $this->_cur["picpos"]);
}
$this->_cols->addbool("html", $this->_form("html"), $this->_cur["html"]);
$this->_cols->addbool("hid", $this->_form("hid"), $this->_cur["hid"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a page at " . $this->_form["path"]
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the page at " . $this->_form["path"]
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the page at " . $this->_cur["path"]
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This page was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This page has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This page has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This page has been successfully deleted."),
"isform"=>false);
}
}
// _remove_curfile: Remove the unwanted pages
// This has to be explicitly run from _rebuild_partial_pages()
function _remove_curfile()
{
// Nothing to remove if there is no current page
if ($this->_type == "new" || $this->_cur["hid"]) {
return;
// A current page to be deleted or hidden
} elseif ( $this->_type == "del"
|| !is_null($this->_form("hid"))) {
grmoldpage($this->_cur["path"]);
// A shown page update with a new page path to check with
} else {
grmoldpage($this->_cur["path"], $this->_form["path"]);
}
return;
}
// _remove_curpic: Remove the unwanted picture
// This has to be explicitly run from _rebuild_partial_pages()
function _remove_curpic()
{
// Nothing to remove if there is no current picture
if ( $this->_type == "new"
|| $this->_cur["hid"]
|| is_null($this->_cur["pic"])) {
return;
}
$pathpat = DOC_ROOT . PAGEPIC_PATH . "/" . $this->_sn . ".%s";
// A current picture to be deleted, hidden or removed
if ( $this->_type == "del"
|| !is_null($this->_form("hid"))
|| !array_key_exists("pic", $this->_form)) {
foreach ($GLOBALS["PIC_VALID_SUFS"] as $suf) {
$file = sprintf($pathpat, $suf);
if (file_exists($file)) {
gunlink($file);
}
}
// A shown picture update
} else {
$PICS =& pic_deposit();
$curpic =& $PICS[$this->_cur["pic"]];
$curpic =& resize_pic($curpic, $curpic["ratio"]);
$newpic =& $PICS[$this->_form["pic"]];
$newpic =& resize_pic($newpic, $newpic["ratio"]);
// Skip when having the same type (and hence file name suffix)
if ($curpic["type"] == $newpic["type"]) {
return;
}
$newfile = sprintf($pathpat,
$GLOBALS["PIC_TYPESUF_MAP"][$newpic["type"]]);
foreach ($GLOBALS["PIC_VALID_SUFS"] as $suf) {
$file = sprintf($pathpat, $suf);
if (file_exists($file) && $file != $newfile) {
gunlink($file);
}
}
}
return;
}
}
// BaseNewsProcessor: Base news form processor class
class BaseNewsProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "news")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
// Get the available languages list
global $ALL_LINGUAS;
// Obtain the picture deposit
$PICS =& pic_deposit();
switch ($this->_type) {
// A form to create a new item
case "new":
// Set the picture information
if (!is_null($this->_form("pic"))) {
$picratio = $PICS[$this->_form("pic")]["ratio"];
$piccap = $this->_form("piccap");
$picpos = $this->_form("picpos");
} else {
$picratio = null;
$piccap = null;
$picpos = null;
}
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->adddate("date", $this->_form("date"));
$this->_cols->addnum("ord", $this->_form("ord"));
$this->_cols->addstr("title", $this->_form("title"));
$this->_cols->addstr("body", $this->_form("body"));
$this->_cols->addstr("kw", $this->_form("kw"));
$this->_cols->addpic("pic", $this->_form("pic"));
$this->_cols->addnum("picratio", $picratio);
$this->_cols->addstr("piccap", $piccap);
$this->_cols->addstr("picpos", $picpos);
$this->_cols->addbool("html", $this->_form("html"));
$this->_cols->addbool("hid", $this->_form("hid"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->adddate("date", $this->_form("date"), $this->_cur["date"]);
$this->_cols->addnum("ord", $this->_form("ord"), $this->_cur["ord"]);
$this->_cols->addstr("title", $this->_form("title"), $this->_cur["title"]);
$this->_cols->addstr("body", $this->_form("body"), $this->_cur["body"]);
$this->_cols->addstr("kw", $this->_form("kw"), $this->_cur["kw"]);
// Special rules to update the picture
$this->_cols->addpic("pic", $this->_form("pic"), $this->_cur["pic"]);
// Delete everything about this picture
if (is_null($this->_form("pic"))) {
$this->_cols->addstr("picratio", null, $this->_cur["picratio"]);
if (count($ALL_LINGUAS) > 1) {
for ($l = 0; $l < count($ALL_LINGUAS); $l++) {
$lndb = ln($ALL_LINGUAS[$l], LN_DATABASE);
$this->_cols->addstr("piccap_$lndb", null, $this->_cur["piccap_$lndb"]);
}
} else {
$this->_cols->addstr("piccap", null, $this->_cur["piccap"]);
}
$this->_cols->addstr("picpos", null, $this->_cur["picpos"]);
// Normal processing
} else {
$picratio = $PICS[$this->_form("pic")]["ratio"];
$this->_cols->addnum("picratio", $picratio, $this->_cur["picratio"]);
$this->_cols->addstr("piccap", $this->_form("piccap"), $this->_cur["piccap"]);
$this->_cols->addstr("picpos", $this->_form("picpos"), $this->_cur["picpos"]);
}
$this->_cols->addbool("html", $this->_form("html"), $this->_cur["html"]);
$this->_cols->addbool("hid", $this->_form("hid"), $this->_cur["hid"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a news article " . newsid_compose($this->_form["date"], $this->_form["ord"])
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the news article " . newsid_compose($this->_form["date"], $this->_form["ord"])
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the news article " . newsid_compose($this->_cur["date"], $this->_cur["ord"])
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This news article was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This news article has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This news article has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This news article has been successfully deleted."),
"isform"=>false);
}
}
// _remove_curpic: Remove the unwanted picture
// This has to be explicitly run from _rebuild_partial_pages()
function _remove_curpic()
{
// Nothing to remove if there is no current picture
if ( $this->_type == "new"
|| $this->_cur["hid"]
|| is_null($this->_cur["pic"])) {
return;
}
$pathpat = DOC_ROOT . NEWSPIC_PATH . "/" . $this->_sn . ".%s";
// A current picture to be deleted, hidden or removed
if ( $this->_type == "del"
|| !is_null($this->_form("hid"))
|| is_null($this->_form("pic"))) {
foreach ($GLOBALS["PIC_VALID_SUFS"] as $suf) {
$file = sprintf($pathpat, $suf);
if (file_exists($file)) {
gunlink($file);
}
}
// A shown picture update
} else {
$PICS =& pic_deposit();
$curpic =& $PICS[$this->_cur["pic"]];
$curpic =& resize_pic($curpic, $curpic["ratio"]);
$newpic =& $PICS[$this->_form["pic"]];
$newpic =& resize_pic($newpic, $newpic["ratio"]);
// Skip when having the same type (and hence file name suffix)
if ($curpic["type"] == $newpic["type"]) {
return;
}
$newfile = sprintf($pathpat,
$GLOBALS["PIC_TYPESUF_MAP"][$newpic["type"]]);
foreach ($GLOBALS["PIC_VALID_SUFS"] as $suf) {
$file = sprintf($pathpat, $suf);
if (file_exists($file) && $file != $newfile) {
gunlink($file);
}
}
}
return;
}
}
// CountryProcessor: Country form processor class
class CountryProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "country")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("id", $this->_form("id"));
$this->_cols->addstr("name", $this->_form("name"));
$this->_cols->addbool("special", $this->_form("special"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addstr("id", $this->_form("id"), $this->_cur["id"]);
$this->_cols->addstr("name", $this->_form("name"), $this->_cur["name"]);
$this->_cols->addbool("special", $this->_form("special"), $this->_cur["special"]);
break;
}
return;
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a country " . $this->_form["id"]
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the country " . $this->_form["id"]
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the country " . $this->_cur["id"]
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This country was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This country has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This country has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This country has been successfully deleted."),
"isform"=>false);
}
}
}
// PictureProcessor: Picture form processor class
class PictureProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = null)
{
parent::__construct($form, $table);
$this->_modified = true;
}
// _other_tasks: Perform tasks other than column updates
function _other_tasks()
{
// Obtain the picture deposit
$PICS =& pic_deposit();
switch ($this->_type) {
// A form to create a new item
case "new":
$PICS[$this->_form["pic"]]["ratio"] = $this->_form("ratio");
$PICS[$this->_form["pic"]]["ratio_input"] =
number_format($this->_form["ratio"], 2);
$cols = array();
// Add the columns
$selurl = $this->_form["caller"];
$cols[] = "formid=" . urlencode($this->_form["cformid"]);
$cols[] = "selsn=" . urlencode($this->_form["pic"]);
$url = $this->_form["caller"] . "?" . implode("&", $cols);
http_303($url);
// No return
// A form to edit a current item
case "cur":
$PICS[$this->_form["pic"]]["ratio"] = $this->_form("ratio");
$PICS[$this->_form["pic"]]["ratio_input"] =
number_format($this->_form["ratio"], 2);
$cols = array();
// Add the columns
$selurl = $this->_form["caller"];
$cols[] = "formid=" . urlencode($this->_form["cformid"]);
$cols[] = "selsn=" . urlencode($this->_form["pic"]);
$url = $this->_form["caller"] . "?" . implode("&", $cols);
http_303($url);
// No return
}
}
}
// RebuildProcessor: Rebuild form processor class
class RebuildProcessor extends BaseProcessor
{
protected $_t_start = null;
protected $_t_end = null;
// __construct: Initialize the processor
function __construct(&$form, $table = null)
{
parent::__construct($form, $table);
$this->_modified = true;
}
// _other_tasks: Perform tasks other than column updates
function _other_tasks()
{
// Rebuild the pages
$this->_t_start = time_hires();
call_user_func("rebuild_" . $this->_form["type"]);
$this->_t_end = time_hires();
}
// _actlog: Log the activity
function _actlog()
{
return gactlog("Rebuild pages of type \"" . $this->_form["type"] . "\".");
}
// _ret_status: Return the process status
function _ret_status()
{
return array("msg"=>NC_("The specified web pages have been successfully rebuilt. (%0.3f seconds)"),
"margs"=>array($this->_t_end-$this->_t_start));
}
}
// LogInProcessor: Log in form processor class
class LogInProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "users")
{
$form["form"] = "cur";
parent::__construct($form, $table);
$this->_sn = $this->_cur["sn"];
$this->_update_timestamp = false;
}
// _save_cols: Save the column deposit
function _save_cols()
{
// Look up the host name
$host = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
if ($host == $_SERVER["REMOTE_ADDR"]) {
$host = null;
}
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
// Add the visits count
$this->_cols->addexpr("visits", "visits+1");
// Record the timestamp and the remote IP
$this->_cols->addexpr("visited", "now()");
$this->_cols->addstr("ip", $_SERVER["REMOTE_ADDR"], $this->_cur["ip"]);
$this->_cols->addstr("host", $host, $this->_cur["host"]);
$this->_cols->addstr("ct", geoiplookup(), $this->_cur["ct"]);
// Reset the fail login count
$this->_cols->addnum("fails", 0);
return;
}
// _other_tasks: Perform tasks other than column updates
function _other_tasks()
{
// Register the logged-in id
$_SESSION["usersn"] = $this->_sn;
// Set the log-in information
upd_login_info();
// Remember the user
$_SESSION["remember"] = !is_null($this->_form("remember"));
// Reset the by-login data deposit
unset($_SESSION["bylogin"]);
}
// _actlog: Log the activity
function _actlog()
{
// Log the guest log in, too
return actlog("Log in with s/n " . $this->_sn . ".");
}
// _ret_status: Return the process status
function _ret_status()
{
return array("msg"=>NC_("Welcome, %s!"),
"margs"=>array("_USERNAME"),
"isform"=>false);
}
}
// LogOutProcessor: Log out form processor class
class LogOutProcessor extends BaseProcessor
{
protected $_is_admin = null;
protected $_userid = null;
// __construct: Initialize the processor
function __construct(&$form, $table = null)
{
parent::__construct($form, $table);
$this->_sn = get_login_sn();
$this->_is_sql = false;
$this->_modified = true;
$this->_is_admin = is_guest()? is_admin_script(): is_admin();
}
// _save_cols: Save the column deposit
// Make it a null function
function _save_cols()
{
return;
}
// _other_tasks: Perform tasks other than column updates
function _other_tasks()
{
$this->_userid = get_login_id();
logout();
}
// _actlog: Log the activity
function _actlog()
{
// Log the guest log out, too
return actlog("Log out with s/n " . $this->_sn . ".", $this->_userid);
}
// _ret_status: Return the process status
function _ret_status()
{
return array("msg"=>NC_("You have successfully logged out."),
"isform"=>false,
"is_admin"=>$this->_is_admin);
}
}
// BaseLinkCategoryProcessor: Base link category form processor class
class BaseLinkCategoryProcessor extends BaseCategoryProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "linkcat")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
if ($this->_type != "del") {
// Set the "topmost" parent
if ( !is_null($this->_form("topmost"))
&& $this->_form["topmost"] == "true") {
unset($this->_form["parent"]);
}
}
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addnum("parent", $this->_form("parent"));
$this->_cols->addstr("id", $this->_form("id"));
$this->_cols->addnum("ord", $this->_form("ord"));
$this->_cols->addstr("title", $this->_form("title"));
$this->_cols->addstr("kw", $this->_form("kw"));
$this->_cols->addbool("hid", $this->_form("hid"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addnum("parent", $this->_form("parent"), $this->_cur["parent"]);
$this->_cols->addstr("id", $this->_form("id"), $this->_cur["id"]);
$this->_cols->addnum("ord", $this->_form("ord"), $this->_cur["ord"]);
$this->_cols->addstr("title", $this->_form("title"), $this->_cur["title"]);
$this->_cols->addstr("kw", $this->_form("kw"), $this->_cur["kw"]);
$this->_cols->addbool("hid", $this->_form("hid"), $this->_cur["hid"]);
break;
}
return;
}
// _update_cols: Update the columns
function _update_cols()
{
$this->_curshown = $this->_shown_parts();
parent::_update_cols();
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a link category " . linkcat_path($this->_sn)
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the link category " . linkcat_path($this->_sn)
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the link category " . $this->_cur["path"]
. " with s/n " . $this->_sn . ".");
}
}
// _remove_curfile: Remove the unwanted page
function _remove_curfile()
{
// Remove the unwanted category files
foreach (array_diff($this->_curshown["catspath"], $this->_newshown["catspath"]) as $page) {
grmoldpage("/links$page");
}
return;
}
// _shown_parts: Obtain the shown parts
function _shown_parts()
{
$shown = links_shown_parts();
// Check if myself is shown
$select = "SELECT sn FROM linkcat"
. " WHERE sn=" . $this->_sn
. " AND linkcat_isshown(sn, hid, parent);\n";
$result = sql_query($select);
$shown["self"] = (sql_num_rows($result) > 0);
return $shown;
}
}
// BaseLinkProcessor: Base link form processor class
class BaseLinkProcessor extends BaseProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "links")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addstr("title", $this->_form("title"));
$this->_cols->addurl("url", $this->_form("url"));
$this->_cols->addstr("dsc", $this->_form("dsc"));
$this->_cols->addbool("hid", $this->_form("hid"));
// Find the changed items
$additems = array();
for ($i = 0; !is_null($this->_form("cat$i")); $i++) {
if ($this->_form["cat$i"] != "") {
$additems[] = $this->_form["cat$i"];
}
}
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["cat"] = $item;
$FORM["link"] = $this->_sn;
$processor = new BaseLinkCategorizationProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addstr("title", $this->_form("title"), $this->_cur["title"]);
$this->_cols->addurl("url", $this->_form("url"), $this->_cur["url"]);
$this->_cols->addstr("dsc", $this->_form("dsc"), $this->_cur["dsc"]);
$this->_cols->addbool("hid", $this->_form("hid"), $this->_cur["hid"]);
// Find the changed items
$olditems = array();
$newitems = array();
for ($i = 0; $i < $this->_cur["catcount"]; $i++) {
$olditems[] = $this->_cur["cat$i"];
}
for ($i = 0; !is_null($this->_form("cat$i")); $i++) {
if ($this->_form["cat$i"] != "") {
$newitems[] = $this->_form["cat$i"];
}
}
$delitems = array_values(array_diff($olditems, $newitems));
$additems = array_values(array_diff($newitems, $olditems));
foreach ($additems as $item) {
unset($FORM);
$FORM = array();
$FORM["form"] = "new";
$FORM["cat"] = $item;
$FORM["link"] = $this->_sn;
$processor = new BaseLinkCategorizationProcessor($FORM);
$processor->_save_cols();
$this->_subs[] = $processor;
}
if (count($delitems) > 0) {
for ($i = 0; $i < count($delitems); $i++) {
$delitems[$i] = "cat=" . $delitems[$i];
}
$cond = implode(" OR ", $delitems);
if (count($delitems) > 1) {
$cond = "($cond)";
}
unset($FORM);
$FORM = array();
$FORM["cond"] = $cond . " AND link=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "linkcatz");
}
break;
// A form to delete a current item
case "del":
// Find the changed items
if ($this->_cur["catcount"] > 0) {
unset($FORM);
$FORM = array();
$FORM["cond"] = "link=" . $this->_sn;
$this->_subs[] = new DeletionProcessor($FORM, "linkcatz");
}
break;
}
return;
}
// _update_cols: Update the columns
function _update_cols()
{
$this->_curshown = $this->_shown_parts();
parent::_update_cols();
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a related link " . $this->_form["url"]
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the related link " . $this->_form["url"]
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the related link " . $this->_cur["url"]
. " with s/n " . $this->_sn . ".");
}
}
// _ret_status: Return the process status
function _ret_status()
{
if (!$this->_modified()) {
return array("msg"=>NC_("This related link was not modified."),
"isform"=>false);
}
switch ($this->_type) {
// A form to create a new item
case "new":
return array("msg"=>NC_("This related link has been successfully added."),
"isform"=>false);
// A form to edit a current item
case "cur":
return array("msg"=>NC_("This related link has been successfully updated."),
"isform"=>false);
// A form to delete a current item
case "del":
return array("msg"=>NC_("This related link has been successfully deleted."),
"isform"=>false);
}
}
// _remove_curfile: Remove the unwanted page
function _remove_curfile()
{
// Remove the unwanted category files
foreach (array_diff($this->_curshown["catspath"], $this->_newshown["catspath"]) as $page) {
grmoldpage("/links$page");
}
return;
}
// _shown_parts: Obtain the shown parts
function _shown_parts()
{
return links_shown_parts();
}
}
// BaseLinkCategorizationProcessor: Base link categorization form processor class
class BaseLinkCategorizationProcessor extends BaseCategorizationProcessor
{
// __construct: Initialize the processor
function __construct(&$form, $table = "linkcatz")
{
parent::__construct($form, $table);
}
// _save_cols: Save the column deposit
function _save_cols()
{
switch ($this->_type) {
// A form to create a new item
case "new":
$this->_sn = $this->_new_sn();
$this->_cols = new AddCol($this->_table, ADDCOL_INSERT);
$this->_cols->addnum("sn", $this->_sn);
$this->_cols->addnum("cat", $this->_form("cat"));
$this->_cols->addnum("link", $this->_form("link"));
break;
// A form to edit a current item
case "cur":
$this->_cols = new AddCol($this->_table, ADDCOL_UPDATE);
$this->_cols->addnum("cat", $this->_form("cat"), $this->_cur["cat"]);
$this->_cols->addnum("link", $this->_form("link"), $this->_cur["link"]);
break;
}
return;
}
// _update_cols: Update the columns
function _update_cols()
{
$this->_curshown = $this->_shown_parts();
parent::_update_cols();
}
// _actlog: Log the activity
function _actlog()
{
switch ($this->_type) {
// A form to create a new item
case "new":
return gactlog("Create a link categorization record " . link_url($this->_form["link"])
. " in category " . linkcat_path($this->_form["cat"])
. " with s/n " . $this->_sn . ".");
// A form to edit a current item
case "cur":
return gactlog("Update the link categorization record " . link_url($this->_form["link"])
. " in category " . linkcat_path($this->_form["cat"])
. " with s/n " . $this->_sn . ".");
// A form to delete a current item
case "del":
return gactlog("Delete the link categorization record " . link_url($this->_cur["link"])
. " in category " . linkcat_path($this->_cur["cat"])
. " with s/n " . $this->_sn . ".");
}
}
// _remove_curfile: Remove the unwanted page
function _remove_curfile()
{
// Remove the unwanted category files
foreach (array_diff($this->_curshown["catspath"], $this->_newshown["catspath"]) as $page) {
grmoldpage("/links$page");
}
return;
}
// _shown_parts: Obtain the shown parts
function _shown_parts()
{
return links_shown_parts();
}
}
?>