xref: /plugin/structpublish/action/cache.php (revision 7261c522adecf64e1fbfce2850ffdc7fb1167f39)
1*7261c522SAnna Dabrowska<?php
2*7261c522SAnna Dabrowska
3*7261c522SAnna Dabrowska/**
4*7261c522SAnna Dabrowska * Double caching of pages containing struct aggregations:
5*7261c522SAnna Dabrowska * one for regular users, one for publishers/approvers
6*7261c522SAnna Dabrowska * @see action_plugin_struct_cache
7*7261c522SAnna Dabrowska */
8*7261c522SAnna Dabrowskaclass action_plugin_structpublish_cache extends DokuWiki_Action_Plugin
9*7261c522SAnna Dabrowska{
10*7261c522SAnna Dabrowska    /**
11*7261c522SAnna Dabrowska     * Registers a callback function for a given event
12*7261c522SAnna Dabrowska     *
13*7261c522SAnna Dabrowska     * @param Doku_Event_Handler $controller DokuWiki's event controller object
14*7261c522SAnna Dabrowska     * @return void
15*7261c522SAnna Dabrowska     */
16*7261c522SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
17*7261c522SAnna Dabrowska    {
18*7261c522SAnna Dabrowska        $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handleCacheAggregation');
19*7261c522SAnna Dabrowska    }
20*7261c522SAnna Dabrowska
21*7261c522SAnna Dabrowska    /**
22*7261c522SAnna Dabrowska     * For pages containing an aggregation, add structpublish flag to cache key
23*7261c522SAnna Dabrowska     * to differentiate between caches for regular and privileged users
24*7261c522SAnna Dabrowska     *
25*7261c522SAnna Dabrowska     * @param Doku_Event $event event object by reference
26*7261c522SAnna Dabrowska     * @return bool
27*7261c522SAnna Dabrowska     */
28*7261c522SAnna Dabrowska    public function handleCacheAggregation(Doku_Event $event)
29*7261c522SAnna Dabrowska    {
30*7261c522SAnna Dabrowska        /** @var \dokuwiki\Cache\CacheParser $cache */
31*7261c522SAnna Dabrowska        $cache = $event->data;
32*7261c522SAnna Dabrowska        if ($cache->mode != 'xhtml') return true;
33*7261c522SAnna Dabrowska        if (!$cache->page) return true; // not a page cache
34*7261c522SAnna Dabrowska
35*7261c522SAnna Dabrowska        $meta = p_get_metadata($cache->page, 'plugin struct');
36*7261c522SAnna Dabrowska        if (isset($meta['hasaggregation'])) {
37*7261c522SAnna Dabrowska            // separate caches for publishers/approvers and others
38*7261c522SAnna Dabrowska             $cache->key .= ';' . action_plugin_structpublish_sqlitefunction::userHasRole($cache->page, '', []);
39*7261c522SAnna Dabrowska
40*7261c522SAnna Dabrowska            // rebuild cache name
41*7261c522SAnna Dabrowska            $cache->cache = getCacheName($cache->key, $cache->ext);
42*7261c522SAnna Dabrowska        }
43*7261c522SAnna Dabrowska
44*7261c522SAnna Dabrowska        return true;
45*7261c522SAnna Dabrowska    }
46*7261c522SAnna Dabrowska}
47