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'); 16d2cf7c78SSzymon Olewniczak $controller->register_hook('INDEXER_VERSION_GET', 'BEFORE', $this, 'set_ireadit_index_version'); 17d2cf7c78SSzymon 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; 25fcd65f6aSSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit=0.2'])) return; 26fcd65f6aSSzymon Olewniczak $ireadit_data = $INFO['meta']['plugin_ireadit=0.2']; 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 34d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 35d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 36ce9be9e9SSzymon Olewniczak 37d2cf7c78SSzymon Olewniczak // we use 'lastmod' insetead of 'rev' to get the timestamp also for the current revision 38*13f6c799SSzymon Olewniczak if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) { 39*13f6c799SSzymon Olewniczak echo '<a href="' . wl($INFO['id'], ['do' => 'ireadit', 'rev' => $INFO['lastmod']]) . '">' . $this->getLang('ireadit') . '</a>'; 40ce9be9e9SSzymon Olewniczak } 41ce9be9e9SSzymon Olewniczak 42*13f6c799SSzymon Olewniczak try { 43*13f6c799SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 44*13f6c799SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 45*13f6c799SSzymon Olewniczak $sqlite = $db_helper->getDB(); 46*13f6c799SSzymon Olewniczak } catch (Exception $e) { 47*13f6c799SSzymon Olewniczak msg($e->getMessage(), -1); 48*13f6c799SSzymon Olewniczak return; 49*13f6c799SSzymon Olewniczak } 50*13f6c799SSzymon Olewniczak 51*13f6c799SSzymon Olewniczak $res = $sqlite->query('SELECT user, timestamp FROM ireadit 52*13f6c799SSzymon Olewniczak WHERE page = ? 53*13f6c799SSzymon Olewniczak AND rev = ? 54*13f6c799SSzymon Olewniczak ORDER BY timestamp', $INFO['id'], $INFO['lastmod']); 55*13f6c799SSzymon Olewniczak $readers = $sqlite->res2arr($res); 56*13f6c799SSzymon Olewniczak 57ce9be9e9SSzymon Olewniczak if (count($readers) > 0) { 58ce9be9e9SSzymon Olewniczak echo '<h3>' . $this->getLang('readit_header') . '</h3>'; 59ce9be9e9SSzymon Olewniczak echo '<ul>'; 60ce9be9e9SSzymon Olewniczak foreach ($readers as $reader) { 61ce9be9e9SSzymon Olewniczak $udata = $auth->getUserData($reader['user'], false); 62ce9be9e9SSzymon Olewniczak $name = $udata ? $udata['name'] : $reader['user']; 63ce9be9e9SSzymon Olewniczak $time = strtotime($reader['timestamp']); 64ce9be9e9SSzymon Olewniczak echo '<li>' . $name . ' - ' . date('d/m/Y H:i', $time) . '</li>'; 65ce9be9e9SSzymon Olewniczak } 66ce9be9e9SSzymon Olewniczak echo '</ul>'; 67ce9be9e9SSzymon Olewniczak } 68ce9be9e9SSzymon Olewniczak echo '</div>'; 69ce9be9e9SSzymon Olewniczak } 70ce9be9e9SSzymon Olewniczak 71ce9be9e9SSzymon Olewniczak public function handle_ireadit_action(Doku_Event $event) 72ce9be9e9SSzymon Olewniczak { 73*13f6c799SSzymon Olewniczak global $INFO, $INPUT; 74ce9be9e9SSzymon Olewniczak if ($event->data != 'ireadit') return; 75ce9be9e9SSzymon Olewniczak if (!$INFO['client']) return; 76fcd65f6aSSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit=0.2'])) return; 77fcd65f6aSSzymon Olewniczak $ireadit_data = $INFO['meta']['plugin_ireadit=0.2']; 78ce9be9e9SSzymon Olewniczak 79d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 80d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 81d2cf7c78SSzymon Olewniczak if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) { 82692a1450SSzymon Olewniczak try { 83ce9be9e9SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 84ce9be9e9SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 85ce9be9e9SSzymon Olewniczak $sqlite = $db_helper->getDB(); 86692a1450SSzymon Olewniczak } catch (Exception $e) { 87692a1450SSzymon Olewniczak msg($e->getMessage(), -1); 88692a1450SSzymon Olewniczak return; 89692a1450SSzymon Olewniczak } 90d2cf7c78SSzymon Olewniczak $sqlite->storeEntry('ireadit', [ 91d2cf7c78SSzymon Olewniczak 'page' => $INFO['id'], 92d2cf7c78SSzymon Olewniczak 'rev' => $INFO['lastmod'], // we use 'lastmod' inseted of 'rev' to get the timestamp also for the current revision 93d2cf7c78SSzymon Olewniczak 'user' => $INFO['client'], 94d2cf7c78SSzymon Olewniczak 'timestamp' => date('c') 95d2cf7c78SSzymon Olewniczak ]); 96d2cf7c78SSzymon Olewniczak } 97*13f6c799SSzymon Olewniczak $go = wl($INFO['id'], ['rev' => $INFO['lastmod']], true, '&'); 98*13f6c799SSzymon Olewniczak send_redirect($go); 99ce9be9e9SSzymon Olewniczak } 100ce9be9e9SSzymon Olewniczak 101d2cf7c78SSzymon Olewniczak public function handle_pagesave_after(Doku_Event $event) 102ce9be9e9SSzymon Olewniczak { 103d2cf7c78SSzymon Olewniczak global $INFO; 104fcd65f6aSSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit=0.2'])) return; 105ce9be9e9SSzymon Olewniczak 106ce9be9e9SSzymon Olewniczak if ($this->getConf('minor_edit_keeps_readers') && 107d2cf7c78SSzymon Olewniczak $event->data['changeType'] == DOKU_CHANGE_TYPE_MINOR_EDIT) { 108d2cf7c78SSzymon Olewniczak try { 109d2cf7c78SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 110d2cf7c78SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 111d2cf7c78SSzymon Olewniczak $sqlite = $db_helper->getDB(); 112d2cf7c78SSzymon Olewniczak } catch (Exception $e) { 113d2cf7c78SSzymon Olewniczak msg($e->getMessage(), -1); 114d2cf7c78SSzymon Olewniczak return; 115ce9be9e9SSzymon Olewniczak } 116d2cf7c78SSzymon Olewniczak $sqlite->query('INSERT INTO ireadit (page,rev,user,timestamp) 117d2cf7c78SSzymon Olewniczak SELECT page, ?, user, timestamp FROM ireadit WHERE rev=? AND page=?', 118d2cf7c78SSzymon Olewniczak $event->data['newRevision'], $event->data['oldRevision'], $event->data['id']); 119ce9be9e9SSzymon Olewniczak } 120ce9be9e9SSzymon Olewniczak } 121ce9be9e9SSzymon Olewniczak 122ce9be9e9SSzymon Olewniczak /** 123d2cf7c78SSzymon Olewniczak * Add a version string to the index so it is rebuilt 124d2cf7c78SSzymon Olewniczak * whenever the stored data format changes. 125ce9be9e9SSzymon Olewniczak */ 126d2cf7c78SSzymon Olewniczak public function set_ireadit_index_version(Doku_Event $event) { 127fcd65f6aSSzymon Olewniczak $event->data['plugin_ireadit'] = '0.2'; 128692a1450SSzymon Olewniczak } 129ce9be9e9SSzymon Olewniczak 130d2cf7c78SSzymon Olewniczak /** 131d2cf7c78SSzymon Olewniczak * Add all data of the readers metadata to the metadata index. 132d2cf7c78SSzymon Olewniczak */ 133d2cf7c78SSzymon Olewniczak public function add_readers_to_index(Doku_Event $event, $param) { 134fcd65f6aSSzymon Olewniczak $ireadit_data = p_get_metadata($event->data['page'], 'plugin_ireadit=0.2'); 135d2cf7c78SSzymon Olewniczak if (!$ireadit_data) return; 136d2cf7c78SSzymon Olewniczak 137d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 138d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 139d2cf7c78SSzymon Olewniczak $event->data['metadata']['ireadit'] = $helper->users_set($ireadit_data); 140ce9be9e9SSzymon Olewniczak } 141ce9be9e9SSzymon Olewniczak} 142