1c3437056SNickeau<?php 2c3437056SNickeau 3*7c479386Sgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php'); 4*7c479386Sgerardnico 54cadd4f8SNickeauuse ComboStrap\CacheLog; 6c3437056SNickeauuse ComboStrap\Event; 704fd306cSNickeauuse ComboStrap\ExceptionCompile; 8*7c479386Sgerardnicouse ComboStrap\ExceptionNotExists; 94cadd4f8SNickeauuse ComboStrap\LogUtility; 10*7c479386Sgerardnicouse ComboStrap\MarkupCacheDependencies; 1104fd306cSNickeauuse ComboStrap\MarkupPath; 1204fd306cSNickeauuse ComboStrap\MetadataMutation; 13c3437056SNickeauuse ComboStrap\PagePath; 14c3437056SNickeauuse ComboStrap\Reference; 15c3437056SNickeauuse ComboStrap\References; 16c3437056SNickeau 17c3437056SNickeau 18c3437056SNickeau/** 19c3437056SNickeau * Refresh the analytics when a backlink mutation occurs for a page 20c3437056SNickeau */ 21c3437056SNickeauclass action_plugin_combo_backlinkmutation extends DokuWiki_Action_Plugin 22c3437056SNickeau{ 23c3437056SNickeau 24c3437056SNickeau 254cadd4f8SNickeau public const BACKLINK_MUTATION_EVENT_NAME = 'backlink_mutation'; 26c3437056SNickeau 27c3437056SNickeau 28c3437056SNickeau public function register(Doku_Event_Handler $controller) 29c3437056SNickeau { 30c3437056SNickeau 31c3437056SNickeau 32c3437056SNickeau /** 33c3437056SNickeau * create the async event 34c3437056SNickeau */ 3504fd306cSNickeau $controller->register_hook(MetadataMutation::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array()); 36c3437056SNickeau 37c3437056SNickeau /** 384cadd4f8SNickeau * process the Async event 39c3437056SNickeau */ 40c3437056SNickeau $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation'); 41c3437056SNickeau 42c3437056SNickeau 43c3437056SNickeau } 44c3437056SNickeau 4504fd306cSNickeau /** 4604fd306cSNickeau * @param Doku_Event $event 4704fd306cSNickeau * @param $param 4804fd306cSNickeau * @return void 4904fd306cSNickeau */ 50c3437056SNickeau public function handle_backlink_mutation(Doku_Event $event, $param) 51c3437056SNickeau { 52c3437056SNickeau 53c3437056SNickeau 54c3437056SNickeau $data = $event->data; 55c3437056SNickeau $pagePath = $data[PagePath::getPersistentName()]; 5604fd306cSNickeau $reference = MarkupPath::createPageFromAbsoluteId($pagePath); 57c3437056SNickeau 5804fd306cSNickeau if ($reference->isSlot()) { 594cadd4f8SNickeau return; 604cadd4f8SNickeau } 614cadd4f8SNickeau 624cadd4f8SNickeau /** 634cadd4f8SNickeau * Delete and recompute analytics 644cadd4f8SNickeau */ 6504fd306cSNickeau try { 6604fd306cSNickeau $analyticsDocument = $reference->fetchAnalyticsDocument(); 6704fd306cSNickeau } catch (ExceptionNotExists $e) { 6804fd306cSNickeau return; 6904fd306cSNickeau } 704cadd4f8SNickeau CacheLog::deleteCacheIfExistsAndLog( 7104fd306cSNickeau $analyticsDocument, 724cadd4f8SNickeau self::BACKLINK_MUTATION_EVENT_NAME, 734cadd4f8SNickeau "Backlink mutation" 744cadd4f8SNickeau ); 7504fd306cSNickeau 764cadd4f8SNickeau try { 7704fd306cSNickeau /** 7804fd306cSNickeau * This is only to recompute the {@link \ComboStrap\Meta\Field\BacklinkCount backlinks metric} and 7904fd306cSNickeau * {@link \ComboStrap\LowQualityPage low quality page metrics} 8004fd306cSNickeau * TODO: when the derived meta are in the meta array and not in the {@link renderer_plugin_combo_analytics document}, 8104fd306cSNickeau * we could just compute them there and modify it with a plus 1 8204fd306cSNickeau */ 834cadd4f8SNickeau $reference->getDatabasePage()->replicateAnalytics(); 8404fd306cSNickeau } catch (ExceptionCompile $e) { 854cadd4f8SNickeau LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}"); 864cadd4f8SNickeau } 874cadd4f8SNickeau 884cadd4f8SNickeau /** 894cadd4f8SNickeau * Render the (footer slot) if it has a backlink dependency 904cadd4f8SNickeau */ 9104fd306cSNickeau MarkupCacheDependencies::reRenderSideSlotIfNeeded( 924cadd4f8SNickeau $pagePath, 9304fd306cSNickeau MarkupCacheDependencies::BACKLINKS_DEPENDENCY, 944cadd4f8SNickeau self::BACKLINK_MUTATION_EVENT_NAME 954cadd4f8SNickeau ); 964cadd4f8SNickeau 97c3437056SNickeau 98c3437056SNickeau } 99c3437056SNickeau 100c3437056SNickeau /** 101c3437056SNickeau */ 102c3437056SNickeau function create_backlink_mutation(Doku_Event $event, $params) 103c3437056SNickeau { 104c3437056SNickeau 105c3437056SNickeau 106c3437056SNickeau $data = $event->data; 107c3437056SNickeau 108c3437056SNickeau /** 109c3437056SNickeau * If this is not a mutation on references we return. 110c3437056SNickeau */ 11104fd306cSNickeau if ($data[MetadataMutation::NAME_ATTRIBUTE] !== References::getPersistentName()) { 112c3437056SNickeau return; 113c3437056SNickeau }; 114c3437056SNickeau 11504fd306cSNickeau $actualReferenceDatas = $data[MetadataMutation::NEW_VALUE_ATTRIBUTE]; 11604fd306cSNickeau $oldReferenceDatas = $data[MetadataMutation::OLD_VALUE_ATTRIBUTE]; 117c3437056SNickeau 11804fd306cSNickeau /** 11904fd306cSNickeau * Create an array of the actual reference with the key as path 12004fd306cSNickeau */ 12104fd306cSNickeau $actualReferences = []; 12204fd306cSNickeau if ($actualReferenceDatas !== null) { 12304fd306cSNickeau foreach ($actualReferenceDatas as $actualReferenceData) { 12404fd306cSNickeau $actualReferenceWikiPathString = $actualReferenceData[Reference::getPersistentName()]; 12504fd306cSNickeau $actualReferences[$actualReferenceWikiPathString] = $actualReferenceWikiPathString; 126c3437056SNickeau } 127c3437056SNickeau } 128c3437056SNickeau 12904fd306cSNickeau if ($oldReferenceDatas !== null) { 13004fd306cSNickeau foreach ($oldReferenceDatas as $oldReferenceData) { 13104fd306cSNickeau 13204fd306cSNickeau $oldReferenceWikiPathString = $oldReferenceData[Reference::getPersistentName()]; 13304fd306cSNickeau 13404fd306cSNickeau if (isset($actualReferences[$oldReferenceWikiPathString])) { 13504fd306cSNickeau unset($actualReferences[$oldReferenceWikiPathString]); 13604fd306cSNickeau continue; 13704fd306cSNickeau } 13804fd306cSNickeau 13904fd306cSNickeau /** 14004fd306cSNickeau * Deleted reference 14104fd306cSNickeau */ 1424cadd4f8SNickeau Event::createEvent( 1434cadd4f8SNickeau action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, 1444cadd4f8SNickeau [ 14504fd306cSNickeau PagePath::getPersistentName() => $oldReferenceWikiPathString 1464cadd4f8SNickeau ] 1474cadd4f8SNickeau ); 14804fd306cSNickeau 149c3437056SNickeau } 150c3437056SNickeau } 15104fd306cSNickeau 15204fd306cSNickeau /** 15304fd306cSNickeau * The new references 15404fd306cSNickeau */ 15504fd306cSNickeau foreach ($actualReferences as $newReference) { 1564cadd4f8SNickeau Event::createEvent( 1574cadd4f8SNickeau action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, 1584cadd4f8SNickeau [PagePath::getPersistentName() => $newReference]); 159c3437056SNickeau } 160c3437056SNickeau 161c3437056SNickeau 162c3437056SNickeau } 163c3437056SNickeau 164c3437056SNickeau 165c3437056SNickeau} 166c3437056SNickeau 167c3437056SNickeau 168c3437056SNickeau 169