1ce9be9e9SSzymon Olewniczak<?php 2ce9be9e9SSzymon Olewniczak// must be run within DokuWiki 3ce9be9e9SSzymon Olewniczakif (!defined('DOKU_INC')) die(); 4ce9be9e9SSzymon Olewniczak 5ce9be9e9SSzymon Olewniczak/** 6ce9be9e9SSzymon Olewniczak * All DokuWiki plugins to extend the parser/rendering mechanism 7ce9be9e9SSzymon Olewniczak * need to inherit from this class 8ce9be9e9SSzymon Olewniczak */ 9ce9be9e9SSzymon Olewniczakclass action_plugin_ireadit_ireadit extends DokuWiki_Action_Plugin 10ce9be9e9SSzymon Olewniczak{ 11ce9be9e9SSzymon Olewniczak public function register(Doku_Event_Handler $controller) 12ce9be9e9SSzymon Olewniczak { 13ce9be9e9SSzymon Olewniczak $controller->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', $this, 'render_list'); 14ce9be9e9SSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_ireadit_action'); 15ce9be9e9SSzymon Olewniczak $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 16*d2cf7c78SSzymon Olewniczak $controller->register_hook('INDEXER_VERSION_GET', 'BEFORE', $this, 'set_ireadit_index_version'); 17*d2cf7c78SSzymon Olewniczak $controller->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, 'add_readers_to_index'); 18ce9be9e9SSzymon Olewniczak } 19ce9be9e9SSzymon Olewniczak 20ce9be9e9SSzymon Olewniczak public function render_list() 21ce9be9e9SSzymon Olewniczak { 22ce9be9e9SSzymon Olewniczak global $INFO, $ACT, $auth; 23ce9be9e9SSzymon Olewniczak 24ce9be9e9SSzymon Olewniczak if ($ACT != 'show') return; 25*d2cf7c78SSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit'])) return; 26*d2cf7c78SSzymon Olewniczak $ireadit_data = $INFO['meta']['plugin_ireadit']; 27ce9be9e9SSzymon Olewniczak 28ce9be9e9SSzymon Olewniczak echo '<div'; 29ce9be9e9SSzymon Olewniczak if ($this->getConf('print') == 0) { 30ce9be9e9SSzymon Olewniczak echo' class="no-print"'; 31ce9be9e9SSzymon Olewniczak } 32ce9be9e9SSzymon Olewniczak echo '>'; 33ce9be9e9SSzymon Olewniczak 34*d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 35*d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 36ce9be9e9SSzymon Olewniczak 37*d2cf7c78SSzymon Olewniczak // we use 'lastmod' insetead of 'rev' to get the timestamp also for the current revision 38*d2cf7c78SSzymon Olewniczak if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'], $readers)) { 39ce9be9e9SSzymon Olewniczak echo '<a href="' . wl($INFO['id'], ['do' => 'ireadit']) . '">' . $this->getLang('ireadit') . '</a>'; 40ce9be9e9SSzymon Olewniczak } 41ce9be9e9SSzymon Olewniczak 42ce9be9e9SSzymon Olewniczak if (count($readers) > 0) { 43ce9be9e9SSzymon Olewniczak echo '<h3>' . $this->getLang('readit_header') . '</h3>'; 44ce9be9e9SSzymon Olewniczak echo '<ul>'; 45ce9be9e9SSzymon Olewniczak foreach ($readers as $reader) { 46ce9be9e9SSzymon Olewniczak $udata = $auth->getUserData($reader['user'], false); 47ce9be9e9SSzymon Olewniczak $name = $udata ? $udata['name'] : $reader['user']; 48ce9be9e9SSzymon Olewniczak $time = strtotime($reader['timestamp']); 49ce9be9e9SSzymon Olewniczak echo '<li>' . $name . ' - ' . date('d/m/Y H:i', $time) . '</li>'; 50ce9be9e9SSzymon Olewniczak } 51ce9be9e9SSzymon Olewniczak echo '</ul>'; 52ce9be9e9SSzymon Olewniczak } 53ce9be9e9SSzymon Olewniczak echo '</div>'; 54ce9be9e9SSzymon Olewniczak } 55ce9be9e9SSzymon Olewniczak 56ce9be9e9SSzymon Olewniczak public function handle_ireadit_action(Doku_Event $event) 57ce9be9e9SSzymon Olewniczak { 58*d2cf7c78SSzymon Olewniczak global $INFO; 59ce9be9e9SSzymon Olewniczak if ($event->data != 'ireadit') return; 60ce9be9e9SSzymon Olewniczak if (!$INFO['client']) return; 61*d2cf7c78SSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit'])) return; 62*d2cf7c78SSzymon Olewniczak $ireadit_data = $INFO['meta']['plugin_ireadit']; 63ce9be9e9SSzymon Olewniczak 64*d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 65*d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 66*d2cf7c78SSzymon Olewniczak if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) { 67692a1450SSzymon Olewniczak try { 68ce9be9e9SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 69ce9be9e9SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 70ce9be9e9SSzymon Olewniczak $sqlite = $db_helper->getDB(); 71692a1450SSzymon Olewniczak } catch (Exception $e) { 72692a1450SSzymon Olewniczak msg($e->getMessage(), -1); 73692a1450SSzymon Olewniczak return; 74692a1450SSzymon Olewniczak } 75*d2cf7c78SSzymon Olewniczak $sqlite->storeEntry('ireadit', [ 76*d2cf7c78SSzymon Olewniczak 'page' => $INFO['id'], 77*d2cf7c78SSzymon Olewniczak 'rev' => $INFO['lastmod'], // we use 'lastmod' inseted of 'rev' to get the timestamp also for the current revision 78*d2cf7c78SSzymon Olewniczak 'user' => $INFO['client'], 79*d2cf7c78SSzymon Olewniczak 'timestamp' => date('c') 80*d2cf7c78SSzymon Olewniczak ]); 81*d2cf7c78SSzymon Olewniczak } 82*d2cf7c78SSzymon Olewniczak $event->data = 'redirect'; 83ce9be9e9SSzymon Olewniczak } 84ce9be9e9SSzymon Olewniczak 85*d2cf7c78SSzymon Olewniczak public function handle_pagesave_after(Doku_Event $event) 86ce9be9e9SSzymon Olewniczak { 87*d2cf7c78SSzymon Olewniczak global $INFO; 88*d2cf7c78SSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit'])) return; 89ce9be9e9SSzymon Olewniczak 90ce9be9e9SSzymon Olewniczak if ($this->getConf('minor_edit_keeps_readers') && 91*d2cf7c78SSzymon Olewniczak $event->data['changeType'] == DOKU_CHANGE_TYPE_MINOR_EDIT) { 92*d2cf7c78SSzymon Olewniczak try { 93*d2cf7c78SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 94*d2cf7c78SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 95*d2cf7c78SSzymon Olewniczak $sqlite = $db_helper->getDB(); 96*d2cf7c78SSzymon Olewniczak } catch (Exception $e) { 97*d2cf7c78SSzymon Olewniczak msg($e->getMessage(), -1); 98*d2cf7c78SSzymon Olewniczak return; 99ce9be9e9SSzymon Olewniczak } 100*d2cf7c78SSzymon Olewniczak $sqlite->query('INSERT INTO ireadit (page,rev,user,timestamp) 101*d2cf7c78SSzymon Olewniczak SELECT page, ?, user, timestamp FROM ireadit WHERE rev=? AND page=?', 102*d2cf7c78SSzymon Olewniczak $event->data['newRevision'], $event->data['oldRevision'], $event->data['id']); 103ce9be9e9SSzymon Olewniczak } 104ce9be9e9SSzymon Olewniczak } 105ce9be9e9SSzymon Olewniczak 106ce9be9e9SSzymon Olewniczak /** 107*d2cf7c78SSzymon Olewniczak * Add a version string to the index so it is rebuilt 108*d2cf7c78SSzymon Olewniczak * whenever the stored data format changes. 109ce9be9e9SSzymon Olewniczak */ 110*d2cf7c78SSzymon Olewniczak public function set_ireadit_index_version(Doku_Event $event) { 111*d2cf7c78SSzymon Olewniczak $event->data['plugin_ireadit'] = '0.1'; 112692a1450SSzymon Olewniczak } 113ce9be9e9SSzymon Olewniczak 114*d2cf7c78SSzymon Olewniczak /** 115*d2cf7c78SSzymon Olewniczak * Add all data of the readers metadata to the metadata index. 116*d2cf7c78SSzymon Olewniczak */ 117*d2cf7c78SSzymon Olewniczak public function add_readers_to_index(Doku_Event $event, $param) { 118*d2cf7c78SSzymon Olewniczak $ireadit_data = p_get_metadata($event->data['page'], 'plugin_ireadit'); 119*d2cf7c78SSzymon Olewniczak if (!$ireadit_data) return; 120*d2cf7c78SSzymon Olewniczak 121*d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 122*d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 123*d2cf7c78SSzymon Olewniczak $event->data['metadata']['ireadit'] = $helper->users_set($ireadit_data); 124ce9be9e9SSzymon Olewniczak } 125ce9be9e9SSzymon Olewniczak} 126