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