[!!!][~API] Extbase: Renamed configureDispatcher() to configurePlugin() in order...
authorJochen Rau <j.rau@web.de>
Wed, 26 Aug 2009 10:44:47 +0000 (10:44 +0000)
committerJochen Rau <j.rau@web.de>
Wed, 26 Aug 2009 10:44:47 +0000 (10:44 +0000)
[!!!][~API] Extbase (Utility): Moved all methods to convert TypoScript array to Utility TypoScript. Renamed postProcessSettions() to convertTypoScriptArrayToPlainArray() and convertExtbaseToClassicTS() to convertPlainArrayToTypoScriptArray().
[~TASK] Extbase: Moved folder Scripts to Resources.
[~TASK] Extbase (Utility): Extracted the autoload function to an own utility class.
[-TASK] Extbase (MVC): Removed unnecessary Standard Controller.
[~TASK] Extbase: Moved methods from Backend Dispatcher to the Dispatcher and removed the Backend Dispatcher.
[+FEATURE] Extbase (MVC): It is now possible to have different templates for different formats (".html", ".json"). We do not have an appropriate $_GET parameter (in combination with RealURL or CoolURI. Relates to #4120.
[+TASK] Extbase (MVC): Added interfaces for Request and Response.

23 files changed:
typo3/sysext/extbase/Classes/BackendDispatcher.php [deleted file]
typo3/sysext/extbase/Classes/Configuration/Manager.php
typo3/sysext/extbase/Classes/Configuration/Source/TypoScriptSource.php
typo3/sysext/extbase/Classes/Controller/StandardController.php [deleted file]
typo3/sysext/extbase/Classes/Dispatcher.php
typo3/sysext/extbase/Classes/MVC/Controller/ActionController.php
typo3/sysext/extbase/Classes/MVC/Request.php
typo3/sysext/extbase/Classes/MVC/RequestInterface.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/ResponseInterface.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/View/EmptyView.php
typo3/sysext/extbase/Classes/MVC/Web/Request.php
typo3/sysext/extbase/Classes/Object/Manager.php
typo3/sysext/extbase/Classes/Utility/ClassLoader.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Utility/Extension.php
typo3/sysext/extbase/Classes/Utility/TypoScript.php
typo3/sysext/extbase/Classes/View/EmptyView.php [deleted file]
typo3/sysext/extbase/Resources/Scripts/RenderDocumentation.php [new file with mode: 0644]
typo3/sysext/extbase/Scripts/RenderDocumentation.php [deleted file]
typo3/sysext/extbase/Tests/Base_testcase.php
typo3/sysext/extbase/Tests/MVC/Controller/ActionController_testcase.php
typo3/sysext/extbase/ext_autoload.php
typo3/sysext/extbase/ext_localconf.php
typo3/sysext/extbase/ext_tables.php

diff --git a/typo3/sysext/extbase/Classes/BackendDispatcher.php b/typo3/sysext/extbase/Classes/BackendDispatcher.php
deleted file mode 100644 (file)
index f7bdda2..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Xavier Perseguers <typo3@perseguers.ch>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Creates a request and dispatches it to the backend controller which was
- * specified by Tx_Extbase_Utility_Module::registerModule() and returns the
- * content to the v4 framework.
- *
- * @package Extbase
- * @subpackage extbase
- * @version $Id: BackendDispatcher.php 23179 2009-08-08 13:24:24Z xperseguers $
- */
-class Tx_Extbase_BackendDispatcher extends Tx_Extbase_Dispatcher {
-
-       /**
-        * Calls an Extbase Backend module.
-        *
-        * @param string $module The name of the module
-        * @return void
-        */
-       public function callModule($module) {
-               if (!isset($GLOBALS['TBE_EXTBASE_MODULES'][$module])) {
-                       die('No configuration found for module ' . $module);
-               }
-
-               $config = $GLOBALS['TBE_EXTBASE_MODULES'][$module];
-
-                       // Check permissions and exit if the user has no permission for entry
-               $GLOBALS['BE_USER']->modAccess($config, TRUE);
-               if (t3lib_div::_GP('id')) {
-                               // Check page access
-                       $id = t3lib_div::_GP('id');
-                       $permClause = $GLOBALS['BE_USER']->getPagePermsClause(TRUE);
-                       $access = is_array(t3lib_BEfunc::readPageAccess($id, $permClause));
-                       if (!$access) {
-                               t3lib_BEfunc::typo3PrintError('No Access', 'You don\'t have access to this page', 0);
-                       }
-               }
-
-                       // Resolve the controller/action to use
-               $controllerAction = $this->resolveControllerAction($module);
-
-                       // As for SCbase modules, output of the controller/action pair should be echoed
-               echo $this->transfer($module, $controllerAction['controller'], $controllerAction['action']);
-       }
-
-       /**
-        * Resolves the controller and action to use for current call.
-        * This takes into account any function menu that has being called. 
-        *
-        * @param string $module The name of the module
-        * @return array The controller/action pair to use for current call
-        */
-       protected function resolveControllerAction($module) {
-               $configuration = $GLOBALS['TBE_EXTBASE_MODULES'][$module];
-               $fallbackControllerAction = $this->getFallbackControllerAction($configuration);
-
-                       // Extract dispatcher settings from request
-               $argumentPrefix = strtolower('tx_' . $configuration['extensionName'] . '_' . $configuration['name']);
-               $dispatcherParameters = t3lib_div::_GPmerged($argumentPrefix);
-               $dispatcherControllerAction = $this->getDispatcherControllerAction($configuration, $dispatcherParameters);
-
-                       // Extract module function settings from request
-               $moduleFunctionControllerAction = $this->getModuleFunctionControllerAction($module, $fallbackControllerAction['controller']);   
-
-                       // Dispatcher controller/action has precedence over default controller/action
-               $controllerAction = t3lib_div::array_merge_recursive_overrule($fallbackControllerAction, $dispatcherControllerAction, FALSE, FALSE);
-                       // Module function controller/action has precedence
-               $controllerAction = t3lib_div::array_merge_recursive_overrule($controllerAction, $moduleFunctionControllerAction, FALSE, FALSE);
-
-               return $controllerAction;
-       }
-
-       /**
-        * Returns the fallback controller/action pair to be used when request does not contain
-        * any controller/action to be used or the provided parameters are not valid. 
-        *
-        * @param array $configuration The module configuration
-        * @return array The controller/action pair
-        */
-       protected function getFallbackControllerAction($configuration) {
-                       // Extract module settings from its registration in ext_tables.php
-               $controllers = array_keys($configuration['controllerActions']);
-               $defaultController = array_shift($controllers);
-               $actions = t3lib_div::trimExplode(',', $configuration['controllerActions'][$defaultController], TRUE);
-               $defaultAction = $actions[0];
-
-               return array(
-                       'controller' => $defaultController,
-                       'action' => $defaultAction,
-               );
-       }
-
-       /**
-        * Returns the controller/action pair that was specified by the request if it is valid,
-        * otherwise, will just return a blank controller/action pair meaning the default
-        * controller/action should be used instead.
-        *
-        * @param array $configuration The module configuration
-        * @param array $dispatcherParameters The dispatcher parameters
-        * @return array The controller/action pair
-        */
-       protected function getDispatcherControllerAction($configuration, $dispatcherParameters) {
-               $controllerAction = array(
-                       'controller' => '',
-                       'action' => '',
-               );
-
-               if (!isset($dispatcherParameters['controller'])) {
-                               // Early return: should use fallback controller/action
-                       return $controllerAction;
-               }
-
-                       // Extract configured controllers from module's registration in ext_tables.php
-               $controllers = array_keys($configuration['controllerActions']);
-
-               $controller = $dispatcherParameters['controller'];
-               if (in_array($controller, $controllers)) {
-                               // Update return value as selected controller is valid
-                       $controllerAction['controller'] = $controller;
-                       $actions = t3lib_div::trimExplode(',', $configuration['controllerActions'][$controller], TRUE);
-                       if (isset($dispatcherParameters['action'])) {
-                                       // Extract configured actions for selected controllers
-                               $action = $dispatcherParameters['action'];
-                               if (in_array($action, $actions)) {
-                                               // Requested action is valid for selected controller
-                                       $controllerAction['action'] = $action;
-                               } else {
-                                               // Use first action of selected controller as fallback action
-                                       $controllerAction['action'] = $actions[0];
-                               }
-                       } else {
-                                       // Use first action of selected controller as fallback action
-                               $controllerAction['action'] = $actions[0];
-                       }
-               }
-
-               return $controllerAction;
-       }
-
-       /**
-        * Returns the controller/action pair to use if a module function parameter is found
-        * in the request, otherwise, will just return a blank controller/action pair.
-        *
-        * @param string $module The name of the module
-        * @param string $defaultController The module's default controller
-        * @return array The controller/action pair
-        */
-       protected function getModuleFunctionControllerAction($module, $defaultController) {
-               $controllerAction = array(
-                       'controller' => '',
-                       'action' => '',
-               );
-
-               $set = t3lib_div::_GP('SET');
-               if (!$set) {
-                               // Early return
-                       return $controllerAction;
-               }
-
-               $moduleFunction = $set['function'];
-               $matches = array();
-               if (preg_match('/^(.*)->(.*)$/', $moduleFunction, $matches)) {
-                       $controllerAction['controller'] = $matches[1];
-                       $controllerAction['action'] = $matches[2];
-               } else {
-                               // Support for external SCbase module function rendering
-                       $functions = $GLOBALS['TBE_MODULES_EXT'][$module]['MOD_MENU']['function'];
-                       if (isset($functions[$moduleFunction])) {
-                               $controllerAction['controller'] = $defaultController;
-                               $controllerAction['action'] = 'extObj';
-                       }
-               }
-
-               return $controllerAction;
-       }
-
-       /**
-        * Transfers the request to an Extbase backend module, calling
-        * a given controller/action.
-        *
-        * @param string $module The name of the module
-        * @param string $controller The controller to use
-        * @param string $action The controller's action to execute
-        * @return string The module rendered view
-        */
-       protected function transfer($module, $controller, $action) {
-                $config = $GLOBALS['TBE_EXTBASE_MODULES'][$module];
-                
-                $extbaseConfiguration = array(
-                       'userFunc' => 'tx_extbase_dispatcher->dispatch',
-                       'pluginName' => $module,
-                       'extensionName' => $config['extensionName'],
-                       'controller' => $controller,
-                       'action' => $action,
-                       'switchableControllerActions.' => array(),
-                       //'persistence' => '< plugin.tx_' . strtolower($config['extensionName']) . '.persistence',
-               );
-               
-               $i = 1;
-               foreach ($config['controllerActions'] as $controller => $actions) {
-                               // Add an "extObj" action for the default controller to handle external
-                               // SCbase modules which add function menu entries
-                       if ($i == 1) {
-                               $actions .= ',extObj'; 
-                       }
-                       $extbaseConfiguration['switchableControllerActions.'][$i++ . '.'] = array(
-                               'controller' => $controller,
-                               'actions' => $actions,
-                       );
-               }
-                               
-                       // BACK_PATH is the path from the typo3/ directory from within the
-                       // directory containing the controller file. We are using mod.php dispatcher
-                       // and thus we are already within typo3/ because we call typo3/mod.php
-               $GLOBALS['BACK_PATH'] = '';
-               
-               return $this->dispatch('Here comes Extbase BE Module', $extbaseConfiguration);
-       }
-       
-}
-?>
\ No newline at end of file
index 4704895..ee9dcc1 100644 (file)
@@ -38,6 +38,13 @@ class Tx_Extbase_Configuration_Manager {
         */
        const DEFAULT_BACKEND_STORAGE_PID = 0;
 
+       /**
+        * The TypoScript parser
+        *
+        * @var t3lib_TSparser
+        */
+       protected $typoScriptParser;
+
        /**
         * Storage for the settings, loaded by loadSettings()
         *
@@ -58,6 +65,7 @@ class Tx_Extbase_Configuration_Manager {
         * @param array $configurationSources An array of configuration sources
         */
        public function __construct($configurationSources = NULL) {
+               $this->typoScriptParser = t3lib_div::makeInstance('t3lib_TSparser');
                if (is_array($configurationSources)) {
                        $this->configurationSources = $configurationSources;
                }
@@ -113,14 +121,14 @@ class Tx_Extbase_Configuration_Manager {
                // TODO Support BE modules by parsing the file "manually" and all files EXT:myext/Configuration/Objects/setup.txt
                $extbaseConfiguration = $GLOBALS['TSFE']->tmpl->setup['config.']['tx_extbase.'];
                if (is_array($extbaseConfiguration)) {
-                       $extbaseConfiguration = Tx_Extbase_Configuration_Manager::postProcessSettings($extbaseConfiguration);
+                       $extbaseConfiguration = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($extbaseConfiguration);
                        $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, $extbaseConfiguration);
                }
 
                if (isset($pluginConfiguration['persistence'])) {
                        $pluginConfiguration = $this->resolveTyposcriptReference($pluginConfiguration, 'persistence');
                }
-               $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, self::postProcessSettings($pluginConfiguration));
+               $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($pluginConfiguration));
                return $frameworkConfiguration;
        }
 
@@ -135,9 +143,8 @@ class Tx_Extbase_Configuration_Manager {
         */
        protected function resolveTyposcriptReference($pluginConfiguration, $setting) {
                if (is_string($pluginConfiguration[$setting]) && substr($pluginConfiguration[$setting], 0, 1) === '<') {
-                       $typoScriptParser = t3lib_div::makeInstance('t3lib_TSparser');
                        $key = trim(substr($pluginConfiguration[$setting], 1));
-                       list(, $newValue) = $typoScriptParser->getVal($key,$GLOBALS['TSFE']->tmpl->setup);
+                       list(, $newValue) = $this->typoScriptParser->getVal($key, $GLOBALS['TSFE']->tmpl->setup);
 
                        unset($pluginConfiguration[$setting]);
                        $pluginConfiguration[$setting . '.'] = $newValue;
@@ -174,38 +181,29 @@ class Tx_Extbase_Configuration_Manager {
                }
                return self::DEFAULT_BACKEND_STORAGE_PID;
        }
-
-       /**
-        * Removes all trailing dots recursively from TS settings array
-        * TODO Explain why we remove the dots.
-        *
-        * @param array $setup The settings array
-        * @return void
-        */
-       public static function postProcessSettings(array $settings) {
-               $processedSettings = array();
-               // TODO Check if the t3lib_div::removeDotsFromTS() fits for this purpose (using rtrim() for removing trailing dots)
-               foreach ($settings as $key => $value) {
-                       if (substr($key, -1) === '.') {
-                               $keyWithoutDot = substr($key, 0, -1);
-                               $processedSettings[$keyWithoutDot] = self::postProcessSettings($value);
-                               if (array_key_exists($keyWithoutDot, $settings)) {
-                                       $processedSettings[$keyWithoutDot]['_typoScriptNodeValue'] = $settings[$keyWithoutDot];
-                                       unset($settings[$keyWithoutDot]);
-                               }
-                       } else {
-                               $keyWithDot = $key . '.';
-                               if (array_key_exists($keyWithDot, $settings)) {
-                                       $processedSettings[$key] = self::postProcessSettings($settings[$keyWithDot]);
-                                       $processedSettings[$key]['_typoScriptNodeValue'] = $value;
-                                       unset($settings[$keyWithDot]);
-                               } else {
-                                       $processedSettings[$key] = $value;
-                               }
-                       }
-               }
-               return $processedSettings;
-       }
+       
+//     /**
+//      * Scans all configuration directories in the extension directories.
+//      *
+//      * @return void
+//      */
+//     protected function scanAvailableTyposcriptConfigurations() {
+//             foreach (new DirectoryIterator(t3lib_extMgm::) as $parentFileInfo) {
+//                     $parentFilename = $parentFileInfo->getFilename();
+//                     if ($parentFilename[0] === '.' || !$parentFileInfo->isDir()) continue;
+//
+//                     foreach (new DirectoryIterator($parentFileInfo->getPathname()) as $childFileInfo) {
+//                             $childFilename = $childFileInfo->getFilename();
+//                             if ($childFilename[0] !== '.' && $childFilename !== 'FLOW3') {
+//                                     $packagePath = \F3\FLOW3\Utility\Files::getUnixStylePath($childFileInfo->getPathName()) . '/';
+//                                     $this->packages[$childFilename] = $this->objectFactory->create('F3\FLOW3\Package\Package', $childFilename, $packagePath);
+//                             }
+//                     }
+//             }
+//             foreach (array_keys($this->packages) as $upperCamelCasedPackageKey) {
+//                     $this->packageKeys[strtolower($upperCamelCasedPackageKey)] = $upperCamelCasedPackageKey;
+//             }
+//     }
 
 }
 ?>
\ No newline at end of file
index 8e900f8..187a1f4 100644 (file)
@@ -46,7 +46,7 @@ class Tx_Extbase_Configuration_Source_TypoScriptSource implements Tx_Extbase_Con
                // TODO Needs a FE (does actually not work with BE or CLI)
                $settings = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_' . strtolower($extensionName) . '.']['settings.'];
                if (is_array($settings)) {
-                       $settings = Tx_Extbase_Configuration_Manager::postProcessSettings($settings);
+                       $settings = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($settings);
                } else {
                        $settings = array();
                }
diff --git a/typo3/sysext/extbase/Classes/Controller/StandardController.php b/typo3/sysext/extbase/Classes/Controller/StandardController.php
deleted file mode 100755 (executable)
index 40e6837..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This class is a backport of the corresponding class of FLOW3. 
-*  All credits go to the v5 team.
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * A Special Case of a Controller: If no controller could be resolved or no
- * controller has been specified in the request, this controller is chosen.
- *
- * @package Extbase
- * @subpackage Controller
- * @version $ID:$
- */
-class Tx_Extbase_Controller_StandardController extends Tx_Extbase_MVC_Controller_ActionController {
-
-       /**
-        * @var Tx_Extbase_View_StandardView
-        */
-       protected $standardView;
-
-       /**
-        * Injects the StandardView.
-        *
-        * @param Tx_Extbase_View_StandardView $notFoundView
-        * @return void
-        */
-       public function injectStandardView(Tx_Extbase_View_StandardView $standardView) {
-               // TODO inject Standard View; implement view and template
-               $this->standardView = $standardView;
-       }
-
-       /**
-        * Processes a generic request and returns a response
-        *
-        * @param Tx_Extbase_MVC_Request $request: The request
-        * @param Tx_Extbase_MVC_Response $response: The response
-        */
-       public function processRequest(Tx_Extbase_MVC_Request $request, Tx_Extbase_MVC_Response $response) {
-               $response->setContent(
-                       "\nWelcome to TYPO3!\n\n" .
-                       "This is the standard view of the TYPO3 Extbase project. You see this message because no \n" .
-                       "other view is available. Please refer to the Developer's Guide for more information \n" .
-                       "how to create and configure one.\n\n" .
-                       "Have fun! The TYPO3 Development Team\n"
-               );
-       }
-
-}
-
-?>
\ No newline at end of file
index f5b3f34..4b8ef1c 100644 (file)
  */
 class Tx_Extbase_Dispatcher {
 
+       /**
+        * @var Tx_Extbase_Utility_ClassLoader
+        */
+       protected $classLoader;
+       
        /**
         * @var Tx_Extbase_Configuration_Manager
         */
@@ -59,7 +64,7 @@ class Tx_Extbase_Dispatcher {
         * Constructs this Dispatcher and registers the autoloader
         */
        public function __construct() {
-               spl_autoload_register(array($this, 'autoloadClass'));
+               $this->initializeClassLoader();
        }
 
        /**
@@ -108,6 +113,21 @@ class Tx_Extbase_Dispatcher {
                $response->sendHeaders();
                return $response->getContent();
        }
+       
+       /**
+        * Initializes the autoload mechanism of Extbase. This is supplement to the core autoloader.
+        *
+        * @return void
+        */
+       
+       protected function initializeClassLoader() {
+               if (!class_exists('Tx_Extbase_Utility_ClassLoader')) {
+                       require(t3lib_extmgm::extPath('extbase') . 'Classes/Utility/ClassLoader.php');
+               }
+
+               $classLoader = new Tx_Extbase_Utility_ClassLoader();
+               spl_autoload_register(array($classLoader, 'loadClass'));
+       }
 
        /**
         * Initializes the configuration manager and the Extbase settings
@@ -214,28 +234,211 @@ class Tx_Extbase_Dispatcher {
                return self::$extbaseFrameworkConfiguration;
        }
 
-       /**
-        * Loads php files containing classes or interfaces found in the classes directory of
-        * an extension.
+               /**
+        * Calls an Extbase Backend module.
         *
-        * @param string $className: Name of the class/interface to load
-        * @uses t3lib_extMgm::extPath()
+        * @param string $module The name of the module
         * @return void
         */
-       public static function autoloadClass($className) {
-               // TODO Remove debug code
-               // TODO Make a registry for Extbase classes
-               //$starttime = microtime(true);
-               $classNameParts = explode('_', $className, 3);
-               $extensionKey = Tx_Extbase_Utility_Extension::convertCamelCaseToLowerCaseUnderscored($classNameParts[1]);
-               if (t3lib_extMgm::isLoaded($extensionKey)) {
-                       $classFilePathAndName = t3lib_extMgm::extPath($extensionKey) . 'Classes/' . strtr($classNameParts[2], '_', '/') . '.php';
-                       if (file_exists($classFilePathAndName)) {
-                               require($classFilePathAndName);
+       public function callModule($module) {
+               if (isset($GLOBALS['TBE_MODULES'][$module])) {
+                       $config = $GLOBALS['TBE_MODULES'][$module];
+
+                       // Check permissions and exit if the user has no permission for entry
+                       $GLOBALS['BE_USER']->modAccess($config, TRUE);
+                       if (t3lib_div::_GP('id')) {
+                               // Check page access
+                               $id = t3lib_div::_GP('id');
+                               $permClause = $GLOBALS['BE_USER']->getPagePermsClause(TRUE);
+                               $access = is_array(t3lib_BEfunc::readPageAccess($id, $permClause));
+                               if (!$access) {
+                                       t3lib_BEfunc::typo3PrintError('No Access', 'You don\'t have access to this page', 0);
+                               }
                        }
+
+                       // Resolve the controller/action to use
+                       $controllerAction = $this->resolveControllerAction($module);
+
+                       // As for SCbase modules, output of the controller/action pair should be echoed
+                       echo $this->transfer($module, $controllerAction['controllerName'], $controllerAction['actionName']);
+                       return TRUE;
+               } else {
+                       return FALSE;
+               }
+       }
+
+       /**
+        * Resolves the controller and action to use for current call.
+        * This takes into account any function menu that has being called.
+        *
+        * @param string $module The name of the module
+        * @return array The controller/action pair to use for current call
+        */
+       protected function resolveControllerAction($module) {
+               $configuration = $GLOBALS['TBE_MODULES'][$module];
+               $fallbackControllerAction = $this->getFallbackControllerAction($configuration);
+
+                       // Extract dispatcher settings from request
+               $argumentPrefix = strtolower('tx_' . $configuration['extensionName'] . '_' . $configuration['name']);
+               $dispatcherParameters = t3lib_div::_GPmerged($argumentPrefix);
+               $dispatcherControllerAction = $this->getDispatcherControllerAction($configuration, $dispatcherParameters);
+
+                       // Extract module function settings from request
+               $moduleFunctionControllerAction = $this->getModuleFunctionControllerAction($module, $fallbackControllerAction['controllerName']);       
+
+                       // Dispatcher controller/action has precedence over default controller/action
+               $controllerAction = t3lib_div::array_merge_recursive_overrule($fallbackControllerAction, $dispatcherControllerAction, FALSE, FALSE);
+                       // Module function controller/action has precedence
+               $controllerAction = t3lib_div::array_merge_recursive_overrule($controllerAction, $moduleFunctionControllerAction, FALSE, FALSE);
+
+               return $controllerAction;
+       }
+
+       /**
+        * Returns the fallback controller/action pair to be used when request does not contain
+        * any controller/action to be used or the provided parameters are not valid. 
+        *
+        * @param array $configuration The module configuration
+        * @return array The controller/action pair
+        */
+       protected function getFallbackControllerAction($configuration) {
+                       // Extract module settings from its registration in ext_tables.php
+               $controllers = array_keys($configuration['controllerActions']);
+               $defaultController = array_shift($controllers);
+               $actions = t3lib_div::trimExplode(',', $configuration['controllerActions'][$defaultController], TRUE);
+               $defaultAction = $actions[0];
+
+               return array(
+                       'controllerName' => $defaultController,
+                       'actionName' => $defaultAction,
+               );
+       }
+
+       /**
+        * Returns the controller/action pair that was specified by the request if it is valid,
+        * otherwise, will just return a blank controller/action pair meaning the default
+        * controller/action should be used instead.
+        *
+        * @param array $configuration The module configuration
+        * @param array $dispatcherParameters The dispatcher parameters
+        * @return array The controller/action pair
+        */
+       protected function getDispatcherControllerAction($configuration, $dispatcherParameters) {
+               $controllerAction = array(
+                       'controllerName' => '',
+                       'actionName' => '',
+               );
+
+               if (!isset($dispatcherParameters['controllerName'])) {
+                               // Early return: should use fallback controller/action
+                       return $controllerAction;
+               }
+
+                       // Extract configured controllers from module's registration in ext_tables.php
+               $controllers = array_keys($configuration['controllerActions']);
+
+               $controller = $dispatcherParameters['controllerName'];
+               if (in_array($controller, $controllers)) {
+                               // Update return value as selected controller is valid
+                       $controllerAction['controllerName'] = $controller;
+                       $actions = t3lib_div::trimExplode(',', $configuration['controllerActions'][$controller], TRUE);
+                       if (isset($dispatcherParameters['actionName'])) {
+                                       // Extract configured actions for selected controllers
+                               $action = $dispatcherParameters['actionName'];
+                               if (in_array($action, $actions)) {
+                                               // Requested action is valid for selected controller
+                                       $controllerAction['actionName'] = $action;
+                               } else {
+                                               // Use first action of selected controller as fallback action
+                                       $controllerAction['actionName'] = $actions[0];
+                               }
+                       } else {
+                                       // Use first action of selected controller as fallback action
+                               $controllerAction['actionName'] = $actions[0];
+                       }
+               }
+
+               return $controllerAction;
+       }
+
+       /**
+        * Returns the controller/action pair to use if a module function parameter is found
+        * in the request, otherwise, will just return a blank controller/action pair.
+        *
+        * @param string $module The name of the module
+        * @param string $defaultController The module's default controller
+        * @return array The controller/action pair
+        */
+       protected function getModuleFunctionControllerAction($module, $defaultController) {
+               $controllerAction = array(
+                       'controller' => '',
+                       'action' => '',
+               );
+
+               $set = t3lib_div::_GP('SET');
+               if (!$set) {
+                               // Early return
+                       return $controllerAction;
+               }
+
+               $moduleFunction = $set['function'];
+               $matches = array();
+               if (preg_match('/^(.*)->(.*)$/', $moduleFunction, $matches)) {
+                       $controllerAction['controller'] = $matches[1];
+                       $controllerAction['action'] = $matches[2];
+               } else {
+                               // Support for external SCbase module function rendering
+                       $functions = $GLOBALS['TBE_MODULES_EXT'][$module]['MOD_MENU']['function'];
+                       if (isset($functions[$moduleFunction])) {
+                               $controllerAction['controller'] = $defaultController;
+                               $controllerAction['action'] = 'extObj';
+                       }
+               }
+
+               return $controllerAction;
+       }
+
+       /**
+        * Transfers the request to an Extbase backend module, calling
+        * a given controller/action.
+        *
+        * @param string $module The name of the module
+        * @param string $controller The controller to use
+        * @param string $action The controller's action to execute
+        * @return string The module rendered view
+        */
+       protected function transfer($module, $controller, $action) {
+                $config = $GLOBALS['TBE_MODULES'][$module];
+                
+                $extbaseConfiguration = array(
+                       'userFunc' => 'tx_extbase_dispatcher->dispatch',
+                       'pluginName' => $module,
+                       'extensionName' => $config['extensionName'],
+                       'controller' => $controller,
+                       'action' => $action,
+                       'switchableControllerActions.' => array(),
+                       'persistence' => '< plugin.tx_' . strtolower($config['extensionName']) . '.persistence',
+               );
+               
+               $i = 1;
+               foreach ($config['controllerActions'] as $controller => $actions) {
+                               // Add an "extObj" action for the default controller to handle external
+                               // SCbase modules which add function menu entries
+                       if ($i == 1) {
+                               $actions .= ',extObj'; 
+                       }
+                       $extbaseConfiguration['switchableControllerActions.'][$i++ . '.'] = array(
+                               'controller' => $controller,
+                               'actions' => $actions,
+                       );
                }
-               //$endtime = microtime(true);
-               //debug(($endtime - $starttime) * 10000, $className);
+                               
+                       // BACK_PATH is the path from the typo3/ directory from within the
+                       // directory containing the controller file. We are using mod.php dispatcher
+                       // and thus we are already within typo3/ because we call typo3/mod.php
+               $GLOBALS['BACK_PATH'] = '';
+               return $this->dispatch('Here comes Extbase BE Module', $extbaseConfiguration);
        }
+       
 }
 ?>
\ No newline at end of file
index 88b13c0..b01a264 100644 (file)
@@ -55,7 +55,7 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * @var string
         * @api
         */
-       protected $viewObjectNamePattern = 'Tx_@extension_View_@controller_@action';
+       protected $viewObjectNamePattern = 'Tx_@extension_View_@controller_@action@format';
 
        /**
         * The default view object to use if neither a Fluid template nor an action
@@ -257,8 +257,8 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
                $view->setControllerContext($controllerContext);
                if ($view->hasTemplate() === FALSE) {
                        $viewObjectName = $this->resolveViewObjectName();
-                       if ($viewObjectName === FALSE) $viewObjectName = 'Tx_Extbase_MVC_View_EmptyView';
-                       $view = t3lib_div::makeInstance($viewObjectName);
+                       if (class_exists($viewObjectName) === FALSE) $viewObjectName = 'Tx_Extbase_MVC_View_EmptyView';
+                       $view = $this->objectManager->getObject($viewObjectName);
                        $view->setControllerContext($controllerContext);
                }
                if (method_exists($view, 'injectSettings')) {
@@ -277,18 +277,23 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         */
        protected function resolveViewObjectName() {
                $possibleViewName = $this->viewObjectNamePattern;
-               $possibleViewName = str_replace('@extension', $this->request->getControllerExtensionName(), $possibleViewName);
+               $extensionName = $this->request->getControllerExtensionName();
+               $subextensionName = $this->request->getControllerSubextensionName();
+               if ($subextensionName !== NULL && $subextensionName !== '') {
+                       $extensionName.= '_' . $subextensionName;
+               }
+               $possibleViewName = str_replace('@extension', $extensionName, $possibleViewName);
                $possibleViewName = str_replace('@controller', $this->request->getControllerName(), $possibleViewName);
                $possibleViewName = str_replace('@action', ucfirst($this->request->getControllerActionName()), $possibleViewName);
 
-               if (class_exists($possibleViewName)) {
-                       return $possibleViewName;
+               $viewObjectName = str_replace('@format', ucfirst($this->request->getFormat()), $possibleViewName);              
+               if (class_exists($viewObjectName) === FALSE) {
+                       $viewObjectName = str_replace('@format', '', $possibleViewName);
                }
-
-               if ($this->defaultViewObjectName !== NULL && class_exists($this->defaultViewObjectName)) {
-                       return $this->defaultViewObjectName;
+               if (class_exists($viewObjectName) === FALSE && $this->defaultViewObjectName !== NULL) {
+                       $viewObjectName = $this->defaultViewObjectName;
                }
-               return FALSE;
+               return $viewObjectName;
        }
 
        /**
index 4b06212..640f6c9 100644 (file)
@@ -33,7 +33,7 @@
  * @version $ID:$
  * @scope prototype
  */
-class Tx_Extbase_MVC_Request {
+class Tx_Extbase_MVC_Request implements Tx_Extbase_MVC_RequestInterface {
 
        const PATTERN_MATCH_FORMAT = '/^[a-z0-9]{1,5}$/';
 
@@ -52,10 +52,17 @@ class Tx_Extbase_MVC_Request {
        /**
         * @var string Name of the extension which is supposed to handle this request. This is the extension name converted to UpperCamelCase
         */
-       protected $controllerExtensionName = 'Extbase';
+       protected $controllerExtensionName = NULL;
 
        /**
-        * @var string Name of the controller which is supposed to handle this request.
+        * Subextension name of the controller which is supposed to handle this request.
+        *
+        * @var string
+        */
+       protected $controllerSubextensionName = NULL;
+
+       /**
+        * @var string Object name of the controller which is supposed to handle this request.
         */
        protected $controllerName = 'Standard';
 
@@ -65,10 +72,15 @@ class Tx_Extbase_MVC_Request {
        protected $controllerActionName = 'index';
 
        /**
-        * @var ArrayObject The arguments for this request
+        * @var array The arguments for this request
         */
        protected $arguments = array();
 
+       /**
+        * @var string The requested representation format
+        */
+       protected $format = 'txt';
+
        /**
         * @var boolean If this request has been changed and needs to be dispatched again
         */
@@ -78,14 +90,7 @@ class Tx_Extbase_MVC_Request {
         * @var array Errors that occured during this request
         */
        protected $errors = array();
-
-       /**
-        * Constructs this request
-        *
-        */
-       public function __construct() {
-       }
-
+       
        /**
         * Sets the dispatched flag
         *
@@ -158,7 +163,7 @@ class Tx_Extbase_MVC_Request {
         * @return void
         * @throws Tx_Extbase_MVC_Exception_InvalidExtensionName if the extension name is not valid
         */
-       public function setControllerExtensionName($controllerExtensionName = NULL) {
+       public function setControllerExtensionName($controllerExtensionName) {
                if ($controllerExtensionName !== NULL) {
                        $this->controllerExtensionName = $controllerExtensionName;
                }
@@ -177,12 +182,35 @@ class Tx_Extbase_MVC_Request {
        /**
         * Returns the extension name of the specified controller.
         *
-        * @return string The extension name
+        * @return string The extension key
         * @api
         */
        public function getControllerExtensionKey() {
                return Tx_Extbase_Utility_Extension::convertCamelCaseToLowerCaseUnderscored($this->controllerExtensionName);
        }
+       
+       /**
+        * Sets the subextension name of the controller.
+        *
+        * @param string $subextensionName The subextensionName.
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       public function setControllerSubextensionName($subextensionName) {
+               $this->controllerSubextensionName = $subextensionName;
+       }
+
+       /**
+        * Returns the subextension name of the specified controller.
+        *
+        * @return string The subextension name
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @api
+        * // TODO mark different API
+        */
+       public function getControllerSubextensionName() {
+               return $this->controllerSubextensionName;
+       }
 
        /**
         * Sets the name of the controller which is supposed to handle the request.
@@ -191,7 +219,7 @@ class Tx_Extbase_MVC_Request {
         * @param string $controllerName Name of the controller
         * @return void
         */
-       public function setControllerName($controllerName = NULL) {
+       public function setControllerName($controllerName) {
                if (!is_string($controllerName) && $controllerName !== NULL) throw new Tx_Extbase_MVC_Exception_InvalidControllerName('The controller name must be a valid string, ' . gettype($controllerName) . ' given.', 1187176358);
                if (strpos($controllerName, '_') !== FALSE) throw new Tx_Extbase_MVC_Exception_InvalidControllerName('The controller name must not contain underscores.', 1217846412);
                if ($controllerName !== NULL) {
@@ -219,7 +247,7 @@ class Tx_Extbase_MVC_Request {
         * @return void
         * @throws Tx_Extbase_MVC_Exception_InvalidActionName if the action name is not valid
         */
-       public function setControllerActionName($actionName = NULL) {
+       public function setControllerActionName($actionName) {
                if (!is_string($actionName) && $actionName !== NULL) throw new Tx_Extbase_MVC_Exception_InvalidActionName('The action name must be a valid string, ' . gettype($actionName) . ' given (' . $actionName . ').', 1187176358);
                if (($actionName{0} !== strtolower($actionName{0})) && $actionName !== NULL) throw new Tx_Extbase_MVC_Exception_InvalidActionName('The action name must start with a lower case letter, "' . $actionName . '" does not match this criteria.', 1218473352);
                if ($actionName !== NULL) {
@@ -294,6 +322,28 @@ class Tx_Extbase_MVC_Request {
                return isset($this->arguments[$argumentName]);
        }
 
+       /**
+        * Sets the requested representation format
+        *
+        * @param string $format The desired format, something like "html", "xml", "png", "json" or the like. Can even be something like "rss.xml".
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function setFormat($format) {
+               $this->format = $format;
+       }
+
+       /**
+        * Returns the requested representation format
+        *
+        * @return string The desired format, something like "html", "xml", "png", "json" or the like.
+        * @author Robert Lemke <robert@typo3.org>
+        * @api
+        */
+       public function getFormat() {
+               return $this->format;
+       }
+
        /**
         * Set errors that occured during the request (e.g. argument mapping errors)
         *
diff --git a/typo3/sysext/extbase/Classes/MVC/RequestInterface.php b/typo3/sysext/extbase/Classes/MVC/RequestInterface.php
new file mode 100644 (file)
index 0000000..fc5fadd
--- /dev/null
@@ -0,0 +1,226 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This class is a backport of the corresponding class of FLOW3.
+*  All credits go to the v5 team.
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Contract for a request.
+ *
+ * @version $Id: RequestInterface.php 2813 2009-07-16 14:02:34Z k-fish $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @author Robert Lemke <robert@typo3.org>
+ * @scope prototype
+ */
+interface Tx_Extbase_MVC_RequestInterface {
+
+       /**
+        * Sets the dispatched flag
+        *
+        * @param boolean $flag If this request has been dispatched
+        * @return void
+        * @api
+        */
+       public function setDispatched($flag);
+
+       /**
+        * If this request has been dispatched and addressed by the responsible
+        * controller and the response is ready to be sent.
+        *
+        * The dispatcher will try to dispatch the request again if it has not been
+        * addressed yet.
+        *
+        * @return boolean TRUE if this request has been disptached successfully
+        * @api
+        */
+       public function isDispatched();
+
+       /**
+        * Returns the object name of the controller defined by the package key and
+        * controller name
+        *
+        * @return string The controller's Object Name
+        * @throws Tx_Extbase_MVC_Exception_NoSuchController if the controller does not exist
+        * @api
+        */
+       public function getControllerObjectName();
+
+       /**
+        * Sets the extension name of the controller.
+        *
+        * @param string $extensionName The extension name.
+        * @return void
+        * @throws Tx_Extbase_MVC_Exception_InvalidPackageKey if the package key is not valid
+        * @api
+        */
+       public function setControllerExtensionName($extensionName);
+
+       /**
+        * Returns the extension name of the specified controller.
+        *
+        * @return string The package key
+        * @api 
+        */
+       public function getControllerExtensionName();
+
+       /**
+        * Sets the subextension name of the controller.
+        *
+        * @param string $subextensionName The subextension name.
+        * @return void
+        * @api
+        */
+       public function setControllerSubextensionName($subextensionName);
+
+       /**
+        * Returns the subextension name of the specified controller.
+        *
+        * @return string The subextension name.
+        * @api
+        */
+       public function getControllerSubextensionName();
+
+       /**
+        * Sets the name of the controller which is supposed to handle the request.
+        * Note: This is not the object name of the controller!
+        *
+        * @param string $controllerName Name of the controller
+        * @return void
+        * @api
+        */
+       public function setControllerName($controllerName);
+
+       /**
+        * Returns the object name of the controller supposed to handle this request, if one
+        * was set already (if not, the name of the default controller is returned)
+        *
+        * @return string Object name of the controller
+        * @api
+        */
+       public function getControllerName();
+
+       /**
+        * Sets the name of the action contained in this request.
+        *
+        * Note that the action name must start with a lower case letter.
+        *
+        * @param string $actionName: Name of the action to execute by the controller
+        * @return void
+        * @throws Tx_Extbase_MVC_Exception_InvalidActionName if the action name is not valid
+        * @api
+        */
+       public function setControllerActionName($actionName);
+
+       /**
+        * Returns the name of the action the controller is supposed to execute.
+        *
+        * @return string Action name
+        * @author Robert Lemke <robert@typo3.org>
+        * @api
+        */
+       public function getControllerActionName();
+
+       /**
+        * Sets the value of the specified argument
+        *
+        * @param string $argumentName Name of the argument to set
+        * @param mixed $value The new value
+        * @return void
+        * @api
+        */
+       public function setArgument($argumentName, $value);
+
+       /**
+        * Sets the whole arguments array and therefore replaces any arguments
+        * which existed before.
+        *
+        * @param array $arguments An array of argument names and their values
+        * @return void
+        * @api
+        */
+       public function setArguments(array $arguments);
+
+       /**
+        * Returns the value of the specified argument
+        *
+        * @param string $argumentName Name of the argument
+        * @return string Value of the argument
+        * @throws Tx_Extbase_MVC_Exception_NoSuchArgument if such an argument does not exist
+        * @api
+        */
+       public function getArgument($argumentName);
+
+       /**
+        * Checks if an argument of the given name exists (is set)
+        *
+        * @param string $argumentName Name of the argument to check
+        * @return boolean TRUE if the argument is set, otherwise FALSE
+        * @api
+        */
+       public function hasArgument($argumentName);
+
+       /**
+        * Returns an array of arguments and their values
+        *
+        * @return array Array of arguments and their values (which may be arguments and values as well)
+        * @api
+        */
+       public function getArguments();
+
+       /**
+        * Sets the requested representation format
+        *
+        * @param string $format The desired format, something like "html", "xml", "png", "json" or the like.
+        * @return void
+        * @api
+        */
+       public function setFormat($format);
+
+       /**
+        * Returns the requested representation format
+        *
+        * @return string The desired format, something like "html", "xml", "png", "json" or the like.
+        * @api
+        */
+       public function getFormat();
+
+       /**
+        * Set the request errors that occured during the request
+        *
+        * @param array $errors An array of Tx_Extbase_Error_Error objects
+        * @return void
+        * @api
+        */
+       public function setErrors(array $errors);
+
+       /**
+        * Get the request errors that occured during the request
+        *
+        * @return array An array of Tx_Extbase_Error_Error objects
+        * @api
+        */
+       public function getErrors();
+
+}
+?>
diff --git a/typo3/sysext/extbase/Classes/MVC/ResponseInterface.php b/typo3/sysext/extbase/Classes/MVC/ResponseInterface.php
new file mode 100644 (file)
index 0000000..2fb0636
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This class is a backport of the corresponding class of FLOW3.
+*  All credits go to the v5 team.
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A generic and very basic response implementation
+ *
+ * @version $Id: ResponseInterface.php 2813 2009-07-16 14:02:34Z k-fish $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @author Robert Lemke <robert@typo3.org>
+ * @scope prototype
+ */
+interface Tx_Extbase_MVC_ResponseInterface {
+
+       /**
+        * Overrides and sets the content of the response
+        *
+        * @param string $content The response content
+        * @return void
+        * @api
+        */
+       public function setContent($content);
+
+       /**
+        * Appends content to the already existing content.
+        *
+        * @param string $content More response content
+        * @return void
+        * @api
+        */
+       public function appendContent($content);
+
+       /**
+        * Returns the response content without sending it.
+        *
+        * @return string The response content
+        * @api
+        */
+       public function getContent();
+
+       /**
+        * Sends the response
+        *
+        * @return void
+        * @api
+        */
+       public function send();
+}
+?>
\ No newline at end of file
index c649dcc..8962fed 100644 (file)
@@ -41,7 +41,7 @@ final class Tx_Extbase_MVC_View_EmptyView extends Tx_Extbase_MVC_View_AbstractVi
         * @return string An empty string
         */
        public function render() {
-               return '';
+               return '<!-- This is the output of the Empty View. An appropriate View was not found. -->';
        }
 
        /**
index 728dec4..88ed8ec 100755 (executable)
  */
 class Tx_Extbase_MVC_Web_Request extends Tx_Extbase_MVC_Request {
 
+       /**
+        * @var string The requested representation format
+        */
+       protected $format = 'html';
+
        /**
         * @var string Contains the request method
         */
index 5161990..1158675 100644 (file)
@@ -57,6 +57,7 @@ class Tx_Extbase_Object_Manager implements Tx_Extbase_Object_ManagerInterface, t
         *
         * @param string $objectName The name of the object to return an instance of
         * @return object The object instance
+        * // TODO This is not part of the official API! Explain why.
         */
        public function getObject($objectName) {
                if (in_array('t3lib_Singleton', class_implements($objectName))) {
diff --git a/typo3/sysext/extbase/Classes/Utility/ClassLoader.php b/typo3/sysext/extbase/Classes/Utility/ClassLoader.php
new file mode 100644 (file)
index 0000000..4a119db
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This class is a backport of the corresponding class of FLOW3.
+*  All credits go to the v5 team.
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Autoloader of Extbase
+ *
+ * @package Extbase
+ * @subpackage Utility
+ * @version $Id: $
+ */
+class Tx_Extbase_Utility_ClassLoader {
+       
+       /**
+        * Loads php files containing classes or interfaces found in the classes directory of
+        * an extension.
+        *
+        * @param string $className: Name of the class/interface to load
+        * @uses t3lib_extMgm::extPath()
+        * @return void
+        */
+       public static function loadClass($className) {
+               // TODO Remove debug code
+               // TODO Make a registry for Extbase classes
+               //$starttime = microtime(true);
+               $classNameParts = explode('_', $className, 3);
+               $extensionKey = Tx_Extbase_Utility_Extension::convertCamelCaseToLowerCaseUnderscored($classNameParts[1]);
+               if (t3lib_extMgm::isLoaded($extensionKey)) {
+                       $classFilePathAndName = t3lib_extMgm::extPath($extensionKey) . 'Classes/' . strtr($classNameParts[2], '_', '/') . '.php';
+                       if (file_exists($classFilePathAndName)) {
+                               require($classFilePathAndName);
+                       }
+               }
+               //$endtime = microtime(true);
+               //debug(($endtime - $starttime) * 10000, $className);
+       }
+       
+}
+?>
\ No newline at end of file
index 1f34ea4..48a01dd 100644 (file)
@@ -23,7 +23,7 @@
 ***************************************************************/
 
 /**
- * Utilities to manage plugins and  modules of an extension. Also useful to auto-generate the autoloader registry
+ * Utilities to manage plugins and  modules of an extension. Also useful to auto-generate the autoloader registry 
  * file ext_autoload.php.
  *
  * @package Extbase
@@ -51,7 +51,7 @@ class Tx_Extbase_Utility_Extension {
         * @param string $defaultControllerAction is an optional array controller name (as array key) and action name (as array value) that should be called as default
         * @return void
         */
-       public static function configureDispatcher($extensionName, $pluginName, array $controllerActions, array $nonCachableControllerActions = array()) {
+       public static function configurePlugin($extensionName, $pluginName, array $controllerActions, array $nonCachableControllerActions = array()) {
                if (empty($pluginName)) {
                        throw new InvalidArgumentException('The plugin name must not be empty', 1239891987);
                }
@@ -166,74 +166,19 @@ tt_content.list.20.' . $pluginSignature . ' {
 
                t3lib_extMgm::addPlugin(array($pluginTitle, $pluginSignature), 'list_type');
        }
-
-       /**
-        * Registers an Extbase module (main or sub) to the backend interface.
-        * FOR USE IN ext_tables.php FILES
-        *
-        * @param string $extensionName The extension name (in UpperCamelCase) or the extension key (in lower_underscore)
-        * @param array $controllerActions is an array of allowed combinations of controller and action stored in an array (controller name as key and a comma separated list of action names as value, the first controller and its first action is chosen as default)
-        * @param array $config The configuration options of the module (icon, locallang.xml file)
-        * @param string $main The main module key, $sub is the submodule key. So $main would be an index in the $TBE_MODULES array and $sub could be an element in the lists there. If $main is not set a blank $extensionName module is created
-        * @param string $sub The submodule key. If $sub is not set a blank $main module is created
-        * @param string $position This can be used to set the position of the $sub module within the list of existing submodules for the main module. $position has this syntax: [cmd]:[submodule-key]. cmd can be "after", "before" or "top" (or blank which is default). If "after"/"before" then submodule will be inserted after/before the existing submodule with [submodule-key] if found. If not found, the bottom of list. If "top" the module is inserted in the top of the submodule list.
-        * @return void
-        */
-       public static function registerModule($extensionName, array $controllerActions, $config = array(), $main = '', $sub = '', $position = '') {
-               if (empty($extensionName)) {
-                       throw new InvalidArgumentException('The extension name was invalid (must not be empty and must match /[A-Za-z][_A-Za-z0-9]/)', 1239891989);
-               }
-               $extensionKey = $extensionName;
-               $extensionName = str_replace(' ', '', ucwords(str_replace('_', ' ', $extensionName)));
-
-               $path = t3lib_extMgm::extPath($extensionKey, 'Classes/');
-               $relPath = t3lib_extMgm::extRelPath($extensionKey) . 'Classes/';
-
-               if (!isset($GLOBALS['TBE_EXTBASE_MODULES'])) {
-                       $GLOBALS['TBE_EXTBASE_MODULES'] = array();
-               }
-
-               // TODO Make if condition explicit
-               if ($main && !isset($GLOBALS['TBE_MODULES'][$main])) {
-                       $main = $extensionName . ucfirst($main);
-               } else {
-                       $main = $main ? $main : $extensionName;
-               }
-
-               if (!is_array($config) || count($config) == 0) {
-                       $config['access'] = 'admin';
-                       $config['icon'] = '';
-                       $config['labels'] = '';
-                       $config['extRelPath'] = $relPath;
-               }
-
-               $key = $main . ($sub ? '_' . $sub : '');
-
-               $moduleConfig = array(
-                       'name' => $key,
-                       'extensionKey' => $extensionKey,
-                       'extensionName' => $extensionName,
-                       'controllerActions' => $controllerActions,
-                       'config' => $config,
-               );
-               $GLOBALS['TBE_EXTBASE_MODULES'][$key] = $moduleConfig;
-               $GLOBALS['TBE_EXTBASE_MODULES'][$key]['configureModuleFunction'] = array('Tx_Extbase_Utility_Extension', 'setModuleConfiguration');
-
-               t3lib_extMgm::addModule($main, $sub, $position, $path);
-       }
-
+       
        /**
         * This method is called from t3lib_loadModules::checkMod and it replaces old conf.php.
-        *
+        * 
         * @param string $key The module name
         * @param string $fullpath      Absolute path to module
         * @param array $MCONF Reference to the array holding the configuration of the module
         * @param array $MLANG Reference to the array holding the localized module labels
         * @return array Configuration of the module
         */
-       public function setModuleConfiguration($key, $fullpath, $MCONF, $MLANG) {
+       public function configureModule($key, $fullpath, array $MCONF = array(), array $MLANG = array()) {
                $path = preg_replace('/\/[^\/.]+\/\.\.\//', '/', $fullpath); // because 'path/../path' does not work
-               $config = $GLOBALS['TBE_EXTBASE_MODULES'][$key]['config'];
+               $config = $GLOBALS['TBE_MODULES'][$key]['config'];
                define('TYPO3_MOD_PATH', $config['extRelPath']);
 
                $GLOBALS['BACK_PATH'] = '';
@@ -247,7 +192,7 @@ tt_content.list.20.' . $pluginSignature . ' {
                        list($extKey, $local) = explode('/', substr($config['icon'], 4), 2);
                        $config['icon'] = t3lib_extMgm::extRelPath($extKey) . $local;
                }
-
+         
                        // Initialize search for alternative icon:
                $altIconKey = 'MOD:' . $key . '/' . $config['icon'];            // Alternative icon key (might have an alternative set in $TBE_STYLES['skinImg']
                $altIconAbsPath = is_array($GLOBALS['TBE_STYLES']['skinImg'][$altIconKey]) ? t3lib_div::resolveBackPath(PATH_typo3.$GLOBALS['TBE_STYLES']['skinImg'][$altIconKey][0]) : '';
@@ -261,15 +206,15 @@ tt_content.list.20.' . $pluginSignature . ' {
                }
 
                        // Fill $MLANG
-               $MLANG['default']['ll_ref'] = $config['labels'];
-
+               $MLANG['default']['ll_ref'] = $config['labels'];   
+               
                        // Finally, set the icon with correct path:
                if (substr($tabImage, 0 ,3) === '../') {
                        $MLANG['default']['tabs_images']['tab'] = PATH_site . substr($tabImage, 3);
                } else {
                        $MLANG['default']['tabs_images']['tab'] = PATH_typo3 . $tabImage;
                }
-
+               
                        // If LOCAL_LANG references are used for labels of the module:
                if ($MLANG['default']['ll_ref']) {
                                // Now the 'default' key is loaded with the CURRENT language - not the english translation...
@@ -281,11 +226,11 @@ tt_content.list.20.' . $pluginSignature . ' {
                        $GLOBALS['LANG']->addModuleLabels($MLANG['default'], $key . '_');
                        $GLOBALS['LANG']->addModuleLabels($MLANG[$GLOBALS['LANG']->lang], $key . '_');
                }
-
+               
                        // Fill $modconf
-               $modconf['script'] = 'mod.php?M=Tx_' . rawurlencode($key);
+               $modconf['script'] = 'mod.php?M=' . rawurlencode($key);
                $modconf['name'] = $key;
-
+                                       
                                // Default tab setting
                if ($MCONF['defaultMod']) {
                        $modconf['defaultMod'] = $MCONF['defaultMod'];
@@ -298,15 +243,70 @@ tt_content.list.20.' . $pluginSignature . ' {
                                $modconf['navFrameScript'] = $this->getRelativePath(PATH_typo3, $fullpath . '/' . $MCONF['navFrameScript']);
                        }
                }
-
+               
                        // Additional params for Navigation Frame Script: "&anyParam=value&moreParam=1"
                if ($MCONF['navFrameScriptParam']) {
                        $modconf['navFrameScriptParam'] = $MCONF['navFrameScriptParam'];
                }
-
+                               
                return $modconf;
        }
+       
+       /**
+        * Registers an Extbase module (main or sub) to the backend interface.
+        * FOR USE IN ext_tables.php FILES
+        *
+        * @param string $extensionName The extension name (in UpperCamelCase) or the extension key (in lower_underscore)
+        * @param string $main The main module key, $sub is the submodule key. So $main would be an index in the $TBE_MODULES array and $sub could be an element in the lists there. If $main is not set a blank $extensionName module is created
+        * @param string $sub The submodule key. If $sub is not set a blank $main module is created
+        * @param string $position This can be used to set the position of the $sub module within the list of existing submodules for the main module. $position has this syntax: [cmd]:[submodule-key]. cmd can be "after", "before" or "top" (or blank which is default). If "after"/"before" then submodule will be inserted after/before the existing submodule with [submodule-key] if found. If not found, the bottom of list. If "top" the module is inserted in the top of the submodule list.
+        * @param array $controllerActions is an array of allowed combinations of controller and action stored in an array (controller name as key and a comma separated list of action names as value, the first controller and its first action is chosen as default)
+        * @param array $config The configuration options of the module (icon, locallang.xml file)
+        * @return void
+        */
+       public static function registerModule($extensionName, $main = '', $sub = '', $position = '', array $controllerActions, $config = array()) {
+               if (empty($extensionName)) {
+                       throw new InvalidArgumentException('The extension name was invalid (must not be empty and must match /[A-Za-z][_A-Za-z0-9]/)', 1239891989);
+               }
+               $extensionKey = $extensionName; // FIXME This will break if the $extensionName is given as BlogExample
+               $extensionName = str_replace(' ', '', ucwords(str_replace('_', ' ', $extensionName)));
+               
+               $path = t3lib_extMgm::extPath($extensionKey, 'Classes/');
+               $relPath = t3lib_extMgm::extRelPath($extensionKey) . 'Classes/';
 
+               if (!is_array($config) || count($config) == 0) {
+                       $config['access'] = 'admin';
+                       $config['icon'] = '';
+                       $config['labels'] = '';
+                       $config['extRelPath'] = $relPath;
+               }
+                               
+               if ((strlen($main) > 0) && !isset($GLOBALS['TBE_MODULES'][$main])) {
+                       $main = $extensionName . self::convertLowerUnderscoreToUpperCamelCase($main);
+               } else {
+                       $main = (strlen($main) > 0) ? $main : 'web'; // TODO By now, $main must default to 'web'
+               }
+               
+               if ((strlen($sub) > 0)) {
+                       $sub = $extensionName . self::convertLowerUnderscoreToUpperCamelCase($sub);
+                       $key = $main . '_' . $sub;
+               } else {
+                       $key = $main;
+               }
+               
+               $moduleConfig = array(
+                       'name' => $key,
+                       'extensionKey' => $extensionKey,
+                       'extensionName' => $extensionName,
+                       'controllerActions' => $controllerActions,
+                       'config' => $config,
+               );
+               $GLOBALS['TBE_MODULES'][$key] = $moduleConfig;
+               $GLOBALS['TBE_MODULES'][$key]['configureModuleFunction'] = array('Tx_Extbase_Utility_Extension', 'configureModule');
+
+               t3lib_extMgm::addModule($main, $sub, $position);
+       }
+       
        // TODO PHPdoc
        public static function convertCamelCaseToLowerCaseUnderscored($string) {
                static $conversionMap = array();
@@ -325,8 +325,8 @@ tt_content.list.20.' . $pluginSignature . ' {
        public static function convertLowerUnderscoreToUpperCamelCase($camelCasedString) {
                return t3lib_div::underscoredToUpperCamelCase($camelCasedString);
        }
-
-       /**
+       
+               /**
         * Build the autoload registry for a given extension and place it ext_autoload.php.
         *
         * @param       string  $extensionKey   Key of the extension
@@ -355,7 +355,7 @@ tt_content.list.20.' . $pluginSignature . ' {
                }
                $errors[] = 'Wrote the following data: <pre>' . htmlspecialchars($autoloadFileString) . '</pre>';
                return implode('<br />', $errors);
-       }
+       }       
 
        /**
         * Generate autoload PHP file data. Takes an associative array with class name to file mapping, and outputs it as PHP.
@@ -481,6 +481,6 @@ tt_content.list.20.' . $pluginSignature . ' {
                }
                return $returnValue;
        }
-
+       
 }
 ?>
\ No newline at end of file
index 79771e3..7bc665f 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 2009 Christian Mller <christian@kitsunet.de>
+*  (c) 2009 Christian Müller <christian@kitsunet.de>
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
  */
 class Tx_Extbase_Utility_TypoScript {
 
+       /**
+        * Removes all trailing dots recursively from TS settings array
+        * TODO Explain why we remove the dots.
+        *
+        * @param array $setup The settings array
+        * @return void
+        * @api
+        */
+       public static function convertTypoScriptArrayToPlainArray(array $settings) {
+               $processedSettings = array();
+               // TODO Check if the t3lib_div::removeDotsFromTS() fits for this purpose (using rtrim() for removing trailing dots)
+               foreach ($settings as $key => $value) {
+                       if (substr($key, -1) === '.') {
+                               $keyWithoutDot = substr($key, 0, -1);
+                               if (is_array($value)) {
+                                       $processedSettings[$keyWithoutDot] = self::convertTypoScriptArrayToPlainArray($value);
+                               } else {
+                                       $processedSettings[$keyWithoutDot] = NULL;
+                               }
+                               if (array_key_exists($keyWithoutDot, $settings)) {
+                                       $processedSettings[$keyWithoutDot]['_typoScriptNodeValue'] = $settings[$keyWithoutDot];
+                                       unset($settings[$keyWithoutDot]);
+                               }
+                       } else {
+                               $keyWithDot = $key . '.';
+                               if (array_key_exists($keyWithDot, $settings)) {
+                                       $processedSettings[$key] = self::convertTypoScriptArrayToPlainArray($settings[$keyWithDot]);
+                                       $processedSettings[$key]['_typoScriptNodeValue'] = $value;
+                                       unset($settings[$keyWithDot]);
+                               } else {
+                                       $processedSettings[$key] = $value;
+                               }
+                       }
+               }
+               return $processedSettings;
+       }
+
        /**
         * Returns an array with Typoscript the old way (with dot).
         *
@@ -39,26 +76,26 @@ class Tx_Extbase_Utility_TypoScript {
         * However, if you want to call legacy TypoScript objects, you somehow need the "old" syntax (because this is what TYPO3 is used to).
         * With this method, you can convert the extbase TypoScript to classical TYPO3 TypoScript which is understood by the rest of TYPO3.
         *
-        * @param array $extbaseTS An Typoscript Array with Extbase Syntax (without dot but with _typoscriptNodeValue)
+        * @param array $plainArray An Typoscript Array with Extbase Syntax (without dot but with _typoscriptNodeValue)
         * @return array array with Typoscript as usual (with dot)
         * @api
         */
-       static public function convertExtbaseToClassicTS($extbaseTS) {
-               $classicTS = array();
-               if (is_array($extbaseTS)) {
-                       foreach ($extbaseTS as $key => $value) {
+       public static function convertPlainArrayToTypoScriptArray($plainArray) {
+               $typoScriptArray = array();
+               if (is_array($plainArray)) {
+                       foreach ($plainArray as $key => $value) {
                                if (is_array($value)) {
                                        if (isset($value['_typoscriptNodeValue'])) {
-                                               $classicTS[$key] = $value['_typoscriptNodeValue'];
+                                               $typoScriptArray[$key] = $value['_typoscriptNodeValue'];
                                                unset($value['_typoscriptNodeValue']);
                                        }
-                                       $classicTS[$key.'.'] = Tx_Extbase_Utility_TypoScript::convertExtbaseToClassicTS($value);
+                                       $typoScriptArray[$key.'.'] = Tx_Extbase_Utility_TypoScript::convertPlainArrayToTypoScriptArray($value);
                                } else {
-                                       $classicTS[$key] = $value;
+                                       $typoScriptArray[$key] = $value;
                                }
                        }
                }
-               return $classicTS;
+               return $typoScriptArray;
        }
 }
 ?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/View/EmptyView.php b/typo3/sysext/extbase/Classes/View/EmptyView.php
deleted file mode 100644 (file)
index a75131b..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This class is a backport of the corresponding class of FLOW3.
-*  All credits go to the v5 team.
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * An empty view - a special case.
- *
- * @package Extbase
- * @subpackage View
- * @version $ID:$
- */
-class Tx_Extbase_View_EmptyView extends Tx_Extbase_MVC_View_AbstractView {
-
-       /**
-        * Renders the empty view
-        *
-        * @return string An empty string
-        */
-       public function render() {
-               return '';
-       }
-
-       /**
-        * A magic call method.
-        *
-        * Because this empty view is used as a Special Case in situations when no matching
-        * view is available, it must be able to handle method calls which originally were
-        * directed to another type of view. This magic method should prevent PHP from issuing
-        * a fatal error.
-        *
-        * @return void
-        */
-       public function __call($methodName, array $arguments) {
-       }
-}
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Resources/Scripts/RenderDocumentation.php b/typo3/sysext/extbase/Resources/Scripts/RenderDocumentation.php
new file mode 100644 (file)
index 0000000..156c975
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+// Temporary script to render documentation with PHP_UML.
+
+// The path to PHP_UML has to be adjusted by hand right now.
+require_once('/Users/sebastian/web-data/flow3/Packages/Application/DocTools/Resources/Private/PHP/PHP_UML/UML.php');
+$renderer = new PHP_UML();
+$renderer->deploymentView = FALSE;
+$renderer->structureFromDocblocks = TRUE;
+$renderer->completeAPI = FALSE;
+$renderer->setInput('../Classes');
+$renderer->parse('Extbase');
+$renderer->generateXMI(2.1, 'utf-8');
+$renderer->export('html', '../Documentation/API/');
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Scripts/RenderDocumentation.php b/typo3/sysext/extbase/Scripts/RenderDocumentation.php
deleted file mode 100644 (file)
index 156c975..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-// Temporary script to render documentation with PHP_UML.
-
-// The path to PHP_UML has to be adjusted by hand right now.
-require_once('/Users/sebastian/web-data/flow3/Packages/Application/DocTools/Resources/Private/PHP/PHP_UML/UML.php');
-$renderer = new PHP_UML();
-$renderer->deploymentView = FALSE;
-$renderer->structureFromDocblocks = TRUE;
-$renderer->completeAPI = FALSE;
-$renderer->setInput('../Classes');
-$renderer->parse('Extbase');
-$renderer->generateXMI(2.1, 'utf-8');
-$renderer->export('html', '../Documentation/API/');
-?>
\ No newline at end of file
index dc0a6cf..3f0056e 100644 (file)
@@ -35,12 +35,18 @@ abstract class Tx_Extbase_Base_testcase extends tx_phpunit_testcase {
         */
        protected $objectManager;
 
+       /**
+        * Constructs this TestCase and registers the autoloader
+        */
+       public function __construct() {
+               spl_autoload_register(array('Tx_Extbase_Utility_Extension', 'autoloadClass'));
+       }
+
        /**
         * Injects an untainted clone of the object manager and all its referencing
         * objects for every test.
         *
         * @return void
-
         */
        public function runBare() {
                $objectManager = t3lib_div::makeInstance('Tx_Extbase_Object_Manager');
index 85e93ae..00ead87 100644 (file)
@@ -188,18 +188,20 @@ class Tx_Extbase_MVC_Controller_ActionController_testcase extends Tx_Extbase_Bas
         * @test
         */
        public function resolveViewPreparesTheViewSpecifiedInTheRequestObjectAndUsesTheEmptyViewIfNoneCouldBeFound() {
-               $mockRequest = $this->getMock('Tx_Extbase_MVC_Web_Request', array(), array(), '', FALSE);
-               $mockRequest->expects($this->at(0))->method('getControllerExtensionKey')->will($this->returnValue('Foo'));
+               $mockRequest = $this->getMock('Tx_Extbase_MVC_RequestInterface', array(), array(), '', FALSE);
+               $mockRequest->expects($this->at(0))->method('getControllerExtensionName')->will($this->returnValue('Foo'));
+               $mockRequest->expects($this->at(1))->method('getControllerSubextensionName')->will($this->returnValue(''));
                $mockRequest->expects($this->at(1))->method('getControllerName')->will($this->returnValue('Test'));
                $mockRequest->expects($this->at(2))->method('getControllerActionName')->will($this->returnValue('list'));
+               $mockRequest->expects($this->once())->method('getFormat')->will($this->returnValue('html'));
 
-               $mockControllerContext = $this->getMock('Tx_Extbase_MVC_Controller_ControllerContext', array('getRequest'), array(), '', FALSE);
+               $mockControllerContext = $this->getMock('Tx_extbase_MVC_Controller_ControllerContext', array('getRequest'), array(), '', FALSE);
                $mockControllerContext->expects($this->any())->method('getRequest')->will($this->returnValue($mockRequest));
 
-               $mockFluidTemplateView = $this->getMock('Tx_Extbase_MVC_View_AbstractView', array('setControllerContext', 'getViewHelper', 'assign', 'render', 'hasTemplate'));
+               $mockFluidTemplateView = $this->getMock('Tx_Extbase_MVC_View_ViewInterface', array('setControllerContext', 'getViewHelper', 'assign', 'assignMultiple', 'render', 'hasTemplate'));
                $mockFluidTemplateView->expects($this->once())->method('setControllerContext')->with($mockControllerContext);
                $mockFluidTemplateView->expects($this->once())->method('hasTemplate')->will($this->returnValue(FALSE));
-               $mockView = $this->getMock('Tx_Extbase_MVC_View_AbstractView');
+               $mockView = $this->getMock('Tx_Extbase_MVC_View_ViewInterface');
                $mockView->expects($this->once())->method('setControllerContext')->with($mockControllerContext);
 
                $mockObjectManager = $this->getMock('Tx_Extbase_Object_ManagerInterface', array(), array(), '', FALSE);
@@ -212,7 +214,7 @@ class Tx_Extbase_MVC_Controller_ActionController_testcase extends Tx_Extbase_Bas
                $mockController->_set('objectManager', $mockObjectManager);
 
                $this->assertSame($mockView, $mockController->_call('resolveView'));
-       }
+               }
 
        /**
         * @test
@@ -361,30 +363,34 @@ class Tx_Extbase_MVC_Controller_ActionController_testcase extends Tx_Extbase_Bas
        public function initializeActionMethodValidatorsDetectsValidateAnnotationsAndRegistersNewValidatorsForEachArgument() {
                $mockController = $this->getMock($this->buildAccessibleProxy('Tx_Extbase_MVC_Controller_ActionController'), array('fooAction'), array(), '', FALSE);
        
-               $chain1 = $this->getMock('Tx_Extbase_Validation_Validator_ConjunctionValidator', array(), array(), '', FALSE);
-               $chain2 = $this->getMock('Tx_Extbase_Validation_Validator_ConjunctionValidator', array(), array(), '', FALSE);
+               $conjunction1 = $this->getMock('Tx_Extbase_Validation_Validator_ConjunctionValidator', array(), array(), '', FALSE);
+               $conjunction2 = $this->getMock('Tx_Extbase_Validation_Validator_ConjunctionValidator', array(), array(), '', FALSE);
        
-               $validatorChains = array(
-                       'arg1' => $chain1,
-                       'arg2' => $chain2
+               $validatorConjunctions = array(
+                       'arg1' => $conjunction1,
+                       'arg2' => $conjunction2
                );
        
                $mockValidatorResolver = $this->getMock('Tx_Extbase_Validation_ValidatorResolver', array(), array(), '', FALSE);
-               $mockValidatorResolver->expects($this->once())->method('buildMethodArgumentsValidatorConjunctions')->with(get_class($mockController), 'fooAction')->will($this->returnValue($validatorChains));
-       
-               $mockArgument = $this->getMock('Tx_Extbase_MVC_Controller_Argument', array(), array(), '', FALSE);
-               $mockArgument->expects($this->at(0))->method('setValidator')->with($chain1);
-               $mockArgument->expects($this->at(1))->method('setValidator')->with($chain1);
+               $mockValidatorResolver->expects($this->once())->method('buildMethodArgumentsValidatorConjunctions')->with(get_class($mockController), 'fooAction')->will($this->returnValue($validatorConjunctions));
        
+               $mockArgument = $this->getMock('Tx_Extbase_MVC_Controller_Argument', array('setValidator'), array(), '', FALSE);
+               $mockArgument->expects($this->at(0))->method('setValidator')->with($conjunction1);
+               $mockArgument->expects($this->at(1))->method('setValidator')->with($conjunction2);
+               
                $mockArguments = $this->getMock('Tx_Extbase_MVC_Controller_Arguments', array(), array(), '', FALSE);
                $mockArguments->expects($this->at(0))->method('offsetExists')->with('arg1')->will($this->returnValue(TRUE));
                $mockArguments->expects($this->at(1))->method('offsetGet')->with('arg1')->will($this->returnValue($mockArgument));
                $mockArguments->expects($this->at(2))->method('offsetExists')->with('arg2')->will($this->returnValue(TRUE));
                $mockArguments->expects($this->at(3))->method('offsetGet')->with('arg2')->will($this->returnValue($mockArgument));
-       
-               $mockController->injectValidatorResolver($mockValidatorResolver);
+               
+               $mockReflectionService = $this->getMock('Tx_Extbase_Reflection_Service', array(), array(), '', FALSE);
+               $mockReflectionService->expects($this->once())->method('getMethodTagsValues')->with(get_class($mockController), 'fooAction')->will($this->returnValue(array('tag' => 'lorem ipsum')));
+               
+               $mockController->_set('validatorResolver', $mockValidatorResolver);
                $mockController->_set('actionMethodName', 'fooAction');
                $mockController->_set('arguments', $mockArguments);
+               $mockController->_set('reflectionService', $mockReflectionService);
                $mockController->_call('initializeActionMethodValidators');
        }
 
index 8434b30..2cc0b38 100644 (file)
@@ -5,7 +5,6 @@
 $extensionClassesPath = t3lib_extMgm::extPath('extbase') . 'Classes/';
 return array(
        'tx_extbase_dispatcher' => $extensionClassesPath . 'Dispatcher.php',
-       'tx_extbase_backenddispatcher' => $extensionClassesPath . 'BackendDispatcher.php',
        'tx_extbase_exception' => $extensionClassesPath . 'Exception.php',
        'tx_extbase_configuration_exception' => $extensionClassesPath . 'Configuration/Exception.php',
        'tx_extbase_configuration_manager' => $extensionClassesPath . 'Configuration/Manager.php',
@@ -17,7 +16,6 @@ return array(
        'tx_extbase_configuration_exception_parseerror' => $extensionClassesPath . 'Configuration/Exception/ParseError.php',
        'tx_extbase_configuration_source_flexformsource' => $extensionClassesPath . 'Configuration/Source/FlexFormSource.php',
        'tx_extbase_configuration_source_typoscriptsource' => $extensionClassesPath . 'Configuration/Source/TypoScriptSource.php',
-       'tx_extbase_controller_standardcontroller' => $extensionClassesPath . 'Controller/StandardController.php',
        'tx_extbase_domain_model_frontenduser' => $extensionClassesPath . 'Domain/Model/FrontendUser.php',
        'tx_extbase_domain_model_frontendusergroup' => $extensionClassesPath . 'Domain/Model/FrontendUserGroup.php',
        'tx_extbase_domain_repository_frontendusergrouprepository' => $extensionClassesPath . 'Domain/Repository/FrontendUserGroupRepository.php',
@@ -52,6 +50,7 @@ return array(
        'tx_extbase_exception_unsupportedrequesttype' => $extensionClassesPath . 'Exception/UnsupportedRequestType.php',
        'tx_extbase_mvc_exception' => $extensionClassesPath . 'MVC/Exception.php',
        'tx_extbase_mvc_request' => $extensionClassesPath . 'MVC/Request.php',
+       'tx_extbase_mvc_requestinterface' => $extensionClassesPath . 'MVC/RequestInterface.php',
        'tx_extbase_mvc_response' => $extensionClassesPath . 'MVC/Response.php',
        'tx_extbase_mvc_controller_abstractcontroller' => $extensionClassesPath . 'MVC/Controller/AbstractController.php',
        'tx_extbase_mvc_controller_actioncontroller' => $extensionClassesPath . 'MVC/Controller/ActionController.php',
index 0f5e793..faf6ee4 100644 (file)
@@ -12,6 +12,5 @@ $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['cache_extb
        ),
 );
 
-
 # $GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:extbase/Classes/Persistence/Hook/TCEMainValueObjectUpdater.php:tx_Extbase_Persistence_Hook_TCEMainValueObjectUpdater';
 ?>
\ No newline at end of file
index 4a0de8d..e1fbfba 100644 (file)
@@ -14,6 +14,8 @@ if (TYPO3_MODE == 'BE') {
        } catch(t3lib_cache_exception_NoSuchCache $exception) {
 
        }
+       
+       $TBE_MODULES['_dispatcher'][] = t3lib_div::makeInstance('Tx_Extbase_Dispatcher');
 }
 
-?>
+?>
\ No newline at end of file