xref: /plugin/approve/admin.php (revision e72eb5b885900c1ba7d95bea885c34b3510ee269)
1<?php
2
3use dokuwiki\Extension\AdminPlugin;
4use dokuwiki\Extension\Event;
5
6class admin_plugin_approve extends AdminPlugin
7{
8    /**
9     * @return int sort number in admin menu
10     */
11    public function getMenuSort()
12    {
13        return 1;
14    }
15
16    /**
17     * Should carry out any processing required by the plugin.
18     */
19    public function handle()
20    {
21        global $ID;
22        /* @var Input */
23        global $INPUT;
24
25        /** @var helper_plugin_approve_data $db */
26        $db = $this->loadHelper('approve_data');
27
28        if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) {
29            $assignment = $INPUT->arr('assignment');
30            //insert empty string as NULL
31            if ($INPUT->str('action') === 'delete') {
32                $db->deleteMaintainer((int) $assignment['id']);
33                $db->updatePagesAssignments();
34            } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) {
35                $approver = '';
36                if (!blank($assignment['approver'])) {
37                    $approver = $assignment['approver'];
38                } elseif (!blank($assignment['approver_fb'])) {
39                    $approver = $assignment['approver_fb'];
40                }
41                $db->addMaintainer($assignment['assign'], $approver);
42
43                // TODO: Transaction must be commit before updatePageAssignments
44                $db->updatePagesAssignments();
45            }
46
47            send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&'));
48        }
49    }
50
51    /**
52     * Render HTML output, e.g. helpful text and a form
53     */
54    public function html()
55    {
56        global $ID;
57        /* @var DokuWiki_Auth_Plugin $auth */
58        global $auth;
59
60        try {
61            /** @var \helper_plugin_approve_db $db_helper */
62            $db_helper = plugin_load('helper', 'approve_db');
63            $sqlite = $db_helper->getDB();
64        } catch (Exception $e) {
65            msg($e->getMessage(), -1);
66            return;
67        }
68
69        $res = $sqlite->query('SELECT * FROM maintainer ORDER BY namespace');
70        $assignments = $sqlite->res2arr($res);
71
72        echo $this->locale_xhtml('assignments_intro');
73
74        echo '<form action="' . wl($ID) . '" action="post">';
75        echo '<input type="hidden" name="do" value="admin" />';
76        echo '<input type="hidden" name="page" value="approve" />';
77        echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />';
78        echo '<table class="inline">';
79
80        // header
81        echo '<tr>';
82        echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>';
83        echo '<th>'.$this->getLang('admin h_assignment_approver').'</th>';
84        echo '<th></th>';
85        echo '</tr>';
86
87        // existing assignments
88        foreach($assignments as $assignment) {
89            $id = $assignment['id'];
90            $namespace = $assignment['namespace'];
91            $approver = $assignment['approver'] ? $assignment['approver'] : '---';
92
93            $link = wl(
94                $ID, array(
95                    'do' => 'admin',
96                    'page' => 'approve',
97                    'action' => 'delete',
98                    'sectok' => getSecurityToken(),
99                    'assignment[id]' => $id
100                )
101            );
102
103            echo '<tr>';
104            echo '<td>' . hsc($namespace) . '</td>';
105            $user = $auth->getUserData($approver);
106            if ($user) {
107                echo '<td>' . hsc($user['name']) . '</td>';
108            } else {
109                echo '<td>' . hsc($approver) . '</td>';
110            }
111            echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>';
112            echo '</tr>';
113        }
114
115        // new assignment form
116        echo '<tr>';
117        echo '<td><input type="text" name="assignment[assign]" /></td>';
118        echo '<td>';
119        if ($auth->canDo('getUsers')) {
120            echo '<select name="assignment[approver]">';
121            echo '<option value="">---</option>';
122            if ($auth->canDo('getGroups')) {
123                foreach($auth->retrieveGroups() as $group) {
124                    echo '<option value="@' . hsc($group) . '">' . '@' . hsc($group) . '</option>';
125                }
126            }
127            foreach($auth->retrieveUsers() as $login => $data) {
128                echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>';
129            }
130            echo '</select>';
131            // in case your auth plugin can do groups, but not list them (like the default one),
132            // leave a text field as backup
133            if (!$auth->canDo('getGroups')) {
134                echo '<input name="assignment[approver_fb]" id="plugin__approve_group_input">';
135            }
136        } else {
137            echo '<input name="assignment[approver]">';
138        }
139        echo '</td>';
140
141        echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>';
142        echo '</tr>';
143
144        echo '</table>';
145    }
146}
147
148// vim:ts=4:sw=4:et:
149