xref: /plugin/structpublish/action/cache.php (revision 31e730e145521fb7010758415a11c928f44439b8)
17261c522SAnna Dabrowska<?php
27261c522SAnna Dabrowska
37261c522SAnna Dabrowska/**
47261c522SAnna Dabrowska * Double caching of pages containing struct aggregations:
57261c522SAnna Dabrowska * one for regular users, one for publishers/approvers
6*31e730e1SAnna Dabrowska *
77261c522SAnna Dabrowska * @see action_plugin_struct_cache
87261c522SAnna Dabrowska */
97261c522SAnna Dabrowskaclass action_plugin_structpublish_cache extends DokuWiki_Action_Plugin
107261c522SAnna Dabrowska{
117261c522SAnna Dabrowska    /**
127261c522SAnna Dabrowska     * Registers a callback function for a given event
137261c522SAnna Dabrowska     *
147261c522SAnna Dabrowska     * @param Doku_Event_Handler $controller DokuWiki's event controller object
157261c522SAnna Dabrowska     * @return void
167261c522SAnna Dabrowska     */
177261c522SAnna Dabrowska    public function register(Doku_Event_Handler $controller)
187261c522SAnna Dabrowska    {
197261c522SAnna Dabrowska        $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handleCacheAggregation');
207261c522SAnna Dabrowska    }
217261c522SAnna Dabrowska
227261c522SAnna Dabrowska    /**
237261c522SAnna Dabrowska     * For pages containing an aggregation, add structpublish flag to cache key
247261c522SAnna Dabrowska     * to differentiate between caches for regular and privileged users
257261c522SAnna Dabrowska     *
267261c522SAnna Dabrowska     * @param Doku_Event $event event object by reference
277261c522SAnna Dabrowska     * @return bool
287261c522SAnna Dabrowska     */
297261c522SAnna Dabrowska    public function handleCacheAggregation(Doku_Event $event)
307261c522SAnna Dabrowska    {
317261c522SAnna Dabrowska        /** @var \dokuwiki\Cache\CacheParser $cache */
327261c522SAnna Dabrowska        $cache = $event->data;
337261c522SAnna Dabrowska        if ($cache->mode != 'xhtml') return true;
347261c522SAnna Dabrowska        if (!$cache->page) return true; // not a page cache
357261c522SAnna Dabrowska
367261c522SAnna Dabrowska        $meta = p_get_metadata($cache->page, 'plugin struct');
377261c522SAnna Dabrowska        if (isset($meta['hasaggregation'])) {
387261c522SAnna Dabrowska            // separate caches for publishers/approvers and others
39ed00f27dSAndreas Gohr             $cache->key .= ';' . helper_plugin_structpublish_db::userHasRole($cache->page, '', []);
407261c522SAnna Dabrowska
417261c522SAnna Dabrowska            // rebuild cache name
427261c522SAnna Dabrowska            $cache->cache = getCacheName($cache->key, $cache->ext);
437261c522SAnna Dabrowska        }
447261c522SAnna Dabrowska
457261c522SAnna Dabrowska        return true;
467261c522SAnna Dabrowska    }
477261c522SAnna Dabrowska}
48