1c3437056SNickeau<?php 2c3437056SNickeau 3c3437056SNickeauuse ComboStrap\BacklinkMenuItem; 4c3437056SNickeauuse ComboStrap\Event; 5*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 6*04fd306cSNickeauuse ComboStrap\ExecutionContext; 7*04fd306cSNickeauuse ComboStrap\FetcherMarkup; 8*04fd306cSNickeauuse ComboStrap\FetcherPage; 9c3437056SNickeauuse ComboStrap\FileSystems; 10*04fd306cSNickeauuse ComboStrap\HttpResponseStatus; 11c3437056SNickeauuse ComboStrap\Identity; 12*04fd306cSNickeauuse ComboStrap\LinkMarkup; 13*04fd306cSNickeauuse ComboStrap\LogUtility; 14*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 15c3437056SNickeauuse ComboStrap\Mime; 16*04fd306cSNickeauuse ComboStrap\MarkupPath; 17c3437056SNickeauuse ComboStrap\PagePath; 18c3437056SNickeauuse ComboStrap\PluginUtility; 19c3437056SNickeauuse ComboStrap\Reference; 20c3437056SNickeauuse ComboStrap\References; 21*04fd306cSNickeauuse ComboStrap\Tag\RelatedTag; 22*04fd306cSNickeauuse ComboStrap\WikiPath; 23*04fd306cSNickeauuse dokuwiki\Menu\Item\Backlink; 24c3437056SNickeau 25c3437056SNickeau 26c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 27c3437056SNickeau 28c3437056SNickeau/** 29c3437056SNickeau * Handle the backlink menu item 30c3437056SNickeau */ 31c3437056SNickeauclass action_plugin_combo_backlinkmenuitem extends DokuWiki_Action_Plugin 32c3437056SNickeau{ 33c3437056SNickeau 34c3437056SNickeau 35c3437056SNickeau const CALL_ID = "combo-backlink"; 36c3437056SNickeau const CANONICAL = "backlink"; 37c3437056SNickeau const WHREF = "whref"; 38c3437056SNickeau 39c3437056SNickeau public function register(Doku_Event_Handler $controller) 40c3437056SNickeau { 41c3437056SNickeau 42c3437056SNickeau 43c3437056SNickeau /** 44c3437056SNickeau * Add a icon in the page tools menu 45c3437056SNickeau * https://www.dokuwiki.org/devel:event:menu_items_assembly 46c3437056SNickeau */ 47c3437056SNickeau $controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'addMenuItem'); 48c3437056SNickeau 49c3437056SNickeau 50c3437056SNickeau /** 51c3437056SNickeau * The ajax api to return data 52c3437056SNickeau */ 53c3437056SNickeau $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'ajaxCall'); 54c3437056SNickeau 55c3437056SNickeau 56c3437056SNickeau } 57c3437056SNickeau 58c3437056SNickeau function addMenuItem(Doku_Event $event, $param) 59c3437056SNickeau { 60c3437056SNickeau 61c3437056SNickeau 62c3437056SNickeau /** 63c3437056SNickeau * The `view` property defines the menu that is currently built 64c3437056SNickeau * https://www.dokuwiki.org/devel:menus 65c3437056SNickeau * If this is not the page menu, return 66c3437056SNickeau */ 67c3437056SNickeau if ($event->data['view'] != 'page') return; 68c3437056SNickeau 69*04fd306cSNickeau 70c3437056SNickeau $menuItems = &$event->data["items"]; 71c3437056SNickeau foreach ($menuItems as $key => $menuItem) { 72*04fd306cSNickeau if ($menuItem instanceof Backlink) { 73c3437056SNickeau $menuItems[$key] = new BacklinkMenuItem(); 74c3437056SNickeau break; 75c3437056SNickeau } 76c3437056SNickeau } 77c3437056SNickeau /** 78*04fd306cSNickeau * Add the link to build the link to the backlinks actions 79c3437056SNickeau */ 80*04fd306cSNickeau try { 81*04fd306cSNickeau $requestedContextPage = ExecutionContext::getActualOrCreateFromEnv()->getRequestedPath(); 82*04fd306cSNickeau } catch (ExceptionNotFound $e) { 83*04fd306cSNickeau // admin 84*04fd306cSNickeau return; 85*04fd306cSNickeau } 86c3437056SNickeau global $JSINFO; 87*04fd306cSNickeau $JSINFO[self::WHREF] = FetcherPage::createPageFetcherFromPath($requestedContextPage)->getFetchUrl()->toString(); 88c3437056SNickeau 89c3437056SNickeau } 90c3437056SNickeau 91c3437056SNickeau /** 92c3437056SNickeau * Main function; dispatches the visual comment actions 93c3437056SNickeau * @param $event Doku_Event 94c3437056SNickeau */ 95c3437056SNickeau function ajaxCall(&$event, $param): void 96c3437056SNickeau { 97c3437056SNickeau $call = $event->data; 98c3437056SNickeau if ($call != self::CALL_ID) { 99c3437056SNickeau return; 100c3437056SNickeau } 101c3437056SNickeau //no other ajax call handlers needed 102c3437056SNickeau $event->stopPropagation(); 103c3437056SNickeau $event->preventDefault(); 104c3437056SNickeau 105c3437056SNickeau /** 106c3437056SNickeau * Shared check between post and get HTTP method 107c3437056SNickeau */ 108c3437056SNickeau $id = $_GET["id"]; 109c3437056SNickeau if ($id === null) { 110c3437056SNickeau /** 111c3437056SNickeau * With {@link TestRequest} 112c3437056SNickeau * for instance 113c3437056SNickeau */ 114c3437056SNickeau $id = $_REQUEST["id"]; 115c3437056SNickeau } 116*04fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 117c3437056SNickeau if (empty($id)) { 118*04fd306cSNickeau $executionContext->response() 119*04fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 120c3437056SNickeau ->setEvent($event) 121c3437056SNickeau ->setCanonical(self::CANONICAL) 122*04fd306cSNickeau ->setBody("The page id should not be empty", Mime::getHtml()) 123*04fd306cSNickeau ->end(); 124c3437056SNickeau return; 125c3437056SNickeau } 126c3437056SNickeau 127c3437056SNickeau 128*04fd306cSNickeau $backlinkPages = MarkupPath::createMarkupFromId($id); 129*04fd306cSNickeau $html = RelatedTag::renderForPage($backlinkPages); 130c3437056SNickeau 131c3437056SNickeau 132*04fd306cSNickeau $executionContext 133*04fd306cSNickeau ->response() 134*04fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 135c3437056SNickeau ->setEvent($event) 136c3437056SNickeau ->setCanonical(self::CANONICAL) 137*04fd306cSNickeau ->setBody($html, Mime::getHtml()) 138*04fd306cSNickeau ->end(); 139c3437056SNickeau 140c3437056SNickeau } 141c3437056SNickeau 142c3437056SNickeau 143c3437056SNickeau} 144c3437056SNickeau 145c3437056SNickeau 146c3437056SNickeau 147