1dbe5bc9dSAndreas Gohr<?php 2*53ed3125SAndreas Gohruse plugin\struct\meta\SearchConfigParameters; 3dbe5bc9dSAndreas Gohr 4dbe5bc9dSAndreas Gohr/** 5dbe5bc9dSAndreas Gohr * Handle caching of pages containing struct aggregations 6dbe5bc9dSAndreas Gohr */ 7dbe5bc9dSAndreas Gohrclass action_plugin_struct_cache extends DokuWiki_Action_Plugin { 8dbe5bc9dSAndreas Gohr 9dbe5bc9dSAndreas Gohr /** 10dbe5bc9dSAndreas Gohr * Registers a callback function for a given event 11dbe5bc9dSAndreas Gohr * 12dbe5bc9dSAndreas Gohr * @param Doku_Event_Handler $controller DokuWiki's event controller object 13dbe5bc9dSAndreas Gohr * @return void 14dbe5bc9dSAndreas Gohr */ 15dbe5bc9dSAndreas Gohr public function register(Doku_Event_Handler $controller) { 16dbe5bc9dSAndreas Gohr $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handle_cache_aggregation'); 17dbe5bc9dSAndreas Gohr $controller->register_hook('PARSER_CACHE_USE', 'AFTER', $this, 'handle_cache_dynamic'); 18dbe5bc9dSAndreas Gohr } 19dbe5bc9dSAndreas Gohr 20dbe5bc9dSAndreas Gohr /** 21dbe5bc9dSAndreas Gohr * For pages containing an aggregation, add the last modified date of the database itself 22dbe5bc9dSAndreas Gohr * to the cache dependencies 23dbe5bc9dSAndreas Gohr * 24dbe5bc9dSAndreas Gohr * @param Doku_Event $event event object by reference 25dbe5bc9dSAndreas Gohr * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 26dbe5bc9dSAndreas Gohr * handler was registered] 27dbe5bc9dSAndreas Gohr * @return bool 28dbe5bc9dSAndreas Gohr */ 29dbe5bc9dSAndreas Gohr public function handle_cache_aggregation(Doku_Event $event, $param) { 30dbe5bc9dSAndreas Gohr /** @var \cache_parser $cache */ 31dbe5bc9dSAndreas Gohr $cache = $event->data; 32dbe5bc9dSAndreas Gohr if($cache->mode != 'xhtml') return true; 33dbe5bc9dSAndreas Gohr if(!$cache->page) return true; // not a page cache 34dbe5bc9dSAndreas Gohr 35dbe5bc9dSAndreas Gohr $meta = p_get_metadata($cache->page, 'plugin struct'); 36dbe5bc9dSAndreas Gohr if(isset($meta['hasaggregation'])) { 37dbe5bc9dSAndreas Gohr /** @var helper_plugin_struct_db $db */ 38dbe5bc9dSAndreas Gohr $db = plugin_load('helper', 'struct_db'); 39dbe5bc9dSAndreas Gohr $cache->depends['files'][] = $db->getDB()->getAdapter()->getDbFile(); 40dbe5bc9dSAndreas Gohr } 41dbe5bc9dSAndreas Gohr 42dbe5bc9dSAndreas Gohr return true; 43dbe5bc9dSAndreas Gohr } 44dbe5bc9dSAndreas Gohr 45dbe5bc9dSAndreas Gohr /** 46dbe5bc9dSAndreas Gohr * Disable cache when dymanic parameters are present 47dbe5bc9dSAndreas Gohr * 48dbe5bc9dSAndreas Gohr * @param Doku_Event $event event object by reference 49dbe5bc9dSAndreas Gohr * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 50dbe5bc9dSAndreas Gohr * handler was registered] 51dbe5bc9dSAndreas Gohr * @return bool 52dbe5bc9dSAndreas Gohr */ 53dbe5bc9dSAndreas Gohr public function handle_cache_dynamic(Doku_Event $event, $param) { 54dbe5bc9dSAndreas Gohr /** @var \cache_parser $cache */ 55dbe5bc9dSAndreas Gohr $cache = $event->data; 56dbe5bc9dSAndreas Gohr if($cache->mode != 'xhtml') return true; 57dbe5bc9dSAndreas Gohr if(!$cache->page) return true; // not a page cache 58dbe5bc9dSAndreas Gohr global $INPUT; 59dbe5bc9dSAndreas Gohr 60dbe5bc9dSAndreas Gohr // disable cache use when one of these parameters is present 61*53ed3125SAndreas Gohr foreach(array( 62*53ed3125SAndreas Gohr SearchConfigParameters::$PARAM_FILTER, 63*53ed3125SAndreas Gohr SearchConfigParameters::$PARAM_OFFSET, 64*53ed3125SAndreas Gohr SearchConfigParameters::$PARAM_SORT 65*53ed3125SAndreas Gohr ) as $key) { 66dbe5bc9dSAndreas Gohr if($INPUT->has($key)) { 67dbe5bc9dSAndreas Gohr $event->result = false; 68dbe5bc9dSAndreas Gohr return true; 69dbe5bc9dSAndreas Gohr } 70dbe5bc9dSAndreas Gohr } 71dbe5bc9dSAndreas Gohr 72dbe5bc9dSAndreas Gohr return true; 73dbe5bc9dSAndreas Gohr } 74dbe5bc9dSAndreas Gohr 75dbe5bc9dSAndreas Gohr} 76