xref: /plugin/tagging/admin.php (revision 8e9d0162baf1ffccd866b99c7890fb8a88f89bd9)
1872edc7cSRené Corinth<?php
2872edc7cSRené Corinth// must be run within Dokuwiki
30cfde7e9SMichael Großeif (!defined('DOKU_INC')) {
40cfde7e9SMichael Große    die();
50cfde7e9SMichael Große}
6872edc7cSRené Corinth
7872edc7cSRené Corinthclass admin_plugin_tagging extends DokuWiki_Admin_Plugin {
8872edc7cSRené Corinth
98a1a3846SAndreas Gohr    /** @var helper_plugin_tagging */
10872edc7cSRené Corinth    private $hlp;
11872edc7cSRené Corinth
128a1a3846SAndreas Gohr    public function __construct() {
13872edc7cSRené Corinth        $this->hlp      = plugin_load('helper', 'tagging');
148a1a3846SAndreas Gohr    }
15872edc7cSRené Corinth
168a1a3846SAndreas Gohr    /**
178a1a3846SAndreas Gohr     * We allow use by managers
188a1a3846SAndreas Gohr     *
198a1a3846SAndreas Gohr     * @return bool always false
208a1a3846SAndreas Gohr     */
218a1a3846SAndreas Gohr    function forAdminOnly() {
228a1a3846SAndreas Gohr        return false;
238a1a3846SAndreas Gohr    }
248a1a3846SAndreas Gohr
258a1a3846SAndreas Gohr    /**
2631396860SSzymon Olewniczak     * Handle tag actions
278a1a3846SAndreas Gohr     */
288a1a3846SAndreas Gohr    function handle() {
2931396860SSzymon Olewniczak        global $ID, $INPUT;
3031396860SSzymon Olewniczak
3131396860SSzymon Olewniczak        //by default use current page namespace
3231396860SSzymon Olewniczak        if (!$INPUT->has('filter')) $INPUT->set('filter', getNS($ID));
3331396860SSzymon Olewniczak
34*8e9d0162SSzymon Olewniczak        //by default sort by tag name
35*8e9d0162SSzymon Olewniczak        if (!$INPUT->has('sort')) $INPUT->set('sort', 'tid');
36*8e9d0162SSzymon Olewniczak
3731396860SSzymon Olewniczak        //now starts functions handle
3831396860SSzymon Olewniczak        if (!$INPUT->has('fn')) return false;
3931396860SSzymon Olewniczak        if (!checkSecurityToken()) return false;
4031396860SSzymon Olewniczak
4131396860SSzymon Olewniczak        // extract the command and any specific parameters
4231396860SSzymon Olewniczak        // submit button name is of the form - fn[cmd][param(s)]
4331396860SSzymon Olewniczak        $fn   = $INPUT->param('fn');
4431396860SSzymon Olewniczak
4531396860SSzymon Olewniczak        if (is_array($fn)) {
4631396860SSzymon Olewniczak            $cmd = key($fn);
4731396860SSzymon Olewniczak            $param = is_array($fn[$cmd]) ? key($fn[$cmd]) : null;
4831396860SSzymon Olewniczak        } else {
4931396860SSzymon Olewniczak            $cmd = $fn;
5031396860SSzymon Olewniczak            $param = null;
5131396860SSzymon Olewniczak        }
5231396860SSzymon Olewniczak
5331396860SSzymon Olewniczak        switch ($cmd) {
54*8e9d0162SSzymon Olewniczak            case 'rename':
55*8e9d0162SSzymon Olewniczak                $this->hlp->renameTag($INPUT->str('old'), $INPUT->str('new'));
56*8e9d0162SSzymon Olewniczak                break;
57*8e9d0162SSzymon Olewniczak            case 'delete':
58*8e9d0162SSzymon Olewniczak                $this->hlp->deleteTags(array_keys($INPUT->arr('tags')), $INPUT->str('filter'));
59*8e9d0162SSzymon Olewniczak                break;
60*8e9d0162SSzymon Olewniczak            case 'sort':
61*8e9d0162SSzymon Olewniczak                $INPUT->set('sort', $param);
62*8e9d0162SSzymon Olewniczak                break;
63*8e9d0162SSzymon Olewniczak
64872edc7cSRené Corinth        }
65872edc7cSRené Corinth    }
66872edc7cSRené Corinth
678a1a3846SAndreas Gohr    /**
688a1a3846SAndreas Gohr     * Draw the interface
698a1a3846SAndreas Gohr     */
70872edc7cSRené Corinth    function html() {
718a1a3846SAndreas Gohr        echo $this->locale_xhtml('intro');
728a1a3846SAndreas Gohr        $this->html_form();
738a1a3846SAndreas Gohr        echo '<br />';
748a1a3846SAndreas Gohr        $this->html_table();
75872edc7cSRené Corinth    }
76872edc7cSRené Corinth
778a1a3846SAndreas Gohr    /**
788a1a3846SAndreas Gohr     * Show form for renaming tags
798a1a3846SAndreas Gohr     */
808a1a3846SAndreas Gohr    protected function html_form() {
810c867873SSzymon Olewniczak        global $ID, $INPUT;
828a1a3846SAndreas Gohr
83f1059d49SSzymon Olewniczak        $form = new dokuwiki\Form\Form();
84f1059d49SSzymon Olewniczak        $form->addClass('plugin_tagging');
858a1a3846SAndreas Gohr
86f1059d49SSzymon Olewniczak        $form->setHiddenField('do',    'admin');
87f1059d49SSzymon Olewniczak        $form->setHiddenField('page',  'tagging');
88f1059d49SSzymon Olewniczak        $form->setHiddenField('id',     $ID);
89f1059d49SSzymon Olewniczak        $form->setHiddenField('filter', $INPUT->str('filter'));
90*8e9d0162SSzymon Olewniczak        $form->setHiddenField('sort', $INPUT->str('sort'));
918a1a3846SAndreas Gohr
92f1059d49SSzymon Olewniczak        $form->addFieldsetOpen($this->getLang('admin rename tag'));
93f1059d49SSzymon Olewniczak        $form->addTextInput('old', $this->getLang('admin find tag'))->addClass('block');
94f1059d49SSzymon Olewniczak        $form->addTagClose('br');
95f1059d49SSzymon Olewniczak        $form->addTextInput('new', $this->getLang('admin new name'))->addClass('block');
96f1059d49SSzymon Olewniczak        $form->addTagClose('br');
97f1059d49SSzymon Olewniczak        $form->addButton('fn[rename]', $this->getLang('admin save'));
98f1059d49SSzymon Olewniczak        $form->addFieldsetClose();
99f1059d49SSzymon Olewniczak
100f1059d49SSzymon Olewniczak        echo $form->toHTML();
1018a1a3846SAndreas Gohr    }
1028a1a3846SAndreas Gohr
1038a1a3846SAndreas Gohr    /**
1048a1a3846SAndreas Gohr     * Display ALL the tags!
1058a1a3846SAndreas Gohr     */
1068a1a3846SAndreas Gohr    protected function html_table() {
107a99b66c1SSzymon Olewniczak        global $ID, $INPUT;
1088f630140SSzymon Olewniczak
1090c867873SSzymon Olewniczak        $headers = array(
110cb469644SSzymon Olewniczak            array('value' => '&#160;',                           'sort_by' => false),
111cb469644SSzymon Olewniczak            array('value' => $this->getLang('admin tag'),        'sort_by' => 'tid'),
112cb469644SSzymon Olewniczak            array('value' => $this->getLang('admin occurrence'), 'sort_by' => 'count'),
113cb469644SSzymon Olewniczak            array('value' => $this->getLang('admin writtenas'),  'sort_by' => 'orig'),
114cb469644SSzymon Olewniczak            array('value' => $this->getLang('admin taggers'),    'sort_by' => 'taggers')
1150c867873SSzymon Olewniczak        );
116*8e9d0162SSzymon Olewniczak
117*8e9d0162SSzymon Olewniczak        $sort = explode(',', $INPUT->str('sort'));
118*8e9d0162SSzymon Olewniczak        $order_by = $sort[0];
119*8e9d0162SSzymon Olewniczak        $desc = false;
120*8e9d0162SSzymon Olewniczak        if (isset($sort[1]) && $sort[1] === 'desc') {
121*8e9d0162SSzymon Olewniczak            $desc = true;
122*8e9d0162SSzymon Olewniczak        }
123*8e9d0162SSzymon Olewniczak        $tags = $this->hlp->getAllTags($INPUT->str('filter'), $order_by, $desc);
124a99b66c1SSzymon Olewniczak
1250c867873SSzymon Olewniczak        $form = new dokuwiki\Form\Form();
1260c867873SSzymon Olewniczak        $form->setHiddenField('do',   'admin');
1270c867873SSzymon Olewniczak        $form->setHiddenField('page', 'tagging');
1280c867873SSzymon Olewniczak        $form->setHiddenField('id',    $ID);
129*8e9d0162SSzymon Olewniczak        $form->setHiddenField('sort', $INPUT->str('sort'));
1300c867873SSzymon Olewniczak
1310c867873SSzymon Olewniczak        $form->addTagOpen('table')->addClass('inline plugin_tagging');
1320c867873SSzymon Olewniczak        $form->addTagOpen('tr');
1330c867873SSzymon Olewniczak        $form->addTagOpen('th')->attr('colspan', count($headers));
1340c867873SSzymon Olewniczak
135a99b66c1SSzymon Olewniczak        /**
136a99b66c1SSzymon Olewniczak         * Show form for filtering the tags by namespaces
137a99b66c1SSzymon Olewniczak         */
1380c867873SSzymon Olewniczak        $form->addTextInput('filter', $this->getLang('admin filter').': ');
1390c867873SSzymon Olewniczak        $form->addButton('fn[filter]', $this->getLang('admin filter button'));
1408a1a3846SAndreas Gohr
1410c867873SSzymon Olewniczak        $form->addTagClose('th');
1420c867873SSzymon Olewniczak        $form->addTagClose('tr');
1438f630140SSzymon Olewniczak
1440c867873SSzymon Olewniczak        /**
1450c867873SSzymon Olewniczak         * Table headers
1460c867873SSzymon Olewniczak         */
1470c867873SSzymon Olewniczak        $form->addTagOpen('tr');
1480c867873SSzymon Olewniczak        foreach ($headers as $header) {
149cb469644SSzymon Olewniczak            $form->addTagOpen('th');
150cb469644SSzymon Olewniczak            if ($header['sort_by'] !== false) {
151*8e9d0162SSzymon Olewniczak                $param = $header['sort_by'];
152*8e9d0162SSzymon Olewniczak                $icon = 'arrow-both';
153*8e9d0162SSzymon Olewniczak                $title = $this->getLang('admin sort ascending');
154*8e9d0162SSzymon Olewniczak                if ($header['sort_by'] === $order_by) {
155*8e9d0162SSzymon Olewniczak                    if ($desc === false) {
156*8e9d0162SSzymon Olewniczak                        $icon = 'arrow-up';
157*8e9d0162SSzymon Olewniczak                        $title = $this->getLang('admin sort descending');
158*8e9d0162SSzymon Olewniczak                        $param .= ',desc';
159*8e9d0162SSzymon Olewniczak                    } else {
160*8e9d0162SSzymon Olewniczak                         $icon = 'arrow-down';
161*8e9d0162SSzymon Olewniczak                    }
162*8e9d0162SSzymon Olewniczak                }
163*8e9d0162SSzymon Olewniczak                $form->addButtonHTML("fn[sort][$param]", $header['value']. ' '. inlineSVG(dirname(__FILE__) . "/images/$icon.svg"))
164*8e9d0162SSzymon Olewniczak                                    ->addClass('plugin_tagging sort_button')
165*8e9d0162SSzymon Olewniczak                                    ->attr('title', $title);
166cb469644SSzymon Olewniczak            }
167cb469644SSzymon Olewniczak            $form->addTagClose('th');
1680c867873SSzymon Olewniczak        }
1690c867873SSzymon Olewniczak        $form->addTagClose('tr');
1708a1a3846SAndreas Gohr
171193a767dSSzymon Olewniczak        foreach ($tags as $taginfo) {
172193a767dSSzymon Olewniczak            $tagname = $taginfo['tid'];
173193a767dSSzymon Olewniczak            $taggers = $taginfo['taggers'];
174193a767dSSzymon Olewniczak            $written = $taginfo['orig'];
1758a1a3846SAndreas Gohr
1760c867873SSzymon Olewniczak            $form->addTagOpen('tr');
1770c867873SSzymon Olewniczak            $form->addTagOpen('td')->addClass('centeralign');
1780c867873SSzymon Olewniczak            $form->addCheckbox('tags['.hsc($tagname).']');
1790c867873SSzymon Olewniczak            $form->addTagClose('td');
1800c867873SSzymon Olewniczak            $form->addHTML('<td><a class="tagslist" href="' .
1810c867873SSzymon Olewniczak                    $this->hlp->getTagSearchURL($tagname) . '">' . hsc($tagname) . '</a></td>');
1820c867873SSzymon Olewniczak            $form->addHTML('<td>' . $taginfo['count'] . '</td>');
1830c867873SSzymon Olewniczak            $form->addHTML('<td>' . hsc($written) . '</td>');
1840c867873SSzymon Olewniczak            $form->addHTML('<td>' . hsc($taggers) . '</td>');
185a99b66c1SSzymon Olewniczak
1860c867873SSzymon Olewniczak            $form->addTagClose('tr');
1870c867873SSzymon Olewniczak        }
1880c867873SSzymon Olewniczak
1890c867873SSzymon Olewniczak        $form->addTagOpen('tr');
1900c867873SSzymon Olewniczak        $form->addHTML('<td colspan="5" class="centeralign"><span class="medialeft">');
1910c867873SSzymon Olewniczak        $form->addButton('fn[delete]', $this->getLang('admin delete_selected'))->id('tagging__del');
1920c867873SSzymon Olewniczak        $form->addHTML('</span></td>');
1930c867873SSzymon Olewniczak        $form->addTagClose('tr');
1940c867873SSzymon Olewniczak
1950c867873SSzymon Olewniczak        $form->addTagClose('table');
1960c867873SSzymon Olewniczak        echo $form->toHTML();
1978f630140SSzymon Olewniczak    }
198872edc7cSRené Corinth}
199