xref: /template/strap/action/backlinkmenuitem.php (revision 7c479386882d4bae439b6a2a93a5e472a77a9162)
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