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