xref: /template/strap/admin/pagerules.php (revision 007225e5fb2d3f64edaccd3bd447ca26effb9d68)
1*007225e5Sgerardnico<?php
2*007225e5Sgerardnico// must be run within Dokuwiki
3*007225e5Sgerardnicouse ComboStrap\LogUtility;
4*007225e5Sgerardnicouse ComboStrap\PageRules;
5*007225e5Sgerardnicouse ComboStrap\PluginUtility;
6*007225e5Sgerardnicouse ComboStrap\Sqlite;
7*007225e5Sgerardnico
8*007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
9*007225e5Sgerardnico
10*007225e5Sgerardnicoif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
11*007225e5Sgerardnico
12*007225e5Sgerardnicorequire_once(DOKU_PLUGIN . 'admin.php');
13*007225e5Sgerardnicorequire_once(DOKU_INC . 'inc/parser/xhtml.php');
14*007225e5Sgerardnicorequire_once(__DIR__ . '/../class/PageRules.php');
15*007225e5Sgerardnicorequire_once(__DIR__ . '/../class/PluginUtility.php');
16*007225e5Sgerardnico
17*007225e5Sgerardnico/**
18*007225e5Sgerardnico * The admin pages
19*007225e5Sgerardnico * need to inherit from this class
20*007225e5Sgerardnico *
21*007225e5Sgerardnico *
22*007225e5Sgerardnico * ! important !
23*007225e5Sgerardnico * The suffix of the class name should:
24*007225e5Sgerardnico *   * be equal to the name of the file
25*007225e5Sgerardnico *   * and have only letters
26*007225e5Sgerardnico */
27*007225e5Sgerardnicoclass admin_plugin_combo_pagerules extends DokuWiki_Admin_Plugin
28*007225e5Sgerardnico{
29*007225e5Sgerardnico
30*007225e5Sgerardnico
31*007225e5Sgerardnico
32*007225e5Sgerardnico    /**
33*007225e5Sgerardnico     * @var array|string[]
34*007225e5Sgerardnico     */
35*007225e5Sgerardnico    private $infoPlugin;
36*007225e5Sgerardnico
37*007225e5Sgerardnico    /**
38*007225e5Sgerardnico     * @var PageRules
39*007225e5Sgerardnico     */
40*007225e5Sgerardnico    private $pageRuleManager;
41*007225e5Sgerardnico
42*007225e5Sgerardnico
43*007225e5Sgerardnico    /**
44*007225e5Sgerardnico     * admin_plugin_combo constructor.
45*007225e5Sgerardnico     *
46*007225e5Sgerardnico     * Use the get function instead
47*007225e5Sgerardnico     */
48*007225e5Sgerardnico    public function __construct()
49*007225e5Sgerardnico    {
50*007225e5Sgerardnico
51*007225e5Sgerardnico        // enable direct access to language strings
52*007225e5Sgerardnico        // of use of $this->getLang
53*007225e5Sgerardnico        $this->setupLocale();
54*007225e5Sgerardnico        $this->currentDate = date("c");
55*007225e5Sgerardnico        $this->infoPlugin = $this->getInfo();
56*007225e5Sgerardnico
57*007225e5Sgerardnico
58*007225e5Sgerardnico    }
59*007225e5Sgerardnico
60*007225e5Sgerardnico    /**
61*007225e5Sgerardnico     * Handle Sqlite instantiation  here and not in the constructor
62*007225e5Sgerardnico     * to not make sqlite mandatory everywhere
63*007225e5Sgerardnico     */
64*007225e5Sgerardnico    private function initiatePageRuleManager()
65*007225e5Sgerardnico    {
66*007225e5Sgerardnico
67*007225e5Sgerardnico        if ($this->pageRuleManager == null) {
68*007225e5Sgerardnico
69*007225e5Sgerardnico            $sqlite = Sqlite::getSqlite();
70*007225e5Sgerardnico            if ($sqlite == null) {
71*007225e5Sgerardnico                // A message should have already been send by the getSqlite function
72*007225e5Sgerardnico                return;
73*007225e5Sgerardnico            }
74*007225e5Sgerardnico            $this->pageRuleManager = new PageRules($sqlite);
75*007225e5Sgerardnico
76*007225e5Sgerardnico        }
77*007225e5Sgerardnico    }
78*007225e5Sgerardnico
79*007225e5Sgerardnico
80*007225e5Sgerardnico    /**
81*007225e5Sgerardnico     * Access for managers allowed
82*007225e5Sgerardnico     */
83*007225e5Sgerardnico    function forAdminOnly()
84*007225e5Sgerardnico    {
85*007225e5Sgerardnico        return false;
86*007225e5Sgerardnico    }
87*007225e5Sgerardnico
88*007225e5Sgerardnico    /**
89*007225e5Sgerardnico     * return sort order for position in admin menu
90*007225e5Sgerardnico     */
91*007225e5Sgerardnico    function getMenuSort()
92*007225e5Sgerardnico    {
93*007225e5Sgerardnico        return 140;
94*007225e5Sgerardnico    }
95*007225e5Sgerardnico
96*007225e5Sgerardnico    /**
97*007225e5Sgerardnico     * return prompt for admin menu
98*007225e5Sgerardnico     * @param string $language
99*007225e5Sgerardnico     * @return string
100*007225e5Sgerardnico     */
101*007225e5Sgerardnico    function getMenuText($language)
102*007225e5Sgerardnico    {
103*007225e5Sgerardnico        return ucfirst(PluginUtility::$PLUGIN_NAME) . " - " . $this->lang['PageRules'];
104*007225e5Sgerardnico    }
105*007225e5Sgerardnico
106*007225e5Sgerardnico    public function getMenuIcon()
107*007225e5Sgerardnico    {
108*007225e5Sgerardnico        return DOKU_PLUGIN . $this->getPluginName() . '/images/page-next.svg';
109*007225e5Sgerardnico    }
110*007225e5Sgerardnico
111*007225e5Sgerardnico
112*007225e5Sgerardnico    /**
113*007225e5Sgerardnico     * handle user request
114*007225e5Sgerardnico     */
115*007225e5Sgerardnico    function handle()
116*007225e5Sgerardnico    {
117*007225e5Sgerardnico
118*007225e5Sgerardnico        $this->initiatePageRuleManager();
119*007225e5Sgerardnico
120*007225e5Sgerardnico        /**
121*007225e5Sgerardnico         * If one of the form submit has the add key
122*007225e5Sgerardnico         */
123*007225e5Sgerardnico        if ($_POST['save'] && checkSecurityToken()) {
124*007225e5Sgerardnico
125*007225e5Sgerardnico            $id = $_POST[PageRules::ID_NAME];
126*007225e5Sgerardnico            $matcher = $_POST[PageRules::MATCHER_NAME];
127*007225e5Sgerardnico            $target = $_POST[PageRules::TARGET_NAME];
128*007225e5Sgerardnico            $priority = $_POST[PageRules::PRIORITY_NAME];
129*007225e5Sgerardnico
130*007225e5Sgerardnico            if ($matcher == null) {
131*007225e5Sgerardnico                msg('Matcher can not be null', LogUtility::LVL_MSG_ERROR);
132*007225e5Sgerardnico                return;
133*007225e5Sgerardnico            }
134*007225e5Sgerardnico            if ($target == null) {
135*007225e5Sgerardnico                msg('Target can not be null', LogUtility::LVL_MSG_ERROR);
136*007225e5Sgerardnico                return;
137*007225e5Sgerardnico            }
138*007225e5Sgerardnico
139*007225e5Sgerardnico            if ($matcher == $target) {
140*007225e5Sgerardnico                msg($this->lang['SameSourceAndTargetAndPage'] . ': ' . $matcher . '', LogUtility::LVL_MSG_ERROR);
141*007225e5Sgerardnico                return;
142*007225e5Sgerardnico            }
143*007225e5Sgerardnico
144*007225e5Sgerardnico            if ($id == null) {
145*007225e5Sgerardnico                if (!$this->pageRuleManager->patternExists($matcher)) {
146*007225e5Sgerardnico                    $this->pageRuleManager->addRule($matcher, $target, $priority);
147*007225e5Sgerardnico                    msg($this->lang['Saved'], LogUtility::LVL_MSG_INFO);
148*007225e5Sgerardnico                } else {
149*007225e5Sgerardnico                    msg("The matcher pattern ($matcher) already exists. The page rule was not inserted.", LogUtility::LVL_MSG_ERROR);
150*007225e5Sgerardnico                }
151*007225e5Sgerardnico            } else {
152*007225e5Sgerardnico                $this->pageRuleManager->updateRule($id, $matcher, $target, $priority);
153*007225e5Sgerardnico                msg($this->lang['Saved'], LogUtility::LVL_MSG_INFO);
154*007225e5Sgerardnico            }
155*007225e5Sgerardnico
156*007225e5Sgerardnico
157*007225e5Sgerardnico
158*007225e5Sgerardnico        }
159*007225e5Sgerardnico
160*007225e5Sgerardnico        if ($_POST['Delete'] && checkSecurityToken()) {
161*007225e5Sgerardnico
162*007225e5Sgerardnico            $ruleId = $_POST[PageRules::ID_NAME];
163*007225e5Sgerardnico            $this->pageRuleManager->deleteRule($ruleId);
164*007225e5Sgerardnico            msg($this->lang['Deleted'], LogUtility::LVL_MSG_INFO);
165*007225e5Sgerardnico
166*007225e5Sgerardnico        }
167*007225e5Sgerardnico
168*007225e5Sgerardnico    }
169*007225e5Sgerardnico
170*007225e5Sgerardnico    /**
171*007225e5Sgerardnico     * output appropriate html
172*007225e5Sgerardnico     * TODO: Add variable parsing where the key is the key of the lang object ??
173*007225e5Sgerardnico     */
174*007225e5Sgerardnico    function html()
175*007225e5Sgerardnico    {
176*007225e5Sgerardnico
177*007225e5Sgerardnico        $this->initiatePageRuleManager();
178*007225e5Sgerardnico
179*007225e5Sgerardnico        ptln('<h1>' . ucfirst(PluginUtility::$PLUGIN_NAME) . ' - ' . ucfirst($this->getPluginComponent()) . '</a></h1>');
180*007225e5Sgerardnico        $relativePath = 'admin/' . $this->getPluginComponent() . '_intro';
181*007225e5Sgerardnico        echo $this->locale_xhtml($relativePath);
182*007225e5Sgerardnico
183*007225e5Sgerardnico        // Forms
184*007225e5Sgerardnico        if ($_POST['upsert']) {
185*007225e5Sgerardnico
186*007225e5Sgerardnico            $matcher = null;
187*007225e5Sgerardnico            $target = null;
188*007225e5Sgerardnico            $priority = 1;
189*007225e5Sgerardnico
190*007225e5Sgerardnico            // Update ?
191*007225e5Sgerardnico            $id = $_POST[PageRules::ID_NAME];
192*007225e5Sgerardnico            if ($id != null){
193*007225e5Sgerardnico                $rule = $this->pageRuleManager->getRule($id);
194*007225e5Sgerardnico                $matcher = $rule[PageRules::MATCHER_NAME];
195*007225e5Sgerardnico                $target = $rule[PageRules::TARGET_NAME];
196*007225e5Sgerardnico                $priority = $rule[PageRules::PRIORITY_NAME];
197*007225e5Sgerardnico            }
198*007225e5Sgerardnico
199*007225e5Sgerardnico
200*007225e5Sgerardnico            // Forms
201*007225e5Sgerardnico            ptln('<div class="level2" >');
202*007225e5Sgerardnico            ptln('<div id="form_container" style="max-width: 600px;">');
203*007225e5Sgerardnico            ptln('<form action="" method="post">');
204*007225e5Sgerardnico            ptln('<input type="hidden" name="sectok" value="'.getSecurityToken().'" />');
205*007225e5Sgerardnico            ptln('<p><b>If the Dokuwiki ID matches the following pattern:</b></p>');
206*007225e5Sgerardnico            $matcherDefault = "";
207*007225e5Sgerardnico            if ($matcher != null) {
208*007225e5Sgerardnico                $matcherDefault = 'value="' . $matcher . '"';
209*007225e5Sgerardnico            }
210*007225e5Sgerardnico            ptln('<label for="' . PageRules::MATCHER_NAME . '">(You can use the asterisk (*) character)</label>');
211*007225e5Sgerardnico            ptln('<p><input type="text"  style="width: 100%;" id="' . PageRules::MATCHER_NAME . '" required="required" name="' . PageRules::MATCHER_NAME . '" ' . $matcherDefault . ' class="edit" placeholder="pattern"/> </p>');
212*007225e5Sgerardnico            ptln('<p><b>Then applies this redirect settings:</b></p>');
213*007225e5Sgerardnico            $targetDefault = "";
214*007225e5Sgerardnico            if ($matcher != null) {
215*007225e5Sgerardnico                $targetDefault = 'value="' . $target . '"';
216*007225e5Sgerardnico            }
217*007225e5Sgerardnico            ptln('<label for="' . PageRules::TARGET_NAME . '">Target: (A DokuWiki Id or an URL where you can use the ($) group character)</label>');
218*007225e5Sgerardnico            ptln('<p><input type="text" style="width: 100%;" required="required" id="' . PageRules::TARGET_NAME . '" name="' . PageRules::TARGET_NAME . '" ' . $targetDefault . ' class="edit" placeholder="target" /></p>');
219*007225e5Sgerardnico            ptln('<label for="' . PageRules::PRIORITY_NAME . '">Priority: (The order in which rules are applied)</label>');
220*007225e5Sgerardnico            ptln('<p><input type="id" id="' . PageRules::PRIORITY_NAME . '." style="width: 100%;" required="required" placeholder="priority" name="' . PageRules::PRIORITY_NAME . '" value="' . $priority . '" class="edit" /></p>');
221*007225e5Sgerardnico            ptln('<input type="hidden" name="do"    value="admin" />');
222*007225e5Sgerardnico            if ($id != null) {
223*007225e5Sgerardnico                ptln('<input type="hidden" name="' . PageRules::ID_NAME . '" value="' . $id . '" />');
224*007225e5Sgerardnico            }
225*007225e5Sgerardnico            ptln('<input type="hidden" name="page"  value="' . $this->getPluginName() . '_' . $this->getPluginComponent() . '" />');
226*007225e5Sgerardnico            ptln('<p>');
227*007225e5Sgerardnico            ptln('<a class="btn btn-light" href="?do=admin&page=webcomponent_pagerules" > ' . 'Cancel' . ' <a/>');
228*007225e5Sgerardnico            ptln('<input class="btn btn-primary" type="submit" name="save" class="button" value="' . 'Save' . '" />');
229*007225e5Sgerardnico            ptln('</p>');
230*007225e5Sgerardnico            ptln('</form>');
231*007225e5Sgerardnico            ptln('</div>');
232*007225e5Sgerardnico
233*007225e5Sgerardnico            ptln('</div>');
234*007225e5Sgerardnico
235*007225e5Sgerardnico
236*007225e5Sgerardnico        } else {
237*007225e5Sgerardnico
238*007225e5Sgerardnico            ptln('<h2><a name="" id="pagerules_list">' . 'Rules' . '</a></h2>');
239*007225e5Sgerardnico            ptln('<div class="level2">');
240*007225e5Sgerardnico
241*007225e5Sgerardnico            ptln('<form class="pt-3 pb-3" action="" method="post">');
242*007225e5Sgerardnico            ptln('<input type="hidden" name="sectok" value="'.getSecurityToken().'" />');
243*007225e5Sgerardnico            ptln('    <input type="hidden" name="do"    value="admin" />');
244*007225e5Sgerardnico            ptln('	<input type="hidden" name="page"  value="' . $this->getPluginName() . '_' . $this->getPluginComponent() . '" />');
245*007225e5Sgerardnico            ptln('	<input type="submit" name="upsert" name="Create a page rule" class="button" value="' . $this->getLangOrDefault('AddNewRule','Add a new rule') . '" />');
246*007225e5Sgerardnico            ptln('</form>');
247*007225e5Sgerardnico
248*007225e5Sgerardnico            // List of redirection
249*007225e5Sgerardnico            $rules = $this->pageRuleManager->getRules();
250*007225e5Sgerardnico
251*007225e5Sgerardnico            if (sizeof($rules)==0){
252*007225e5Sgerardnico                ptln('<p>No Rules found</p>');
253*007225e5Sgerardnico            } else {
254*007225e5Sgerardnico                ptln('<div class="table-responsive">');
255*007225e5Sgerardnico
256*007225e5Sgerardnico                ptln('<table class="table table-hover">');
257*007225e5Sgerardnico                ptln('	<thead>');
258*007225e5Sgerardnico                ptln('		<tr>');
259*007225e5Sgerardnico                ptln('			<th>&nbsp;</th>');
260*007225e5Sgerardnico                ptln('			<th>' . $this->getLangOrDefault('Priority', 'Priority') . '</th>');
261*007225e5Sgerardnico                ptln('			<th>' . $this->getLangOrDefault('Matcher', 'Matcher') . '</th>');
262*007225e5Sgerardnico                ptln('			<th>' . $this->getLangOrDefault('Target', 'Target') . '</th>');
263*007225e5Sgerardnico                ptln('			<th>' . $this->getLangOrDefault('NDate', 'Date') . '</th>');
264*007225e5Sgerardnico                ptln('	    </tr>');
265*007225e5Sgerardnico                ptln('	</thead>');
266*007225e5Sgerardnico                ptln('	<tbody>');
267*007225e5Sgerardnico
268*007225e5Sgerardnico
269*007225e5Sgerardnico                foreach ($rules as $key => $row) {
270*007225e5Sgerardnico
271*007225e5Sgerardnico                    $id = $row[PageRules::ID_NAME];
272*007225e5Sgerardnico                    $matcher = $row[PageRules::MATCHER_NAME];
273*007225e5Sgerardnico                    $target = $row[PageRules::TARGET_NAME];
274*007225e5Sgerardnico                    $timestamp = $row[PageRules::TIMESTAMP_NAME];
275*007225e5Sgerardnico                    $priority = $row[PageRules::PRIORITY_NAME];
276*007225e5Sgerardnico
277*007225e5Sgerardnico
278*007225e5Sgerardnico                    ptln('	  <tr class="redirect_info">');
279*007225e5Sgerardnico                    ptln('		<td>');
280*007225e5Sgerardnico                    ptln('			<form action="" method="post" style="display: inline-block">');
281*007225e5Sgerardnico                    ptln('<input type="hidden" name="sectok" value="'.getSecurityToken().'" />');
282*007225e5Sgerardnico                    ptln('<button style="background: none;border: 0;">');
283*007225e5Sgerardnico                    ptln(inlineSVG(DOKU_PLUGIN . $this->getPluginName() . '/images/delete.svg'));
284*007225e5Sgerardnico                    ptln('</button>');
285*007225e5Sgerardnico                    ptln('				<input type="hidden" name="Delete"  value="Yes" />');
286*007225e5Sgerardnico                    ptln('				<input type="hidden" name="' . PageRules::ID_NAME . '"  value="' . $id . '" />');
287*007225e5Sgerardnico                    ptln('			</form>');
288*007225e5Sgerardnico                    ptln('			<form action="" method="post" style="display: inline-block">');
289*007225e5Sgerardnico                    ptln('<input type="hidden" name="sectok" value="'.getSecurityToken().'" />');
290*007225e5Sgerardnico                    ptln('<button style="background: none;border: 0;">');
291*007225e5Sgerardnico                    ptln(inlineSVG(DOKU_PLUGIN . $this->getPluginName() . '/images/file-document-edit-outline.svg'));
292*007225e5Sgerardnico                    ptln('</button>');
293*007225e5Sgerardnico                    ptln('				<input type="hidden" name="upsert"  value="Yes" />');
294*007225e5Sgerardnico                    ptln('				<input type="hidden" name="' . PageRules::ID_NAME . '"  value="' . $id . '" />');
295*007225e5Sgerardnico                    ptln('			</form>');
296*007225e5Sgerardnico
297*007225e5Sgerardnico                    ptln('		</td>');
298*007225e5Sgerardnico                    ptln('		<td>' . $priority . '</td>');
299*007225e5Sgerardnico                    ptln('	    <td>' . $matcher . '</td>');
300*007225e5Sgerardnico                    ptln('		<td>' . $target . '</td>');
301*007225e5Sgerardnico                    ptln('		<td>' . $timestamp . '</td>');
302*007225e5Sgerardnico                    ptln('    </tr>');
303*007225e5Sgerardnico                }
304*007225e5Sgerardnico                ptln('  </tbody>');
305*007225e5Sgerardnico                ptln('</table>');
306*007225e5Sgerardnico                ptln('</div>'); //End Table responsive
307*007225e5Sgerardnico            }
308*007225e5Sgerardnico
309*007225e5Sgerardnico            ptln('</div>'); // End level 2
310*007225e5Sgerardnico
311*007225e5Sgerardnico
312*007225e5Sgerardnico        }
313*007225e5Sgerardnico
314*007225e5Sgerardnico
315*007225e5Sgerardnico    }
316*007225e5Sgerardnico
317*007225e5Sgerardnico    /**
318*007225e5Sgerardnico     * An utility function to return the plugin translation or a default value
319*007225e5Sgerardnico     * @param $id
320*007225e5Sgerardnico     * @param $default
321*007225e5Sgerardnico     * @return mixed|string
322*007225e5Sgerardnico     */
323*007225e5Sgerardnico    private function getLangOrDefault($id, $default)
324*007225e5Sgerardnico    {
325*007225e5Sgerardnico        $lang = $this->getLang($id);
326*007225e5Sgerardnico        return $lang !='' ? $lang : $default;
327*007225e5Sgerardnico    }
328*007225e5Sgerardnico
329*007225e5Sgerardnico
330*007225e5Sgerardnico    static function getAdminPageName(){
331*007225e5Sgerardnico        return PluginUtility::getAdminPageName(get_called_class());
332*007225e5Sgerardnico    }
333*007225e5Sgerardnico
334*007225e5Sgerardnico}
335