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