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