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