diff --git a/ChangeLog b/ChangeLog index c0fa47720583bd3f91d0daa6788c1b9a6c7215fc..d7e2b6ab97202ebcffc31b5de9dddb8a33871f80 100755 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2010-10-18 Steffen Kamper <steffen@typo3.org> + * Added feature #16008: A new TypoScript cObject: FLUIDTEMPLATE * Added feature #16031: Feature - Implement new layout and labels for tt_content as result of T3UXW09 (Thanks to Jo Hasenau) * Fixed bug #16051: Palette render wrong and throw php warning if fieldset starts with palette * Added feature #16015: Feature - Implement new layout and labels for pages as result of T3UXW09 (Thanks to Jo Hasenau) diff --git a/typo3/sysext/cms/tslib/class.tslib_content.php b/typo3/sysext/cms/tslib/class.tslib_content.php index e144e2ffc2f31acff7aee12b215023d7aa0d55fb..9a65aede48209d896aac7729fc5bcbbebf12d81b 100644 --- a/typo3/sysext/cms/tslib/class.tslib_content.php +++ b/typo3/sysext/cms/tslib/class.tslib_content.php @@ -842,6 +842,9 @@ class tslib_cObj { case 'TEMPLATE' : $content .= $this->TEMPLATE($conf); break; + case 'FLUIDTEMPLATE': + $content .= $this->FLUIDTEMPLATE($conf); + break; case 'EDITPANEL' : if ($GLOBALS['TSFE']->beUserLogin) { $content .= $this->editPanel($content, $conf); @@ -3051,6 +3054,170 @@ class tslib_cObj { return $content; } + /** + * Rendering the cObject, FLUIDTEMPLATE + * configuration properties are: + * - file string+stdWrap the FLUID template file + * - extbase.pluginName, extbase.controllerExtensionName, + * - extbase.controllerName, extbase.controllerActionName + * - layoutRootPath filepath+stdWrap by default, + * - partialRootPath filepath+stdWrap the + * - variables array of cObjects, the keys are the variable names in fluid + * + * an example would be + * 10 = FLUIDTEMPLATE + * 10.file = fileadmin/templates/mytemplate.html + * 10.partialRootPath = fileadmin/templates/partial/ + * 10.variables { + * mylabel = TEXT + * mylabel.value = Label from TypoScript coming + * } + * + * @param array array of TypoScript properties + * @return string the HTML output + * + * @author Steffen Ritter <info@steffen-ritter.net> + * @author Benjamin Mack <benni@typo3.org> + */ + protected function FLUIDTEMPLATE(array $conf) { + + // check if the needed extensions are installed + if (!t3lib_extMgm::isLoaded('fluid')) { + return 'You need to install "Fluid" in order to use the FLUIDTEMPLATE content element'; + } + if (!t3lib_extMgm::isLoaded('extbase')) { + return 'You need to install "Extbase" in order to use the FLUIDTEMPLATE content element'; + } + + // initialize the extbase autoloader, + // see Extbase_Dispatcher->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')); + } + + + /** + * 1. initializing configuration parameters + **/ + + // fetch the FLUID file + $templateFile = $GLOBALS['TSFE']->tmpl->getFileName($this->stdWrap($conf['file'], $conf['file.'])); + $templatePath = dirname($templateFile) . '/'; + $layoutRootPath = $templatePath . 'Layouts'; + $partialRootPath = $templatePath . 'Partials'; + + // override the default layout path via typoscript + if (isset($conf['layoutRootPath']) || isset($conf['layoutRootPath.'])) { + $layoutRootPath = $this->stdWrap($conf['layoutRootPath'], $conf['layoutRootPath.']); + $layoutRootPath = t3lib_div::getFileAbsFileName($layoutRootPath); + } + + // override the default partials path via typoscript + if (isset($conf['partialRootPath']) || isset($conf['partialRootPath.'])) { + $partialRootPath = $this->stdWrap($conf['partialRootPath'], $conf['partialRootPath.']); + $partialRootPath = t3lib_div::getFileAbsFileName($partialRootPath); + } + + + // set some default variables for initializing Extbase + if (isset($conf['extbase.']['pluginName'])) { + $requestPluginName = $conf['extbase.']['pluginName']; + } else { + $requestPluginName = 'pi1'; + } + + if (isset($conf['extbase.']['controllerExtensionName'])) { + $requestControllerExtensionName = $conf['extbase.']['controllerExtensionName']; + } else { + $requestControllerExtensionName = 'cms'; + } + + if (isset($conf['extbase.']['controllerName'])) { + $requestControllerName = $conf['extbase.']['controllerName']; + } else { + $requestControllerName = 'cms'; + } + + if (isset($conf['extbase.']['controllerActionName'])) { + $requestControllerActionName = $conf['extbase.']['controllerActionName']; + } else { + $requestControllerActionName = 'index'; + } + + + /** + * 2. initializing Fluid classes, + * first, the controller context needs to be created + **/ + $objectManager = t3lib_div::makeInstance('Tx_Fluid_Compatibility_ObjectManager'); + + // creating a request object + $controllerContext = $objectManager->create('Tx_Extbase_MVC_Controller_ControllerContext'); + /** + * @var $request Tx_Extbase_MVC_Web_Request + */ + $request = t3lib_div::makeInstance('Tx_Extbase_MVC_Web_Request'); + $request->setPluginName($requestPluginName); + $request->setControllerExtensionName($requestControllerExtensionName); + $request->setControllerName($requestControllerName); + $request->setControllerActionName($requestControllerActionName); + $request->setRequestURI(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL')); + $request->setBaseURI(t3lib_div::getIndpEnv('TYPO3_SITE_URL')); + + /** + * @var $uriBuilder Tx_Extbase_MVC_Web_Routing_UriBuilder + */ + $uriBuilder = t3lib_div::makeInstance('Tx_Extbase_MVC_Web_Routing_UriBuilder'); + $uriBuilder->setRequest($request); + + $controllerContext->setRequest($request); + $controllerContext->setUriBuilder($uriBuilder); + + /** + * @var $view Tx_Fluid_View_TemplateView + */ + $view = t3lib_div::makeInstance('Tx_Fluid_View_TemplateView'); + $view->setControllerContext($controllerContext); + + // setting the paths for the template and the layouts/partials + $view->setTemplatePathAndFilename($templateFile); + $view->setLayoutRootPath($layoutRootPath); + $view->setPartialRootPath($partialRootPath); + + // In FLOW3, solved through Object Lifecycle methods, + // v4 needs to call it explicitely + $view->initializeView(); + + + /** + * 3. variable replacement + */ + $reservedVariables = array('data', 'current'); + // accumulate the variables to be replaced + // and loop them through cObjGetSingle + $variables = (array) $conf['variables.']; + foreach ($variables as $variableName => $cObjType) { + if(!in_array($variableName, $reservedVariables)) { + if (!is_array($cObjType)) { + $view->assign($variableName, $this->cObjGetSingle($cObjType, $variables[$variableName . '.'])); + } + } else { + throw new InvalidArgumentException('Cannot use reserved name "' . $variableName . '" as variable name in FLUIDTEMPLATE'); + } + } + $view->assign('data', $this->data); + $view->assign('current', $this->data[$this->currentValKey]); + + /** + * 4. render the content + */ + $content = $view->render(); + return $this->stdWrap($content, $conf['stdWrap.']); + } + /** * Rendering the cObject, MULTIMEDIA *