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; 25*fcd65f6aSSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit=0.2'])) return; 26*fcd65f6aSSzymon 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 38d2cf7c78SSzymon 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 { 58d2cf7c78SSzymon Olewniczak global $INFO; 59ce9be9e9SSzymon Olewniczak if ($event->data != 'ireadit') return; 60ce9be9e9SSzymon Olewniczak if (!$INFO['client']) return; 61*fcd65f6aSSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit=0.2'])) return; 62*fcd65f6aSSzymon Olewniczak $ireadit_data = $INFO['meta']['plugin_ireadit=0.2']; 63ce9be9e9SSzymon Olewniczak 64d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 65d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 66d2cf7c78SSzymon 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 } 75d2cf7c78SSzymon Olewniczak $sqlite->storeEntry('ireadit', [ 76d2cf7c78SSzymon Olewniczak 'page' => $INFO['id'], 77d2cf7c78SSzymon Olewniczak 'rev' => $INFO['lastmod'], // we use 'lastmod' inseted of 'rev' to get the timestamp also for the current revision 78d2cf7c78SSzymon Olewniczak 'user' => $INFO['client'], 79d2cf7c78SSzymon Olewniczak 'timestamp' => date('c') 80d2cf7c78SSzymon Olewniczak ]); 81d2cf7c78SSzymon Olewniczak } 82d2cf7c78SSzymon Olewniczak $event->data = 'redirect'; 83ce9be9e9SSzymon Olewniczak } 84ce9be9e9SSzymon Olewniczak 85d2cf7c78SSzymon Olewniczak public function handle_pagesave_after(Doku_Event $event) 86ce9be9e9SSzymon Olewniczak { 87d2cf7c78SSzymon Olewniczak global $INFO; 88*fcd65f6aSSzymon Olewniczak if (!isset($INFO['meta']['plugin_ireadit=0.2'])) return; 89ce9be9e9SSzymon Olewniczak 90ce9be9e9SSzymon Olewniczak if ($this->getConf('minor_edit_keeps_readers') && 91d2cf7c78SSzymon Olewniczak $event->data['changeType'] == DOKU_CHANGE_TYPE_MINOR_EDIT) { 92d2cf7c78SSzymon Olewniczak try { 93d2cf7c78SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 94d2cf7c78SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 95d2cf7c78SSzymon Olewniczak $sqlite = $db_helper->getDB(); 96d2cf7c78SSzymon Olewniczak } catch (Exception $e) { 97d2cf7c78SSzymon Olewniczak msg($e->getMessage(), -1); 98d2cf7c78SSzymon Olewniczak return; 99ce9be9e9SSzymon Olewniczak } 100d2cf7c78SSzymon Olewniczak $sqlite->query('INSERT INTO ireadit (page,rev,user,timestamp) 101d2cf7c78SSzymon Olewniczak SELECT page, ?, user, timestamp FROM ireadit WHERE rev=? AND page=?', 102d2cf7c78SSzymon Olewniczak $event->data['newRevision'], $event->data['oldRevision'], $event->data['id']); 103ce9be9e9SSzymon Olewniczak } 104ce9be9e9SSzymon Olewniczak } 105ce9be9e9SSzymon Olewniczak 106ce9be9e9SSzymon Olewniczak /** 107d2cf7c78SSzymon Olewniczak * Add a version string to the index so it is rebuilt 108d2cf7c78SSzymon Olewniczak * whenever the stored data format changes. 109ce9be9e9SSzymon Olewniczak */ 110d2cf7c78SSzymon Olewniczak public function set_ireadit_index_version(Doku_Event $event) { 111*fcd65f6aSSzymon Olewniczak $event->data['plugin_ireadit'] = '0.2'; 112692a1450SSzymon Olewniczak } 113ce9be9e9SSzymon Olewniczak 114d2cf7c78SSzymon Olewniczak /** 115d2cf7c78SSzymon Olewniczak * Add all data of the readers metadata to the metadata index. 116d2cf7c78SSzymon Olewniczak */ 117d2cf7c78SSzymon Olewniczak public function add_readers_to_index(Doku_Event $event, $param) { 118*fcd65f6aSSzymon Olewniczak $ireadit_data = p_get_metadata($event->data['page'], 'plugin_ireadit=0.2'); 119d2cf7c78SSzymon Olewniczak if (!$ireadit_data) return; 120d2cf7c78SSzymon Olewniczak 121d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 122d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 123d2cf7c78SSzymon Olewniczak $event->data['metadata']['ireadit'] = $helper->users_set($ireadit_data); 124ce9be9e9SSzymon Olewniczak } 125ce9be9e9SSzymon Olewniczak} 126