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