[+TASK] Extbase (Tests): Fixed Extbase unit tests
[Packages/TYPO3.CMS.git] / typo3 / sysext / extbase / Classes / MVC / Web / Routing / UriBuilder.php
index 4389d61..3daf718 100644 (file)
 class Tx_Extbase_MVC_Web_Routing_UriBuilder {
 
        /**
+        * @var Tx_Extbase_Configuration_ConfigurationManagerInterface
+        */
+       protected $configurationManager;
+
+       /**
         * An instance of tslib_cObj
         *
         * @var tslib_cObj
@@ -96,12 +101,25 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
        protected $format = '';
 
        /**
-        * Constructs this URI Helper
+        * @var string
+        */
+       protected $argumentPrefix = NULL;
+
+       /**
+        * @param Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager
+        * @return void
+        */
+       public function injectConfigurationManager(Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager) {
+               $this->configurationManager = $configurationManager;
+       }
+
+       /**
+        * Life-cycle method that is called by the DI container as soon as this object is completely built
         *
-        * @param tslib_cObj $contentObject
+        * @return void
         */
-       public function __construct(tslib_cObj $contentObject = NULL) {
-               $this->contentObject = $contentObject !== NULL ? $contentObject : t3lib_div::makeInstance('tslib_cObj');
+       public function initializeObject() {
+               $this->contentObject = $this->configurationManager->getContentObject();
        }
 
        /**
@@ -249,6 +267,24 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
        }
 
        /**
+        * Specifies the prefix to be used for all arguments.
+        *
+        * @param string $argumentPrefix
+        * @return Tx_Extbase_MVC_Web_Routing_UriBuilder the current UriBuilder to allow method chaining
+        */
+       public function setArgumentPrefix($argumentPrefix) {
+               $this->argumentPrefix = (string)$argumentPrefix;
+               return $this;
+       }
+
+       /**
+        * @return string
+        */
+       public function getArgumentPrefix() {
+               return $this->argumentPrefix;
+       }
+
+       /**
         * If set, URIs for pages without access permissions will be created
         *
         * @param boolean $linkAccessRestrictedPages
@@ -381,13 +417,14 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
                $this->targetPageType = 0;
                $this->noCache = FALSE;
                $this->useCacheHash = TRUE;
+               $this->argumentPrefix = NULL;
 
                return $this;
        }
 
        /**
         * Creates an URI used for linking to an Extbase action.
-        * Works in Frondend and Backend mode of TYPO3.
+        * Works in Frontend and Backend mode of TYPO3.
         *
         * @param string $actionName Name of the action to be called
         * @param array $controllerArguments Additional query parameters. Will be "namespaced" and merged with $this->arguments.
@@ -410,14 +447,24 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
                if ($extensionName === NULL) {
                        $extensionName = $this->request->getControllerExtensionName();
                }
+               if ($pluginName === NULL && TYPO3_MODE === 'FE') {
+                       $pluginName = Tx_Extbase_Utility_Extension::getPluginNameByAction($extensionName, $controllerArguments['controller'], $controllerArguments['action']);
+               }
                if ($pluginName === NULL) {
                        $pluginName = $this->request->getPluginName();
                }
+               if ($this->targetPageUid === NULL && TYPO3_MODE === 'FE') {
+                       $this->targetPageUid = Tx_Extbase_Utility_Extension::getTargetPidByPlugin($extensionName, $pluginName);
+               }
                if ($this->format !== '') {
                        $controllerArguments['format'] = $this->format;
                }
-               $argumentPrefix = strtolower('tx_' . $extensionName . '_' . $pluginName);
-               $prefixedControllerArguments = array($argumentPrefix => $controllerArguments);
+               if ($this->argumentPrefix !== NULL) {
+                       $prefixedControllerArguments = array($this->argumentPrefix => $controllerArguments);
+               } else {
+                       $pluginNamespace = Tx_Extbase_Utility_Extension::getPluginNamespace($extensionName, $pluginName);
+                       $prefixedControllerArguments = array($pluginNamespace => $controllerArguments);
+               }
                $this->arguments = t3lib_div::array_merge_recursive_overrule($this->arguments, $prefixedControllerArguments);
 
                return $this->build();
@@ -482,10 +529,11 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
        public function buildFrontendUri() {
                $typolinkConfiguration = $this->buildTypolinkConfiguration();
 
-               $uri = $this->contentObject->typoLink_URL($typolinkConfiguration);
                if ($this->createAbsoluteUri === TRUE) {
-                       $uri = $this->request->getBaseURI() . $uri;
+                       $typolinkConfiguration['forceAbsoluteUrl'] = TRUE;
                }
+
+               $uri = $this->contentObject->typoLink_URL($typolinkConfiguration);
                return $uri;
        }
 
@@ -507,7 +555,7 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
                if (count($this->arguments) > 0) {
                        $arguments = $this->convertDomainObjectsToIdentityArrays($this->arguments);
                        $this->lastArguments = $arguments;
-                       $typolinkConfiguration['additionalParams'] = '&' . http_build_query($arguments, NULL, '&');
+                       $typolinkConfiguration['additionalParams'] = t3lib_div::implodeArrayForUrl(NULL, $arguments);
                }
 
                if ($this->addQueryString === TRUE) {
@@ -546,8 +594,21 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
         */
        protected function convertDomainObjectsToIdentityArrays(array $arguments) {
                foreach ($arguments as $argumentKey => $argumentValue) {
-                       if ($argumentValue instanceof Tx_Extbase_DomainObject_AbstractEntity) {
-                               $arguments[$argumentKey] = $argumentValue->getUid();
+                       // if we have a LazyLoadingProxy here, make sure to get the real instance for further processing
+                       if ($argumentValue instanceof Tx_Extbase_Persistence_LazyLoadingProxy) {
+                               $argumentValue = $argumentValue->_loadRealInstance();
+                               // also update the value in the arguments array, because the lazyLoaded object could be
+                               // hidden and thus the $argumentValue would be NULL.
+                               $arguments[$argumentKey] = $argumentValue;
+                       }
+                       if ($argumentValue instanceof Tx_Extbase_DomainObject_AbstractDomainObject) {
+                               if ($argumentValue->getUid() !== NULL) {
+                                       $arguments[$argumentKey] = $argumentValue->getUid();
+                               } elseif ($argumentValue instanceof Tx_Extbase_DomainObject_AbstractValueObject) {
+                                       $arguments[$argumentKey] = $this->convertTransientObjectToArray($argumentValue);
+                               } else {
+                                       throw new Tx_Extbase_MVC_Exception_InvalidArgumentValue('Could not serialize Domain Object ' . get_class($argumentValue) . '. It is neither an Entity with identity properties set, nor a Value Object.', 1260881688);
+                               }
                        } elseif (is_array($argumentValue)) {
                                $arguments[$argumentKey] = $this->convertDomainObjectsToIdentityArrays($argumentValue);
                        }
@@ -555,5 +616,30 @@ class Tx_Extbase_MVC_Web_Routing_UriBuilder {
                return $arguments;
        }
 
+       /**
+        * Converts a given object recursively into an array.
+        *
+        * @param Tx_Extbase_DomainObject_AbstractDomainObject $object
+        * @return void
+        */
+       // TODO Refactore this into convertDomainObjectsToIdentityArrays()
+       public function convertTransientObjectToArray(Tx_Extbase_DomainObject_AbstractDomainObject $object) {
+               $result = array();
+               foreach ($object->_getProperties() as $propertyName => $propertyValue) {
+                       if ($propertyValue instanceof Tx_Extbase_DomainObject_AbstractDomainObject) {
+                               if ($propertyValue->getUid() !== NULL) {
+                                       $result[$propertyName] = $propertyValue->getUid();
+                               } else {
+                                       $result[$propertyName] = $this->convertTransientObjectToArray($propertyValue);
+                               }
+                       } elseif (is_array($propertyValue)) {
+                               $result[$propertyName] = $this->convertDomainObjectsToIdentityArrays($propertyValue);
+                       } else {
+                               $result[$propertyName] = $propertyValue;
+                       }
+               }
+               return $result;
+       }
+
 }
 ?>
\ No newline at end of file