14cadd4f8SNickeau<?php 24cadd4f8SNickeau 3*04fd306cSNickeauuse ComboStrap\ComboFs; 4*04fd306cSNickeauuse ComboStrap\DatabasePageRow; 54cadd4f8SNickeauuse ComboStrap\Event; 6*04fd306cSNickeauuse ComboStrap\ExceptionCompile; 7*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 8*04fd306cSNickeauuse ComboStrap\ExecutionContext; 94cadd4f8SNickeauuse ComboStrap\FileSystems; 104cadd4f8SNickeauuse ComboStrap\LocalPath; 11*04fd306cSNickeauuse ComboStrap\LogUtility; 12*04fd306cSNickeauuse ComboStrap\MarkupCacheDependencies; 13*04fd306cSNickeauuse ComboStrap\MarkupPath; 14*04fd306cSNickeauuse ComboStrap\PageId; 154cadd4f8SNickeauuse ComboStrap\PagePath; 164cadd4f8SNickeauuse ComboStrap\Site; 17*04fd306cSNickeauuse ComboStrap\SlotSystem; 184cadd4f8SNickeau 194cadd4f8SNickeau 204cadd4f8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 214cadd4f8SNickeau 224cadd4f8SNickeau/** 234cadd4f8SNickeau * When a page is added or deleted from the file system 244cadd4f8SNickeau */ 254cadd4f8SNickeauclass action_plugin_combo_pagesystemmutation extends DokuWiki_Action_Plugin 264cadd4f8SNickeau{ 274cadd4f8SNickeau 284cadd4f8SNickeau 294cadd4f8SNickeau public const PAGE_SYSTEM_MUTATION_EVENT_NAME = 'page_system_mutation'; 304cadd4f8SNickeau 314cadd4f8SNickeau const TYPE_ATTRIBUTE = "type"; 324cadd4f8SNickeau const TYPE_CREATION = "creation"; 334cadd4f8SNickeau const TYPE_DELETION = "deletion"; 34*04fd306cSNickeau const CANONICAL = "combo-file-system"; 354cadd4f8SNickeau 364cadd4f8SNickeau 374cadd4f8SNickeau public function register(Doku_Event_Handler $controller) 384cadd4f8SNickeau { 394cadd4f8SNickeau 404cadd4f8SNickeau 414cadd4f8SNickeau /** 42*04fd306cSNickeau * 43*04fd306cSNickeau * And To delete sidebar (cache) cache when a page was modified in a namespace 444cadd4f8SNickeau * https://combostrap.com/sideslots 454cadd4f8SNickeau */ 464cadd4f8SNickeau $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'createFileSystemMutation', array()); 474cadd4f8SNickeau 484cadd4f8SNickeau /** 49*04fd306cSNickeau * Synchronization with the combo file system 50*04fd306cSNickeau */ 51*04fd306cSNickeau $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'comboFsSynchronization', array()); 52*04fd306cSNickeau 53*04fd306cSNickeau /** 544cadd4f8SNickeau * process the Async event 554cadd4f8SNickeau */ 564cadd4f8SNickeau $controller->register_hook(self::PAGE_SYSTEM_MUTATION_EVENT_NAME, 'AFTER', $this, 'handleFileSystemMutation'); 574cadd4f8SNickeau 584cadd4f8SNickeau } 594cadd4f8SNickeau 604cadd4f8SNickeau /** 614cadd4f8SNickeau * @param $event 624cadd4f8SNickeau * @throws Exception 634cadd4f8SNickeau * @link https://www.dokuwiki.org/devel:event:io_wikipage_write 64*04fd306cSNickeau * 65*04fd306cSNickeau * On update to an existing page this event is called twice, once for the transfer of the old version to the attic 66*04fd306cSNickeau * (rev will have a value) 67*04fd306cSNickeau * and once to write the new version of the page into the wiki (rev is false) 684cadd4f8SNickeau */ 694cadd4f8SNickeau function createFileSystemMutation($event) 704cadd4f8SNickeau { 714cadd4f8SNickeau 724cadd4f8SNickeau $data = $event->data; 734cadd4f8SNickeau $pageName = $data[2]; 744cadd4f8SNickeau 754cadd4f8SNickeau /** 764cadd4f8SNickeau * Modification to the secondary slot are not processed 774cadd4f8SNickeau */ 78*04fd306cSNickeau if (in_array($pageName, SlotSystem::getSlotNames())) return; 794cadd4f8SNickeau 804cadd4f8SNickeau 814cadd4f8SNickeau /** 82*04fd306cSNickeau * TODO ?: the common uses the common_wikipage_save instead ? 83*04fd306cSNickeau * https://www.dokuwiki.org/devel:event:common_wikipage_save 844cadd4f8SNickeau * File creation 854cadd4f8SNickeau * 864cadd4f8SNickeau * ``` 874cadd4f8SNickeau * Page creation may be detected by checking if the file already exists and the revision is false. 884cadd4f8SNickeau * ``` 894cadd4f8SNickeau * From https://www.dokuwiki.org/devel:event:io_wikipage_write 904cadd4f8SNickeau * 914cadd4f8SNickeau */ 924cadd4f8SNickeau $rev = $data[3]; 934cadd4f8SNickeau $filePath = $data[0][0]; 94*04fd306cSNickeau $file = LocalPath::createFromPathString($filePath); 954cadd4f8SNickeau if (!FileSystems::exists($file) && $rev === false) { 964cadd4f8SNickeau Event::createEvent( 974cadd4f8SNickeau action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME, 984cadd4f8SNickeau [ 994cadd4f8SNickeau self::TYPE_ATTRIBUTE => self::TYPE_CREATION, 100*04fd306cSNickeau PagePath::getPersistentName() => $file->toWikiPath()->toAbsoluteId() 1014cadd4f8SNickeau ] 1024cadd4f8SNickeau ); 1034cadd4f8SNickeau return; 1044cadd4f8SNickeau } 1054cadd4f8SNickeau 1064cadd4f8SNickeau /** 1074cadd4f8SNickeau * File deletion 1084cadd4f8SNickeau * (No content) 1094cadd4f8SNickeau * 1104cadd4f8SNickeau * ``` 1114cadd4f8SNickeau * Page deletion may be detected by checking for empty page content. 112*04fd306cSNickeau * On update to an existing page this event is called twice, once for the transfer 113*04fd306cSNickeau * of the old version to the attic (rev will have a value) 1144cadd4f8SNickeau * and once to write the new version of the page into the wiki (rev is false) 1154cadd4f8SNickeau * ``` 1164cadd4f8SNickeau * From https://www.dokuwiki.org/devel:event:io_wikipage_write 1174cadd4f8SNickeau */ 1184cadd4f8SNickeau $append = $data[0][2]; 1194cadd4f8SNickeau if (!$append) { 1204cadd4f8SNickeau 1214cadd4f8SNickeau $content = $data[0][1]; 1224cadd4f8SNickeau if (empty($content) && $rev === false) { 1234cadd4f8SNickeau // Deletion 1244cadd4f8SNickeau Event::createEvent( 1254cadd4f8SNickeau action_plugin_combo_pagesystemmutation::PAGE_SYSTEM_MUTATION_EVENT_NAME, 1264cadd4f8SNickeau [ 1274cadd4f8SNickeau self::TYPE_ATTRIBUTE => self::TYPE_DELETION, 128*04fd306cSNickeau PagePath::getPersistentName() => $file->toWikiPath()->toAbsoluteId() 1294cadd4f8SNickeau ] 1304cadd4f8SNickeau ); 1314cadd4f8SNickeau } 1324cadd4f8SNickeau } 1334cadd4f8SNickeau 1344cadd4f8SNickeau } 1354cadd4f8SNickeau 1364cadd4f8SNickeau public function handleFileSystemMutation($event) 1374cadd4f8SNickeau { 1384cadd4f8SNickeau 1394cadd4f8SNickeau /** 1404cadd4f8SNickeau * We need to re-render the slot 141*04fd306cSNickeau * that are {@link \ComboStrap\MarkupCacheDependencies::PAGE_SYSTEM_DEPENDENCY} 1424cadd4f8SNickeau * dependent 1434cadd4f8SNickeau */ 1444cadd4f8SNickeau $data = $event->data; 1454cadd4f8SNickeau 1464cadd4f8SNickeau /** 1474cadd4f8SNickeau * Re-render 1484cadd4f8SNickeau */ 149*04fd306cSNickeau $pathAddedOrDeleted = $data[PagePath::getPersistentName()]; 150*04fd306cSNickeau MarkupCacheDependencies::reRenderSideSlotIfNeeded( 151*04fd306cSNickeau $pathAddedOrDeleted, 152*04fd306cSNickeau MarkupCacheDependencies::PAGE_SYSTEM_DEPENDENCY, 1534cadd4f8SNickeau self::PAGE_SYSTEM_MUTATION_EVENT_NAME 1544cadd4f8SNickeau ); 1554cadd4f8SNickeau 1564cadd4f8SNickeau } 1574cadd4f8SNickeau 158*04fd306cSNickeau /** 159*04fd306cSNickeau * Store into the Combo file system 160*04fd306cSNickeau * @param $event 161*04fd306cSNickeau * @return void 162*04fd306cSNickeau */ 163*04fd306cSNickeau public function comboFsSynchronization($event) 164*04fd306cSNickeau { 165*04fd306cSNickeau 166*04fd306cSNickeau $id = $event->data['id']; 167*04fd306cSNickeau $markup = MarkupPath::createMarkupFromId($id); 168*04fd306cSNickeau 169*04fd306cSNickeau $changedType = $event->data['changeType']; 170*04fd306cSNickeau switch ($changedType) { 171*04fd306cSNickeau // creation 172*04fd306cSNickeau case DOKU_CHANGE_TYPE_CREATE: 173*04fd306cSNickeau /** 174*04fd306cSNickeau * For now, we just sync the page id in the index tables (pages) 175*04fd306cSNickeau * 176*04fd306cSNickeau * This is mandatory to allow permanent url redirection {@link PageUrlType}) 177*04fd306cSNickeau */ 178*04fd306cSNickeau if (action_plugin_combo_linkmove::isMoveOperation()) { 179*04fd306cSNickeau /** 180*04fd306cSNickeau * Is this a creation from a move ? 181*04fd306cSNickeau */ 182*04fd306cSNickeau return; 183*04fd306cSNickeau } 184*04fd306cSNickeau try { 185*04fd306cSNickeau PageId::createForPage($markup) 186*04fd306cSNickeau ->getValue(); 187*04fd306cSNickeau } catch (ExceptionNotFound $e) { 188*04fd306cSNickeau ComboFs::createIfNotExists($markup); 189*04fd306cSNickeau } 190*04fd306cSNickeau return; 191*04fd306cSNickeau case DOKU_CHANGE_TYPE_DELETE: 192*04fd306cSNickeau /** 193*04fd306cSNickeau * Is this a delete from a move ? 194*04fd306cSNickeau */ 195*04fd306cSNickeau if (action_plugin_combo_linkmove::isMoveOperation()) { 196*04fd306cSNickeau return; 197*04fd306cSNickeau } 198*04fd306cSNickeau ComboFs::delete($markup); 199*04fd306cSNickeau return; 200*04fd306cSNickeau } 201*04fd306cSNickeau 202*04fd306cSNickeau 203*04fd306cSNickeau } 2044cadd4f8SNickeau 2054cadd4f8SNickeau} 2064cadd4f8SNickeau 2074cadd4f8SNickeau 2084cadd4f8SNickeau 209