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