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