1*4cadd4f8SNickeau<?php 2*4cadd4f8SNickeau 3*4cadd4f8SNickeauuse ComboStrap\CacheDependencies; 4*4cadd4f8SNickeauuse ComboStrap\Event; 5*4cadd4f8SNickeauuse ComboStrap\FileSystems; 6*4cadd4f8SNickeauuse ComboStrap\LocalPath; 7*4cadd4f8SNickeauuse ComboStrap\Page; 8*4cadd4f8SNickeauuse ComboStrap\PagePath; 9*4cadd4f8SNickeauuse ComboStrap\Site; 10*4cadd4f8SNickeau 11*4cadd4f8SNickeau 12*4cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 13*4cadd4f8SNickeau 14*4cadd4f8SNickeau/** 15*4cadd4f8SNickeau * When a page is added or deleted from the file system 16*4cadd4f8SNickeau */ 17*4cadd4f8SNickeauclass action_plugin_combo_pagesystemmutation extends DokuWiki_Action_Plugin 18*4cadd4f8SNickeau{ 19*4cadd4f8SNickeau 20*4cadd4f8SNickeau 21*4cadd4f8SNickeau public const PAGE_SYSTEM_MUTATION_EVENT_NAME = 'page_system_mutation'; 22*4cadd4f8SNickeau 23*4cadd4f8SNickeau const TYPE_ATTRIBUTE = "type"; 24*4cadd4f8SNickeau const TYPE_CREATION = "creation"; 25*4cadd4f8SNickeau const TYPE_DELETION = "deletion"; 26*4cadd4f8SNickeau 27*4cadd4f8SNickeau 28*4cadd4f8SNickeau public function register(Doku_Event_Handler $controller) 29*4cadd4f8SNickeau { 30*4cadd4f8SNickeau 31*4cadd4f8SNickeau 32*4cadd4f8SNickeau /** 33*4cadd4f8SNickeau * To delete sidebar (cache) cache when a page was modified in a namespace 34*4cadd4f8SNickeau * https://combostrap.com/sideslots 35*4cadd4f8SNickeau */ 36*4cadd4f8SNickeau $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'createFileSystemMutation', array()); 37*4cadd4f8SNickeau 38*4cadd4f8SNickeau /** 39*4cadd4f8SNickeau * process the Async event 40*4cadd4f8SNickeau */ 41*4cadd4f8SNickeau $controller->register_hook(self::PAGE_SYSTEM_MUTATION_EVENT_NAME, 'AFTER', $this, 'handleFileSystemMutation'); 42*4cadd4f8SNickeau 43*4cadd4f8SNickeau } 44*4cadd4f8SNickeau 45*4cadd4f8SNickeau /** 46*4cadd4f8SNickeau * @param $event 47*4cadd4f8SNickeau * @throws Exception 48*4cadd4f8SNickeau * @link https://www.dokuwiki.org/devel:event:io_wikipage_write 49*4cadd4f8SNickeau */ 50*4cadd4f8SNickeau function createFileSystemMutation($event) 51*4cadd4f8SNickeau { 52*4cadd4f8SNickeau 53*4cadd4f8SNickeau $data = $event->data; 54*4cadd4f8SNickeau $pageName = $data[2]; 55*4cadd4f8SNickeau 56*4cadd4f8SNickeau /** 57*4cadd4f8SNickeau * Modification to the secondary slot are not processed 58*4cadd4f8SNickeau */ 59*4cadd4f8SNickeau if (in_array($pageName, Site::getSecondarySlotNames())) return; 60*4cadd4f8SNickeau 61*4cadd4f8SNickeau 62*4cadd4f8SNickeau /** 63*4cadd4f8SNickeau * File creation 64*4cadd4f8SNickeau * 65*4cadd4f8SNickeau * ``` 66*4cadd4f8SNickeau * Page creation may be detected by checking if the file already exists and the revision is false. 67*4cadd4f8SNickeau * ``` 68*4cadd4f8SNickeau * From https://www.dokuwiki.org/devel:event:io_wikipage_write 69*4cadd4f8SNickeau * 70*4cadd4f8SNickeau */ 71*4cadd4f8SNickeau $rev = $data[3]; 72*4cadd4f8SNickeau $filePath = $data[0][0]; 73*4cadd4f8SNickeau $file = LocalPath::createFromPath($filePath); 74*4cadd4f8SNickeau if (!FileSystems::exists($file) && $rev === false) { 75*4cadd4f8SNickeau Event::createEvent( 76*4cadd4f8SNickeau action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME, 77*4cadd4f8SNickeau [ 78*4cadd4f8SNickeau self::TYPE_ATTRIBUTE => self::TYPE_CREATION, 79*4cadd4f8SNickeau PagePath::getPersistentName() => $file->toDokuPath()->toString() 80*4cadd4f8SNickeau ] 81*4cadd4f8SNickeau ); 82*4cadd4f8SNickeau return; 83*4cadd4f8SNickeau } 84*4cadd4f8SNickeau 85*4cadd4f8SNickeau /** 86*4cadd4f8SNickeau * File deletion 87*4cadd4f8SNickeau * (No content) 88*4cadd4f8SNickeau * 89*4cadd4f8SNickeau * ``` 90*4cadd4f8SNickeau * Page deletion may be detected by checking for empty page content. 91*4cadd4f8SNickeau * On update to an existing page this event is called twice, once for the transfer of the old version to the attic (rev will have a value) 92*4cadd4f8SNickeau * and once to write the new version of the page into the wiki (rev is false) 93*4cadd4f8SNickeau * ``` 94*4cadd4f8SNickeau * From https://www.dokuwiki.org/devel:event:io_wikipage_write 95*4cadd4f8SNickeau */ 96*4cadd4f8SNickeau $append = $data[0][2]; 97*4cadd4f8SNickeau if (!$append) { 98*4cadd4f8SNickeau 99*4cadd4f8SNickeau $content = $data[0][1]; 100*4cadd4f8SNickeau if (empty($content) && $rev === false) { 101*4cadd4f8SNickeau // Deletion 102*4cadd4f8SNickeau Event::createEvent( 103*4cadd4f8SNickeau action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME, 104*4cadd4f8SNickeau [ 105*4cadd4f8SNickeau self::TYPE_ATTRIBUTE => self::TYPE_DELETION, 106*4cadd4f8SNickeau PagePath::getPersistentName() => $file->toDokuPath()->toString() 107*4cadd4f8SNickeau ] 108*4cadd4f8SNickeau ); 109*4cadd4f8SNickeau } 110*4cadd4f8SNickeau } 111*4cadd4f8SNickeau 112*4cadd4f8SNickeau } 113*4cadd4f8SNickeau 114*4cadd4f8SNickeau public function handleFileSystemMutation($event) 115*4cadd4f8SNickeau { 116*4cadd4f8SNickeau 117*4cadd4f8SNickeau /** 118*4cadd4f8SNickeau * We need to re-render the slot 119*4cadd4f8SNickeau * that are {@link \ComboStrap\CacheDependencies::PAGE_SYSTEM_DEPENDENCY} 120*4cadd4f8SNickeau * dependent 121*4cadd4f8SNickeau */ 122*4cadd4f8SNickeau $data = $event->data; 123*4cadd4f8SNickeau 124*4cadd4f8SNickeau /** 125*4cadd4f8SNickeau * Re-render 126*4cadd4f8SNickeau */ 127*4cadd4f8SNickeau $path = $data[PagePath::getPersistentName()]; 128*4cadd4f8SNickeau CacheDependencies::reRenderSecondarySlotsIfNeeded( 129*4cadd4f8SNickeau $path, 130*4cadd4f8SNickeau CacheDependencies::PAGE_SYSTEM_DEPENDENCY, 131*4cadd4f8SNickeau self::PAGE_SYSTEM_MUTATION_EVENT_NAME 132*4cadd4f8SNickeau ); 133*4cadd4f8SNickeau 134*4cadd4f8SNickeau } 135*4cadd4f8SNickeau 136*4cadd4f8SNickeau 137*4cadd4f8SNickeau} 138*4cadd4f8SNickeau 139*4cadd4f8SNickeau 140*4cadd4f8SNickeau 141