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 32*ca455b8eSMichael Große if (!$INPUT->has('filter')) { 33*ca455b8eSMichael Große $INPUT->set('filter', getNS($ID)); 34*ca455b8eSMichael Große } 3531396860SSzymon Olewniczak 36a546f97cSSzymon Olewniczak 378e9d0162SSzymon Olewniczak //by default sort by tag name 38*ca455b8eSMichael Große if (!$INPUT->has('sort')) { 39*ca455b8eSMichael Große $INPUT->set('sort', 'tid'); 40*ca455b8eSMichael Große } 418e9d0162SSzymon Olewniczak 4231396860SSzymon Olewniczak //now starts functions handle 43*ca455b8eSMichael Große if (!$INPUT->has('fn')) { 44*ca455b8eSMichael Große return false; 45*ca455b8eSMichael Große } 46*ca455b8eSMichael Große if (!checkSecurityToken()) { 47*ca455b8eSMichael Große return false; 48*ca455b8eSMichael Große } 4931396860SSzymon Olewniczak 5031396860SSzymon Olewniczak // extract the command and any specific parameters 5131396860SSzymon Olewniczak // submit button name is of the form - fn[cmd][param(s)] 5231396860SSzymon Olewniczak $fn = $INPUT->param('fn'); 5331396860SSzymon Olewniczak 5431396860SSzymon Olewniczak if (is_array($fn)) { 5531396860SSzymon Olewniczak $cmd = key($fn); 5631396860SSzymon Olewniczak $param = is_array($fn[$cmd]) ? key($fn[$cmd]) : null; 5731396860SSzymon Olewniczak } else { 5831396860SSzymon Olewniczak $cmd = $fn; 5931396860SSzymon Olewniczak $param = null; 6031396860SSzymon Olewniczak } 6131396860SSzymon Olewniczak 6231396860SSzymon Olewniczak switch ($cmd) { 638e9d0162SSzymon Olewniczak case 'rename': 648e9d0162SSzymon Olewniczak $this->hlp->renameTag($INPUT->str('old'), $INPUT->str('new')); 658e9d0162SSzymon Olewniczak break; 668e9d0162SSzymon Olewniczak case 'delete': 678e9d0162SSzymon Olewniczak $this->hlp->deleteTags(array_keys($INPUT->arr('tags')), $INPUT->str('filter')); 688e9d0162SSzymon Olewniczak break; 698e9d0162SSzymon Olewniczak case 'sort': 708e9d0162SSzymon Olewniczak $INPUT->set('sort', $param); 718e9d0162SSzymon Olewniczak break; 728e9d0162SSzymon Olewniczak 73872edc7cSRené Corinth } 74872edc7cSRené Corinth } 75872edc7cSRené Corinth 768a1a3846SAndreas Gohr /** 778a1a3846SAndreas Gohr * Draw the interface 788a1a3846SAndreas Gohr */ 79872edc7cSRené Corinth function html() { 808a1a3846SAndreas Gohr echo $this->locale_xhtml('intro'); 818a1a3846SAndreas Gohr $this->html_form(); 828a1a3846SAndreas Gohr echo '<br />'; 838a1a3846SAndreas Gohr $this->html_table(); 84872edc7cSRené Corinth } 85872edc7cSRené Corinth 868a1a3846SAndreas Gohr /** 878a1a3846SAndreas Gohr * Show form for renaming tags 888a1a3846SAndreas Gohr */ 898a1a3846SAndreas Gohr protected function html_form() { 900c867873SSzymon Olewniczak global $ID, $INPUT; 918a1a3846SAndreas Gohr 92f1059d49SSzymon Olewniczak $form = new dokuwiki\Form\Form(); 93f1059d49SSzymon Olewniczak $form->addClass('plugin_tagging'); 948a1a3846SAndreas Gohr 95f1059d49SSzymon Olewniczak $form->setHiddenField('do', 'admin'); 96f1059d49SSzymon Olewniczak $form->setHiddenField('page', 'tagging'); 97f1059d49SSzymon Olewniczak $form->setHiddenField('id', $ID); 98f1059d49SSzymon Olewniczak $form->setHiddenField('filter', $INPUT->str('filter')); 998e9d0162SSzymon Olewniczak $form->setHiddenField('sort', $INPUT->str('sort')); 1008a1a3846SAndreas Gohr 101f1059d49SSzymon Olewniczak $form->addFieldsetOpen($this->getLang('admin rename tag')); 102f1059d49SSzymon Olewniczak $form->addTextInput('old', $this->getLang('admin find tag'))->addClass('block'); 103f1059d49SSzymon Olewniczak $form->addTagClose('br'); 104f1059d49SSzymon Olewniczak $form->addTextInput('new', $this->getLang('admin new name'))->addClass('block'); 105f1059d49SSzymon Olewniczak $form->addTagClose('br'); 106f1059d49SSzymon Olewniczak $form->addButton('fn[rename]', $this->getLang('admin save')); 107f1059d49SSzymon Olewniczak $form->addFieldsetClose(); 108f1059d49SSzymon Olewniczak 109f1059d49SSzymon Olewniczak echo $form->toHTML(); 1108a1a3846SAndreas Gohr } 1118a1a3846SAndreas Gohr 1128a1a3846SAndreas Gohr /** 1138a1a3846SAndreas Gohr * Display ALL the tags! 1148a1a3846SAndreas Gohr */ 1158a1a3846SAndreas Gohr protected function html_table() { 116a99b66c1SSzymon Olewniczak global $ID, $INPUT; 1178f630140SSzymon Olewniczak 1180c867873SSzymon Olewniczak $headers = array( 119cb469644SSzymon Olewniczak array('value' => ' ', 'sort_by' => false), 120cb469644SSzymon Olewniczak array('value' => $this->getLang('admin tag'), 'sort_by' => 'tid'), 121cb469644SSzymon Olewniczak array('value' => $this->getLang('admin occurrence'), 'sort_by' => 'count'), 122cb469644SSzymon Olewniczak array('value' => $this->getLang('admin writtenas'), 'sort_by' => 'orig'), 123*ca455b8eSMichael Große array('value' => $this->getLang('admin taggers'), 'sort_by' => 'taggers'), 1240c867873SSzymon Olewniczak ); 1258e9d0162SSzymon Olewniczak 1268e9d0162SSzymon Olewniczak $sort = explode(',', $INPUT->str('sort')); 1278e9d0162SSzymon Olewniczak $order_by = $sort[0]; 1288e9d0162SSzymon Olewniczak $desc = false; 1298e9d0162SSzymon Olewniczak if (isset($sort[1]) && $sort[1] === 'desc') { 1308e9d0162SSzymon Olewniczak $desc = true; 1318e9d0162SSzymon Olewniczak } 1328e9d0162SSzymon Olewniczak $tags = $this->hlp->getAllTags($INPUT->str('filter'), $order_by, $desc); 133a99b66c1SSzymon Olewniczak 1340c867873SSzymon Olewniczak $form = new dokuwiki\Form\Form(); 1350c867873SSzymon Olewniczak $form->setHiddenField('do', 'admin'); 1360c867873SSzymon Olewniczak $form->setHiddenField('page', 'tagging'); 1370c867873SSzymon Olewniczak $form->setHiddenField('id', $ID); 1388e9d0162SSzymon Olewniczak $form->setHiddenField('sort', $INPUT->str('sort')); 1390c867873SSzymon Olewniczak 1400c867873SSzymon Olewniczak $form->addTagOpen('table')->addClass('inline plugin_tagging'); 1410c867873SSzymon Olewniczak $form->addTagOpen('tr'); 1420c867873SSzymon Olewniczak $form->addTagOpen('th')->attr('colspan', count($headers)); 1430c867873SSzymon Olewniczak 144a99b66c1SSzymon Olewniczak /** 145a99b66c1SSzymon Olewniczak * Show form for filtering the tags by namespaces 146a99b66c1SSzymon Olewniczak */ 1470c867873SSzymon Olewniczak $form->addTextInput('filter', $this->getLang('admin filter') . ': '); 1480c867873SSzymon Olewniczak $form->addButton('fn[filter]', $this->getLang('admin filter button')); 1498a1a3846SAndreas Gohr 1500c867873SSzymon Olewniczak $form->addTagClose('th'); 1510c867873SSzymon Olewniczak $form->addTagClose('tr'); 1528f630140SSzymon Olewniczak 1530c867873SSzymon Olewniczak /** 1540c867873SSzymon Olewniczak * Table headers 1550c867873SSzymon Olewniczak */ 1560c867873SSzymon Olewniczak $form->addTagOpen('tr'); 1570c867873SSzymon Olewniczak foreach ($headers as $header) { 158cb469644SSzymon Olewniczak $form->addTagOpen('th'); 159cb469644SSzymon Olewniczak if ($header['sort_by'] !== false) { 1608e9d0162SSzymon Olewniczak $param = $header['sort_by']; 1618e9d0162SSzymon Olewniczak $icon = 'arrow-both'; 1628e9d0162SSzymon Olewniczak $title = $this->getLang('admin sort ascending'); 1638e9d0162SSzymon Olewniczak if ($header['sort_by'] === $order_by) { 1648e9d0162SSzymon Olewniczak if ($desc === false) { 1658e9d0162SSzymon Olewniczak $icon = 'arrow-up'; 1668e9d0162SSzymon Olewniczak $title = $this->getLang('admin sort descending'); 1678e9d0162SSzymon Olewniczak $param .= ',desc'; 1688e9d0162SSzymon Olewniczak } else { 1698e9d0162SSzymon Olewniczak $icon = 'arrow-down'; 1708e9d0162SSzymon Olewniczak } 1718e9d0162SSzymon Olewniczak } 1728e9d0162SSzymon Olewniczak $form->addButtonHTML("fn[sort][$param]", $header['value'] . ' ' . inlineSVG(dirname(__FILE__) . "/images/$icon.svg")) 1738e9d0162SSzymon Olewniczak ->addClass('plugin_tagging sort_button') 1748e9d0162SSzymon Olewniczak ->attr('title', $title); 175cb469644SSzymon Olewniczak } 176cb469644SSzymon Olewniczak $form->addTagClose('th'); 1770c867873SSzymon Olewniczak } 1780c867873SSzymon Olewniczak $form->addTagClose('tr'); 1798a1a3846SAndreas Gohr 180193a767dSSzymon Olewniczak foreach ($tags as $taginfo) { 181193a767dSSzymon Olewniczak $tagname = $taginfo['tid']; 1827e05e623SSzymon Olewniczak $taggers = $taginfo['taggers']; 1837e05e623SSzymon Olewniczak $written = $taginfo['orig']; 1848a1a3846SAndreas Gohr 1850c867873SSzymon Olewniczak $form->addTagOpen('tr'); 1860c867873SSzymon Olewniczak $form->addTagOpen('td')->addClass('centeralign'); 1870c867873SSzymon Olewniczak $form->addCheckbox('tags[' . hsc($tagname) . ']'); 1880c867873SSzymon Olewniczak $form->addTagClose('td'); 1890c867873SSzymon Olewniczak $form->addHTML('<td><a class="tagslist" href="' . 1900c867873SSzymon Olewniczak $this->hlp->getTagSearchURL($tagname) . '">' . hsc($tagname) . '</a></td>'); 1910c867873SSzymon Olewniczak $form->addHTML('<td>' . $taginfo['count'] . '</td>'); 1920c867873SSzymon Olewniczak $form->addHTML('<td>' . hsc($written) . '</td>'); 1930c867873SSzymon Olewniczak $form->addHTML('<td>' . hsc($taggers) . '</td>'); 194a99b66c1SSzymon Olewniczak 1950c867873SSzymon Olewniczak $form->addTagClose('tr'); 1960c867873SSzymon Olewniczak } 1970c867873SSzymon Olewniczak 1980c867873SSzymon Olewniczak $form->addTagOpen('tr'); 1990c867873SSzymon Olewniczak $form->addHTML('<td colspan="5" class="centeralign"><span class="medialeft">'); 2000c867873SSzymon Olewniczak $form->addButton('fn[delete]', $this->getLang('admin delete_selected'))->id('tagging__del'); 2010c867873SSzymon Olewniczak $form->addHTML('</span></td>'); 2020c867873SSzymon Olewniczak $form->addTagClose('tr'); 2030c867873SSzymon Olewniczak 2040c867873SSzymon Olewniczak $form->addTagClose('table'); 2050c867873SSzymon Olewniczak echo $form->toHTML(); 2068f630140SSzymon Olewniczak } 207872edc7cSRené Corinth} 208