1c3437056SNickeau<?php 2c3437056SNickeau 3*7c479386Sgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php'); 4*7c479386Sgerardnico 5c3437056SNickeauuse ComboStrap\BacklinkMenuItem; 604fd306cSNickeauuse ComboStrap\ExceptionNotFound; 704fd306cSNickeauuse ComboStrap\ExecutionContext; 804fd306cSNickeauuse ComboStrap\FetcherPage; 904fd306cSNickeauuse ComboStrap\HttpResponseStatus; 1004fd306cSNickeauuse ComboStrap\MarkupPath; 11*7c479386Sgerardnicouse ComboStrap\Mime; 1204fd306cSNickeauuse ComboStrap\Tag\RelatedTag; 1304fd306cSNickeauuse dokuwiki\Menu\Item\Backlink; 14c3437056SNickeau 15c3437056SNickeau 16*7c479386Sgerardnico 17c3437056SNickeau 18c3437056SNickeau/** 19c3437056SNickeau * Handle the backlink menu item 20c3437056SNickeau */ 21c3437056SNickeauclass action_plugin_combo_backlinkmenuitem extends DokuWiki_Action_Plugin 22c3437056SNickeau{ 23c3437056SNickeau 24c3437056SNickeau 25c3437056SNickeau const CALL_ID = "combo-backlink"; 26c3437056SNickeau const CANONICAL = "backlink"; 27c3437056SNickeau const WHREF = "whref"; 28c3437056SNickeau 29c3437056SNickeau public function register(Doku_Event_Handler $controller) 30c3437056SNickeau { 31c3437056SNickeau 32c3437056SNickeau 33c3437056SNickeau /** 34c3437056SNickeau * Add a icon in the page tools menu 35c3437056SNickeau * https://www.dokuwiki.org/devel:event:menu_items_assembly 36c3437056SNickeau */ 37c3437056SNickeau $controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'addMenuItem'); 38c3437056SNickeau 39c3437056SNickeau 40c3437056SNickeau /** 41c3437056SNickeau * The ajax api to return data 42c3437056SNickeau */ 43c3437056SNickeau $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'ajaxCall'); 44c3437056SNickeau 45c3437056SNickeau 46c3437056SNickeau } 47c3437056SNickeau 48c3437056SNickeau function addMenuItem(Doku_Event $event, $param) 49c3437056SNickeau { 50c3437056SNickeau 51c3437056SNickeau 52c3437056SNickeau /** 53c3437056SNickeau * The `view` property defines the menu that is currently built 54c3437056SNickeau * https://www.dokuwiki.org/devel:menus 55c3437056SNickeau * If this is not the page menu, return 56c3437056SNickeau */ 57c3437056SNickeau if ($event->data['view'] != 'page') return; 58c3437056SNickeau 5904fd306cSNickeau 60c3437056SNickeau $menuItems = &$event->data["items"]; 61c3437056SNickeau foreach ($menuItems as $key => $menuItem) { 6204fd306cSNickeau if ($menuItem instanceof Backlink) { 63c3437056SNickeau $menuItems[$key] = new BacklinkMenuItem(); 64c3437056SNickeau break; 65c3437056SNickeau } 66c3437056SNickeau } 67c3437056SNickeau /** 6804fd306cSNickeau * Add the link to build the link to the backlinks actions 69c3437056SNickeau */ 7004fd306cSNickeau try { 7104fd306cSNickeau $requestedContextPage = ExecutionContext::getActualOrCreateFromEnv()->getRequestedPath(); 7204fd306cSNickeau } catch (ExceptionNotFound $e) { 7304fd306cSNickeau // admin 7404fd306cSNickeau return; 7504fd306cSNickeau } 76c3437056SNickeau global $JSINFO; 7704fd306cSNickeau $JSINFO[self::WHREF] = FetcherPage::createPageFetcherFromPath($requestedContextPage)->getFetchUrl()->toString(); 78c3437056SNickeau 79c3437056SNickeau } 80c3437056SNickeau 81c3437056SNickeau /** 82c3437056SNickeau * Main function; dispatches the visual comment actions 83c3437056SNickeau * @param $event Doku_Event 84c3437056SNickeau */ 85c3437056SNickeau function ajaxCall(&$event, $param): void 86c3437056SNickeau { 87c3437056SNickeau $call = $event->data; 88c3437056SNickeau if ($call != self::CALL_ID) { 89c3437056SNickeau return; 90c3437056SNickeau } 91c3437056SNickeau //no other ajax call handlers needed 92c3437056SNickeau $event->stopPropagation(); 93c3437056SNickeau $event->preventDefault(); 94c3437056SNickeau 95c3437056SNickeau /** 96c3437056SNickeau * Shared check between post and get HTTP method 97c3437056SNickeau */ 98c3437056SNickeau $id = $_GET["id"]; 99c3437056SNickeau if ($id === null) { 100c3437056SNickeau /** 101c3437056SNickeau * With {@link TestRequest} 102c3437056SNickeau * for instance 103c3437056SNickeau */ 104c3437056SNickeau $id = $_REQUEST["id"]; 105c3437056SNickeau } 10604fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 107c3437056SNickeau if (empty($id)) { 10804fd306cSNickeau $executionContext->response() 10904fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 110c3437056SNickeau ->setEvent($event) 111c3437056SNickeau ->setCanonical(self::CANONICAL) 11204fd306cSNickeau ->setBody("The page id should not be empty", Mime::getHtml()) 11304fd306cSNickeau ->end(); 114c3437056SNickeau return; 115c3437056SNickeau } 116c3437056SNickeau 117c3437056SNickeau 11804fd306cSNickeau $backlinkPages = MarkupPath::createMarkupFromId($id); 11904fd306cSNickeau $html = RelatedTag::renderForPage($backlinkPages); 120c3437056SNickeau 121c3437056SNickeau 12204fd306cSNickeau $executionContext 12304fd306cSNickeau ->response() 12404fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 125c3437056SNickeau ->setEvent($event) 126c3437056SNickeau ->setCanonical(self::CANONICAL) 12704fd306cSNickeau ->setBody($html, Mime::getHtml()) 12804fd306cSNickeau ->end(); 129c3437056SNickeau 130c3437056SNickeau } 131c3437056SNickeau 132c3437056SNickeau 133c3437056SNickeau} 134c3437056SNickeau 135c3437056SNickeau 136c3437056SNickeau 137