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