11b552e87SSzymon Olewniczak<?php 21b552e87SSzymon Olewniczak/** 31b552e87SSzymon Olewniczak * DokuWiki Plugin watchcycle (Admin Component) 41b552e87SSzymon Olewniczak * 51b552e87SSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 61b552e87SSzymon Olewniczak * @author Szymon Olewniczak <dokuwiki@cosmocode.de> 71b552e87SSzymon Olewniczak */ 81b552e87SSzymon Olewniczak 91b552e87SSzymon Olewniczak// must be run within Dokuwiki 101b552e87SSzymon Olewniczakif (!defined('DOKU_INC')) { 111b552e87SSzymon Olewniczak die(); 121b552e87SSzymon Olewniczak} 131b552e87SSzymon Olewniczak 141b552e87SSzymon Olewniczakclass admin_plugin_approve extends DokuWiki_Admin_Plugin 151b552e87SSzymon Olewniczak{ 161b552e87SSzymon Olewniczak 171b552e87SSzymon Olewniczak /** @var helper_plugin_sqlite */ 181b552e87SSzymon Olewniczak protected $sqlite; 191b552e87SSzymon Olewniczak 201b552e87SSzymon Olewniczak /** @var helper_plugin_approve */ 211b552e87SSzymon Olewniczak protected $helper; 221b552e87SSzymon Olewniczak 231b552e87SSzymon Olewniczak /** 241b552e87SSzymon Olewniczak * @return helper_plugin_sqlite 251b552e87SSzymon Olewniczak */ 261b552e87SSzymon Olewniczak protected function sqlite() { 271b552e87SSzymon Olewniczak if (!$this->sqlite) { 281b552e87SSzymon Olewniczak /** @var helper_plugin_approve_db $db_helper */ 291b552e87SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 301b552e87SSzymon Olewniczak $this->sqlite = $db_helper->getDB(); 311b552e87SSzymon Olewniczak } 321b552e87SSzymon Olewniczak return $this->sqlite; 331b552e87SSzymon Olewniczak } 341b552e87SSzymon Olewniczak 351b552e87SSzymon Olewniczak /** 361b552e87SSzymon Olewniczak * @return helper_plugin_approve 371b552e87SSzymon Olewniczak */ 381b552e87SSzymon Olewniczak protected function helper() { 391b552e87SSzymon Olewniczak if (!$this->helper) { 401b552e87SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 411b552e87SSzymon Olewniczak $this->helper = $helper; 421b552e87SSzymon Olewniczak } 431b552e87SSzymon Olewniczak return $this->helper; 441b552e87SSzymon Olewniczak } 451b552e87SSzymon Olewniczak 461b552e87SSzymon Olewniczak /** 471b552e87SSzymon Olewniczak * @return int sort number in admin menu 481b552e87SSzymon Olewniczak */ 491b552e87SSzymon Olewniczak public function getMenuSort() 501b552e87SSzymon Olewniczak { 511b552e87SSzymon Olewniczak return 1; 521b552e87SSzymon Olewniczak } 531b552e87SSzymon Olewniczak 54086ec97fSSzymon Olewniczak protected function getPages() { 55086ec97fSSzymon Olewniczak global $conf; 56086ec97fSSzymon Olewniczak $datadir = $conf['datadir']; 57086ec97fSSzymon Olewniczak if (substr($datadir, -1) != '/') { 58086ec97fSSzymon Olewniczak $datadir .= '/'; 59086ec97fSSzymon Olewniczak } 60086ec97fSSzymon Olewniczak 61086ec97fSSzymon Olewniczak $directory = new RecursiveDirectoryIterator($datadir, FilesystemIterator::SKIP_DOTS); 62086ec97fSSzymon Olewniczak $iterator = new RecursiveIteratorIterator($directory); 63086ec97fSSzymon Olewniczak 64086ec97fSSzymon Olewniczak $pages = []; 657e838775SSzymon Olewniczak /** @var SplFileInfo $fileinfo */ 66086ec97fSSzymon Olewniczak foreach ($iterator as $fileinfo) { 67086ec97fSSzymon Olewniczak if (!$fileinfo->isFile()) continue; 68086ec97fSSzymon Olewniczak 697e838775SSzymon Olewniczak $path = $fileinfo->getPathname(); 70086ec97fSSzymon Olewniczak //remove .txt 717e838775SSzymon Olewniczak $id = str_replace('/', ':', substr($path, strlen($datadir), -4)); 727e838775SSzymon Olewniczak $pages[] = $id; 73086ec97fSSzymon Olewniczak } 74086ec97fSSzymon Olewniczak 75086ec97fSSzymon Olewniczak return $pages; 76086ec97fSSzymon Olewniczak } 77086ec97fSSzymon Olewniczak 78086ec97fSSzymon Olewniczak protected function updatePage() 79086ec97fSSzymon Olewniczak { 807e838775SSzymon Olewniczak //clean current settings 817e838775SSzymon Olewniczak $this->sqlite()->query('DELETE FROM page'); 82b1ff32a1SSzymon Olewniczak 83b1ff32a1SSzymon Olewniczak $wikiPages = $this->getPages(); 847e838775SSzymon Olewniczak $no_apr_namespace = $this->helper()->no_apr_namespace(); 85b1ff32a1SSzymon Olewniczak $weighted_assignments = $this->helper()->weighted_assignments(); 86b1ff32a1SSzymon Olewniczak foreach ($wikiPages as $id) { 872ce523c6SSzymon Olewniczak if ($this->helper()->isPageAssigned($id, $approver, $weighted_assignments)) { 88b1ff32a1SSzymon Olewniczak $data = [ 89b1ff32a1SSzymon Olewniczak 'page' => $id, 90b1ff32a1SSzymon Olewniczak 'hidden' => $this->helper()->in_hidden_namespace($id, $no_apr_namespace) ? '1' : '0' 91b1ff32a1SSzymon Olewniczak ]; 9207b13373SSzymon Olewniczak if (!blank($approver)) { 932ce523c6SSzymon Olewniczak $data['approver'] = $approver; 94b1ff32a1SSzymon Olewniczak } 95b1ff32a1SSzymon Olewniczak $this->sqlite()->storeEntry('page', $data); 967e838775SSzymon Olewniczak } 977e838775SSzymon Olewniczak } 98086ec97fSSzymon Olewniczak } 99086ec97fSSzymon Olewniczak 1001b552e87SSzymon Olewniczak /** 1011b552e87SSzymon Olewniczak * Should carry out any processing required by the plugin. 1021b552e87SSzymon Olewniczak */ 1031b552e87SSzymon Olewniczak public function handle() 1041b552e87SSzymon Olewniczak { 105086ec97fSSzymon Olewniczak global $ID; 106086ec97fSSzymon Olewniczak 1071b552e87SSzymon Olewniczak /* @var Input */ 1081b552e87SSzymon Olewniczak global $INPUT; 1091b552e87SSzymon Olewniczak 110086ec97fSSzymon Olewniczak if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) { 111086ec97fSSzymon Olewniczak $assignment = $INPUT->arr('assignment'); 112086ec97fSSzymon Olewniczak //insert empty string as NULL 113086ec97fSSzymon Olewniczak if ($INPUT->str('action') === 'delete') { 1147e838775SSzymon Olewniczak $this->sqlite()->query('DELETE FROM maintainer WHERE id=?', $assignment['id']); 115086ec97fSSzymon Olewniczak $this->updatePage(); 116086ec97fSSzymon Olewniczak } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) { 117b1ff32a1SSzymon Olewniczak $data = [ 118b1ff32a1SSzymon Olewniczak 'namespace' => $assignment['assign'] 119b1ff32a1SSzymon Olewniczak ]; 1202ce523c6SSzymon Olewniczak if (!blank($assignment['approver'])) { 1212ce523c6SSzymon Olewniczak $data['approver'] = $assignment['approver']; 1221b552e87SSzymon Olewniczak } 12307b13373SSzymon Olewniczak $this->sqlite()->storeEntry('maintainer', $data); 124b1ff32a1SSzymon Olewniczak 125086ec97fSSzymon Olewniczak $this->updatePage(); 1261b552e87SSzymon Olewniczak } 127086ec97fSSzymon Olewniczak 128086ec97fSSzymon Olewniczak send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&')); 1291b552e87SSzymon Olewniczak } 1301b552e87SSzymon Olewniczak } 1311b552e87SSzymon Olewniczak 1321b552e87SSzymon Olewniczak /** 1331b552e87SSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 1341b552e87SSzymon Olewniczak */ 1351b552e87SSzymon Olewniczak public function html() 1361b552e87SSzymon Olewniczak { 1371b552e87SSzymon Olewniczak global $ID; 1387e838775SSzymon Olewniczak /* @var DokuWiki_Auth_Plugin $auth */ 139086ec97fSSzymon Olewniczak global $auth; 1401b552e87SSzymon Olewniczak 14182132408SSzymon Olewniczak $res = $this->sqlite()->query('SELECT * FROM maintainer ORDER BY namespace'); 142086ec97fSSzymon Olewniczak $assignments = $this->sqlite()->res2arr($res); 1431b552e87SSzymon Olewniczak 144086ec97fSSzymon Olewniczak echo $this->locale_xhtml('assignments_intro'); 1451b552e87SSzymon Olewniczak 146086ec97fSSzymon Olewniczak echo '<form action="' . wl($ID) . '" action="post">'; 147086ec97fSSzymon Olewniczak echo '<input type="hidden" name="do" value="admin" />'; 148086ec97fSSzymon Olewniczak echo '<input type="hidden" name="page" value="approve" />'; 149086ec97fSSzymon Olewniczak echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />'; 150086ec97fSSzymon Olewniczak echo '<table class="inline">'; 1511b552e87SSzymon Olewniczak 152086ec97fSSzymon Olewniczak // header 153086ec97fSSzymon Olewniczak echo '<tr>'; 154086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>'; 1552ce523c6SSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_approver').'</th>'; 156086ec97fSSzymon Olewniczak echo '<th></th>'; 157086ec97fSSzymon Olewniczak echo '</tr>'; 1581b552e87SSzymon Olewniczak 159086ec97fSSzymon Olewniczak // existing assignments 160086ec97fSSzymon Olewniczak foreach($assignments as $assignment) { 161086ec97fSSzymon Olewniczak $id = $assignment['id']; 162086ec97fSSzymon Olewniczak $namespace = $assignment['namespace']; 1632ce523c6SSzymon Olewniczak $approver = $assignment['approver'] ? $assignment['approver'] : '---'; 1641b552e87SSzymon Olewniczak 165086ec97fSSzymon Olewniczak $link = wl( 166086ec97fSSzymon Olewniczak $ID, array( 1671b552e87SSzymon Olewniczak 'do' => 'admin', 168086ec97fSSzymon Olewniczak 'page' => 'approve', 169086ec97fSSzymon Olewniczak 'action' => 'delete', 170086ec97fSSzymon Olewniczak 'sectok' => getSecurityToken(), 171086ec97fSSzymon Olewniczak 'assignment[id]' => $id 172086ec97fSSzymon Olewniczak ) 173086ec97fSSzymon Olewniczak ); 1741b552e87SSzymon Olewniczak 175086ec97fSSzymon Olewniczak echo '<tr>'; 176086ec97fSSzymon Olewniczak echo '<td>' . hsc($namespace) . '</td>'; 1772ce523c6SSzymon Olewniczak $user = $auth->getUserData($approver); 178c7d53eabSSzymon Olewniczak if ($user) { 179c7d53eabSSzymon Olewniczak echo '<td>' . hsc($user['name']) . '</td>'; 180c7d53eabSSzymon Olewniczak } else { 1812ce523c6SSzymon Olewniczak echo '<td>' . hsc($approver) . '</td>'; 182c7d53eabSSzymon Olewniczak } 183086ec97fSSzymon Olewniczak echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>'; 184086ec97fSSzymon Olewniczak echo '</tr>'; 1851b552e87SSzymon Olewniczak } 1861b552e87SSzymon Olewniczak 187086ec97fSSzymon Olewniczak // new assignment form 188086ec97fSSzymon Olewniczak echo '<tr>'; 189086ec97fSSzymon Olewniczak echo '<td><input type="text" name="assignment[assign]" /></td>'; 190086ec97fSSzymon Olewniczak echo '<td>'; 191*6dbb709bSSzymon Olewniczak if ($auth->canDo('getUsers')) { 1922ce523c6SSzymon Olewniczak echo '<select name="assignment[approver]">'; 193086ec97fSSzymon Olewniczak echo '<option value="">---</option>'; 194086ec97fSSzymon Olewniczak foreach($auth->retrieveUsers() as $login => $data) { 195086ec97fSSzymon Olewniczak echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>'; 1961b552e87SSzymon Olewniczak } 197086ec97fSSzymon Olewniczak echo '</select>'; 198*6dbb709bSSzymon Olewniczak 199*6dbb709bSSzymon Olewniczak } else { 200*6dbb709bSSzymon Olewniczak echo '<input name="assignment[approver]">'; 201*6dbb709bSSzymon Olewniczak } 202086ec97fSSzymon Olewniczak echo '</td>'; 203*6dbb709bSSzymon Olewniczak 204086ec97fSSzymon Olewniczak echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>'; 205086ec97fSSzymon Olewniczak echo '</tr>'; 2061b552e87SSzymon Olewniczak 207086ec97fSSzymon Olewniczak echo '</table>'; 2081b552e87SSzymon Olewniczak } 2091b552e87SSzymon Olewniczak} 2101b552e87SSzymon Olewniczak 2111b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et: 212