4 * Copyright 1999,2000,2001,2002,2007 $ThePhpWikiProgrammingTeam
6 * This file is part of PhpWiki.
8 * PhpWiki is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * PhpWiki is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * This plugin shows the current page-level metadata and gives an
27 * entry box for adding a new field or changing an existing one. (A
28 * field can be deleted by specifying a blank value.) Certain fields,
29 * such as 'hits' cannot be changed.
31 * If there is a reason to do so, I will add support for revision-
32 * level metadata as well.
34 * Access by restricted to ADMIN_USER
36 * Written by MichaelVanDam, to test out some ideas about
37 * PagePermissions and PageTypes.
39 * Rewritten for recursive array support by ReiniUrban.
42 require_once 'lib/plugin/_BackendInfo.php';
44 class WikiPlugin_EditMetaData
45 extends WikiPlugin__BackendInfo
49 return _("EditMetaData");
52 function getDescription()
54 return sprintf(_("Edit metadata for %s"), '[pagename]');
57 function getDefaultArguments()
59 return array('page' => '[pagename]'
63 function run($dbi, $argstr, &$request, $basepage)
65 $this->_args = $this->getArgs($argstr, $request);
66 extract($this->_args);
70 $this->hidden_pagemeta = array('_cached_html');
71 $this->readonly_pagemeta = array('hits', 'passwd');
72 $dbi = $request->getDbh();
73 $p = $dbi->getPage($page);
74 $pagemeta = $p->getMetaData();
75 $this->chunk_split = false;
77 // Look at arguments to see if submit was entered. If so,
78 // process this request before displaying.
80 if ($request->isPost()
81 and $request->_user->isAdmin()
82 and $request->getArg('metaedit')
84 $metafield = trim($request->getArg('metafield'));
85 $metavalue = trim($request->getArg('metavalue'));
86 $meta = $request->getArg('meta');
88 // meta[__global[_upgrade][name]] => 1030.13
89 foreach ($meta as $key => $val) {
90 if ($val != $pagemeta[$key]
91 and !in_array($key, $this->readonly_pagemeta)
97 if ($metafield and !in_array($metafield, $this->readonly_pagemeta)) {
98 // __global[_upgrade][name] => 1030.13
99 if (preg_match('/^(.*?)\[(.*?)\]$/', $metafield, $matches)) {
100 list(, $array_field, $array_key) = $matches;
101 $array_value = $pagemeta[$array_field];
102 $array_value[$array_key] = $metavalue;
103 if ($pagemeta[$array_field] != $array_value) {
105 $p->set($array_field, $array_value);
107 } elseif ($pagemeta[$metafield] != $metavalue) {
109 $p->set($metafield, $metavalue);
114 $url = $request->getURLtoSelf(false,
115 array('meta', 'metaedit', 'metafield', 'metavalue'));
116 $request->redirect($url);
117 // The rest of the output will not be seen due to the
123 // Now we show the meta data and provide entry box for new data.
125 //$html->pushContent(HTML::h3(fmt("Existing page-level metadata for %s:",
127 //$dl = $this->_display_values('', $pagemeta);
128 //$html->pushContent($dl);
130 // FIXME: invalid HTML
131 $html->pushContent(HTML::p(fmt("No metadata for %s", $page)));
134 $table = HTML::table(array('border' => 1,
136 'cellspacing' => 0));
137 $this->_fixupData($pagemeta);
138 $table->pushContent($this->_showhash("MetaData('$page')", $pagemeta));
141 if ($request->_user->isAdmin()) {
142 $action = $request->getPostURL();
143 $hiddenfield = HiddenInputs($request->getArgs());
144 $instructions = _("Add or change a page-level metadata 'key=>value' pair. Note that you can remove a key by leaving the value-box empty.");
145 $keyfield = HTML::input(array('name' => 'metafield'), '');
146 $valfield = HTML::input(array('name' => 'metavalue'), '');
147 $button = Button('submit:metaedit', _("Submit"), false);
148 $form = HTML::form(array('action' => $action,
150 'accept-charset' => $GLOBALS['charset']),
152 // edit existing fields
155 $instructions, HTML::br(),
156 $keyfield, ' => ', $valfield,
157 HTML::raw(' '), $button
160 $html->pushContent($form);
162 $html->pushContent(HTML::em(_("Requires WikiAdmin privileges to edit.")));
167 function _showvalue($key, $val, $prefix = '')
169 if (is_array($val) or is_object($val)) return $val;
170 if (in_array($key, $this->hidden_pagemeta)) return '';
172 $fullkey = $prefix . '[' . $key . ']';
173 if (substr($fullkey, 0, 1) == '[') {
174 $meta = "meta" . $fullkey;
175 $fullkey = preg_replace("/\]\[/", "[", substr($fullkey, 1), 1);
177 $meta = preg_replace("/^([^\[]+)\[/", "meta[$1][", $fullkey, 1);
181 $meta = "meta[" . $key . "]";
183 //$meta = "meta[".$fullkey."]";
184 $arr = array('name' => $meta, 'value' => $val);
185 if (strlen($val) > 20)
186 $arr['size'] = strlen($val);
187 if (in_array($key, $this->readonly_pagemeta)) {
188 $arr['readonly'] = 'readonly';
189 return HTML::input($arr);
191 return HTML(HTML::em($fullkey), HTML::br(),
203 // c-hanging-comment-ender-p: nil
204 // indent-tabs-mode: nil