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