1c3437056SNickeau<?php 2c3437056SNickeau 3*04fd306cSNickeauuse ComboStrap\ExceptionNotExists; 4*04fd306cSNickeauuse ComboStrap\MarkupCacheDependencies; 54cadd4f8SNickeauuse ComboStrap\CacheLog; 64cadd4f8SNickeauuse ComboStrap\CacheManager; 7c3437056SNickeauuse ComboStrap\Event; 8*04fd306cSNickeauuse ComboStrap\ExceptionCompile; 9c3437056SNickeauuse ComboStrap\FileSystems; 104cadd4f8SNickeauuse ComboStrap\LogUtility; 11*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 12*04fd306cSNickeauuse ComboStrap\MarkupPath; 13*04fd306cSNickeauuse ComboStrap\MetadataMutation; 14c3437056SNickeauuse ComboStrap\PagePath; 15c3437056SNickeauuse ComboStrap\Reference; 16c3437056SNickeauuse ComboStrap\References; 17c3437056SNickeau 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 264cadd4f8SNickeau 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 */ 36*04fd306cSNickeau $controller->register_hook(MetadataMutation::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array()); 37c3437056SNickeau 38c3437056SNickeau /** 394cadd4f8SNickeau * process the Async event 40c3437056SNickeau */ 41c3437056SNickeau $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation'); 42c3437056SNickeau 43c3437056SNickeau 44c3437056SNickeau } 45c3437056SNickeau 46*04fd306cSNickeau /** 47*04fd306cSNickeau * @param Doku_Event $event 48*04fd306cSNickeau * @param $param 49*04fd306cSNickeau * @return void 50*04fd306cSNickeau */ 51c3437056SNickeau public function handle_backlink_mutation(Doku_Event $event, $param) 52c3437056SNickeau { 53c3437056SNickeau 54c3437056SNickeau 55c3437056SNickeau $data = $event->data; 56c3437056SNickeau $pagePath = $data[PagePath::getPersistentName()]; 57*04fd306cSNickeau $reference = MarkupPath::createPageFromAbsoluteId($pagePath); 58c3437056SNickeau 59*04fd306cSNickeau if ($reference->isSlot()) { 604cadd4f8SNickeau return; 614cadd4f8SNickeau } 624cadd4f8SNickeau 634cadd4f8SNickeau /** 644cadd4f8SNickeau * Delete and recompute analytics 654cadd4f8SNickeau */ 66*04fd306cSNickeau try { 67*04fd306cSNickeau $analyticsDocument = $reference->fetchAnalyticsDocument(); 68*04fd306cSNickeau } catch (ExceptionNotExists $e) { 69*04fd306cSNickeau return; 70*04fd306cSNickeau } 714cadd4f8SNickeau CacheLog::deleteCacheIfExistsAndLog( 72*04fd306cSNickeau $analyticsDocument, 734cadd4f8SNickeau self::BACKLINK_MUTATION_EVENT_NAME, 744cadd4f8SNickeau "Backlink mutation" 754cadd4f8SNickeau ); 76*04fd306cSNickeau 774cadd4f8SNickeau try { 78*04fd306cSNickeau /** 79*04fd306cSNickeau * This is only to recompute the {@link \ComboStrap\Meta\Field\BacklinkCount backlinks metric} and 80*04fd306cSNickeau * {@link \ComboStrap\LowQualityPage low quality page metrics} 81*04fd306cSNickeau * TODO: when the derived meta are in the meta array and not in the {@link renderer_plugin_combo_analytics document}, 82*04fd306cSNickeau * we could just compute them there and modify it with a plus 1 83*04fd306cSNickeau */ 844cadd4f8SNickeau $reference->getDatabasePage()->replicateAnalytics(); 85*04fd306cSNickeau } catch (ExceptionCompile $e) { 864cadd4f8SNickeau LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}"); 874cadd4f8SNickeau } 884cadd4f8SNickeau 894cadd4f8SNickeau /** 904cadd4f8SNickeau * Render the (footer slot) if it has a backlink dependency 914cadd4f8SNickeau */ 92*04fd306cSNickeau MarkupCacheDependencies::reRenderSideSlotIfNeeded( 934cadd4f8SNickeau $pagePath, 94*04fd306cSNickeau MarkupCacheDependencies::BACKLINKS_DEPENDENCY, 954cadd4f8SNickeau self::BACKLINK_MUTATION_EVENT_NAME 964cadd4f8SNickeau ); 974cadd4f8SNickeau 98c3437056SNickeau 99c3437056SNickeau } 100c3437056SNickeau 101c3437056SNickeau /** 102c3437056SNickeau */ 103c3437056SNickeau function create_backlink_mutation(Doku_Event $event, $params) 104c3437056SNickeau { 105c3437056SNickeau 106c3437056SNickeau 107c3437056SNickeau $data = $event->data; 108c3437056SNickeau 109c3437056SNickeau /** 110c3437056SNickeau * If this is not a mutation on references we return. 111c3437056SNickeau */ 112*04fd306cSNickeau if ($data[MetadataMutation::NAME_ATTRIBUTE] !== References::getPersistentName()) { 113c3437056SNickeau return; 114c3437056SNickeau }; 115c3437056SNickeau 116*04fd306cSNickeau $actualReferenceDatas = $data[MetadataMutation::NEW_VALUE_ATTRIBUTE]; 117*04fd306cSNickeau $oldReferenceDatas = $data[MetadataMutation::OLD_VALUE_ATTRIBUTE]; 118c3437056SNickeau 119*04fd306cSNickeau /** 120*04fd306cSNickeau * Create an array of the actual reference with the key as path 121*04fd306cSNickeau */ 122*04fd306cSNickeau $actualReferences = []; 123*04fd306cSNickeau if ($actualReferenceDatas !== null) { 124*04fd306cSNickeau foreach ($actualReferenceDatas as $actualReferenceData) { 125*04fd306cSNickeau $actualReferenceWikiPathString = $actualReferenceData[Reference::getPersistentName()]; 126*04fd306cSNickeau $actualReferences[$actualReferenceWikiPathString] = $actualReferenceWikiPathString; 127c3437056SNickeau } 128c3437056SNickeau } 129c3437056SNickeau 130*04fd306cSNickeau if ($oldReferenceDatas !== null) { 131*04fd306cSNickeau foreach ($oldReferenceDatas as $oldReferenceData) { 132*04fd306cSNickeau 133*04fd306cSNickeau $oldReferenceWikiPathString = $oldReferenceData[Reference::getPersistentName()]; 134*04fd306cSNickeau 135*04fd306cSNickeau if (isset($actualReferences[$oldReferenceWikiPathString])) { 136*04fd306cSNickeau unset($actualReferences[$oldReferenceWikiPathString]); 137*04fd306cSNickeau continue; 138*04fd306cSNickeau } 139*04fd306cSNickeau 140*04fd306cSNickeau /** 141*04fd306cSNickeau * Deleted reference 142*04fd306cSNickeau */ 1434cadd4f8SNickeau Event::createEvent( 1444cadd4f8SNickeau action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, 1454cadd4f8SNickeau [ 146*04fd306cSNickeau PagePath::getPersistentName() => $oldReferenceWikiPathString 1474cadd4f8SNickeau ] 1484cadd4f8SNickeau ); 149*04fd306cSNickeau 150c3437056SNickeau } 151c3437056SNickeau } 152*04fd306cSNickeau 153*04fd306cSNickeau /** 154*04fd306cSNickeau * The new references 155*04fd306cSNickeau */ 156*04fd306cSNickeau foreach ($actualReferences as $newReference) { 1574cadd4f8SNickeau Event::createEvent( 1584cadd4f8SNickeau action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, 1594cadd4f8SNickeau [PagePath::getPersistentName() => $newReference]); 160c3437056SNickeau } 161c3437056SNickeau 162c3437056SNickeau 163c3437056SNickeau } 164c3437056SNickeau 165c3437056SNickeau 166c3437056SNickeau} 167c3437056SNickeau 168c3437056SNickeau 169c3437056SNickeau 170