1*7261c522SAnna Dabrowska<?php 2*7261c522SAnna Dabrowska 3*7261c522SAnna Dabrowska/** 4*7261c522SAnna Dabrowska * Double caching of pages containing struct aggregations: 5*7261c522SAnna Dabrowska * one for regular users, one for publishers/approvers 6*7261c522SAnna Dabrowska * @see action_plugin_struct_cache 7*7261c522SAnna Dabrowska */ 8*7261c522SAnna Dabrowskaclass action_plugin_structpublish_cache extends DokuWiki_Action_Plugin 9*7261c522SAnna Dabrowska{ 10*7261c522SAnna Dabrowska /** 11*7261c522SAnna Dabrowska * Registers a callback function for a given event 12*7261c522SAnna Dabrowska * 13*7261c522SAnna Dabrowska * @param Doku_Event_Handler $controller DokuWiki's event controller object 14*7261c522SAnna Dabrowska * @return void 15*7261c522SAnna Dabrowska */ 16*7261c522SAnna Dabrowska public function register(Doku_Event_Handler $controller) 17*7261c522SAnna Dabrowska { 18*7261c522SAnna Dabrowska $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handleCacheAggregation'); 19*7261c522SAnna Dabrowska } 20*7261c522SAnna Dabrowska 21*7261c522SAnna Dabrowska /** 22*7261c522SAnna Dabrowska * For pages containing an aggregation, add structpublish flag to cache key 23*7261c522SAnna Dabrowska * to differentiate between caches for regular and privileged users 24*7261c522SAnna Dabrowska * 25*7261c522SAnna Dabrowska * @param Doku_Event $event event object by reference 26*7261c522SAnna Dabrowska * @return bool 27*7261c522SAnna Dabrowska */ 28*7261c522SAnna Dabrowska public function handleCacheAggregation(Doku_Event $event) 29*7261c522SAnna Dabrowska { 30*7261c522SAnna Dabrowska /** @var \dokuwiki\Cache\CacheParser $cache */ 31*7261c522SAnna Dabrowska $cache = $event->data; 32*7261c522SAnna Dabrowska if ($cache->mode != 'xhtml') return true; 33*7261c522SAnna Dabrowska if (!$cache->page) return true; // not a page cache 34*7261c522SAnna Dabrowska 35*7261c522SAnna Dabrowska $meta = p_get_metadata($cache->page, 'plugin struct'); 36*7261c522SAnna Dabrowska if (isset($meta['hasaggregation'])) { 37*7261c522SAnna Dabrowska // separate caches for publishers/approvers and others 38*7261c522SAnna Dabrowska $cache->key .= ';' . action_plugin_structpublish_sqlitefunction::userHasRole($cache->page, '', []); 39*7261c522SAnna Dabrowska 40*7261c522SAnna Dabrowska // rebuild cache name 41*7261c522SAnna Dabrowska $cache->cache = getCacheName($cache->key, $cache->ext); 42*7261c522SAnna Dabrowska } 43*7261c522SAnna Dabrowska 44*7261c522SAnna Dabrowska return true; 45*7261c522SAnna Dabrowska } 46*7261c522SAnna Dabrowska} 47