diff --git a/Classes/TYPO3/Form/Finishers/RedirectFinisher.php b/Classes/TYPO3/Form/Finishers/RedirectFinisher.php index 98c907f..0520389 100644 --- a/Classes/TYPO3/Form/Finishers/RedirectFinisher.php +++ b/Classes/TYPO3/Form/Finishers/RedirectFinisher.php @@ -10,23 +10,26 @@ * * * The TYPO3 project - inspiring people to share! * * */ +use TYPO3\Flow\Mvc\Routing\UriBuilder; +use TYPO3\Form\Core\Model\AbstractFinisher; /** - * This finisher redirects to another Controller. + * This finisher redirects to another Controller or a specific URI. */ -class RedirectFinisher extends \TYPO3\Form\Core\Model\AbstractFinisher +class RedirectFinisher extends AbstractFinisher { /** * @var array */ - protected $defaultOptions = array( + protected $defaultOptions = [ 'package' => null, 'controller' => null, 'action' => '', - 'arguments' => array(), + 'arguments' => [], + 'uri' => '', 'delay' => 0, - 'statusCode' => 303, - ); + 'statusCode' => 303 + ]; /** * Executes this finisher @@ -40,23 +43,20 @@ public function executeInternal() $formRuntime = $this->finisherContext->getFormRuntime(); $request = $formRuntime->getRequest()->getMainRequest(); - $packageKey = $this->parseOption('package'); - $controllerName = $this->parseOption('controller'); - $actionName = $this->parseOption('action'); - $arguments = $this->parseOption('arguments'); $delay = (integer)$this->parseOption('delay'); $statusCode = $this->parseOption('statusCode'); + $uri = $this->parseOption('uri'); - $subpackageKey = null; - if ($packageKey !== null && strpos($packageKey, '\\') !== false) { - list($packageKey, $subpackageKey) = explode('\\', $packageKey, 2); + + if($uri === '') { + $uri = $this->buildActionUri($request); + } + + $uriParts = parse_url($uri); + if(!isset($uriParts['scheme']) || $uriParts['scheme'] === '') { + $uri = $request->getHttpRequest()->getBaseUri() . $uri; } - $uriBuilder = new \TYPO3\Flow\Mvc\Routing\UriBuilder(); - $uriBuilder->setRequest($request); - $uriBuilder->reset(); - $uri = $uriBuilder->uriFor($actionName, $arguments, $controllerName, $packageKey, $subpackageKey); - $uri = $request->getHttpRequest()->getBaseUri() . $uri; $escapedUri = htmlentities($uri, ENT_QUOTES, 'utf-8'); $response = $formRuntime->getResponse(); @@ -80,4 +80,28 @@ public function setOptions(array $options) { $this->options = $options; } + + /** + * @param $request + * @return string + * @throws \TYPO3\Flow\Mvc\Routing\Exception\MissingActionNameException + */ + protected function buildActionUri($request) + { + $packageKey = $this->parseOption('package'); + $controllerName = $this->parseOption('controller'); + $actionName = $this->parseOption('action'); + $arguments = $this->parseOption('arguments'); + + $subpackageKey = null; + if ($packageKey !== null && strpos($packageKey, '\\') !== false) { + list($packageKey, $subpackageKey) = explode('\\', $packageKey, 2); + } + $uriBuilder = new UriBuilder(); + $uriBuilder->setRequest($request); + $uriBuilder->reset(); + + $uri = $uriBuilder->uriFor($actionName, $arguments, $controllerName, $packageKey, $subpackageKey); + return $uri; + } }