xref: /plugin/structpublish/action/cache.php (revision 9ab8cbae39a6ffa37705f745bc76916ea212a92b)
17261c522SAnna Dabrowska<?php
27261c522SAnna Dabrowska
3*9ab8cbaeSanndause dokuwiki\Extension\ActionPlugin;
4*9ab8cbaeSanndause dokuwiki\Extension\EventHandler;
5*9ab8cbaeSanndause dokuwiki\Extension\Event;
6*9ab8cbaeSanndause dokuwiki\Cache\CacheParser;
7*9ab8cbaeSannda
87261c522SAnna Dabrowska/**
97261c522SAnna Dabrowska * Double caching of pages containing struct aggregations:
107261c522SAnna Dabrowska * one for regular users, one for publishers/approvers
1131e730e1SAnna Dabrowska *
127261c522SAnna Dabrowska * @see action_plugin_struct_cache
137261c522SAnna Dabrowska */
14*9ab8cbaeSanndaclass action_plugin_structpublish_cache extends ActionPlugin
157261c522SAnna Dabrowska{
167261c522SAnna Dabrowska    /**
177261c522SAnna Dabrowska     * Registers a callback function for a given event
187261c522SAnna Dabrowska     *
19*9ab8cbaeSannda     * @param EventHandler $controller DokuWiki's event controller object
207261c522SAnna Dabrowska     * @return void
217261c522SAnna Dabrowska     */
22*9ab8cbaeSannda    public function register(EventHandler $controller)
237261c522SAnna Dabrowska    {
247261c522SAnna Dabrowska        $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handleCacheAggregation');
257261c522SAnna Dabrowska    }
267261c522SAnna Dabrowska
277261c522SAnna Dabrowska    /**
287261c522SAnna Dabrowska     * For pages containing an aggregation, add structpublish flag to cache key
297261c522SAnna Dabrowska     * to differentiate between caches for regular and privileged users
307261c522SAnna Dabrowska     *
31*9ab8cbaeSannda     * @param Event $event event object by reference
327261c522SAnna Dabrowska     * @return bool
337261c522SAnna Dabrowska     */
34*9ab8cbaeSannda    public function handleCacheAggregation(Event $event)
357261c522SAnna Dabrowska    {
36*9ab8cbaeSannda        /** @var CacheParser $cache */
377261c522SAnna Dabrowska        $cache = $event->data;
387261c522SAnna Dabrowska        if ($cache->mode != 'xhtml') return true;
397261c522SAnna Dabrowska        if (!$cache->page) return true; // not a page cache
407261c522SAnna Dabrowska
417261c522SAnna Dabrowska        $meta = p_get_metadata($cache->page, 'plugin struct');
427261c522SAnna Dabrowska        if (isset($meta['hasaggregation'])) {
437261c522SAnna Dabrowska            // separate caches for publishers/approvers and others
44ed00f27dSAndreas Gohr             $cache->key .= ';' . helper_plugin_structpublish_db::userHasRole($cache->page, '', []);
457261c522SAnna Dabrowska
467261c522SAnna Dabrowska            // rebuild cache name
477261c522SAnna Dabrowska            $cache->cache = getCacheName($cache->key, $cache->ext);
487261c522SAnna Dabrowska        }
497261c522SAnna Dabrowska
507261c522SAnna Dabrowska        return true;
517261c522SAnna Dabrowska    }
527261c522SAnna Dabrowska}
53