xref: /plugin/ireadit/action/ireadit.php (revision 13f6c79932364942534c54835bbbb6b994d388d9)
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