1c3437056SNickeau<?php 2c3437056SNickeau 3*4cadd4f8SNickeauuse ComboStrap\CacheDependencies; 4*4cadd4f8SNickeauuse ComboStrap\CacheLog; 5*4cadd4f8SNickeauuse ComboStrap\CacheManager; 6c3437056SNickeauuse ComboStrap\Event; 7c3437056SNickeauuse ComboStrap\ExceptionCombo; 8c3437056SNickeauuse ComboStrap\FileSystems; 9*4cadd4f8SNickeauuse ComboStrap\LogUtility; 10c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore; 11c3437056SNickeauuse ComboStrap\Page; 12c3437056SNickeauuse ComboStrap\PagePath; 13c3437056SNickeauuse ComboStrap\Reference; 14c3437056SNickeauuse ComboStrap\References; 15c3437056SNickeau 16c3437056SNickeau 17c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 18c3437056SNickeau 19c3437056SNickeau/** 20c3437056SNickeau * Refresh the analytics when a backlink mutation occurs for a page 21c3437056SNickeau */ 22c3437056SNickeauclass action_plugin_combo_backlinkmutation extends DokuWiki_Action_Plugin 23c3437056SNickeau{ 24c3437056SNickeau 25c3437056SNickeau 26*4cadd4f8SNickeau public const BACKLINK_MUTATION_EVENT_NAME = 'backlink_mutation'; 27c3437056SNickeau 28c3437056SNickeau 29c3437056SNickeau public function register(Doku_Event_Handler $controller) 30c3437056SNickeau { 31c3437056SNickeau 32c3437056SNickeau 33c3437056SNickeau /** 34c3437056SNickeau * create the async event 35c3437056SNickeau */ 36c3437056SNickeau $controller->register_hook(MetadataDokuWikiStore::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array()); 37c3437056SNickeau 38c3437056SNickeau /** 39*4cadd4f8SNickeau * process the Async event 40c3437056SNickeau */ 41c3437056SNickeau $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation'); 42c3437056SNickeau 43c3437056SNickeau 44c3437056SNickeau } 45c3437056SNickeau 46c3437056SNickeau 47c3437056SNickeau public function handle_backlink_mutation(Doku_Event $event, $param) 48c3437056SNickeau { 49c3437056SNickeau 50c3437056SNickeau 51c3437056SNickeau $data = $event->data; 52c3437056SNickeau $pagePath = $data[PagePath::getPersistentName()]; 53*4cadd4f8SNickeau $reference = Page::createPageFromQualifiedPath($pagePath); 54c3437056SNickeau 55*4cadd4f8SNickeau if ($reference->isSecondarySlot()) { 56*4cadd4f8SNickeau return; 57*4cadd4f8SNickeau } 58*4cadd4f8SNickeau 59*4cadd4f8SNickeau /** 60*4cadd4f8SNickeau * Delete and recompute analytics 61*4cadd4f8SNickeau */ 62*4cadd4f8SNickeau CacheLog::deleteCacheIfExistsAndLog( 63*4cadd4f8SNickeau $reference->getAnalyticsDocument(), 64*4cadd4f8SNickeau self::BACKLINK_MUTATION_EVENT_NAME, 65*4cadd4f8SNickeau "Backlink mutation" 66*4cadd4f8SNickeau ); 67*4cadd4f8SNickeau try { 68*4cadd4f8SNickeau $reference->getDatabasePage()->replicateAnalytics(); 69*4cadd4f8SNickeau } catch (ExceptionCombo $e) { 70*4cadd4f8SNickeau LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}"); 71*4cadd4f8SNickeau } 72*4cadd4f8SNickeau 73*4cadd4f8SNickeau /** 74*4cadd4f8SNickeau * Render the (footer slot) if it has a backlink dependency 75*4cadd4f8SNickeau */ 76*4cadd4f8SNickeau CacheDependencies::reRenderSecondarySlotsIfNeeded( 77*4cadd4f8SNickeau $pagePath, 78*4cadd4f8SNickeau CacheDependencies::BACKLINKS_DEPENDENCY, 79*4cadd4f8SNickeau self::BACKLINK_MUTATION_EVENT_NAME 80*4cadd4f8SNickeau ); 81*4cadd4f8SNickeau 82c3437056SNickeau 83c3437056SNickeau 84c3437056SNickeau } 85c3437056SNickeau 86c3437056SNickeau /** 87c3437056SNickeau */ 88c3437056SNickeau function create_backlink_mutation(Doku_Event $event, $params) 89c3437056SNickeau { 90c3437056SNickeau 91c3437056SNickeau 92c3437056SNickeau $data = $event->data; 93c3437056SNickeau 94c3437056SNickeau /** 95c3437056SNickeau * If this is not a mutation on references we return. 96c3437056SNickeau */ 97c3437056SNickeau if ($data["name"] !== References::getPersistentName()) { 98c3437056SNickeau return; 99c3437056SNickeau }; 100c3437056SNickeau 101c3437056SNickeau $newRows = $data["new_value"]; 102c3437056SNickeau $oldRows = $data["old_value"]; 103c3437056SNickeau 104c3437056SNickeau $afterReferences = []; 105c3437056SNickeau if ($newRows !== null) { 106c3437056SNickeau foreach ($newRows as $rowNewValue) { 107c3437056SNickeau $reference = $rowNewValue[Reference::getPersistentName()]; 108c3437056SNickeau $afterReferences[$reference] = $reference; 109c3437056SNickeau } 110c3437056SNickeau } 111c3437056SNickeau 112c3437056SNickeau if ($oldRows !== null) { 113c3437056SNickeau foreach ($oldRows as $oldRow) { 114c3437056SNickeau $beforeReference = $oldRow[Reference::getPersistentName()]; 115c3437056SNickeau if (isset($afterReferences[$beforeReference])) { 116c3437056SNickeau unset($afterReferences[$beforeReference]); 117c3437056SNickeau } else { 118*4cadd4f8SNickeau Event::createEvent( 119*4cadd4f8SNickeau action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, 120*4cadd4f8SNickeau [ 121*4cadd4f8SNickeau PagePath::getPersistentName() => $beforeReference 122*4cadd4f8SNickeau ] 123*4cadd4f8SNickeau ); 124c3437056SNickeau } 125c3437056SNickeau } 126c3437056SNickeau } 127c3437056SNickeau foreach ($afterReferences as $newReference) { 128*4cadd4f8SNickeau Event::createEvent( 129*4cadd4f8SNickeau action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, 130*4cadd4f8SNickeau [PagePath::getPersistentName() => $newReference]); 131c3437056SNickeau } 132c3437056SNickeau 133c3437056SNickeau 134c3437056SNickeau } 135c3437056SNickeau 136c3437056SNickeau 137c3437056SNickeau} 138c3437056SNickeau 139c3437056SNickeau 140c3437056SNickeau 141