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