xref: /plugin/struct/admin/assignments.php (revision 0549dcc5bc88d4f9d923acdd09931d8d51be7097)
1<?php
2
3/**
4 * DokuWiki Plugin struct (Admin Component)
5 *
6 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7 * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
8 */
9
10// must be run within Dokuwiki
11use dokuwiki\plugin\struct\meta\Assignments;
12use dokuwiki\plugin\struct\meta\Schema;
13use dokuwiki\plugin\struct\meta\StructException;
14
15if (!defined('DOKU_INC')) die();
16
17class admin_plugin_struct_assignments extends DokuWiki_Admin_Plugin
18{
19    /**
20     * @return int sort number in admin menu
21     */
22    public function getMenuSort()
23    {
24        return 501;
25    }
26
27    /**
28     * Return the text that is displayed at the main admin menu
29     *
30     * @param string $language language code
31     * @return string menu string
32     */
33    public function getMenuText($language)
34    {
35        return $this->getLang('menu_assignments');
36    }
37
38    /**
39     * @return bool true if only access for superuser, false is for superusers and moderators
40     */
41    public function forAdminOnly()
42    {
43        return false;
44    }
45
46    /**
47     * Should carry out any processing required by the plugin.
48     */
49    public function handle()
50    {
51        global $INPUT;
52        global $ID;
53
54        try {
55            $assignments = Assignments::getInstance();
56        } catch (StructException $e) {
57            msg($e->getMessage(), -1);
58            return false;
59        }
60
61        if ($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) {
62            $assignment = $INPUT->arr('assignment');
63            if (!blank($assignment['assign']) && !blank($assignment['tbl'])) {
64                if ($INPUT->str('action') === 'delete') {
65                    $ok = $assignments->removePattern($assignment['assign'], $assignment['tbl']);
66                    if (!$ok) msg('failed to remove pattern', -1);
67                } elseif ($INPUT->str('action') === 'add') {
68                    if ($assignment['assign'][0] == '/') {
69                        if (@preg_match($assignment['assign'], null) === false) {
70                            msg('Invalid regular expression. Pattern not saved', -1);
71                        } else {
72                            $ok = $assignments->addPattern($assignment['assign'], $assignment['tbl']);
73                            if (!$ok) msg('failed to add pattern', -1);
74                        }
75                    } else {
76                        $ok = $assignments->addPattern($assignment['assign'], $assignment['tbl']);
77                        if (!$ok) msg('failed to add pattern', -1);
78                    }
79                }
80            }
81
82
83            send_redirect(wl($ID, array('do' => 'admin', 'page' => 'struct_assignments'), true, '&'));
84        }
85    }
86
87    /**
88     * Render HTML output, e.g. helpful text and a form
89     */
90    public function html()
91    {
92        global $ID;
93
94        echo $this->locale_xhtml('assignments_intro');
95
96        try {
97            $ass = Assignments::getInstance();
98        } catch (StructException $e) {
99            msg($e->getMessage(), -1);
100            return false;
101        }
102        $assignments = $ass->getAllPatterns();
103
104        echo '<form action="' . wl($ID) . '" action="post">';
105        echo '<input type="hidden" name="do" value="admin" />';
106        echo '<input type="hidden" name="page" value="struct_assignments" />';
107        echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />';
108        echo '<table class="inline">';
109
110        // header
111        echo '<tr>';
112        echo '<th>' . $this->getLang('assign_assign') . '</th>';
113        echo '<th>' . $this->getLang('assign_tbl') . '</th>';
114        echo '<th></th>';
115        echo '</tr>';
116
117        // existing assignments
118        foreach ($assignments as $assignment) {
119            $schema = $assignment['tbl'];
120            $assignee = $assignment['pattern'];
121
122            $link = wl(
123                $ID,
124                array(
125                    'do' => 'admin',
126                    'page' => 'struct_assignments',
127                    'action' => 'delete',
128                    'sectok' => getSecurityToken(),
129                    'assignment[tbl]' => $schema,
130                    'assignment[assign]' => $assignee,
131                )
132            );
133
134            echo '<tr>';
135            echo '<td>' . hsc($assignee) . '</td>';
136            echo '<td>' . hsc($schema) . '</td>';
137            echo '<td><a class="deleteSchema" href="' . $link . '">' . $this->getLang('assign_del') . '</a></td>';
138            echo '</tr>';
139        }
140
141        // new assignment form
142        echo '<tr>';
143        echo '<td><input type="text" name="assignment[assign]" /></td>';
144        echo '<td>';
145        echo '<select name="assignment[tbl]">';
146        foreach (Schema::getAll() as $table) {
147            echo '<option value="' . hsc($table) . '">' . hsc($table) . '</option>';
148        }
149        echo '</select>';
150        echo '</td>';
151        echo '<td><button type="submit" name="action" value="add">' . $this->getLang('assign_add') . '</button></td>';
152        echo '</tr>';
153
154        echo '</table>';
155        echo '</form>';
156    }
157
158    /**
159     * Copies the TOC from the Schema Editor
160     *
161     * @return array
162     */
163    public function getTOC()
164    {
165        /** @var admin_plugin_struct_schemas $plugin */
166        $plugin = plugin_load('admin', 'struct_schemas');
167        return $plugin->getTOC();
168    }
169}
170
171// vim:ts=4:sw=4:et:
172