Implemented the URIHelper and backported new redirect for the controller
authorChristopher Hlubek <hlubek@networkteam.com>
Sat, 28 Mar 2009 23:18:23 +0000 (23:18 +0000)
committerChristopher Hlubek <hlubek@networkteam.com>
Sat, 28 Mar 2009 23:18:23 +0000 (23:18 +0000)
typo3/sysext/extbase/Classes/MVC/Controller/AbstractController.php
typo3/sysext/extbase/Classes/MVC/Web/URIHelper.php [new file with mode: 0644]

index dacf07a..63cdd2b 100755 (executable)
@@ -63,6 +63,11 @@ abstract class Tx_ExtBase_MVC_Controller_AbstractController implements Tx_ExtBas
         * @var array
         */
        protected $nonCachableActions = array();
+       
+       /**
+        * @var Tx_ExtBase_MVC_URIHelper
+        */
+       protected $URIHelper;
 
        /**
         * Constructs the controller.
@@ -73,6 +78,7 @@ abstract class Tx_ExtBase_MVC_Controller_AbstractController implements Tx_ExtBas
        public function __construct() {
                // SK: Set $this->extensionName, could be done the same way as it is done in Fluid
                $this->arguments = t3lib_div::makeInstance('Tx_ExtBase_MVC_Controller_Arguments');
+               $this->URIHelper = t3lib_div::makeInstance('Tx_ExtBase_MVC_Web_URIHelper');
        }
 
        /**
@@ -129,22 +135,47 @@ abstract class Tx_ExtBase_MVC_Controller_AbstractController implements Tx_ExtBas
        }
 
        /**
+        * Forwards the request to another action and / or controller.
+        *
+        * NOTE: This method only supports web requests and will thrown an exception
+        * if used with other request types.
+        *
+        * @param string $actionName Name of the action to forward to
+        * @param string $controllerName Unqualified object name of the controller to forward to. If not specified, the current controller is used.
+        * @param string $extensionKey Key of the extension containing the controller to forward to. If not specified, the current extension is assumed.
+        * @param integer $delay (optional) The delay in seconds. Default is no delay.
+        * @param integer $statusCode (optional) The HTTP status code for the redirect. Default is "303 See Other"
+        * @param Tx_ExtBase_MVC_Controller_Arguments $arguments Arguments to pass to the target action
+        * @return void
+        * @throws Tx_ExtBase_Exception_UnsupportedRequestType If the request is not a web request
+        * @throws Tx_ExtBase_Exception_StopAction
+        */
+       protected function redirect($actionName, $controllerName = '', $extensionKey = '', array $arguments = NULL, $delay = 0, $statusCode = 303) {
+               if (!$this->request instanceof Tx_ExtBase_MVC_Web_Request) throw new Tx_ExtBase_Exception_UnsupportedRequestType('redirect() only supports web requests.', 1220539734);
+
+               $uri = $this->URIHelper->URIFor($this->request, $actionName, $arguments, $controllerName, $extensionKey);
+               $this->redirectToURI($uri, $delay, $statusCode);
+       }
+
+       /**
         * Redirects the web request to another uri.
         *
         * NOTE: This method only supports web requests and will thrown an exception if used with other request types.
         *
-        * @param mixed $uri Either a string representation of a URI or a F3_FLOW3_Property_DataType_URI object
+        * @param mixed $uri Either a string representation of a URI or a \F3\FLOW3\Property\DataType\URI object
         * @param integer $delay (optional) The delay in seconds. Default is no delay.
         * @param integer $statusCode (optional) The HTTP status code for the redirect. Default is "303 See Other"
         * @throws Tx_ExtBase_Exception_UnsupportedRequestType If the request is not a web request
         * @throws Tx_ExtBase_Exception_StopAction
         */
-       public function redirect($uri, $delay = 0, $statusCode = 303) {
+       protected function redirectToURI($uri, $delay = 0, $statusCode = 303) {
                if (!$this->request instanceof Tx_ExtBase_MVC_Web_Request) throw new Tx_ExtBase_Exception_UnsupportedRequestType('redirect() only supports web requests.', 1220539734);
 
+               $uri = $this->request->getBaseURI() . (string)$uri;
                $escapedUri = htmlentities($uri, ENT_QUOTES, 'utf-8');
                $this->response->setContent('<html><head><meta http-equiv="refresh" content="' . intval($delay) . ';url=' . $escapedUri . '"/></head></html>');
                $this->response->setStatus($statusCode);
+               $this->response->setHeader('Location', (string)$uri);
                throw new Tx_ExtBase_Exception_StopAction();
        }
 
@@ -185,7 +216,6 @@ abstract class Tx_ExtBase_MVC_Controller_AbstractController implements Tx_ExtBas
                        }
                }
        }
-
 }
 
 ?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Web/URIHelper.php b/typo3/sysext/extbase/Classes/MVC/Web/URIHelper.php
new file mode 100644 (file)
index 0000000..5459b51
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+
+/*                                                                        *
+ * This script is part of the TYPO3 project - inspiring people to share!  *
+ *                                                                        *
+ * TYPO3 is free software; you can redistribute it and/or modify it under *
+ * the terms of the GNU General Public License version 2 as published by  *
+ * the Free Software Foundation.                                          *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General      *
+ * Public License for more details.                                       *
+ *                                                                        */
+
+require_once(PATH_t3lib . 'interfaces/interface.t3lib_singleton.php');
+require_once(PATH_tslib . 'class.tslib_content.php');
+
+/**
+ * @package
+ * @subpackage
+ * @version $Id:$
+ */
+class Tx_ExtBase_MVC_Web_URIHelper implements t3lib_Singleton {
+       /**
+        * An instance of tslib_cObj
+        *
+        * @var tslib_cObj
+        */
+       protected $contentObject;
+
+       public function __construct(array $arguments = array()) {
+               $this->contentObject = t3lib_div::makeInstance('tslib_cObj');
+       }
+
+       /**
+        * Get an URI for a controller / action / extension on a specific page within the scope
+        * of the current request.
+        * @return The URI
+        */
+       public function URIFor($request, $actionName = '', $arguments = array(), $controllerName = '', $page = '', $extensionKey = '', $anchor = '', $useCacheHash = TRUE) {
+               $prefixedExtensionKey = 'tx_' . strtolower($request->getExtensionName()) . '_' . strtolower($request->getPluginKey());
+
+               $arguments['action'] = $actionName;
+               $arguments['controller'] = ($controllerName !== '') ? $controllerName : $request->getControllerName();
+               $prefixedArguments = array();
+               foreach ($arguments as $argumentName => $argumentValue) {
+                       $key = $prefixedExtensionKey . '[' . $argumentName . ']';
+                       $prefixedArguments[$key] = $argumentValue;
+               }
+               
+               return $this->typolinkURI($page, $anchor, $useCacheHash, $prefixedArguments);
+       }
+
+       /**
+        * Get an URI from typolink
+        * @return The URI
+        */     
+       public function typolinkURI($page = '', $anchor = '', $useCacheHash = TRUE, $arguments = array()) {
+               if ($page === '') {
+                       $page = $GLOBALS['TSFE']->id;
+               }
+
+               $typolinkConfiguration = array(
+                       'parameter' => $page
+               );
+
+               if (count($arguments) > 0) {
+                       foreach ($arguments as $argumentNameSpace => $argument) {
+                               $typolinkConfiguration['additionalParams'] .= '&' . $argumentNameSpace . '=' . rawurlencode($argument);
+                       }
+               }
+               if ($anchor) {
+                       $typolinkConfiguration['section'] = $anchor;
+               }
+               if ($useCacheHash) {
+                       $typolinkConfiguration['useCacheHash'] = 1;
+               } else {
+                       $typolinkConfiguration['useCacheHash'] = 0;
+               }
+
+               return $this->contentObject->typoLink_URL($typolinkConfiguration);              
+       }
+}
+?>
\ No newline at end of file