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