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