[~TASK] Extbase: Reimplemented BE module support. Still needs cleanup.
authorJochen Rau <j.rau@web.de>
Tue, 16 Nov 2010 10:17:24 +0000 (10:17 +0000)
committerJochen Rau <j.rau@web.de>
Tue, 16 Nov 2010 10:17:24 +0000 (10:17 +0000)
typo3/sysext/extbase/Classes/Configuration/AbstractConfigurationManager.php
typo3/sysext/extbase/Classes/Configuration/BackendConfigurationManager.php
typo3/sysext/extbase/Classes/Configuration/ConfigurationManager.php
typo3/sysext/extbase/Classes/Configuration/FrontendConfigurationManager.php
typo3/sysext/extbase/Classes/Core/Bootstrap.php
typo3/sysext/extbase/ext_tables.php

index e8c5e84..3efdda0 100644 (file)
@@ -53,18 +53,6 @@ abstract class Tx_Extbase_Configuration_AbstractConfigurationManager implements
        protected $objectManager;
 
        /**
-        * name of the extension this Configuration Manager instance belongs to
-        * @var string
-        */
-       protected $extensionName;
-
-       /**
-        * name of the plugin this Configuration Manager instance belongs to
-        * @var string
-        */
-       protected $pluginName;
-
-       /**
         * 1st level configuration cache
         *
         * @var array
@@ -104,135 +92,37 @@ abstract class Tx_Extbase_Configuration_AbstractConfigurationManager implements
        public function setConfiguration(array $configuration = array()) {
                // reset 1st level cache
                $this->configurationCache = array();
-
-               $this->extensionName = $configuration['extensionName'];
-               $this->pluginName = $configuration['pluginName'];
-               $this->configuration = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($configuration);
+               $this->configuration = $configuration;
        }
 
-       /**
-        * Loads the Extbase Framework configuration.
-        *
-        * The Extbase framework configuration HAS TO be retrieved using this method, as they are come from different places than the normal settings.
-        * Framework configuration is, in contrast to normal settings, needed for the Extbase framework to operate correctly.
-        *
-        * @param string $extensionName if specified, the configuration for the given extension will be returned (plugin.tx_extensionname)
-        * @param string $pluginName if specified, the configuration for the given plugin will be returned (plugin.tx_extensionname_pluginname)
-        * @return array the Extbase framework configuration
-        */
-       public function getConfiguration($extensionName = NULL, $pluginName = NULL) {
-               // 1st level cache
-               if ($extensionName !== NULL) {
-                       if ($pluginName === NULL) {
-                               throw new Tx_Extbase_Configuration_Exception('You\'ll have to specify either both, extensionName and pluginName, or neither.', 1289852422);
-                       }
-                       $configurationCacheKey = strtolower($extensionName . '_' . $pluginName);
-               } else {
-                       $configurationCacheKey = strtolower($this->extensionName . '_' . $this->pluginName);
-               }
-               if (isset($this->configurationCache[$configurationCacheKey])) {
-                       return $this->configurationCache[$configurationCacheKey];
-               }
-
-               $frameworkConfiguration = $this->getExtbaseConfiguration();
-               if (!isset($frameworkConfiguration['persistence']['storagePid'])) {
-                       $frameworkConfiguration['persistence']['storagePid'] = self::DEFAULT_BACKEND_STORAGE_PID;
-               }
-
-               if ($extensionName !== NULL) {
-                       $pluginConfiguration = $this->getPluginConfiguration($extensionName, $pluginName);
-                       $pluginConfiguration['controllerConfiguration'] = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$extensionName][$pluginName]['controllers'];
-               } else {
-                       $pluginConfiguration = $this->getPluginConfiguration($this->extensionName, $this->pluginName);
-                       $pluginConfiguration = t3lib_div::array_merge_recursive_overrule($pluginConfiguration, $this->configuration);
-                       $pluginConfiguration['controllerConfiguration'] = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][$this->extensionName][$this->pluginName]['controllers'];
-                       if (isset($this->configuration['switchableControllerActions'])) {
-                               $this->overrideSwitchableControllerActions($pluginConfiguration, $this->configuration['switchableControllerActions']);
-                       }
-               }
-               $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, $pluginConfiguration);
-
-               // only load context specific configuration when retrieving configuration of the current plugin
-               if ($extensionName === NULL || ($extensionName === $this->extensionName && $pluginName === $this->pluginName)) {
-                       $frameworkConfiguration = $this->getContextSpecificFrameworkConfiguration($frameworkConfiguration);
-               }
-
-               // 1st level cache
-               $this->configurationCache[$configurationCacheKey] = $frameworkConfiguration;
-               return $frameworkConfiguration;
-       }
 
        /**
-        * Returns the TypoScript configuration found in config.tx_extbase
+        * Returns TypoScript Setup array from current Environment.
         *
-        * @return array
+        * @return array the TypoScript setup
         */
-       protected function getExtbaseConfiguration() {
-               $setup = $this->getTypoScriptSetup();
-               $extbaseConfiguration = array();
-               if (isset($setup['config.']['tx_extbase.'])) {
-                       $extbaseConfiguration = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($setup['config.']['tx_extbase.']);
-               }
-               return $extbaseConfiguration;
-       }
+       abstract protected function getTypoScriptSetup();
 
        /**
-        * Returns the TypoScript configuration found in plugin.tx_yourextension_yourplugin
-        * merged with the global configuration of your extension from plugin.tx_yourextension
+        * Resolves the TypoScript reference for $pluginConfiguration[$setting].
+        * In case the setting is a string and starts with "<", we know that this is a TypoScript reference which
+        * needs to be resolved separately.
         *
-        * @param string $extensionName
-        * @param string $pluginName
-        * @return array
-        */
-       protected function getPluginConfiguration($extensionName, $pluginName) {
-               $setup = $this->getTypoScriptSetup();
-               $pluginConfiguration = array();
-               if (is_array($setup['plugin.']['tx_' . strtolower($extensionName) . '.'])) {
-                       $pluginConfiguration = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($setup['plugin.']['tx_' . strtolower($extensionName) . '.']);
-               }
-               $pluginSignature = strtolower($extensionName . '_' . $pluginName);
-               if (is_array($setup['plugin.']['tx_' . $pluginSignature . '.'])) {
-                       $pluginConfiguration = t3lib_div::array_merge_recursive_overrule($pluginConfiguration, Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($setup['plugin.']['tx_' . $pluginSignature . '.']));
+        * @param array $pluginConfiguration The whole plugin configuration
+        * @param string $setting The key inside the $pluginConfiguration to check
+        * @return array The modified plugin configuration
+        */
+       protected function resolveTyposcriptReference($pluginConfiguration, $setting) {
+               if (is_string($pluginConfiguration[$setting]) && substr($pluginConfiguration[$setting], 0, 1) === '<') {
+                       $key = trim(substr($pluginConfiguration[$setting], 1));
+                       $setup = $this->getTypoScriptSetup();
+                       list(, $newValue) = $this->typoScriptParser->getVal($key, $setup);
+
+                       unset($pluginConfiguration[$setting]);
+                       $pluginConfiguration[$setting . '.'] = $newValue;
                }
                return $pluginConfiguration;
        }
 
-       /**
-        * @param array $frameworkConfiguration
-        * @param array $overriddenSwitchableControllerActions in the format array('Controller1' => array('action1', 'action2'), 'Controller2' => ...)
-        * @return void
-        */
-       protected function overrideSwitchableControllerActions(array &$frameworkConfiguration, array $switchableControllerActions) {
-               $overriddenSwitchableControllerActions = array();
-               foreach ($switchableControllerActions as $controllerName => $actions) {
-                       $overriddenSwitchableControllerActions[$controllerName] = array('actions' => $actions);
-                       $nonCacheableActions = $frameworkConfiguration['controllerConfiguration'][$controllerName]['nonCacheableActions'];
-                       $overriddenNonCacheableActions = array_intersect($nonCacheableActions, $actions);
-                       if (!empty($overriddenNonCacheableActions)) {
-                               $overriddenSwitchableControllerActions[$controllerName]['nonCacheableActions'] = $overriddenNonCacheableActions;
-                       }
-               }
-               $frameworkConfiguration['controllerConfiguration'] = $overriddenSwitchableControllerActions;
-       }
-
-       /**
-        * The context specific configuration returned by this method
-        * will override the framework configuration which was
-        * obtained from TypoScript. This can be used f.e. to override the storagePid
-        * with the value set inside the Plugin Instance.
-        *
-        * WARNING: Make sure this method ALWAYS returns an array!
-        *
-        * @param array $frameworkConfiguration The framework configuration until now
-        * @return array context specific configuration which will override the configuration obtained by TypoScript
-        */
-       abstract protected function getContextSpecificFrameworkConfiguration(array $frameworkConfiguration);
-
-       /**
-        * Returns TypoScript Setup array from current Environment.
-        *
-        * @return array the TypoScript setup
-        */
-       abstract protected function getTypoScriptSetup();
 }
 ?>
\ No newline at end of file
index d17b855..97485d0 100644 (file)
@@ -37,6 +37,182 @@ class Tx_Extbase_Configuration_BackendConfigurationManager extends Tx_Extbase_Co
        protected $typoScriptSetupCache = NULL;
 
        /**
+        * Transfers the request to an Extbase backend module, calling
+        * a given controller/action.
+        *
+        * @param string $configurationType The kind of configuration to fetch - must be one of the CONFIGURATION_TYPE_* constants
+        * @param string $extensionName if specified, the configuration for the given extension will be returned (plugin.tx_extensionname)
+        * @param string $pluginName if specified, the configuration for the given plugin will be returned (plugin.tx_extensionname_pluginname)
+        * @return string The module rendered view
+        */
+       public function getConfiguration($configurationType, $extensionName = NULL, $pluginName = NULL) {
+               $frameworkConfiguration = array();
+               $frameworkConfiguration['persistence']['storagePid'] = self::DEFAULT_BACKEND_STORAGE_PID;
+               $controllerAction = $this->resolveControllerAction($this->configuration['name']);
+               $setup = $this->getTypoScriptSetup();
+               $frameworkConfiguration = array(
+                       'pluginName' => $this->configuration['name'],
+                       'extensionName' => $this->configuration['extensionName'],
+                       'controller' => $controllerAction['controllerName'],
+                       'action' => $controllerAction['actionName'],
+                       'switchableControllerActions' => array(),
+                       'settings' => $this->resolveTyposcriptReference($setup, 'settings'),
+                       'persistence' => $this->resolveTyposcriptReference($setup, 'persistence'),
+                       'view' => $this->resolveTyposcriptReference($setup, 'view'),
+                       '_LOCAL_LANG' => $this->resolveTyposcriptReference($setup, '_LOCAL_LANG'),
+               );
+
+               foreach ($this->configuration['controllerActions'] as $controller => $actions) {
+                       // Add an "extObj" action for the default controller to handle external
+                       // SCbase modules which add function menu entries
+                       $actions .= ',extObj';
+                       $frameworkConfiguration['switchableControllerActions'][$i++] = array(
+                               'controller' => $controller,
+                               'actions' => $actions,
+                       );
+               }
+
+               $extbaseConfiguration = $setup['config.']['tx_extbase.'];
+               if (is_array($extbaseConfiguration)) {
+                       $extbaseConfiguration = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($extbaseConfiguration);
+                       $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, $extbaseConfiguration);
+               }
+
+               return $frameworkConfiguration;
+       }
+
+       /**
+        * 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']['_configuration'][$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(
+                       'controllerName' => '',
+                       'actionName' => '',
+               );
+
+               $set = t3lib_div::_GP('SET');
+               if (!$set) {
+                               // Early return
+                       return $controllerAction;
+               }
+
+               $moduleFunction = $set['function'];
+               $matches = array();
+               if (preg_match('/^(.*)->(.*)$/', $moduleFunction, $matches)) {
+                       $controllerAction['controllerName'] = $matches[1];
+                       $controllerAction['actionName'] = $matches[2];
+               } else {
+                               // Support for external SCbase module function rendering
+                       $functions = $GLOBALS['TBE_MODULES_EXT']['_configuration'][$module]['MOD_MENU']['function'];
+                       if (isset($functions[$moduleFunction])) {
+                               $controllerAction['controllerName'] = $defaultController;
+                               $controllerAction['actionName'] = 'extObj';
+                       }
+               }
+
+               return $controllerAction;
+       }
+
+       /**
         * Returns TypoScript Setup array from current Environment.
         *
         * @return array the raw TypoScript setup
@@ -87,12 +263,5 @@ class Tx_Extbase_Configuration_BackendConfigurationManager extends Tx_Extbase_Co
                return self::DEFAULT_BACKEND_STORAGE_PID;
        }
 
-       /**
-        * We do not want to override anything in the backend.
-        * @return array
-        */
-       protected function getContextSpecificFrameworkConfiguration(array $frameworkConfiguration) {
-               return $frameworkConfiguration;
-       }
 }
 ?>
\ No newline at end of file
index aac52d6..f4a851e 100644 (file)
@@ -104,10 +104,10 @@ class Tx_Extbase_Configuration_ConfigurationManager implements Tx_Extbase_Config
        public function getConfiguration($configurationType, $extensionName = NULL, $pluginName = NULL) {
                switch ($configurationType) {
                        case self::CONFIGURATION_TYPE_SETTINGS :
-                               $configuration = $this->concreteConfigurationManager->getConfiguration($extensionName, $pluginName);
+                               $configuration = $this->concreteConfigurationManager->getConfiguration($configurationType, $extensionName, $pluginName);
                                return $configuration['settings'];
                        case self::CONFIGURATION_TYPE_FRAMEWORK :
-                               return $this->concreteConfigurationManager->getConfiguration($extensionName, $pluginName);
+                               return $this->concreteConfigurationManager->getConfiguration($configurationType, $extensionName, $pluginName);
                        case self::CONFIGURATION_TYPE_FULL_TYPOSCRIPT :
                                return $this->concreteConfigurationManager->getTypoScriptSetup();
                        default :
index fb7cda8..7bd69d2 100644 (file)
 class Tx_Extbase_Configuration_FrontendConfigurationManager extends Tx_Extbase_Configuration_AbstractConfigurationManager {
 
        /**
+        * Loads the Extbase Framework configuration.
+        *
+        * The Extbase framework configuration HAS TO be retrieved using this method, as they are come from different places than the normal settings.
+        * Framework configuration is, in contrast to normal settings, needed for the Extbase framework to operate correctly.
+        *
+        * @param string $configurationType The kind of configuration to fetch - must be one of the CONFIGURATION_TYPE_* constants
+        * @param string $extensionName if specified, the configuration for the given extension will be returned (plugin.tx_extensionname)
+        * @param string $pluginName if specified, the configuration for the given plugin will be returned (plugin.tx_extensionname_pluginname)
+        * @return array the Extbase framework configuration
+        */
+       public function getConfiguration($configurationType, $extensionName = NULL, $pluginName = NULL) {
+               // 1st level cache
+               if ($extensionName !== NULL) {
+                       $configurationCacheKey = strtolower($extensionName);
+                       if ($pluginName !== NULL) {
+                               $configurationCacheKey .= '_' . strtolower($pluginName);
+                       }
+               } else {
+                       $configurationCacheKey = strtolower($this->extensionName . '_' . $this->pluginName);
+               }
+               if (isset($this->configurationCache[$configurationCacheKey])) {
+                       return $this->configurationCache[$configurationCacheKey];
+               }
+
+               $frameworkConfiguration = array();
+               $frameworkConfiguration['persistence']['storagePid'] = self::DEFAULT_BACKEND_STORAGE_PID;
+
+               $setup = $this->getTypoScriptSetup();
+               if ($extensionName !== NULL) {
+                       $pluginConfiguration = $setup['plugin.']['tx_' . strtolower($extensionName) . '.'];
+                       if ($pluginName !== NULL) {
+                               $pluginSignature = strtolower($extensionName . '_' . $pluginName);
+                               if (is_array($setup['plugin.']['tx_' . $pluginSignature . '.'])) {
+                                       $pluginConfiguration = t3lib_div::array_merge_recursive_overrule($pluginConfiguration, $setup['plugin.']['tx_' . $pluginSignature . '.']);
+                               }
+                       }
+               } else {
+                       $pluginConfiguration = $this->configuration;
+               }
+               $extbaseConfiguration = $setup['config.']['tx_extbase.'];
+               if (is_array($extbaseConfiguration)) {
+                       $extbaseConfiguration = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($extbaseConfiguration);
+                       $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, $extbaseConfiguration);
+               }
+
+               if (isset($pluginConfiguration['settings'])) {
+                       $pluginConfiguration = $this->resolveTyposcriptReference($pluginConfiguration, 'settings');
+               }
+               if (!is_array($pluginConfiguration['settings.'])) $pluginConfiguration['settings.'] = array(); // We expect that the settings are arrays on various places
+               if (isset($pluginConfiguration['persistence'])) {
+                       $pluginConfiguration = $this->resolveTyposcriptReference($pluginConfiguration, 'persistence');
+               }
+               if (isset($pluginConfiguration['view'])) {
+                       $pluginConfiguration = $this->resolveTyposcriptReference($pluginConfiguration, 'view');
+               }
+               if (isset($pluginConfiguration['_LOCAL_LANG'])) {
+                       $pluginConfiguration = $this->resolveTyposcriptReference($pluginConfiguration, '_LOCAL_LANG');
+               }
+               $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($pluginConfiguration));
+
+               // only load context specific configuration when retrieving configuration of the current plugin
+               if ($extensionName === NULL || ($extensionName === $this->extensionName && $pluginName === $this->pluginName)) {
+                       $frameworkConfiguration = $this->getContextSpecificFrameworkConfiguration($frameworkConfiguration);
+               }
+
+               // 1st level cache
+               $this->configurationCache[$configurationCacheKey] = $frameworkConfiguration;
+               return $frameworkConfiguration;
+       }
+
+       /**
         * Returns TypoScript Setup array from current Environment.
         *
         * @return array the raw TypoScript setup
index 709f0ff..e7fbb6b 100644 (file)
@@ -273,12 +273,14 @@ class Tx_Extbase_Core_Bootstrap {
          * @see run()
          **/
        public function callModule($moduleName) {
+               if (!isset($GLOBALS['TBE_MODULES']['_configuration'][$moduleName])) return FALSE;
+               $configuration = $GLOBALS['TBE_MODULES']['_configuration'][$moduleName];
 
                // Check permissions and exit if the user has no permission for entry
-               $GLOBALS['BE_USER']->modAccess($config, TRUE);
+               $GLOBALS['BE_USER']->modAccess($configuration, TRUE);
                if (t3lib_div::_GP('id')) {
                        // Check page access
-                       $id = intval(t3lib_div::_GP('id'));
+                       $id = t3lib_div::_GP('id');
                        $permClause = $GLOBALS['BE_USER']->getPagePermsClause(TRUE);
                        $access = is_array(t3lib_BEfunc::readPageAccess($id, $permClause));
                        if (!$access) {
@@ -286,10 +288,13 @@ class Tx_Extbase_Core_Bootstrap {
                        }
                }
 
+               // 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'] = '';
 
-               $configuration = array();
-               $configuration['module.']['tx_extbase.']['moduleName'] = $moduleName;
                $this->run('', $configuration);
+
                return TRUE;
        }
 }
index 0999c51..67b0b19 100644 (file)
@@ -16,7 +16,7 @@ if (TYPO3_MODE == 'BE') {
 
        }
 
-       $TBE_MODULES['_dispatcher'][] = 'Tx_Extbase_Core_Bootstrap->callModule';
+       $TBE_MODULES['_dispatcher'][] = 'Tx_Extbase_Core_Bootstrap';
        
 }