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 * @return int sort number in admin menu 181b552e87SSzymon Olewniczak */ 191b552e87SSzymon Olewniczak public function getMenuSort() 201b552e87SSzymon Olewniczak { 211b552e87SSzymon Olewniczak return 1; 221b552e87SSzymon Olewniczak } 231b552e87SSzymon Olewniczak 24086ec97fSSzymon Olewniczak protected function getPages() { 25086ec97fSSzymon Olewniczak global $conf; 26086ec97fSSzymon Olewniczak $datadir = $conf['datadir']; 27086ec97fSSzymon Olewniczak if (substr($datadir, -1) != '/') { 28086ec97fSSzymon Olewniczak $datadir .= '/'; 29086ec97fSSzymon Olewniczak } 30086ec97fSSzymon Olewniczak 31086ec97fSSzymon Olewniczak $directory = new RecursiveDirectoryIterator($datadir, FilesystemIterator::SKIP_DOTS); 32086ec97fSSzymon Olewniczak $iterator = new RecursiveIteratorIterator($directory); 33086ec97fSSzymon Olewniczak 34086ec97fSSzymon Olewniczak $pages = []; 357e838775SSzymon Olewniczak /** @var SplFileInfo $fileinfo */ 36086ec97fSSzymon Olewniczak foreach ($iterator as $fileinfo) { 37086ec97fSSzymon Olewniczak if (!$fileinfo->isFile()) continue; 38086ec97fSSzymon Olewniczak 397e838775SSzymon Olewniczak $path = $fileinfo->getPathname(); 40086ec97fSSzymon Olewniczak //remove .txt 417e838775SSzymon Olewniczak $id = str_replace('/', ':', substr($path, strlen($datadir), -4)); 427e838775SSzymon Olewniczak $pages[] = $id; 43086ec97fSSzymon Olewniczak } 44086ec97fSSzymon Olewniczak 45086ec97fSSzymon Olewniczak return $pages; 46086ec97fSSzymon Olewniczak } 47086ec97fSSzymon Olewniczak 48*0c60a293SSzymon Olewniczak protected function updatePage(helper_plugin_sqlite $sqlite, helper_plugin_approve $helper) 49086ec97fSSzymon Olewniczak { 507e838775SSzymon Olewniczak //clean current settings 51*0c60a293SSzymon Olewniczak $sqlite->query('DELETE FROM page'); 52b1ff32a1SSzymon Olewniczak 53b1ff32a1SSzymon Olewniczak $wikiPages = $this->getPages(); 54*0c60a293SSzymon Olewniczak $no_apr_namespace = $helper->no_apr_namespace($sqlite); 55*0c60a293SSzymon Olewniczak $weighted_assignments = $helper->weighted_assignments($sqlite); 56b1ff32a1SSzymon Olewniczak foreach ($wikiPages as $id) { 57*0c60a293SSzymon Olewniczak if ($helper->isPageAssigned($sqlite, $id, $approver, $weighted_assignments)) { 58b1ff32a1SSzymon Olewniczak $data = [ 59b1ff32a1SSzymon Olewniczak 'page' => $id, 60*0c60a293SSzymon Olewniczak 'hidden' => $helper->in_hidden_namespace($sqlite, $id, $no_apr_namespace) ? '1' : '0' 61b1ff32a1SSzymon Olewniczak ]; 6207b13373SSzymon Olewniczak if (!blank($approver)) { 632ce523c6SSzymon Olewniczak $data['approver'] = $approver; 64b1ff32a1SSzymon Olewniczak } 65*0c60a293SSzymon Olewniczak $sqlite->storeEntry('page', $data); 667e838775SSzymon Olewniczak } 677e838775SSzymon Olewniczak } 68086ec97fSSzymon Olewniczak } 69086ec97fSSzymon Olewniczak 701b552e87SSzymon Olewniczak /** 711b552e87SSzymon Olewniczak * Should carry out any processing required by the plugin. 721b552e87SSzymon Olewniczak */ 731b552e87SSzymon Olewniczak public function handle() 741b552e87SSzymon Olewniczak { 75086ec97fSSzymon Olewniczak global $ID; 761b552e87SSzymon Olewniczak /* @var Input */ 771b552e87SSzymon Olewniczak global $INPUT; 781b552e87SSzymon Olewniczak 79*0c60a293SSzymon Olewniczak try { 80*0c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 81*0c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 82*0c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 83*0c60a293SSzymon Olewniczak } catch (Exception $e) { 84*0c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 85*0c60a293SSzymon Olewniczak return; 86*0c60a293SSzymon Olewniczak } 87*0c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 88*0c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 89*0c60a293SSzymon Olewniczak 90086ec97fSSzymon Olewniczak if($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) { 91086ec97fSSzymon Olewniczak $assignment = $INPUT->arr('assignment'); 92086ec97fSSzymon Olewniczak //insert empty string as NULL 93086ec97fSSzymon Olewniczak if ($INPUT->str('action') === 'delete') { 94*0c60a293SSzymon Olewniczak $sqlite->query('DELETE FROM maintainer WHERE id=?', $assignment['id']); 95*0c60a293SSzymon Olewniczak $this->updatePage($sqlite, $helper); 96086ec97fSSzymon Olewniczak } else if ($INPUT->str('action') === 'add' && !blank($assignment['assign'])) { 97b1ff32a1SSzymon Olewniczak $data = [ 98b1ff32a1SSzymon Olewniczak 'namespace' => $assignment['assign'] 99b1ff32a1SSzymon Olewniczak ]; 1002ce523c6SSzymon Olewniczak if (!blank($assignment['approver'])) { 1012ce523c6SSzymon Olewniczak $data['approver'] = $assignment['approver']; 1021b552e87SSzymon Olewniczak } 103*0c60a293SSzymon Olewniczak $sqlite->storeEntry('maintainer', $data); 104b1ff32a1SSzymon Olewniczak 105*0c60a293SSzymon Olewniczak $this->updatePage($sqlite, $helper); 1061b552e87SSzymon Olewniczak } 107086ec97fSSzymon Olewniczak 108086ec97fSSzymon Olewniczak send_redirect(wl($ID, array('do' => 'admin', 'page' => 'approve'), true, '&')); 1091b552e87SSzymon Olewniczak } 1101b552e87SSzymon Olewniczak } 1111b552e87SSzymon Olewniczak 1121b552e87SSzymon Olewniczak /** 1131b552e87SSzymon Olewniczak * Render HTML output, e.g. helpful text and a form 1141b552e87SSzymon Olewniczak */ 1151b552e87SSzymon Olewniczak public function html() 1161b552e87SSzymon Olewniczak { 1171b552e87SSzymon Olewniczak global $ID; 1187e838775SSzymon Olewniczak /* @var DokuWiki_Auth_Plugin $auth */ 119086ec97fSSzymon Olewniczak global $auth; 1201b552e87SSzymon Olewniczak 121*0c60a293SSzymon Olewniczak try { 122*0c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 123*0c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 124*0c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 125*0c60a293SSzymon Olewniczak } catch (Exception $e) { 126*0c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 127*0c60a293SSzymon Olewniczak return; 128*0c60a293SSzymon Olewniczak } 129*0c60a293SSzymon Olewniczak 130*0c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT * FROM maintainer ORDER BY namespace'); 131*0c60a293SSzymon Olewniczak $assignments = $sqlite->res2arr($res); 1321b552e87SSzymon Olewniczak 133086ec97fSSzymon Olewniczak echo $this->locale_xhtml('assignments_intro'); 1341b552e87SSzymon Olewniczak 135086ec97fSSzymon Olewniczak echo '<form action="' . wl($ID) . '" action="post">'; 136086ec97fSSzymon Olewniczak echo '<input type="hidden" name="do" value="admin" />'; 137086ec97fSSzymon Olewniczak echo '<input type="hidden" name="page" value="approve" />'; 138086ec97fSSzymon Olewniczak echo '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />'; 139086ec97fSSzymon Olewniczak echo '<table class="inline">'; 1401b552e87SSzymon Olewniczak 141086ec97fSSzymon Olewniczak // header 142086ec97fSSzymon Olewniczak echo '<tr>'; 143086ec97fSSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_namespace').'</th>'; 1442ce523c6SSzymon Olewniczak echo '<th>'.$this->getLang('admin h_assignment_approver').'</th>'; 145086ec97fSSzymon Olewniczak echo '<th></th>'; 146086ec97fSSzymon Olewniczak echo '</tr>'; 1471b552e87SSzymon Olewniczak 148086ec97fSSzymon Olewniczak // existing assignments 149086ec97fSSzymon Olewniczak foreach($assignments as $assignment) { 150086ec97fSSzymon Olewniczak $id = $assignment['id']; 151086ec97fSSzymon Olewniczak $namespace = $assignment['namespace']; 1522ce523c6SSzymon Olewniczak $approver = $assignment['approver'] ? $assignment['approver'] : '---'; 1531b552e87SSzymon Olewniczak 154086ec97fSSzymon Olewniczak $link = wl( 155086ec97fSSzymon Olewniczak $ID, array( 1561b552e87SSzymon Olewniczak 'do' => 'admin', 157086ec97fSSzymon Olewniczak 'page' => 'approve', 158086ec97fSSzymon Olewniczak 'action' => 'delete', 159086ec97fSSzymon Olewniczak 'sectok' => getSecurityToken(), 160086ec97fSSzymon Olewniczak 'assignment[id]' => $id 161086ec97fSSzymon Olewniczak ) 162086ec97fSSzymon Olewniczak ); 1631b552e87SSzymon Olewniczak 164086ec97fSSzymon Olewniczak echo '<tr>'; 165086ec97fSSzymon Olewniczak echo '<td>' . hsc($namespace) . '</td>'; 1662ce523c6SSzymon Olewniczak $user = $auth->getUserData($approver); 167c7d53eabSSzymon Olewniczak if ($user) { 168c7d53eabSSzymon Olewniczak echo '<td>' . hsc($user['name']) . '</td>'; 169c7d53eabSSzymon Olewniczak } else { 1702ce523c6SSzymon Olewniczak echo '<td>' . hsc($approver) . '</td>'; 171c7d53eabSSzymon Olewniczak } 172086ec97fSSzymon Olewniczak echo '<td><a href="' . $link . '">'.$this->getLang('admin btn_delete').'</a></td>'; 173086ec97fSSzymon Olewniczak echo '</tr>'; 1741b552e87SSzymon Olewniczak } 1751b552e87SSzymon Olewniczak 176086ec97fSSzymon Olewniczak // new assignment form 177086ec97fSSzymon Olewniczak echo '<tr>'; 178086ec97fSSzymon Olewniczak echo '<td><input type="text" name="assignment[assign]" /></td>'; 179086ec97fSSzymon Olewniczak echo '<td>'; 1806dbb709bSSzymon Olewniczak if ($auth->canDo('getUsers')) { 1812ce523c6SSzymon Olewniczak echo '<select name="assignment[approver]">'; 182086ec97fSSzymon Olewniczak echo '<option value="">---</option>'; 183086ec97fSSzymon Olewniczak foreach($auth->retrieveUsers() as $login => $data) { 184086ec97fSSzymon Olewniczak echo '<option value="' . hsc($login) . '">' . hsc($data['name']) . '</option>'; 1851b552e87SSzymon Olewniczak } 186086ec97fSSzymon Olewniczak echo '</select>'; 1876dbb709bSSzymon Olewniczak 1886dbb709bSSzymon Olewniczak } else { 1896dbb709bSSzymon Olewniczak echo '<input name="assignment[approver]">'; 1906dbb709bSSzymon Olewniczak } 191086ec97fSSzymon Olewniczak echo '</td>'; 1926dbb709bSSzymon Olewniczak 193086ec97fSSzymon Olewniczak echo '<td><button type="submit" name="action" value="add">'.$this->getLang('admin btn_add').'</button></td>'; 194086ec97fSSzymon Olewniczak echo '</tr>'; 1951b552e87SSzymon Olewniczak 196086ec97fSSzymon Olewniczak echo '</table>'; 1971b552e87SSzymon Olewniczak } 1981b552e87SSzymon Olewniczak} 1991b552e87SSzymon Olewniczak 2001b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et: 201