xref: /plugin/struct/action/cache.php (revision 097f4a53a9f2c54a89643d357681041c89816aed)
1<?php
2use plugin\struct\meta\SearchConfigParameters;
3
4/**
5 * Handle caching of pages containing struct aggregations
6 */
7class action_plugin_struct_cache extends DokuWiki_Action_Plugin {
8
9    /**
10     * Registers a callback function for a given event
11     *
12     * @param Doku_Event_Handler $controller DokuWiki's event controller object
13     * @return void
14     */
15    public function register(Doku_Event_Handler $controller) {
16        $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handle_cache_aggregation');
17        $controller->register_hook('PARSER_CACHE_USE', 'AFTER', $this, 'handle_cache_dynamic');
18    }
19
20    /**
21     * For pages containing an aggregation, add the last modified date of the database itself
22     * to the cache dependencies
23     *
24     * @param Doku_Event $event event object by reference
25     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
26     *                           handler was registered]
27     * @return bool
28     */
29    public function handle_cache_aggregation(Doku_Event $event, $param) {
30        /** @var \cache_parser $cache */
31        $cache = $event->data;
32        if($cache->mode != 'xhtml') return true;
33        if(!$cache->page) return true; // not a page cache
34
35        $meta = p_get_metadata($cache->page, 'plugin struct');
36        if(isset($meta['hasaggregation'])) {
37            /** @var helper_plugin_struct_db $db */
38            $db = plugin_load('helper', 'struct_db');
39            $cache->depends['files'][] = $db->getDB()->getAdapter()->getDbFile();
40        }
41
42        return true;
43    }
44
45    /**
46     * Disable cache when dymanic parameters are present
47     *
48     * @param Doku_Event $event event object by reference
49     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
50     *                           handler was registered]
51     * @return bool
52     */
53    public function handle_cache_dynamic(Doku_Event $event, $param) {
54        /** @var \cache_parser $cache */
55        $cache = $event->data;
56        if($cache->mode != 'xhtml') return true;
57        if(!$cache->page) return true; // not a page cache
58        global $INPUT;
59
60        // disable cache use when one of these parameters is present
61        foreach(array(
62                    SearchConfigParameters::$PARAM_FILTER,
63                    SearchConfigParameters::$PARAM_OFFSET,
64                    SearchConfigParameters::$PARAM_SORT
65                ) as $key) {
66            if($INPUT->has($key)) {
67                $event->result = false;
68                return true;
69            }
70        }
71
72        return true;
73    }
74
75}
76