xref: /plugin/watchcycle/action.php (revision c510d2bf2d7c2d1dca6e18d28778d0633bcbb823) !
168716d5dSSzymon Olewniczak<?php
284c6f062SAnna Dabrowska
3*c510d2bfSanndause dokuwiki\Cache\Cache;
492c202adSanndause dokuwiki\Extension\ActionPlugin;
592c202adSanndause dokuwiki\Extension\EventHandler;
692c202adSanndause dokuwiki\Extension\Event;
792c202adSanndause dokuwiki\Form\Form;
892c202adSanndause dokuwiki\ChangeLog\PageChangeLog;
984c6f062SAnna Dabrowskause dokuwiki\plugin\sqlite\SQLiteDB;
1084c6f062SAnna Dabrowska
1168716d5dSSzymon Olewniczak/**
1268716d5dSSzymon Olewniczak * DokuWiki Plugin watchcycle (Action Component)
1368716d5dSSzymon Olewniczak *
1468716d5dSSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
1568716d5dSSzymon Olewniczak * @author  Szymon Olewniczak <dokuwiki@cosmocode.de>
1668716d5dSSzymon Olewniczak */
1768716d5dSSzymon Olewniczak
1892c202adSanndaclass action_plugin_watchcycle extends ActionPlugin
191cd7657bSMichael Große{
2068716d5dSSzymon Olewniczak    /**
2168716d5dSSzymon Olewniczak     * Registers a callback function for a given event
2268716d5dSSzymon Olewniczak     *
2392c202adSannda     * @param EventHandler $controller DokuWiki's event controller object
241cd7657bSMichael Große     *
2568716d5dSSzymon Olewniczak     * @return void
2668716d5dSSzymon Olewniczak     */
2792c202adSannda    public function register(EventHandler $controller)
281cd7657bSMichael Große    {
2968716d5dSSzymon Olewniczak
309de4e228SAnna Dabrowska        $controller->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'handleParserMetadataRender');
319de4e228SAnna Dabrowska        $controller->register_hook('PARSER_CACHE_USE', 'AFTER', $this, 'handleParserCacheUse');
324082d945SSzymon Olewniczak        // ensure a page revision is created when summary changes:
339de4e228SAnna Dabrowska        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handlePagesaveBefore');
34ff7d7d2fSMichael Große        $controller->register_hook('SEARCH_RESULT_PAGELOOKUP', 'BEFORE', $this, 'addIconToPageLookupResult');
35ff7d7d2fSMichael Große        $controller->register_hook('SEARCH_RESULT_FULLPAGE', 'BEFORE', $this, 'addIconToFullPageResult');
361e9d3322SMichael Große        $controller->register_hook('FORM_SEARCH_OUTPUT', 'BEFORE', $this, 'addFilterToSearchForm');
379de4e228SAnna Dabrowska        $controller->register_hook('FORM_QUICKSEARCH_OUTPUT', 'BEFORE', $this, 'handleFormQuicksearchOutput');
381e9d3322SMichael Große        $controller->register_hook('SEARCH_QUERY_FULLPAGE', 'AFTER', $this, 'filterSearchResults');
391e9d3322SMichael Große        $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'filterSearchResults');
406c3d183aSMichael Große
419de4e228SAnna Dabrowska        $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'handleToolbarDefine');
429de4e228SAnna Dabrowska        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxGet');
439de4e228SAnna Dabrowska        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxValidate');
446c3d183aSMichael Große    }
456c3d183aSMichael Große
466c3d183aSMichael Große
476c3d183aSMichael Große    /**
486c3d183aSMichael Große     * Register a new toolbar button
496c3d183aSMichael Große     *
5092c202adSannda     * @param Event $event event object by reference
516c3d183aSMichael Große     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
526c3d183aSMichael Große     *                           handler was registered]
531cd7657bSMichael Große     *
546c3d183aSMichael Große     * @return void
556c3d183aSMichael Große     */
5692c202adSannda    public function handleToolbarDefine(Event $event, $param)
571cd7657bSMichael Große    {
581cd7657bSMichael Große        $event->data[] = [
596c3d183aSMichael Große            'type' => 'plugin_watchcycle',
60b935dbe4SMichael Große            'title' => $this->getLang('title toolbar button'),
6150b9f250SMichael Große            'icon' => '../../plugins/watchcycle/images/eye-plus16Green.png',
621cd7657bSMichael Große        ];
631e9d3322SMichael Große    }
641e9d3322SMichael Große
651e9d3322SMichael Große    /**
661e9d3322SMichael Große     * Add a checkbox to the search form to allow limiting the search to maintained pages only
671e9d3322SMichael Große     *
6892c202adSannda     * @param Event $event
691e9d3322SMichael Große     * @param            $param
701e9d3322SMichael Große     */
7192c202adSannda    public function addFilterToSearchForm(Event $event, $param)
721e9d3322SMichael Große    {
731e9d3322SMichael Große        /* @var \dokuwiki\Form\Form $searchForm */
741e9d3322SMichael Große        $searchForm = $event->data;
751e9d3322SMichael Große        $advOptionsPos = $searchForm->findPositionByAttribute('class', 'advancedOptions');
761e9d3322SMichael Große        $searchForm->addCheckbox('watchcycle_only', $this->getLang('cb only maintained pages'), $advOptionsPos + 1)
771e9d3322SMichael Große            ->addClass('plugin__watchcycle_searchform_cb');
781e9d3322SMichael Große    }
791e9d3322SMichael Große
801e9d3322SMichael Große    /**
8156d39839SMichael Große     * Handles the FORM_QUICKSEARCH_OUTPUT event
8256d39839SMichael Große     *
8392c202adSannda     * @param Event $event event object by reference
8456d39839SMichael Große     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
8556d39839SMichael Große     *                           handler was registered]
861cd7657bSMichael Große     *
8756d39839SMichael Große     * @return void
8856d39839SMichael Große     */
8992c202adSannda    public function handleFormQuicksearchOutput(Event $event, $param)
901cd7657bSMichael Große    {
9192c202adSannda        /** @var Form $qsearchForm */
9256d39839SMichael Große        $qsearchForm = $event->data;
9356d39839SMichael Große        if ($this->getConf('default_maintained_only')) {
9456d39839SMichael Große            $qsearchForm->setHiddenField('watchcycle_only', '1');
9556d39839SMichael Große        }
9656d39839SMichael Große    }
9756d39839SMichael Große
9856d39839SMichael Große    /**
991e9d3322SMichael Große     * Filter the search results to show only maintained pages, if  watchcycle_only is true in $INPUT
1001e9d3322SMichael Große     *
10192c202adSannda     * @param Event $event
1021e9d3322SMichael Große     * @param            $param
1031e9d3322SMichael Große     */
10492c202adSannda    public function filterSearchResults(Event $event, $param)
1051e9d3322SMichael Große    {
1061e9d3322SMichael Große        global $INPUT;
107afaf3415SMichael Große        if (!$INPUT->bool('watchcycle_only')) {
108afaf3415SMichael Große            return;
109afaf3415SMichael Große        }
1101e9d3322SMichael Große        $event->result = array_filter($event->result, function ($key) {
1111e9d3322SMichael Große            $watchcycle = p_get_metadata($key, 'plugin watchcycle');
1121e9d3322SMichael Große            return !empty($watchcycle);
1131e9d3322SMichael Große        }, ARRAY_FILTER_USE_KEY);
1141e9d3322SMichael Große    }
11568716d5dSSzymon Olewniczak
11668716d5dSSzymon Olewniczak    /**
11768716d5dSSzymon Olewniczak     * [Custom event handler which performs action]
11868716d5dSSzymon Olewniczak     *
11992c202adSannda     * @param Event $event event object by reference
12068716d5dSSzymon Olewniczak     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
12168716d5dSSzymon Olewniczak     *                           handler was registered]
1221cd7657bSMichael Große     *
12368716d5dSSzymon Olewniczak     * @return void
12468716d5dSSzymon Olewniczak     */
12592c202adSannda    public function handleParserMetadataRender(Event $event, $param)
1261cd7657bSMichael Große    {
1274082d945SSzymon Olewniczak        global $ID;
1284082d945SSzymon Olewniczak
12984c6f062SAnna Dabrowska        /** @var \helper_plugin_watchcycle_db $dbHelper */
13084c6f062SAnna Dabrowska        $dbHelper = plugin_load('helper', 'watchcycle_db');
13184c6f062SAnna Dabrowska
13284c6f062SAnna Dabrowska        /** @var SQLiteDB */
13384c6f062SAnna Dabrowska        $sqlite = $dbHelper->getDB();
13484c6f062SAnna Dabrowska
13519870ce2SMichael Große        /* @var \helper_plugin_watchcycle $helper */
1364048d1eeSSzymon Olewniczak        $helper = plugin_load('helper', 'watchcycle');
137d31368a4SSzymon Olewniczak
1384048d1eeSSzymon Olewniczak        $page = $event->data['current']['last_change']['id'];
139d31368a4SSzymon Olewniczak
140d31368a4SSzymon Olewniczak        if (isset($event->data['current']['plugin']['watchcycle'])) {
141d31368a4SSzymon Olewniczak            $watchcycle = $event->data['current']['plugin']['watchcycle'];
14284c6f062SAnna Dabrowska            $row = $sqlite->queryRecord('SELECT * FROM watchcycle WHERE page=?', $page);
143d31368a4SSzymon Olewniczak            $changes = $this->getLastMaintainerRev($event->data, $watchcycle['maintainer'], $last_maintainer_rev);
14402b945d2SAnna Dabrowska            //false if page needs checking
14502b945d2SAnna Dabrowska            $uptodate = $helper->daysAgo($last_maintainer_rev) <= (int)$watchcycle['cycle'];
146686a1274SAnna Dabrowska
14702b945d2SAnna Dabrowska            if ($uptodate === false) {
148ba165cbdSAnna Dabrowska                $helper->informMaintainer($watchcycle['maintainer'], $ID);
149686a1274SAnna Dabrowska            }
150686a1274SAnna Dabrowska
1514048d1eeSSzymon Olewniczak            if (!$row) {
152d31368a4SSzymon Olewniczak                $entry = $watchcycle;
1534048d1eeSSzymon Olewniczak                $entry['page'] = $page;
154d31368a4SSzymon Olewniczak                $entry['last_maintainer_rev'] = $last_maintainer_rev;
15502b945d2SAnna Dabrowska                // uptodate is an int in the database
15602b945d2SAnna Dabrowska                $entry['uptodate'] = (int)$uptodate;
15784c6f062SAnna Dabrowska                $sqlite->saveRecord('watchcycle', $entry);
158d31368a4SSzymon Olewniczak            } else { //check if we need to update something
1591cd7657bSMichael Große                $toupdate = [];
160d31368a4SSzymon Olewniczak
161d31368a4SSzymon Olewniczak                if ($row['cycle'] != $watchcycle['cycle']) {
162d31368a4SSzymon Olewniczak                    $toupdate['cycle'] = $watchcycle['cycle'];
163d31368a4SSzymon Olewniczak                }
164d31368a4SSzymon Olewniczak
165d31368a4SSzymon Olewniczak                if ($row['maintainer'] != $watchcycle['maintainer']) {
166d31368a4SSzymon Olewniczak                    $toupdate['maintainer'] = $watchcycle['maintainer'];
1674048d1eeSSzymon Olewniczak                }
1684048d1eeSSzymon Olewniczak
1694048d1eeSSzymon Olewniczak                if ($row['last_maintainer_rev'] != $last_maintainer_rev) {
170d31368a4SSzymon Olewniczak                    $toupdate['last_maintainer_rev'] = $last_maintainer_rev;
171d31368a4SSzymon Olewniczak                }
172d31368a4SSzymon Olewniczak
17384c6f062SAnna Dabrowska                //uptodate value has changed?
17484c6f062SAnna Dabrowska                if ($row['uptodate'] !== (int)$uptodate) {
175b1c7da2aSAnna Dabrowska                    $toupdate['uptodate'] = (int)$uptodate;
1764048d1eeSSzymon Olewniczak                }
1774048d1eeSSzymon Olewniczak
17892c202adSannda                if ($toupdate !== []) {
17992c202adSannda                    $set = implode(',', array_map(static fn($v) => "$v=?", array_keys($toupdate)));
1804048d1eeSSzymon Olewniczak                    $toupdate[] = $page;
18184c6f062SAnna Dabrowska                    $sqlite->query("UPDATE watchcycle SET $set WHERE page=?", array_values($toupdate));
182d31368a4SSzymon Olewniczak                }
183d31368a4SSzymon Olewniczak            }
184d31368a4SSzymon Olewniczak            $event->data['current']['plugin']['watchcycle']['last_maintainer_rev'] = $last_maintainer_rev;
185d31368a4SSzymon Olewniczak            $event->data['current']['plugin']['watchcycle']['changes'] = $changes;
186d31368a4SSzymon Olewniczak        } else { //maybe we've removed the syntax -> delete from the database
1874048d1eeSSzymon Olewniczak            $sqlite->query('DELETE FROM watchcycle WHERE page=?', $page);
188d31368a4SSzymon Olewniczak        }
189d31368a4SSzymon Olewniczak    }
190d31368a4SSzymon Olewniczak
191d31368a4SSzymon Olewniczak    /**
1920eeacb89SAnna Dabrowska     * Returns JSON with filtered users and groups
1930eeacb89SAnna Dabrowska     *
19492c202adSannda     * @param Event $event
1950eeacb89SAnna Dabrowska     * @param string $param
1960eeacb89SAnna Dabrowska     */
19792c202adSannda    public function handleAjaxGet(Event $event, $param)
1980eeacb89SAnna Dabrowska    {
19993878f6fSAnna Dabrowska        if ($event->data != 'plugin_watchcycle_get') return;
2000eeacb89SAnna Dabrowska        $event->preventDefault();
2010eeacb89SAnna Dabrowska        $event->stopPropagation();
2020eeacb89SAnna Dabrowska        global $conf;
2030eeacb89SAnna Dabrowska
2040eeacb89SAnna Dabrowska        header('Content-Type: application/json');
2050eeacb89SAnna Dabrowska        try {
2060eeacb89SAnna Dabrowska            $result = $this->fetchUsersAndGroups();
2070eeacb89SAnna Dabrowska        } catch (\Exception $e) {
2080eeacb89SAnna Dabrowska            $result = [
2090eeacb89SAnna Dabrowska                'error' => $e->getMessage() . ' ' . basename($e->getFile()) . ':' . $e->getLine()
2100eeacb89SAnna Dabrowska            ];
2110eeacb89SAnna Dabrowska            if ($conf['allowdebug']) {
2120eeacb89SAnna Dabrowska                $result['stacktrace'] = $e->getTraceAsString();
2130eeacb89SAnna Dabrowska            }
2140eeacb89SAnna Dabrowska            http_status(500);
2150eeacb89SAnna Dabrowska        }
2160eeacb89SAnna Dabrowska
217e98a8e79SAnna Dabrowska        echo json_encode($result);
2180eeacb89SAnna Dabrowska    }
2190eeacb89SAnna Dabrowska
2200eeacb89SAnna Dabrowska    /**
22193878f6fSAnna Dabrowska     * JSON result of validation of maintainers definition
22293878f6fSAnna Dabrowska     *
22392c202adSannda     * @param Event $event
22493878f6fSAnna Dabrowska     * @param $param
22593878f6fSAnna Dabrowska     */
22692c202adSannda    public function handleAjaxValidate(Event $event, $param)
22793878f6fSAnna Dabrowska    {
22893878f6fSAnna Dabrowska        if ($event->data != 'plugin_watchcycle_validate') return;
22993878f6fSAnna Dabrowska        $event->preventDefault();
23093878f6fSAnna Dabrowska        $event->stopPropagation();
23193878f6fSAnna Dabrowska
23293878f6fSAnna Dabrowska        global $INPUT;
23393878f6fSAnna Dabrowska        $maintainers = $INPUT->str('param');
23493878f6fSAnna Dabrowska
23593878f6fSAnna Dabrowska        if (empty($maintainers)) return;
23693878f6fSAnna Dabrowska
23793878f6fSAnna Dabrowska        header('Content-Type: application/json');
23893878f6fSAnna Dabrowska
23993878f6fSAnna Dabrowska        /* @var \helper_plugin_watchcycle $helper */
24093878f6fSAnna Dabrowska        $helper = plugin_load('helper', 'watchcycle');
24193878f6fSAnna Dabrowska
242e98a8e79SAnna Dabrowska        echo json_encode($helper->validateMaintainerString($maintainers));
24393878f6fSAnna Dabrowska    }
24493878f6fSAnna Dabrowska
24593878f6fSAnna Dabrowska    /**
2460eeacb89SAnna Dabrowska     * Returns filtered users and groups, if supported by the current authentication
2470eeacb89SAnna Dabrowska     *
2480eeacb89SAnna Dabrowska     * @return array
2490eeacb89SAnna Dabrowska     */
2500eeacb89SAnna Dabrowska    protected function fetchUsersAndGroups()
2510eeacb89SAnna Dabrowska    {
2520eeacb89SAnna Dabrowska        global $INPUT;
25393878f6fSAnna Dabrowska        $term = $INPUT->str('param');
2540eeacb89SAnna Dabrowska
2550eeacb89SAnna Dabrowska        if (empty($term)) return [];
2560eeacb89SAnna Dabrowska
2570eeacb89SAnna Dabrowska        /* @var DokuWiki_Auth_Plugin $auth */
2580eeacb89SAnna Dabrowska        global $auth;
2590eeacb89SAnna Dabrowska
2600eeacb89SAnna Dabrowska        $users = [];
2610eeacb89SAnna Dabrowska        $foundUsers = $auth->retrieveUsers(0, 50, ['user' => $term]);
2620eeacb89SAnna Dabrowska        if (!empty($foundUsers)) {
263f82d2ef7SAnna Dabrowska            $users = array_map(
264f82d2ef7SAnna Dabrowska                static fn($name, $user) => ['label' => $user['name'] . " ($name)", 'value' => $name],
265f82d2ef7SAnna Dabrowska                array_keys($foundUsers),
266f82d2ef7SAnna Dabrowska                $foundUsers
267f82d2ef7SAnna Dabrowska            );
2680eeacb89SAnna Dabrowska        }
2690eeacb89SAnna Dabrowska
2700eeacb89SAnna Dabrowska        $groups = [];
2710eeacb89SAnna Dabrowska
2720eeacb89SAnna Dabrowska        // check cache
273*c510d2bfSannda        $cachedGroups = new Cache('retrievedGroups', '.txt');
2740eeacb89SAnna Dabrowska        if ($cachedGroups->useCache(['age' => 30])) {
2750eeacb89SAnna Dabrowska            $foundGroups = unserialize($cachedGroups->retrieveCache());
2760eeacb89SAnna Dabrowska        } else {
27765bfe62cSAnna Dabrowska            $foundGroups = $auth->retrieveGroups();
2780eeacb89SAnna Dabrowska            $cachedGroups->storeCache(serialize($foundGroups));
2790eeacb89SAnna Dabrowska        }
2800eeacb89SAnna Dabrowska
2810eeacb89SAnna Dabrowska        if (!empty($foundGroups)) {
2820eeacb89SAnna Dabrowska            $groups = array_filter(
2830eeacb89SAnna Dabrowska                array_map(function ($grp) use ($term) {
2840eeacb89SAnna Dabrowska                    // filter groups
28592c202adSannda                    if (strpos($grp, (string) $term) !== false) {
2860eeacb89SAnna Dabrowska                        return ['label' => '@' . $grp, 'value' => '@' . $grp];
2870eeacb89SAnna Dabrowska                    }
2880eeacb89SAnna Dabrowska                }, $foundGroups)
2890eeacb89SAnna Dabrowska            );
2900eeacb89SAnna Dabrowska        }
2910eeacb89SAnna Dabrowska
2920eeacb89SAnna Dabrowska        return array_merge($users, $groups);
2930eeacb89SAnna Dabrowska    }
2940eeacb89SAnna Dabrowska
2950eeacb89SAnna Dabrowska    /**
296d31368a4SSzymon Olewniczak     * @param array  $meta metadata of the page
2977ec9f11bSAnna Dabrowska     * @param string $maintainer
2984082d945SSzymon Olewniczak     * @param int    $rev  revision of the last page edition by maintainer or -1 if no edition was made
2991cd7657bSMichael Große     *
3004082d945SSzymon Olewniczak     * @return int   number of changes since last maintainer's revision or -1 if no changes was made
301d31368a4SSzymon Olewniczak     */
3027ec9f11bSAnna Dabrowska    protected function getLastMaintainerRev($meta, $maintainer, &$rev)
3031cd7657bSMichael Große    {
304d31368a4SSzymon Olewniczak        $changes = 0;
3057ec9f11bSAnna Dabrowska
3067ec9f11bSAnna Dabrowska        /* @var \helper_plugin_watchcycle $helper */
3077ec9f11bSAnna Dabrowska        $helper = plugin_load('helper', 'watchcycle');
3087ec9f11bSAnna Dabrowska
3097ec9f11bSAnna Dabrowska        if ($helper->isMaintainer($meta['current']['last_change']['user'], $maintainer)) {
310d31368a4SSzymon Olewniczak            $rev = $meta['current']['last_change']['date'];
311d31368a4SSzymon Olewniczak            return $changes;
312d31368a4SSzymon Olewniczak        } else {
3134048d1eeSSzymon Olewniczak            $page = $meta['current']['last_change']['id'];
31492c202adSannda            $changelog = new PageChangeLog($page);
315d31368a4SSzymon Olewniczak            $first = 0;
316d31368a4SSzymon Olewniczak            $num = 100;
317d31368a4SSzymon Olewniczak            while (count($revs = $changelog->getRevisions($first, $num)) > 0) {
318d31368a4SSzymon Olewniczak                foreach ($revs as $rev) {
31992c202adSannda                    ++$changes;
320d31368a4SSzymon Olewniczak                    $revInfo = $changelog->getRevisionInfo($rev);
3217ec9f11bSAnna Dabrowska                    if ($helper->isMaintainer($revInfo['user'], $maintainer)) {
322d31368a4SSzymon Olewniczak                        $rev = $revInfo['date'];
323d31368a4SSzymon Olewniczak                        return $changes;
324d31368a4SSzymon Olewniczak                    }
325d31368a4SSzymon Olewniczak                }
326d31368a4SSzymon Olewniczak                $first += $num;
327d31368a4SSzymon Olewniczak            }
328d31368a4SSzymon Olewniczak        }
329d31368a4SSzymon Olewniczak
3304082d945SSzymon Olewniczak        $rev = -1;
331d31368a4SSzymon Olewniczak        return -1;
33268716d5dSSzymon Olewniczak    }
33368716d5dSSzymon Olewniczak
3344082d945SSzymon Olewniczak    /**
3354082d945SSzymon Olewniczak     * clean the cache every 24 hours
3364048d1eeSSzymon Olewniczak     *
33792c202adSannda     * @param Event $event event object by reference
3384048d1eeSSzymon Olewniczak     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
3394048d1eeSSzymon Olewniczak     *                           handler was registered]
3401cd7657bSMichael Große     *
3414048d1eeSSzymon Olewniczak     * @return void
3424048d1eeSSzymon Olewniczak     */
34392c202adSannda    public function handleParserCacheUse(Event $event, $param)
3441cd7657bSMichael Große    {
34519870ce2SMichael Große        /* @var \helper_plugin_watchcycle $helper */
3464048d1eeSSzymon Olewniczak        $helper = plugin_load('helper', 'watchcycle');
3474048d1eeSSzymon Olewniczak
3484048d1eeSSzymon Olewniczak        if ($helper->daysAgo($event->data->_time) >= 1) {
3494048d1eeSSzymon Olewniczak            $event->result = false;
3504048d1eeSSzymon Olewniczak        }
3514048d1eeSSzymon Olewniczak    }
3524048d1eeSSzymon Olewniczak
3534082d945SSzymon Olewniczak    /**
3544082d945SSzymon Olewniczak     * Check if the page has to be changed
3554082d945SSzymon Olewniczak     *
35692c202adSannda     * @param Event $event event object by reference
3574082d945SSzymon Olewniczak     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
3584082d945SSzymon Olewniczak     *                           handler was registered]
3591cd7657bSMichael Große     *
3604082d945SSzymon Olewniczak     * @return void
3614082d945SSzymon Olewniczak     */
36292c202adSannda    public function handlePagesaveBefore(Event $event, $param)
3631cd7657bSMichael Große    {
3641cd7657bSMichael Große        if ($event->data['contentChanged']) {
3651cd7657bSMichael Große            return;
3661cd7657bSMichael Große        } // will be saved for page changes
3674082d945SSzymon Olewniczak
3684082d945SSzymon Olewniczak        //save page if summary is provided
3694082d945SSzymon Olewniczak        if (!empty($event->data['summary'])) {
3704082d945SSzymon Olewniczak            $event->data['contentChanged'] = true;
3714082d945SSzymon Olewniczak        }
3724082d945SSzymon Olewniczak    }
3734082d945SSzymon Olewniczak
37419870ce2SMichael Große    /**
37519870ce2SMichael Große     * called for event SEARCH_RESULT_PAGELOOKUP
37619870ce2SMichael Große     *
37792c202adSannda     * @param Event $event
37819870ce2SMichael Große     * @param            $param
37919870ce2SMichael Große     */
38092c202adSannda    public function addIconToPageLookupResult(Event $event, $param)
381ff7d7d2fSMichael Große    {
38238cc216eSMichael Große        /* @var \helper_plugin_watchcycle $helper */
38338cc216eSMichael Große        $helper = plugin_load('helper', 'watchcycle');
38438cc216eSMichael Große
38538cc216eSMichael Große        $icon = $helper->getSearchResultIconHTML($event->data['page']);
386ff7d7d2fSMichael Große        if ($icon) {
387ff7d7d2fSMichael Große            $event->data['listItemContent'][] = $icon;
388ff7d7d2fSMichael Große        }
389ff7d7d2fSMichael Große    }
390ff7d7d2fSMichael Große
39119870ce2SMichael Große    /**
39219870ce2SMichael Große     * called for event SEARCH_RESULT_FULLPAGE
39319870ce2SMichael Große     *
39492c202adSannda     * @param Event $event
39519870ce2SMichael Große     * @param            $param
39619870ce2SMichael Große     */
39792c202adSannda    public function addIconToFullPageResult(Event $event, $param)
398ff7d7d2fSMichael Große    {
39938cc216eSMichael Große        /* @var \helper_plugin_watchcycle $helper */
40038cc216eSMichael Große        $helper = plugin_load('helper', 'watchcycle');
40138cc216eSMichael Große
40238cc216eSMichael Große        $icon = $helper->getSearchResultIconHTML($event->data['page']);
403ff7d7d2fSMichael Große        if ($icon) {
404ff7d7d2fSMichael Große            $event->data['resultHeader'][] = $icon;
405ff7d7d2fSMichael Große        }
406ff7d7d2fSMichael Große    }
40768716d5dSSzymon Olewniczak}
408