xref: /plugin/combo/action/routermessage.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1*c3437056SNickeau<?php
2*c3437056SNickeau
3*c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
4*c3437056SNickeau
5*c3437056SNickeauuse ComboStrap\Index;
6*c3437056SNickeauuse ComboStrap\LogUtility;
7*c3437056SNickeauuse ComboStrap\Message;
8*c3437056SNickeauuse ComboStrap\PagesIndex;
9*c3437056SNickeauuse dokuwiki\Extension\ActionPlugin;
10*c3437056SNickeau
11*c3437056SNickeau
12*c3437056SNickeau/**
13*c3437056SNickeau *
14*c3437056SNickeau * To show a message after redirection or rewriting
15*c3437056SNickeau *
16*c3437056SNickeau *
17*c3437056SNickeau *
18*c3437056SNickeau */
19*c3437056SNickeauclass action_plugin_combo_routermessage extends ActionPlugin
20*c3437056SNickeau{
21*c3437056SNickeau
22*c3437056SNickeau    // a class can not start with a number then webcomponent is not a valid class name
23*c3437056SNickeau    const REDIRECT_MANAGER_BOX_CLASS = "redirect-manager";
24*c3437056SNickeau
25*c3437056SNickeau    // Property key
26*c3437056SNickeau    const ORIGIN_PAGE = 'redirectId';
27*c3437056SNickeau    const ORIGIN_TYPE = 'redirectOrigin';
28*c3437056SNickeau    const CONF_SHOW_PAGE_NAME_IS_NOT_UNIQUE = 'ShowPageNameIsNotUnique';
29*c3437056SNickeau
30*c3437056SNickeau    function __construct()
31*c3437056SNickeau    {
32*c3437056SNickeau        // enable direct access to language strings
33*c3437056SNickeau        // ie $this->lang
34*c3437056SNickeau        $this->setupLocale();
35*c3437056SNickeau    }
36*c3437056SNickeau
37*c3437056SNickeau    /**
38*c3437056SNickeau     *
39*c3437056SNickeau     * Return the message properties from a query string
40*c3437056SNickeau     *
41*c3437056SNickeau     * An internal HTTP redirect pass them via query string
42*c3437056SNickeau     */
43*c3437056SNickeau    private static function getMessageQueryStringProperties(): array
44*c3437056SNickeau    {
45*c3437056SNickeau
46*c3437056SNickeau        $returnValues = array();
47*c3437056SNickeau
48*c3437056SNickeau        global $INPUT;
49*c3437056SNickeau        $origin = $INPUT->str(self::ORIGIN_PAGE, null);
50*c3437056SNickeau        if ($origin != null) {
51*c3437056SNickeau            $returnValues = array(
52*c3437056SNickeau                $origin,
53*c3437056SNickeau                $INPUT->str(self::ORIGIN_TYPE, null)
54*c3437056SNickeau            );
55*c3437056SNickeau        }
56*c3437056SNickeau        return $returnValues;
57*c3437056SNickeau
58*c3437056SNickeau    }
59*c3437056SNickeau
60*c3437056SNickeau
61*c3437056SNickeau    function register(Doku_Event_Handler $controller)
62*c3437056SNickeau    {
63*c3437056SNickeau
64*c3437056SNickeau        /* This will call the function _displayRedirectMessage */
65*c3437056SNickeau        $controller->register_hook(
66*c3437056SNickeau            'TPL_ACT_RENDER',
67*c3437056SNickeau            'BEFORE',
68*c3437056SNickeau            $this,
69*c3437056SNickeau            '_displayRedirectMessage',
70*c3437056SNickeau            array()
71*c3437056SNickeau        );
72*c3437056SNickeau
73*c3437056SNickeau
74*c3437056SNickeau    }
75*c3437056SNickeau
76*c3437056SNickeau
77*c3437056SNickeau    /**
78*c3437056SNickeau     * Main function; dispatches the visual comment actions
79*c3437056SNickeau     * @param   $event Doku_Event
80*c3437056SNickeau     */
81*c3437056SNickeau    function _displayRedirectMessage(&$event, $param)
82*c3437056SNickeau    {
83*c3437056SNickeau
84*c3437056SNickeau
85*c3437056SNickeau        $pageIdOrigin = null;
86*c3437056SNickeau        $redirectSource = null;
87*c3437056SNickeau
88*c3437056SNickeau
89*c3437056SNickeau        $messageQueryStringProperties = self::getMessageQueryStringProperties();
90*c3437056SNickeau        if (!empty($messageQueryStringProperties)) {
91*c3437056SNickeau            list($pageIdOrigin, $redirectSource) = $messageQueryStringProperties;
92*c3437056SNickeau        }
93*c3437056SNickeau
94*c3437056SNickeau        if ($pageIdOrigin) {
95*c3437056SNickeau
96*c3437056SNickeau            switch ($redirectSource) {
97*c3437056SNickeau
98*c3437056SNickeau                case action_plugin_combo_router::TARGET_ORIGIN_PAGE_RULES:
99*c3437056SNickeau                    $message = Message::createInfoMessage()
100*c3437056SNickeau                        ->addHtmlContent("<p>" . sprintf($this->getLang('message_redirected_by_redirect'), hsc($pageIdOrigin)) . "</p>");
101*c3437056SNickeau                    break;
102*c3437056SNickeau
103*c3437056SNickeau                case action_plugin_combo_router::TARGET_ORIGIN_START_PAGE:
104*c3437056SNickeau                    $message = Message::createWarningMessage()
105*c3437056SNickeau                        ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_startpage'], hsc($pageIdOrigin)) . "</p>");
106*c3437056SNickeau                    break;
107*c3437056SNickeau
108*c3437056SNickeau                case  action_plugin_combo_router::TARGET_ORIGIN_BEST_PAGE_NAME:
109*c3437056SNickeau                    $message = Message::createWarningMessage()
110*c3437056SNickeau                        ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_bestpagename'], hsc($pageIdOrigin)) . "</p>");
111*c3437056SNickeau                    break;
112*c3437056SNickeau
113*c3437056SNickeau                case action_plugin_combo_router::TARGET_ORIGIN_BEST_NAMESPACE:
114*c3437056SNickeau                    $message = Message::createWarningMessage()
115*c3437056SNickeau                        ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_bestnamespace'], hsc($pageIdOrigin)) . "</p>");
116*c3437056SNickeau                    break;
117*c3437056SNickeau
118*c3437056SNickeau                case action_plugin_combo_router::TARGET_ORIGIN_SEARCH_ENGINE:
119*c3437056SNickeau                    $message = Message::createWarningMessage()
120*c3437056SNickeau                        ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_searchengine'], hsc($pageIdOrigin)) . "</p>");
121*c3437056SNickeau                    break;
122*c3437056SNickeau
123*c3437056SNickeau                case action_plugin_combo_router::GO_TO_EDIT_MODE:
124*c3437056SNickeau                    $message = Message::createInfoMessage()
125*c3437056SNickeau                        ->addHtmlContent("<p>" . $this->lang['message_redirected_to_edit_mode'] . "</p>");
126*c3437056SNickeau                    break;
127*c3437056SNickeau                case action_plugin_combo_router::TARGET_ORIGIN_PERMALINK_EXTENDED:
128*c3437056SNickeau                case action_plugin_combo_router::TARGET_ORIGIN_PERMALINK:
129*c3437056SNickeau                    $message = Message::createInfoMessage()
130*c3437056SNickeau                        ->addHtmlContent("<p>" . $this->lang['message_redirected_from_permalink'] . "</p>");
131*c3437056SNickeau                    break;
132*c3437056SNickeau                default:
133*c3437056SNickeau                    LogUtility::msg("The redirection source ($redirectSource) is unknown. It was not expected", LogUtility::LVL_MSG_ERROR, action_plugin_combo_router::CANONICAL);
134*c3437056SNickeau                    return;
135*c3437056SNickeau
136*c3437056SNickeau            }
137*c3437056SNickeau
138*c3437056SNickeau
139*c3437056SNickeau            // Add a list of page with the same name to the message
140*c3437056SNickeau            // if the redirections is not planned
141*c3437056SNickeau            if ($redirectSource != action_plugin_combo_router::TARGET_ORIGIN_PAGE_RULES) {
142*c3437056SNickeau                $this->addToMessagePagesWithSameName($message, $pageIdOrigin);
143*c3437056SNickeau            }
144*c3437056SNickeau
145*c3437056SNickeau            if ($event->data === 'show' || $event->data === 'edit' || $event->data === 'search') {
146*c3437056SNickeau                $html = $message
147*c3437056SNickeau                    ->setPlugin($this)
148*c3437056SNickeau                    ->setClass(action_plugin_combo_routermessage::REDIRECT_MANAGER_BOX_CLASS)
149*c3437056SNickeau                    ->setCanonical(action_plugin_combo_router::CANONICAL)
150*c3437056SNickeau                    ->setSignatureName(action_plugin_combo_router::URL_MANAGER_NAME)
151*c3437056SNickeau                    ->toHtmlBox();
152*c3437056SNickeau                ptln($html);
153*c3437056SNickeau            }
154*c3437056SNickeau
155*c3437056SNickeau
156*c3437056SNickeau        }
157*c3437056SNickeau
158*c3437056SNickeau
159*c3437056SNickeau    }
160*c3437056SNickeau
161*c3437056SNickeau
162*c3437056SNickeau    /**
163*c3437056SNickeau     * Add the page with the same page name but in an other location
164*c3437056SNickeau     * @param Message $message
165*c3437056SNickeau     * @param $pageIdOrigin
166*c3437056SNickeau     */
167*c3437056SNickeau    function addToMessagePagesWithSameName(Message $message, $pageIdOrigin)
168*c3437056SNickeau    {
169*c3437056SNickeau
170*c3437056SNickeau        if ($this->getConf(self::CONF_SHOW_PAGE_NAME_IS_NOT_UNIQUE) == 1) {
171*c3437056SNickeau
172*c3437056SNickeau            global $ID;
173*c3437056SNickeau            // The page name
174*c3437056SNickeau            $pageName = noNS($pageIdOrigin);
175*c3437056SNickeau            $pagesWithSameName = Index::getOrCreate()->getPagesWithSameLastName($pageIdOrigin);
176*c3437056SNickeau
177*c3437056SNickeau            if (count($pagesWithSameName) > 0) {
178*c3437056SNickeau
179*c3437056SNickeau                $message->setType(Message::TYPE_WARNING);
180*c3437056SNickeau
181*c3437056SNickeau                // Assign the value to a variable to be able to use the construct .=
182*c3437056SNickeau                if ($message->getPlainTextContent() <> '') {
183*c3437056SNickeau                    $message->addHtmlContent('<br/><br/>');
184*c3437056SNickeau                }
185*c3437056SNickeau                $message->addHtmlContent($this->lang['message_pagename_exist_one']);
186*c3437056SNickeau                $message->addHtmlContent('<ul>');
187*c3437056SNickeau
188*c3437056SNickeau                $i = 0;
189*c3437056SNickeau                foreach ($pagesWithSameName as $pageId => $title) {
190*c3437056SNickeau                    if ($pageId === $ID) {
191*c3437056SNickeau                        continue;
192*c3437056SNickeau                    }
193*c3437056SNickeau                    $i++;
194*c3437056SNickeau                    if ($i > 10) {
195*c3437056SNickeau                        $message->addHtmlContent('<li>' .
196*c3437056SNickeau                            tpl_link(
197*c3437056SNickeau                                wl($pageIdOrigin) . "?do=search&q=" . rawurldecode($pageName),
198*c3437056SNickeau                                "More ...",
199*c3437056SNickeau                                'class="" rel="nofollow" title="More..."',
200*c3437056SNickeau                                $return = true
201*c3437056SNickeau                            ) . '</li>');
202*c3437056SNickeau                        break;
203*c3437056SNickeau                    }
204*c3437056SNickeau                    if ($title == null) {
205*c3437056SNickeau                        $title = $pageId;
206*c3437056SNickeau                    }
207*c3437056SNickeau                    $message->addHtmlContent('<li>' .
208*c3437056SNickeau                        tpl_link(
209*c3437056SNickeau                            wl($pageId),
210*c3437056SNickeau                            $title,
211*c3437056SNickeau                            'class="" rel="nofollow" title="' . $title . '"',
212*c3437056SNickeau                            $return = true
213*c3437056SNickeau                        ) . '</li>');
214*c3437056SNickeau                }
215*c3437056SNickeau                $message->addHtmlContent('</ul>');
216*c3437056SNickeau            }
217*c3437056SNickeau        }
218*c3437056SNickeau    }
219*c3437056SNickeau
220*c3437056SNickeau
221*c3437056SNickeau    /**
222*c3437056SNickeau     * Set the redirect in a session that will be be read after the redirect
223*c3437056SNickeau     * in order to show a message to the user
224*c3437056SNickeau     * @param string $id
225*c3437056SNickeau     * @param string $redirectSource
226*c3437056SNickeau     */
227*c3437056SNickeau    static function notify($id, $redirectSource)
228*c3437056SNickeau    {
229*c3437056SNickeau        // Msg via session
230*c3437056SNickeau        if (!defined('NOSESSION')) {
231*c3437056SNickeau            //reopen session, store data and close session again
232*c3437056SNickeau            self::sessionStart();
233*c3437056SNickeau            $_SESSION[DOKU_COOKIE][self::ORIGIN_PAGE] = $id;
234*c3437056SNickeau            $_SESSION[DOKU_COOKIE][self::ORIGIN_TYPE] = $redirectSource;
235*c3437056SNickeau            self::sessionClose();
236*c3437056SNickeau
237*c3437056SNickeau        }
238*c3437056SNickeau    }
239*c3437056SNickeau
240*c3437056SNickeau
241*c3437056SNickeau    private static function sessionStart()
242*c3437056SNickeau    {
243*c3437056SNickeau        $sessionStatus = session_status();
244*c3437056SNickeau        switch ($sessionStatus) {
245*c3437056SNickeau            case PHP_SESSION_DISABLED:
246*c3437056SNickeau                throw new RuntimeException("Sessions are disabled");
247*c3437056SNickeau
248*c3437056SNickeau            case PHP_SESSION_NONE:
249*c3437056SNickeau                $result = @session_start();
250*c3437056SNickeau                if (!$result) {
251*c3437056SNickeau                    throw new RuntimeException("The session was not successfully started");
252*c3437056SNickeau                }
253*c3437056SNickeau                break;
254*c3437056SNickeau            case PHP_SESSION_ACTIVE:
255*c3437056SNickeau                break;
256*c3437056SNickeau        }
257*c3437056SNickeau    }
258*c3437056SNickeau
259*c3437056SNickeau    private static function sessionClose()
260*c3437056SNickeau    {
261*c3437056SNickeau        // Close the session
262*c3437056SNickeau        $phpVersion = phpversion();
263*c3437056SNickeau        if ($phpVersion > "7.2.0") {
264*c3437056SNickeau            /** @noinspection PhpVoidFunctionResultUsedInspection */
265*c3437056SNickeau            $result = session_write_close();
266*c3437056SNickeau            if (!$result) {
267*c3437056SNickeau                // Session is really not a well known mechanism
268*c3437056SNickeau                // Set this error in a info level to not fail the test
269*c3437056SNickeau                LogUtility::msg("Failure to write the session", LogUtility::LVL_MSG_INFO);
270*c3437056SNickeau            }
271*c3437056SNickeau        } else {
272*c3437056SNickeau            session_write_close();
273*c3437056SNickeau        }
274*c3437056SNickeau
275*c3437056SNickeau    }
276*c3437056SNickeau
277*c3437056SNickeau}
278