xref: /template/strap/action/backlinkmenuitem.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1*c3437056SNickeau<?php
2*c3437056SNickeau
3*c3437056SNickeauuse ComboStrap\BacklinkMenuItem;
4*c3437056SNickeauuse ComboStrap\Event;
5*c3437056SNickeauuse ComboStrap\FileSystems;
6*c3437056SNickeauuse ComboStrap\Identity;
7*c3437056SNickeauuse ComboStrap\LinkUtility;
8*c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore;
9*c3437056SNickeauuse ComboStrap\Mime;
10*c3437056SNickeauuse ComboStrap\Page;
11*c3437056SNickeauuse ComboStrap\PagePath;
12*c3437056SNickeauuse ComboStrap\PluginUtility;
13*c3437056SNickeauuse ComboStrap\Reference;
14*c3437056SNickeauuse ComboStrap\References;
15*c3437056SNickeau
16*c3437056SNickeau
17*c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
18*c3437056SNickeau
19*c3437056SNickeau/**
20*c3437056SNickeau * Handle the backlink menu item
21*c3437056SNickeau */
22*c3437056SNickeauclass action_plugin_combo_backlinkmenuitem extends DokuWiki_Action_Plugin
23*c3437056SNickeau{
24*c3437056SNickeau
25*c3437056SNickeau
26*c3437056SNickeau    const CALL_ID = "combo-backlink";
27*c3437056SNickeau    const CANONICAL = "backlink";
28*c3437056SNickeau    const WHREF = "whref";
29*c3437056SNickeau
30*c3437056SNickeau    public function register(Doku_Event_Handler $controller)
31*c3437056SNickeau    {
32*c3437056SNickeau
33*c3437056SNickeau
34*c3437056SNickeau        /**
35*c3437056SNickeau         * Add a icon in the page tools menu
36*c3437056SNickeau         * https://www.dokuwiki.org/devel:event:menu_items_assembly
37*c3437056SNickeau         */
38*c3437056SNickeau        $controller->register_hook('MENU_ITEMS_ASSEMBLY', 'AFTER', $this, 'addMenuItem');
39*c3437056SNickeau
40*c3437056SNickeau
41*c3437056SNickeau        /**
42*c3437056SNickeau         * The ajax api to return data
43*c3437056SNickeau         */
44*c3437056SNickeau        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'ajaxCall');
45*c3437056SNickeau
46*c3437056SNickeau
47*c3437056SNickeau    }
48*c3437056SNickeau
49*c3437056SNickeau    function addMenuItem(Doku_Event $event, $param)
50*c3437056SNickeau    {
51*c3437056SNickeau
52*c3437056SNickeau
53*c3437056SNickeau        /**
54*c3437056SNickeau         * The `view` property defines the menu that is currently built
55*c3437056SNickeau         * https://www.dokuwiki.org/devel:menus
56*c3437056SNickeau         * If this is not the page menu, return
57*c3437056SNickeau         */
58*c3437056SNickeau        if ($event->data['view'] != 'page') return;
59*c3437056SNickeau
60*c3437056SNickeau        global $INFO;
61*c3437056SNickeau        if (!$INFO['exists']) {
62*c3437056SNickeau            return;
63*c3437056SNickeau        }
64*c3437056SNickeau        $menuItems = &$event->data["items"];
65*c3437056SNickeau        foreach ($menuItems as $key => $menuItem) {
66*c3437056SNickeau            if ($menuItem instanceof \dokuwiki\Menu\Item\Backlink) {
67*c3437056SNickeau                $menuItems[$key] = new BacklinkMenuItem();
68*c3437056SNickeau                break;
69*c3437056SNickeau            }
70*c3437056SNickeau        }
71*c3437056SNickeau        /**
72*c3437056SNickeau         * Add the wl to build the link to the backlinks actions
73*c3437056SNickeau         */
74*c3437056SNickeau        $id = PluginUtility::getMainPageDokuwikiId();
75*c3437056SNickeau        global $JSINFO;
76*c3437056SNickeau        $JSINFO[self::WHREF] = wl($id);
77*c3437056SNickeau
78*c3437056SNickeau    }
79*c3437056SNickeau
80*c3437056SNickeau    /**
81*c3437056SNickeau     * Main function; dispatches the visual comment actions
82*c3437056SNickeau     * @param   $event Doku_Event
83*c3437056SNickeau     */
84*c3437056SNickeau    function ajaxCall(&$event, $param): void
85*c3437056SNickeau    {
86*c3437056SNickeau        $call = $event->data;
87*c3437056SNickeau        if ($call != self::CALL_ID) {
88*c3437056SNickeau            return;
89*c3437056SNickeau        }
90*c3437056SNickeau        //no other ajax call handlers needed
91*c3437056SNickeau        $event->stopPropagation();
92*c3437056SNickeau        $event->preventDefault();
93*c3437056SNickeau
94*c3437056SNickeau        /**
95*c3437056SNickeau         * Shared check between post and get HTTP method
96*c3437056SNickeau         */
97*c3437056SNickeau        $id = $_GET["id"];
98*c3437056SNickeau        if ($id === null) {
99*c3437056SNickeau            /**
100*c3437056SNickeau             * With {@link TestRequest}
101*c3437056SNickeau             * for instance
102*c3437056SNickeau             */
103*c3437056SNickeau            $id = $_REQUEST["id"];
104*c3437056SNickeau        }
105*c3437056SNickeau
106*c3437056SNickeau        if (empty($id)) {
107*c3437056SNickeau            \ComboStrap\HttpResponse::create(\ComboStrap\HttpResponse::STATUS_BAD_REQUEST)
108*c3437056SNickeau                ->setEvent($event)
109*c3437056SNickeau                ->setCanonical(self::CANONICAL)
110*c3437056SNickeau                ->send("The page id should not be empty", Mime::HTML);
111*c3437056SNickeau            return;
112*c3437056SNickeau        }
113*c3437056SNickeau
114*c3437056SNickeau
115*c3437056SNickeau        $backlinkPages = Page::createPageFromId($id);
116*c3437056SNickeau        $html = syntax_plugin_combo_related::getHtmlRelated($backlinkPages);
117*c3437056SNickeau
118*c3437056SNickeau
119*c3437056SNickeau        \ComboStrap\HttpResponse::create(\ComboStrap\HttpResponse::STATUS_ALL_GOOD)
120*c3437056SNickeau            ->setEvent($event)
121*c3437056SNickeau            ->setCanonical(self::CANONICAL)
122*c3437056SNickeau            ->send($html, Mime::HTML);
123*c3437056SNickeau
124*c3437056SNickeau    }
125*c3437056SNickeau
126*c3437056SNickeau
127*c3437056SNickeau}
128*c3437056SNickeau
129*c3437056SNickeau
130*c3437056SNickeau
131