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