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 { 2249d6b1b0SSzymon Olewniczak global $INFO, $ACT; 23ce9be9e9SSzymon Olewniczak 24ce9be9e9SSzymon Olewniczak if ($ACT != 'show') return; 25*ffa244fdSSzymon Olewniczak if (empty($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 3813f6c799SSzymon Olewniczak if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) { 3913f6c799SSzymon Olewniczak echo '<a href="' . wl($INFO['id'], ['do' => 'ireadit', 'rev' => $INFO['lastmod']]) . '">' . $this->getLang('ireadit') . '</a>'; 40ce9be9e9SSzymon Olewniczak } 41ce9be9e9SSzymon Olewniczak 4213f6c799SSzymon Olewniczak try { 4313f6c799SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 4413f6c799SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 4513f6c799SSzymon Olewniczak $sqlite = $db_helper->getDB(); 4613f6c799SSzymon Olewniczak } catch (Exception $e) { 4713f6c799SSzymon Olewniczak msg($e->getMessage(), -1); 4813f6c799SSzymon Olewniczak return; 4913f6c799SSzymon Olewniczak } 5013f6c799SSzymon Olewniczak 5113f6c799SSzymon Olewniczak $res = $sqlite->query('SELECT user, timestamp FROM ireadit 5213f6c799SSzymon Olewniczak WHERE page = ? 5313f6c799SSzymon Olewniczak AND rev = ? 5413f6c799SSzymon Olewniczak ORDER BY timestamp', $INFO['id'], $INFO['lastmod']); 5513f6c799SSzymon Olewniczak $readers = $sqlite->res2arr($res); 5613f6c799SSzymon 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 $time = strtotime($reader['timestamp']); 6249d6b1b0SSzymon Olewniczak echo '<li>' . userlink($reader['user']) . ' - ' . dformat($time) . '</li>'; 63ce9be9e9SSzymon Olewniczak } 64ce9be9e9SSzymon Olewniczak echo '</ul>'; 65ce9be9e9SSzymon Olewniczak } 6649d6b1b0SSzymon Olewniczak 6749d6b1b0SSzymon Olewniczak if ($this->getConf('show_not_read_list') && $helper->use_ireadit_here($INFO['id'], $INFO['lastmod'])) { 6849d6b1b0SSzymon Olewniczak $not_read = array_diff($helper->users_set($ireadit_data), array_column($readers, 'user')); 6949d6b1b0SSzymon Olewniczak $not_read_userlinks = array_map('userlink', $not_read); 7049d6b1b0SSzymon Olewniczak sort($not_read_userlinks); 7149d6b1b0SSzymon Olewniczak if (count($not_read) > 0) { 7249d6b1b0SSzymon Olewniczak echo '<h3>' . $this->getLang('not_read_header') . '</h3>'; 7349d6b1b0SSzymon Olewniczak echo '<ul>'; 7449d6b1b0SSzymon Olewniczak foreach ($not_read_userlinks as $userlink) { 7549d6b1b0SSzymon Olewniczak echo '<li>' . $userlink . '</li>'; 7649d6b1b0SSzymon Olewniczak } 7749d6b1b0SSzymon Olewniczak echo '</ul>'; 7849d6b1b0SSzymon Olewniczak } 7949d6b1b0SSzymon Olewniczak } 8049d6b1b0SSzymon Olewniczak 81ce9be9e9SSzymon Olewniczak echo '</div>'; 82ce9be9e9SSzymon Olewniczak } 83ce9be9e9SSzymon Olewniczak 84ce9be9e9SSzymon Olewniczak public function handle_ireadit_action(Doku_Event $event) 85ce9be9e9SSzymon Olewniczak { 8649d6b1b0SSzymon Olewniczak global $INFO; 87ce9be9e9SSzymon Olewniczak if ($event->data != 'ireadit') return; 88ce9be9e9SSzymon Olewniczak if (!$INFO['client']) return; 89*ffa244fdSSzymon Olewniczak if (empty($INFO['meta']['plugin_ireadit=0.2'])) return; 90fcd65f6aSSzymon Olewniczak $ireadit_data = $INFO['meta']['plugin_ireadit=0.2']; 91ce9be9e9SSzymon Olewniczak 92d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 93d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 94d2cf7c78SSzymon Olewniczak if ($helper->user_can_read_page($ireadit_data, $INFO['id'], $INFO['lastmod'], $INFO['client'])) { 95692a1450SSzymon Olewniczak try { 96ce9be9e9SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 97ce9be9e9SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 98ce9be9e9SSzymon Olewniczak $sqlite = $db_helper->getDB(); 99692a1450SSzymon Olewniczak } catch (Exception $e) { 100692a1450SSzymon Olewniczak msg($e->getMessage(), -1); 101692a1450SSzymon Olewniczak return; 102692a1450SSzymon Olewniczak } 103d2cf7c78SSzymon Olewniczak $sqlite->storeEntry('ireadit', [ 104d2cf7c78SSzymon Olewniczak 'page' => $INFO['id'], 105d2cf7c78SSzymon Olewniczak 'rev' => $INFO['lastmod'], // we use 'lastmod' inseted of 'rev' to get the timestamp also for the current revision 106d2cf7c78SSzymon Olewniczak 'user' => $INFO['client'], 107d2cf7c78SSzymon Olewniczak 'timestamp' => date('c') 108d2cf7c78SSzymon Olewniczak ]); 109d2cf7c78SSzymon Olewniczak } 11013f6c799SSzymon Olewniczak $go = wl($INFO['id'], ['rev' => $INFO['lastmod']], true, '&'); 11113f6c799SSzymon Olewniczak send_redirect($go); 112ce9be9e9SSzymon Olewniczak } 113ce9be9e9SSzymon Olewniczak 114d2cf7c78SSzymon Olewniczak public function handle_pagesave_after(Doku_Event $event) 115ce9be9e9SSzymon Olewniczak { 116d2cf7c78SSzymon Olewniczak global $INFO; 117*ffa244fdSSzymon Olewniczak if (empty($INFO['meta']['plugin_ireadit=0.2'])) return; 118ce9be9e9SSzymon Olewniczak 119ce9be9e9SSzymon Olewniczak if ($this->getConf('minor_edit_keeps_readers') && 120d2cf7c78SSzymon Olewniczak $event->data['changeType'] == DOKU_CHANGE_TYPE_MINOR_EDIT) { 121d2cf7c78SSzymon Olewniczak try { 122d2cf7c78SSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 123d2cf7c78SSzymon Olewniczak $db_helper = plugin_load('helper', 'ireadit_db'); 124d2cf7c78SSzymon Olewniczak $sqlite = $db_helper->getDB(); 125d2cf7c78SSzymon Olewniczak } catch (Exception $e) { 126d2cf7c78SSzymon Olewniczak msg($e->getMessage(), -1); 127d2cf7c78SSzymon Olewniczak return; 128ce9be9e9SSzymon Olewniczak } 129d2cf7c78SSzymon Olewniczak $sqlite->query('INSERT INTO ireadit (page,rev,user,timestamp) 130d2cf7c78SSzymon Olewniczak SELECT page, ?, user, timestamp FROM ireadit WHERE rev=? AND page=?', 131d2cf7c78SSzymon Olewniczak $event->data['newRevision'], $event->data['oldRevision'], $event->data['id']); 132ce9be9e9SSzymon Olewniczak } 133ce9be9e9SSzymon Olewniczak } 134ce9be9e9SSzymon Olewniczak 135ce9be9e9SSzymon Olewniczak /** 136d2cf7c78SSzymon Olewniczak * Add a version string to the index so it is rebuilt 137d2cf7c78SSzymon Olewniczak * whenever the stored data format changes. 138ce9be9e9SSzymon Olewniczak */ 139d2cf7c78SSzymon Olewniczak public function set_ireadit_index_version(Doku_Event $event) { 140fcd65f6aSSzymon Olewniczak $event->data['plugin_ireadit'] = '0.2'; 141692a1450SSzymon Olewniczak } 142ce9be9e9SSzymon Olewniczak 143d2cf7c78SSzymon Olewniczak /** 144d2cf7c78SSzymon Olewniczak * Add all data of the readers metadata to the metadata index. 145d2cf7c78SSzymon Olewniczak */ 146d2cf7c78SSzymon Olewniczak public function add_readers_to_index(Doku_Event $event, $param) { 147fcd65f6aSSzymon Olewniczak $ireadit_data = p_get_metadata($event->data['page'], 'plugin_ireadit=0.2'); 148*ffa244fdSSzymon Olewniczak if (empty($ireadit_data)) return; 149d2cf7c78SSzymon Olewniczak 150d2cf7c78SSzymon Olewniczak /** @var helper_plugin_ireadit $helper */ 151d2cf7c78SSzymon Olewniczak $helper = $this->loadHelper('ireadit'); 152d2cf7c78SSzymon Olewniczak $event->data['metadata']['ireadit'] = $helper->users_set($ireadit_data); 153ce9be9e9SSzymon Olewniczak } 154ce9be9e9SSzymon Olewniczak} 155