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