4 This plugin provides per-page administrative functions, for easier access
5 to some settings and tools. Currently supports page renaming and page flag
7 requires _PROTECTED_MODE, see ewiki_auth() in README, and $ewiki_ring==0
9 The functions have following ring permission level equirements:
10 delete: ring<=1 moderators
11 rename: ring<=1 moderators
13 flags: ring=0 admins, moderators may change just some flags
15 For styling purposes following CSS selectors could be used:
16 .wiki.control .flags {...}
17 .wiki.control .rename {...}
18 .wiki.control .meta {...}
19 .wiki.control .delete {...}
23 #-- which flags moderators may change
24 define("EWIKI_DB_F_MODERATORFLAGS", 0x0070 | 0x0004 | 0x0008);
25 # == EWIKI_DB_F_ACCESS | EWIKI_DB_F_DISABLED | EWIKI_DB_F_HTML
29 $ewiki_plugins["action"]["control"] = "ewiki_action_control_page";
30 $ewiki_config["action_links"]["view"]["control"] = "Page Control";
34 function ewiki_action_control_page($id, &$data, $action) {
35 global $ewiki_ring, $ewiki_config, $ewiki_plugins;
38 "_TEXT", "_BINARY", "_DISABLED", "_HTML", "_READONLY", "_WRITEABLE",
39 "_APPENDONLY", "_SYSTEM", "_PART", "_MINOR", "_HIDDEN", "_ARCHIVE",
40 "_UU12", "_UU13", "_UU14", "_UU15", "_UU16", "_EXEC", "_UU18", "_UU19",
44 $o = ewiki_make_title($id, "control $id", 2);
46 #-- admin requ. ---------------------------------------------------------
47 if (!ewiki_auth($id,$data,$action, $ring=0, "_FORCE_LOGIN=1") || !isset($ewiki_ring) || ($ewiki_ring > 1)) {
49 if (is_array($data)) {
50 $data = "You'll need to be admin. See ewiki_auth() and _PROTECTED_MODE in the README.";
56 #-- page flags ---------------------------------------------------------
57 elseif (@$_REQUEST["pgc_setflags"]) {
61 foreach ($_REQUEST["sflag"] as $n=>$b) {
66 #-- administrator may change all flags
68 $data["flags"] = $new_f;
70 #-- moderators only a few
72 $data["flags"] = ($data["flags"] & ( ~ EWIKI_DB_F_MODERATORFLAGS))
73 | ($new_f & EWIKI_DB_F_MODERATORFLAGS);
75 $data["lastmodified"] = time();
78 if (ewiki_db::WRITE($data)) {
79 $o .= "Page flags were updated correctly.";
80 ewiki_log("page flags of '$id' were set to $data[flags]");
83 $o .= "A database error occoured.";
87 #-- renaming -----------------------------------------------------------
88 elseif (@$_REQUEST["pgc_rename"] && strlen($new_id = $_REQUEST["mv_to"])) {
93 $preg_id = "/". addcslashes($old_id, ".+*?|/\\()$[]^#") ."/"
94 . ($_REQUEST["mv_cr1"] ? "i" : "");
96 #-- check if new name does not already exist in database
97 $exists = ewiki_db::GET($new_id);
98 if ($exists || !empty($exists)) {
99 return($o .= "Cannot overwrite an existing database entry.");
102 #-- copy from old name to new name
103 $max_ver = $data["version"];
105 for ($v=1; $v<=$max_ver; $v++) {
107 $row = ewiki_db::GET($old_id, $v);
108 $row["id"] = $new_id;
109 $row["lastmodified"] = time();
110 $row["content"] = preg_replace($preg_id, $new_id, $row["content"]);
111 ewiki_scan_wikiwords($row["content"], $links, "_STRIP_EMAIL=1");
112 $row["refs"] = "\n\n".implode("\n", array_keys($links))."\n\n";
113 $row["author"] = ewiki_author("control/");
115 if (!ewiki_db::WRITE($row)) {
116 $report .= "error while copying version $v,<br />\n";
121 #-- proceed if previous actions error_free
122 if (empty($report)) {
124 #-- deleting old versions
125 for ($v=1; $v<=$max_ver; $v++) {
126 ewiki_db::DELETE($old_id, $v);
129 #-- adjust links/references to old page name
130 if ($_REQUEST["mv_cr0"]) {
132 $result = ewiki_db::SEARCH("refs", $old_id);
133 while ($result && ($row = $result->get())) {
135 $row = ewiki_db::GET($row["id"]);
137 if (preg_match($preg_id, $row["content"], $uu)) {
139 $row["content"] = preg_replace($preg_id, $new_id, $row["content"]);
140 $row["lastmodified"] = time();
142 ewiki_scan_wikiwords($row["content"], $links, "_STRIP_EMAIL=1");
143 $row["refs"] = "\n\n".implode("\n", array_keys($links))."\n\n";
144 $row["author"] = ewiki_author("control/");
146 if (!ewiki_db::WRITE($row)) {
147 $report .= "could not update references in ".$row['id'].",<br />\n";
150 $report .= "updated references in ".$row['id'].",<br />\n";
158 $o .= "This page was correctly renamed from '$old_id' to '$new_id'.<br /><br />\n$report";
159 ewiki_log("page renamed from '$old_id' to '$new_id'", 2);
164 $o .= "Some problems occoured while processing your request, therefor the old page still exists:<br />\n" . $report;
169 #-- meta data -----------------------------------------------------------
170 elseif (@$_REQUEST["pgc_setmeta"] && ($ewiki_ring==0) && ($set = explode("\n", $_REQUEST["pgc_meta"]))) {
173 foreach ($set as $line) {
174 if (($line=trim($line)) && ($key=trim(strtok($line, ":"))) && ($value=trim(strtok("\000"))) ) {
175 $new_meta[$key] = $value;
179 $data["meta"] = $new_meta;
180 $data["lastmodified"] = time();
183 if (ewiki_db::WRITE($data)) {
184 $o .= "The {meta} field was updated.";
187 $o .= "A database error occoured.";
191 #-- deletion -----------------------------------------------------------
192 elseif (@$_REQUEST["pgc_purge"] && $_REQUEST["pgc_purge1"]) {
196 $verZ = $data["version"];
198 ewiki_db::DELETE($id, $verZ);
201 } while ($loop-- && ($data = ewiki_db::GET($id)));
204 $o .= "Page completely removed from database.";
205 ewiki_log("page '$id' was deleted from db", 2);
208 $o .= "Page still here.";
212 #-- function list -------------------------------------------------------
214 $o .= '<form action="'.ewiki_script("$action",$id).'" method="POST" enctype="text/html">'
215 . '<input type="hidden" name="id" value="'."$action/$id".'">';
218 $o .= '<div class="flags">';
219 $o .= "<h4>page flags</h4>\n";
220 foreach ($a_flagnames as $n=>$s) {
221 $disabled = (($ewiki_ring==1) && !((1<<$n) & EWIKI_DB_F_MODERATORFLAGS)) ? ' disabled="disabled"' : "";
222 $checked = $data["flags"] & (1<<$n) ? ' checked="checked"': "";
223 $a[$n] = '<input type="checkbox" name="sflag['.$n.']" value="1"'.
224 $checked . $disabled .'> ' . $s;
226 $o .= '<table border="0" class="list">' . "\n";
227 for ($n=0; $n<count($a_flagnames); $n++) {
230 if ($x==0) $o .= "<tr>";
231 $o .= "<td>" . $a[4*$y + $x] . "</td>";
232 if ($x==3) $o .= "</tr>\n";
235 $o .= '<input type="submit" name="pgc_setflags" value="chmod">';
236 $o .= "\n<br /><br /><hr></div>\n";
239 $o .= '<div class="rename">';
240 $o .= "<h4>rename page</h4>\n";
241 $o .= 'new page name: <input type="text" size="30" name="mv_to" value="'.htmlentities($id).'">'
243 . '<input type="checkbox" name="mv_cr0" value="1" checked> also try to change all references from other pages accordingly '
244 . '(<input type="checkbox" name="mv_cr1" value="1" checked> and act case-insensitive when doing so) ';
245 $o .= '<br /><input type="submit" name="pgc_rename" value="mv">';
246 $o .= "\n<br /><br /><hr></div>\n";
249 if (isset($ewiki_ring) && ($ewiki_ring==0)) {
250 $o .= '<div class="meta">';
251 $o .= "<h4>meta data</h4>\n";
252 $o .= '<textarea cols="40" rows="6" name="pgc_meta">';
253 if (($uu = @$data["meta"]) && is_array($uu))
254 foreach ($uu as $key=>$value) {
255 if (is_array($value)) { $value = serialize($array); }
256 $o .= htmlentities($key.": ".trim($value)) . "\n";
258 $o .= "</textarea>\n";
259 $o .= '<br /><input type="submit" name="pgc_setmeta" value="set">';
260 $o .= "\n<br /><br /><hr></div>\n";
264 $o .= '<div class="delete">';
265 $o .= "<h4>delete page</h4>\n";
266 $o .= '<input type="checkbox" name="pgc_purge1" value="1"> I\'m sure';
267 $o .= '<br /><input type="submit" name="pgc_purge" value="rm">';
268 $o .= "\n<br /><br /><hr></div>\n";