1*c3437056SNickeau<?php 2*c3437056SNickeau 3*c3437056SNickeauuse ComboStrap\Event; 4*c3437056SNickeauuse ComboStrap\ExceptionCombo; 5*c3437056SNickeauuse ComboStrap\FileSystems; 6*c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore; 7*c3437056SNickeauuse ComboStrap\Page; 8*c3437056SNickeauuse ComboStrap\PagePath; 9*c3437056SNickeauuse ComboStrap\Reference; 10*c3437056SNickeauuse ComboStrap\References; 11*c3437056SNickeau 12*c3437056SNickeau 13*c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 14*c3437056SNickeau 15*c3437056SNickeau/** 16*c3437056SNickeau * Refresh the analytics when a backlink mutation occurs for a page 17*c3437056SNickeau */ 18*c3437056SNickeauclass action_plugin_combo_backlinkmutation extends DokuWiki_Action_Plugin 19*c3437056SNickeau{ 20*c3437056SNickeau 21*c3437056SNickeau 22*c3437056SNickeau public const BACKLINK_MUTATION_EVENT_NAME = 'BACKLINK_MUTATION'; 23*c3437056SNickeau 24*c3437056SNickeau 25*c3437056SNickeau public function register(Doku_Event_Handler $controller) 26*c3437056SNickeau { 27*c3437056SNickeau 28*c3437056SNickeau 29*c3437056SNickeau /** 30*c3437056SNickeau * create the async event 31*c3437056SNickeau */ 32*c3437056SNickeau $controller->register_hook(MetadataDokuWikiStore::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array()); 33*c3437056SNickeau 34*c3437056SNickeau /** 35*c3437056SNickeau * process the async event 36*c3437056SNickeau */ 37*c3437056SNickeau $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation'); 38*c3437056SNickeau 39*c3437056SNickeau 40*c3437056SNickeau } 41*c3437056SNickeau 42*c3437056SNickeau 43*c3437056SNickeau public function handle_backlink_mutation(Doku_Event $event, $param) 44*c3437056SNickeau { 45*c3437056SNickeau 46*c3437056SNickeau 47*c3437056SNickeau $data = $event->data; 48*c3437056SNickeau $pagePath = $data[PagePath::getPersistentName()]; 49*c3437056SNickeau $page = Page::createPageFromQualifiedPath($pagePath); 50*c3437056SNickeau 51*c3437056SNickeau // delete analytics 52*c3437056SNickeau FileSystems::deleteIfExists($page->getAnalyticsDocument()->getCachePath()); 53*c3437056SNickeau $page->getDatabasePage()->replicateAnalytics(); 54*c3437056SNickeau 55*c3437056SNickeau 56*c3437056SNickeau } 57*c3437056SNickeau 58*c3437056SNickeau /** 59*c3437056SNickeau */ 60*c3437056SNickeau function create_backlink_mutation(Doku_Event $event, $params) 61*c3437056SNickeau { 62*c3437056SNickeau 63*c3437056SNickeau 64*c3437056SNickeau $data = $event->data; 65*c3437056SNickeau 66*c3437056SNickeau /** 67*c3437056SNickeau * If this is not a mutation on references we return. 68*c3437056SNickeau */ 69*c3437056SNickeau if ($data["name"] !== References::getPersistentName()) { 70*c3437056SNickeau return; 71*c3437056SNickeau }; 72*c3437056SNickeau 73*c3437056SNickeau $newRows = $data["new_value"]; 74*c3437056SNickeau $oldRows = $data["old_value"]; 75*c3437056SNickeau 76*c3437056SNickeau $afterReferences = []; 77*c3437056SNickeau if ($newRows !== null) { 78*c3437056SNickeau foreach ($newRows as $rowNewValue) { 79*c3437056SNickeau $reference = $rowNewValue[Reference::getPersistentName()]; 80*c3437056SNickeau $afterReferences[$reference] = $reference; 81*c3437056SNickeau } 82*c3437056SNickeau } 83*c3437056SNickeau 84*c3437056SNickeau if ($oldRows !== null) { 85*c3437056SNickeau foreach ($oldRows as $oldRow) { 86*c3437056SNickeau $beforeReference = $oldRow[Reference::getPersistentName()]; 87*c3437056SNickeau if (isset($afterReferences[$beforeReference])) { 88*c3437056SNickeau unset($afterReferences[$beforeReference]); 89*c3437056SNickeau } else { 90*c3437056SNickeau Event::createEvent(action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, [PagePath::getPersistentName() => $beforeReference]); 91*c3437056SNickeau /** 92*c3437056SNickeau * Delete the analytics 93*c3437056SNickeau */ 94*c3437056SNickeau FileSystems::deleteIfExists(Page::createPageFromQualifiedPath($beforeReference)->getAnalyticsDocument()->getCachePath()); 95*c3437056SNickeau } 96*c3437056SNickeau } 97*c3437056SNickeau } 98*c3437056SNickeau foreach ($afterReferences as $newReference) { 99*c3437056SNickeau Page::createPageFromQualifiedPath($newReference) 100*c3437056SNickeau ->getAnalyticsDocument() 101*c3437056SNickeau ->deleteIfExists(); 102*c3437056SNickeau Event::createEvent(action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, [PagePath::getPersistentName() => $newReference]); 103*c3437056SNickeau /** 104*c3437056SNickeau * Delete the analytics 105*c3437056SNickeau */ 106*c3437056SNickeau FileSystems::deleteIfExists(Page::createPageFromQualifiedPath($newReference)->getAnalyticsDocument()->getCachePath()); 107*c3437056SNickeau } 108*c3437056SNickeau 109*c3437056SNickeau 110*c3437056SNickeau } 111*c3437056SNickeau 112*c3437056SNickeau 113*c3437056SNickeau} 114*c3437056SNickeau 115*c3437056SNickeau 116*c3437056SNickeau 117