* Raised Extbase and Fluid versions to 1.3.0alpha1. See their ChangeLog.txt for full...
authorSebastian Kurfürst <sebastian.kurfuerst@typo3.org>
Tue, 24 Aug 2010 08:43:27 +0000 (08:43 +0000)
committerSebastian Kurfürst <sebastian.kurfuerst@typo3.org>
Tue, 24 Aug 2010 08:43:27 +0000 (08:43 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@8665 709f56b5-9817-0410-a4d7-c38de5d9e867

178 files changed:
ChangeLog
typo3/sysext/extbase/ChangeLog.txt [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Controller/Argument.php
typo3/sysext/extbase/Classes/MVC/View/AbstractView.php
typo3/sysext/extbase/Classes/MVC/View/EmptyView.php
typo3/sysext/extbase/Classes/MVC/View/ViewInterface.php
typo3/sysext/extbase/Classes/Persistence/Mapper/DataMapper.php
typo3/sysext/extbase/Classes/Persistence/Repository.php
typo3/sysext/extbase/Classes/Property/Mapper.php
typo3/sysext/extbase/ext_emconf.php
typo3/sysext/extbase/last_synched_target
typo3/sysext/fluid/ChangeLog.txt [new file with mode: 0644]
typo3/sysext/fluid/Classes/Compatibility/DocbookGeneratorService.php
typo3/sysext/fluid/Classes/Compatibility/ObjectManager.php
typo3/sysext/fluid/Classes/Compatibility/TemplateParserBuilder.php
typo3/sysext/fluid/Classes/Core/Exception.php
typo3/sysext/fluid/Classes/Core/Parser/Configuration.php
typo3/sysext/fluid/Classes/Core/Parser/Exception.php
typo3/sysext/fluid/Classes/Core/Parser/Interceptor/Escape.php
typo3/sysext/fluid/Classes/Core/Parser/InterceptorInterface.php
typo3/sysext/fluid/Classes/Core/Parser/ParsedTemplateInterface.php
typo3/sysext/fluid/Classes/Core/Parser/ParsingState.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/AbstractNode.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/ArrayNode.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/NodeInterface.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/ObjectAccessorNode.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/RenderingContextAwareInterface.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/RootNode.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/TextNode.php
typo3/sysext/fluid/Classes/Core/Parser/SyntaxTree/ViewHelperNode.php
typo3/sysext/fluid/Classes/Core/Parser/TemplateParser.php
typo3/sysext/fluid/Classes/Core/Rendering/RenderingContext.php
typo3/sysext/fluid/Classes/Core/Rendering/RenderingContextInterface.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractConditionViewHelper.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractTagBasedViewHelper.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractViewHelper.php
typo3/sysext/fluid/Classes/Core/ViewHelper/ArgumentDefinition.php
typo3/sysext/fluid/Classes/Core/ViewHelper/Arguments.php
typo3/sysext/fluid/Classes/Core/ViewHelper/Exception.php
typo3/sysext/fluid/Classes/Core/ViewHelper/Exception/InvalidVariableException.php
typo3/sysext/fluid/Classes/Core/ViewHelper/Exception/RenderingContextNotAccessibleException.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/Core/ViewHelper/Facets/ChildNodeAccessInterface.php
typo3/sysext/fluid/Classes/Core/ViewHelper/Facets/PostParseInterface.php
typo3/sysext/fluid/Classes/Core/ViewHelper/TagBasedViewHelper.php
typo3/sysext/fluid/Classes/Core/ViewHelper/TagBuilder.php
typo3/sysext/fluid/Classes/Core/ViewHelper/TemplateVariableContainer.php
typo3/sysext/fluid/Classes/Core/ViewHelper/ViewHelperInterface.php
typo3/sysext/fluid/Classes/Core/ViewHelper/ViewHelperVariableContainer.php
typo3/sysext/fluid/Classes/Exception.php
typo3/sysext/fluid/Classes/Fluid.php
typo3/sysext/fluid/Classes/Service/DocbookGenerator.php
typo3/sysext/fluid/Classes/View/AbstractTemplateView.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/View/Exception.php
typo3/sysext/fluid/Classes/View/Exception/InvalidSectionException.php
typo3/sysext/fluid/Classes/View/Exception/InvalidTemplateResourceException.php
typo3/sysext/fluid/Classes/View/TemplateView.php
typo3/sysext/fluid/Classes/View/TemplateViewInterface.php
typo3/sysext/fluid/Classes/ViewHelpers/AliasViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/BaseViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/AbstractBackendViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/Buttons/CshViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/Buttons/IconViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/Buttons/ShortcutViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/ContainerViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuItemViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/PageInfoViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/PagePathViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/TableListViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/CObjectViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/CountViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/CycleViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/DebugViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/ElseViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/EscapeViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/FlashMessagesViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/ForViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormFieldViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/AbstractFormViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/CheckboxViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/ErrorsViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/HiddenViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/PasswordViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/RadioViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/SelectViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/SubmitViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/TextareaViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/TextboxViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/TextfieldViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Form/UploadViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/FormViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/CropViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/CurrencyViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/DateViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/HtmlViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/Nl2brViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/NumberViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/PaddingViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Format/PrintfViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/GroupedForViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/IfViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/ImageViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/LayoutViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Link/ActionViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Link/EmailViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Link/ExternalViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Link/PageViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/RenderFlashMessagesViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/RenderViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/SectionViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/ThenViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/TranslateViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Uri/ActionViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Uri/EmailViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Uri/ExternalViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Uri/ImageViewHelper.php [new file with mode: 0644]
typo3/sysext/fluid/Classes/ViewHelpers/Uri/PageViewHelper.php
typo3/sysext/fluid/Classes/ViewHelpers/Uri/ResourceViewHelper.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/Fixtures/ChildNodeAccessFacetViewHelper.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/Interceptor/EscapeTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/ParsingStateTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/SyntaxTree/AbstractNodeTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/SyntaxTree/TextNodeTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/SyntaxTree/ViewHelperNodeComparatorTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/SyntaxTree/ViewHelperNodeTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/TemplateParserPatternTest.php
typo3/sysext/fluid/Tests/Unit/Core/Parser/TemplateParserTest.php
typo3/sysext/fluid/Tests/Unit/Core/Rendering/RenderingContextTest.php
typo3/sysext/fluid/Tests/Unit/Core/TagBasedViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/Core/TagBuilderTest.php
typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/AbstractViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ArgumentDefinitionTest.php
typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ConditionViewHelperTest.php [new file with mode: 0644]
typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/TemplateVariableContainerTest.php
typo3/sysext/fluid/Tests/Unit/Core/ViewHelper/ViewHelperVariableContainerTest.php
typo3/sysext/fluid/Tests/Unit/View/AbstractTemplateViewTest.php [new file with mode: 0644]
typo3/sysext/fluid/Tests/Unit/View/Fixtures/TemplateViewFixture.php
typo3/sysext/fluid/Tests/Unit/View/Fixtures/TransparentSyntaxTreeNode.php
typo3/sysext/fluid/Tests/Unit/View/TemplateViewTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/AliasViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/BaseViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/CountViewHelperTest.php [new file with mode: 0644]
typo3/sysext/fluid/Tests/Unit/ViewHelpers/CycleViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/ElseViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Fixtures/ConstraintSyntaxTreeNode.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/ForViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/AbstractFormFieldViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/AbstractFormViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/CheckboxViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/Fixtures/EmptySyntaxTreeNode.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/Fixtures/Fixture_UserDomainClass.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/HiddenViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/RadioViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/SelectViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/SubmitViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/TextareaViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/TextboxViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Form/UploadViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/FormViewHelperTest.php [new file with mode: 0644]
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/CropViewHelperTest.php [new file with mode: 0644]
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/CurrencyViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/DateViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/Nl2brViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/NumberViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/PaddingViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Format/PrintfViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/GroupedForViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/IfViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/EmailViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Link/ExternalViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Persistence/IdentityViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/ThenViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Uri/EmailViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/Uri/ExternalViewHelperTest.php
typo3/sysext/fluid/Tests/Unit/ViewHelpers/ViewHelperBaseTestcase.php
typo3/sysext/fluid/ext_autoload.php
typo3/sysext/fluid/ext_emconf.php
typo3/sysext/fluid/last_synched_target

index 43b4892..0dcc3fb 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-08-24  Sebastian Kurfuerst  <sebastian@typo3.org>
+
+       * Raised Fluid and Extbase version numbers to 1.3.0alpha1. See ChangeLog.txt in Extbase/Fluid for a full list of changes.
+
 2010-08-24 Steffen Gebert  <steffen@steffen-gebert.de>
 
        * Added feature #15454: Provide a reason for logDeprecatedTypoScript()
diff --git a/typo3/sysext/extbase/ChangeLog.txt b/typo3/sysext/extbase/ChangeLog.txt
new file mode 100644 (file)
index 0000000..3e10c2e
--- /dev/null
@@ -0,0 +1,32 @@
+ChangeLog for Fluid
+===================
+
+
+Changes for 1.3.0 Alpha 1
+=========================
+
+Since the last version, the following notable things happened:
+
+* All methods trying to find an object by uid now ignore the storagePid. This changes the behavior of argument mapping and the way extbase fetches 1:1 relations. Resolves #5631. You should not experience any negative side-effects of this change, i.e. if your extension worked before, it will definitely after this change. However, it makes the record handling more robust.
+* Performance improvements in TypoScript::convertTypoScriptArrayToPlainArray. Thanks to Timo Schmidt.
+* Numerous other bugfixes, see below.
+
+Full Changes:
+-------------
+[~TASK] Extbase: Raised version number to 1.3.0-devel to reflect the version scheme defined in the wiki. Resolves #9152. Thanks Xavier for pointing to it.
+[+TASK] Extbase (MVC): cleaned up View implementations and added assign() and assignMultiple() methods to ViewInterface. This resolves #9137
+[+BUGFIX] Extbase: Fixed a small typo in extension description.
+[+BUGFIX] Extbase (Persistence): DataMapper now mapps NULL into a property on non-existing related object instead of FALSE. Resolves #8973.
+[+BUGFIX] Extbase (Reflection): getParentClass() in Tx_Extbase_Reflection_ClassReflection no longer causes a fatal error if no parent class exists. Resolves #8800.
+[+BUGFIX] Extbase (Utility): Improved performance of TypoScript::convertTypoScriptArrayToPlainArray. Thanks to Timo Schmidt. Resolves #8857.
+[~TASK] Extbase: Changed state to 'stable'. Resolves #8768.
+[+BUGFIX] Extbase: Fixed EOL and encoding of several files. Resolves #8876.
+[+BUGFIX] Extbase (MVC): Fixed a problem where a non-required action argument throwed Exception if it was not found in the Backend. Thanks to Marc Bastian Heinrichs. Resolves #7277.
+[!!!][+BUGFIX] Extbase (Persistence): All methods trying to find an object by uid now ignores the storagePid. This changes the behavior of argument mapping and the way extbase fetches 1:1 relations. Resolves #5631.
+[+BUGFIX] Extbase (Persistence): Fixed a problem where localized objects inside an aggregate are not translated. Resolves #8555.
+[~TASK] Extbase: Removed new lines at the end of php files.
+
+
+HOW TO CREATE THE CHANGELOG
+===========================
+git log [startRevision]..HEAD --pretty=format:"%s%n%b%n" | grep -v "^$" | grep -v "git-svn-id"
\ No newline at end of file
index f7659e7..70817e4 100644 (file)
@@ -378,6 +378,7 @@ class Tx_Extbase_MVC_Controller_Argument {
        protected function findObjectByUid($uid) {
                $query = $this->queryFactory->create($this->dataType);
                $query->getQuerySettings()->setRespectSysLanguage(FALSE);
+               $query->getQuerySettings()->setRespectStoragePage(FALSE);
                $result = $query->matching($query->equals('uid', $uid))->execute();
                $object = NULL;
                if (count($result) > 0) {
index 0355df0..9d6928b 100644 (file)
@@ -60,11 +60,11 @@ abstract class Tx_Extbase_MVC_View_AbstractView implements Tx_Extbase_MVC_View_V
 
        /**
         * Add a variable to $this->viewData.
-        * Can be chained, so $this->view->assign(..., ...)->assign(..., ...); is possible,
+        * Can be chained, so $this->view->assign(..., ...)->assign(..., ...); is possible
         *
         * @param string $key Key of variable
         * @param object $value Value of object
-        * @return Tx_Extbase_MVC_View_ViewInterface an instance of $this, to enable chaining.
+        * @return Tx_Extbase_MVC_View_AbstractView an instance of $this, to enable chaining
         * @api
         */
        public function assign($key, $value) {
@@ -76,13 +76,14 @@ abstract class Tx_Extbase_MVC_View_AbstractView implements Tx_Extbase_MVC_View_V
         * Add multiple variables to $this->viewData.
         *
         * @param array $values array in the format array(key1 => value1, key2 => value2).
-        * @return void
+        * @return Tx_Extbase_MVC_View_AbstractView an instance of $this, to enable chaining
         * @api
         */
        public function assignMultiple(array $values) {
                foreach($values as $key => $value) {
                        $this->assign($key, $value);
                }
+               return $this;
        }
 
        /**
index cf13b8b..eb1dbec 100644 (file)
 final class Tx_Extbase_MVC_View_EmptyView extends Tx_Extbase_MVC_View_AbstractView {
 
        /**
+        * Dummy method to satisfy the ViewInterface
+        *
+        * @param string $key
+        * @param mixed $value
+        * @return Tx_Extbase_MVC_View_EmptyView instance of $this to allow chaining
+        * @api
+        */
+       public function assign($key, $value) {
+               return $this;
+       }
+
+       /**
+        * Dummy method to satisfy the ViewInterface
+        *
+        * @param array $values
+        * @return Tx_Extbase_MVC_View_EmptyView instance of $this to allow chaining
+        * @api
+        */
+       public function assignMultiple(array $values) {
+               return $this;
+       }
+
+       /**
         * Renders the empty view
         *
         * @return string An empty string
index e33e02a..bdb9648 100644 (file)
@@ -44,6 +44,26 @@ interface Tx_Extbase_MVC_View_ViewInterface {
        public function setControllerContext(Tx_Extbase_MVC_Controller_ControllerContext $controllerContext);
 
        /**
+        * Add a variable to the view data collection.
+        * Can be chained, so $this->view->assign(..., ...)->assign(..., ...); is possible
+        *
+        * @param string $key Key of variable
+        * @param object $value Value of object
+        * @return Tx_Extbase_MVC_View_ViewInterface an instance of $this, to enable chaining
+        * @api
+        */
+       public function assign($key, $value);
+
+       /**
+        * Add multiple variables to the view data collection
+        *
+        * @param array $values array in the format array(key1 => value1, key2 => value2)
+        * @return Tx_Extbase_MVC_View_ViewInterface an instance of $this, to enable chaining
+        * @api
+        */
+       public function assignMultiple(array $values);
+
+       /**
         * Renders the view
         *
         * @return string The rendered view
index 2e3df34..232e55e 100644 (file)
@@ -343,25 +343,19 @@ class Tx_Extbase_Persistence_Mapper_DataMapper implements t3lib_Singleton {
         */
        protected function getPreparedQuery(Tx_Extbase_DomainObject_DomainObjectInterface $parentObject, $propertyName, $fieldValue = '') {
                $columnMap = $this->getDataMap(get_class($parentObject))->getColumnMap($propertyName);
-               $queryFactory = t3lib_div::makeInstance('Tx_Extbase_Persistence_QueryFactory');
                $type = $this->getType(get_class($parentObject), $propertyName);
-               if ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_ONE) {
-                       $query = $queryFactory->create($type);
-               } elseif ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_MANY) {
-                       $query = $queryFactory->create($type);
-                       $query->getQuerySettings()->setRespectStoragePage(FALSE);
+               $queryFactory = t3lib_div::makeInstance('Tx_Extbase_Persistence_QueryFactory');
+               $query = $queryFactory->create($type);
+               $query->getQuerySettings()->setRespectStoragePage(FALSE);
+               if ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_MANY) {
                        if ($columnMap->getChildSortByFieldName() !== NULL) {
                                $query->setOrderings(array($columnMap->getChildSortByFieldName() => Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING));
                        }
                } elseif ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_AND_BELONGS_TO_MANY) {
-                       $query = $queryFactory->create($type);
-                       $query->getQuerySettings()->setRespectStoragePage(FALSE);
                        $query->setSource($this->getSource($parentObject, $propertyName));
                        if ($columnMap->getChildSortByFieldName() !== NULL) {
                                $query->setOrderings(array($columnMap->getChildSortByFieldName() => Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING));
                        }
-               } else {
-                       throw new Tx_Extbase_Persistence_Exception('Could not determine type of relation for the property "' . $propertyName . '". This is mainly caused by a missing type declaration above the property definition. If the PHPDoc comment is there, make sure it starts with "/**" and not just with "/*".', 1252502725);
                }
                $query->matching($this->getConstraint($query, $parentObject, $propertyName, $fieldValue, $columnMap->getRelationTableMatchFields()));
                return $query;
index 8a8ca6f..446bfda 100644 (file)
@@ -246,6 +246,7 @@ class Tx_Extbase_Persistence_Repository implements Tx_Extbase_Persistence_Reposi
                } else {
                        $query = $this->createQuery();
                        $query->getQuerySettings()->setRespectSysLanguage(FALSE);
+                       $query->getQuerySettings()->setRespectStoragePage(FALSE);
                        $result = $query->matching($query->equals('uid', $uid))->execute();
                        $object = NULL;
                        if (count($result) > 0) {
index 5644b7f..4e834e6 100644 (file)
@@ -317,6 +317,7 @@ class Tx_Extbase_Property_Mapper {
        protected function findObjectByUid($dataType, $uid) {
                $query = $this->queryFactory->create($dataType);
                $query->getQuerySettings()->setRespectSysLanguage(FALSE);
+               $query->getQuerySettings()->setRespectStoragePage(FALSE);
                $result = $query->matching($query->equals('uid', intval($uid)))->execute();
                $object = NULL;
                if (count($result) > 0) {
index 79172cd..489079d 100644 (file)
@@ -29,7 +29,7 @@ $EM_CONF[$_EXTKEY] = array(
        'clearCacheOnLoad' => 1,
        'lockType' => '',
        'author_company' => '',
-       'version' => '1.2.1',
+       'version' => '1.3.0alpha1',
        'constraints' => array(
                'depends' => array(
                        'php' => '5.2.0-0.0.0',
index 35608bf..3b852b6 100644 (file)
@@ -1 +1 @@
-https://svn.typo3.org/TYPO3v4/CoreProjects/MVC/extbase/tags/1.2.1/
+https://svn.typo3.org/TYPO3v4/CoreProjects/MVC/extbase/tags/1.3.0alpha1/
diff --git a/typo3/sysext/fluid/ChangeLog.txt b/typo3/sysext/fluid/ChangeLog.txt
new file mode 100644 (file)
index 0000000..f698800
--- /dev/null
@@ -0,0 +1,87 @@
+ChangeLog for Fluid
+===================
+
+
+Changes for 1.3.0 Alpha 1
+=========================
+
+In this release, numerous bugs have been fixed, making Fluid more stable than ever. Below are some nice features which have been introduced:
+
+* Instead of <f:form name="...">, you should now write write <f:form objectName="...">, to create an XHTML compliant form (#6521)
+
+* The <f:for>-ViewHelper has now Iteration Information available, if you want that:
+  <f:for each="{objects}" as="object" iteration="iteration">
+     {iteration.index} is a counter which starts at 0
+     {iteration.cycle} is a counter which starts at 1
+     {iteration.isEven} / {iteration.isOdd} is a boolean variable which is true if the index is even/odd
+     {iteration.isFirst} / {iteration.isLast} is a boolean variable which is true if it is the first or last element in the list.
+  </f:for>
+
+!!! Refactored all Condition-ViewHelpers like f:if, f:security.if* to use a newly created base class F3\Fluid\Core\ViewHelper\ConditionViewHelper. This greatly simplifies the implementation of custom conditions.
+  THIS IS A BREAKING CHANGE in case you copied the f:if ViewHelper to create a custom condition ViewHelper, as the internal workings changed. Please check the new f:if ViewHelper to see how to adjust your ViewHelper -- you basically just have to throw away a lot of code. Resolves #8824.
+
+* Fixed section, partial and layout rendering to function in all cases as expected now, and tested this behavior also.
+  !!! Removed renderSection() and renderWithLayout() from public API in Tx_Fluid_View_TemplateView, as this should only be called from inside Fluid.
+
+* Fixing checkbox, radio and select-ViewHelpers, but this task is not finished yet.
+  !!! The value argument is required again in form.checkbox and form.radio ViewHelpers. This is a breaking change, as the value argument has not been mandatory for a while. But it probably won't break existing templates as omitting the value makes no sense at all.
+
+* Fixed BE support of ViewHelpers (cObject, format.crop, uri.resource, format.html, image)
+
+* Negative numeric values are now properly converted to FALSE when used in boolean ViewHelper arguments.
+
+* added f:uri.image ViewHelper, working just like f:image, but returning the URL and not the full image tag.
+
+Full Changes:
+-------------
+[~TASK] Fluid: Changed version of Extbase dependency from '1.2.0-1.2.999' to '1.3.0.devel' to reflect the version scheme defined in the wiki. Relates to #9152.
+[+BUGFIX] Fluid (View): AbstractTemplateView now correctly implements F3\FLOW3\MVC\View\ViewInterface and assign() and assignMultiple() will return an instance of $this to allow chaining again like $this->view->assign()->assign()... This fixes #9090 (backported from Fluid package r4931)
+[~TASK] Fluid (Tests): committing modified AbstractFormFieldViewHelperTest that I forgot to add in previous commit
+[+TASK] Fluid (ViewHelpers): Small performance improvement in ForViewHelper: Objects will only be converted to arrays if reverse is TRUE. Relates to #8732 (backported from Fluid package r4907)
+[+TASK] Fluid (View): Added getter for template parser to AbstractTemplateView. This is useful if you want to use the parser from within your custom ViewHelper (creating a new instance would skip interceptor registration) (backported from Fluid package r4907)
+[~TASK] Fluid (ViewHelpers): Added argument "objectName" to form ViewHelper. This is now the recommended way to specify the name of the object that is bound to a form! If objectName is not specified, the name attribute will be used as object name for backwards-compatibility reasons. This resolves #6521 (backported from Fluid package r4905)
+* Raised Fluid version in trunk to 1.3.0-devel
+[+BUGFIX] Fluid (ViewHelpers): Fixed a possible security issue where the content inside the Fluid a is not properly HTML escaped.
+[+FEATURE] Fluid (ViewHelpers): Added iteration information to for ViewHelper. Thanks to all the contributors for your input and patches! This resolves #6149 (backported from Fluid package r4904)
+[~TASK] Fluid (ViewHelpers): Fresh backport from Fluid package r4899 (Mostly fixed typos. slightly improved count ViewHelper)
+[~TASK] Fluid (ViewHelpers): Replaced custom convertToArray() method by PHPs iterator_to_array() function in cycle, for and groupedFor ViewHelpers. This resolves #8732. (backport from Fluid package r4898)
+[+BUGFIX] Fluid (ViewHelpers): Now, it is possible to "unselect" checkboxes and multiselect fields in editing forms. This fixes #5638. This fixes #8535. This fixes #6897 (improved forward-backport from Fluid package r4874)
+[+TASK] Fluid (Tests): Backported FormViewHelperTest from Fluid package
+[+BUGFIX] Fluid (ViewHelpers): FormViewHelper wraps hidden fields with a div tag to create XHTML valid output. This fixes #5512 (backported from Fluid package)
+[~TASK] Fluid (ViewHelpers): Fixed BE support of the ViewHelpers cObject, format.crop, uri.resource. Relates to #8947
+[~TASK] Fluid (ViewHelpers): Added BE support in the ViewHelpers format.html and image. Relates to #8947
+[!!!][+TASK] Fluid (ViewHelpers): The value argument is required again in form.checkbox and form.radio ViewHelpers. This is a breaking change, as the value argument has not been mandatory for a while. But it probably won't break existing templates as omitting the value makes no sense at all. Relates to #8852 (backported from Fluid package r4864)
+[+FEATURE] Fluid (Core): implemented overrideArgument() method in AbstractViewHelper to be able to override previously registered arguments in subclasses. This resolves #8852 (backported from Fluid package r4864)
+[+BUGFIX] Fluid (Core): Negative numeric values are properly converted to FALSE when used in boolean ViewHelper arguments. This resolves #8893 (backported from Fluid package r4864)
+[+BUGFIX] Fluid (ViewHelpers): Reversed the rendering order of header and childNodes in be.container ViewHelper to enable child nodes to modify the pageRenderer. This resolves #8880 (thanks to Andreas Wolf)
+[+BUGFIX] Fluid: Removed leading slash from @var annotations that were backported by mistake
+[+BUGFIX] Fluid: Replaced SplObjectStorage by Tx_Extbase_Persistence_ObjectStorage to be PHP 5.2-compatible (which ships with a broken implementation of SplObjectStorage)
+[!!!][~TASK] Fluid (Core): Renamed ConditionViewHelper and TagBasedViewHelper to Abstract*ViewHelper as per CGL. (backported from Fluid package r4840). To be backwards-compatible, TagBasedViewHelper.php still exists and will write an entry to TYPO3s deprecation log if used. Please adapt your custom ViewHelpers and inherit from AbstractTagBasedViewHelper instead of TagBasedViewHelper. This resolves #8834
+[~TASK] Fluid: Marked vfs unit tests to be skipped, as vfs is not part of v4 (yet)
+[-TASK] Fluid: Removed @package/@subpackage annotations from all Fluid classes. They have already been removed in FLOW3 packages in r2813.
+[-TASK] Fluid: Removed @version annotation from all Fluid classes to ease the backporting process. Relates to #8835 (backported from Fluid package)
+[+BUGFIX] Fluid (View): fixed method signature of AbstractTemplateView:getTemplateSource() that was different from the concrete implementation (backported from Fluid package)
+Fluid in v5 and v4 are now synchronized again!
+[+FEATURE] Fluid: The TemplateVariableContainer now provides a method to retrieve all variables.
+[~TASK] Fluid (Core): Introduced a RenderingContextInterface to more cleanly decouple Fluid's rendering context from the TypoScript rendering context. Note that view helpers (and other code) should now refer to that interface instead of the concrete Fluid implementation!
+[!!!][+BUGFIX] Fluid (Core): Refactored all Condition-ViewHelpers like f:if, f:security.if* to use a newly created base class F3\Fluid\Core\ViewHelper\ConditionViewHelper. This greatly simplifies the implementation of custom conditions. However, THIS IS A BREAKING CHANGE in case you copied the f:if ViewHelper to create a custom condition ViewHelper, as the internal workings changed. Please check the new f:if ViewHelper to see how to adjust your ViewHelper -- you basically just have to throw away a lot of code. Resolves #8824.
+[!!!][-API] Fluid (TemplateView): Removed renderSection() and renderWithLayout() from public API in Tx_Fluid_View_TemplateView, as this should only be called from inside Fluid.
+[!!!][TASK] Fluid (ViewHelpers): the <f:section />-ViewHelper now does NOT render itself anymore when encountered in a normal template. Example: Before the change, the template "before <f:section name='...'> middle </f:section> after" was rendered as "before middle after", but now it is only rendered as "before after". Although this is a breaking change, it is quite unlikely that anybody relied on this behavior, as it was inconsistent beforehand.
+[TASK] Fluid (TemplateView): Major refactoring of the layout, partial and section rendering mechanism. This also induces a speedup as retundant rendering is eliminated.
+[+FEATURE] Fluid (ViewHelpers): The <f:render>-ViewHelper can be now used to render sections in the same partial and template. In these cases, all arguments need to be specified explicitely. Additionally, it can now be used to render a section recursively.
+[~TASK] Fluid (Core): Removed some non-API-methods which were never called.
+[+FEATURE] Fluid (ViewHelpers): format.crop ViewHelper now supports all features in Backend mode. Relates to #8648
+[+TASK] Fluid: Set dependency to Extbase 1.2.x in ext_emconf.php to avoid confusions when working with different versions
+[+TASK] Fluid: Backported recent changes from Fluid package:
+[+FEATURE] Fluid (ViewHelpers): added "selectAllByDefault" argument to form.select ViewHelper. Resolves #4984
+~TASK] Fluid (Parser): Got rid of the constructor in Parser\Configuration.
+[+FEATURE] Fluid (ViewHelpers): Added uri.image ViewHelper. This resolves #8233
+[+FEATURE] Fluid (ViewHelpers): Added URI options noCache, noCacheHash, section, format, additionalParams, absolute, addQueryString & argumentsToBeExcludedFromQueryString to FormViewHelper. Resolves #8247 [+BUGFIX] Fluid: Removed a leading backslash in ViewHelperBaseTestcase that led to an error with PHP < 5.3
+[+TASK] Fluid: Backported some recent Fluid changes (Note: this is not a complete backport, there are still changes in Fluid Package that are not backported yet):
+[+BUGFIX] Fluid (ViewHelpers): form.select ViewHelper did only check whether "multiple" attribute was set and not whether it was empty or not. Resolves #5879
+[+FEATURE] Fluid (ViewHelpers): GroupedForViewHelper can now group by object. Resolves #7389
+
+
+HOW TO CREATE THE CHANGELOG
+===========================
+git log [startRevision]..HEAD --pretty=format:"%s%n%b%n" | grep -v "^$" | grep -v "git-svn-id"
\ No newline at end of file
index 539b50f..edfd42c 100644 (file)
@@ -14,9 +14,6 @@
  *                                                                        */
 
 /**
- * @package
- * @subpackage
- * @version $Id: DocbookGeneratorService.php 1734 2009-11-25 21:53:57Z stucki $
  */
 /**
  * Class extending the docbook generator service for use in typo3 v4.
index a6febc1..2a3f083 100644 (file)
@@ -14,9 +14,6 @@
  *                                                                        */
 
 /**
- * @package
- * @subpackage
- * @version $Id: ObjectFactory.php 1734 2009-11-25 21:53:57Z stucki $
  */
 /**
  * Class emulating the object factory for Fluid v4.
@@ -33,17 +30,20 @@ class Tx_Fluid_Compatibility_ObjectManager implements t3lib_Singleton {
                'Tx_Fluid_Core_ViewHelper_AbstractViewHelper' => array(
                        'injectReflectionService' => 'Tx_Extbase_Reflection_Service'
                ),
-               'Tx_Fluid_Core_ViewHelper_TagBasedViewHelper' => array(
+               'Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper' => array(
                        'injectTagBuilder' => 'Tx_Fluid_Core_ViewHelper_TagBuilder'
                ),
                'Tx_Fluid_Core_Parser_ParsingState' => array(
                        'injectVariableContainer' => 'Tx_Fluid_Core_ViewHelper_TemplateVariableContainer'
                ),
+
                'Tx_Fluid_Core_Parser_TemplateParser' => array(
                        'injectObjectManager' => 'Tx_Fluid_Compatibility_ObjectManager'
                ),
-               'Tx_Fluid_Core_Rendering_RenderingContext' => array(
-                       'injectObjectManager' => 'Tx_Fluid_Compatibility_ObjectManager'
+               'Tx_Fluid_Core_Rendering_RenderingContextInterface' => array(
+                       'injectObjectManager' => 'Tx_Fluid_Compatibility_ObjectManager',
+                       'injectTemplateVariableContainer' => 'Tx_Fluid_Core_ViewHelper_TemplateVariableContainer',
+                       'injectViewHelperVariableContainer' => 'Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer'
                ),
                'Tx_Fluid_Core_Parser_Interceptor_Escape' => array(
                        'injectObjectManager' => 'Tx_Fluid_Compatibility_ObjectManager'
index 561c9ac..2b676c9 100644 (file)
@@ -15,9 +15,6 @@
  *                                                                        */
 
 /**
- * @package
- * @subpackage
- * @version $Id: TemplateParserBuilder.php 2043 2010-03-16 08:49:45Z sebastian $
  */
 /**
  * Build a template parser.
index 9a919a6..8b5cea0 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * A generic Fluid Core exception.
  *
- * @version $Id: Exception.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
index 8ed1cee..4541b1a 100644 (file)
  * The parser configuration. Contains all configuration needed to configure
  * the building of a SyntaxTree.
  *
- * @version $Id: Configuration.php 4269 2010-05-05 10:03:16Z robert $
- * @package Fluid
- * @subpackage Core\Parser
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
 class Tx_Fluid_Core_Parser_Configuration {
 
        /**
-        * generic interceptors registered with the configuration.
-        * @var array<\SplObjectStorage>
+        * Generic interceptors registered with the configuration.
+        * @var array<Tx_Extbase_Persistence_ObjectStorage>
         */
-       protected $interceptors;
-
-       /**
-        * Set up the internals...
-        *
-        * @author Karsten Dambekalns <karsten@typo3.org>
-        */
-       public function __construct() {
-               $this->interceptors = array();
-       }
+       protected $interceptors = array();
 
        /**
         * Adds an interceptor to apply to values coming from object accessors.
@@ -57,7 +45,7 @@ class Tx_Fluid_Core_Parser_Configuration {
        public function addInterceptor(Tx_Fluid_Core_Parser_InterceptorInterface $interceptor) {
                foreach ($interceptor->getInterceptionPoints() as $interceptionPoint) {
                        if (!isset($this->interceptors[$interceptionPoint])) {
-                               $this->interceptors[$interceptionPoint] = new SplObjectStorage();
+                               $this->interceptors[$interceptionPoint] = t3lib_div::makeInstance('Tx_Extbase_Persistence_ObjectStorage');
                        }
                        if (!$this->interceptors[$interceptionPoint]->contains($interceptor)) {
                                $this->interceptors[$interceptionPoint]->attach($interceptor);
@@ -66,33 +54,17 @@ class Tx_Fluid_Core_Parser_Configuration {
        }
 
        /**
-        * Removes an interceptor to apply to values coming from object accessors.
-        *
-        * @param Tx_Fluid_Core_Parser_InterceptorInterface $interceptor
-        * @return void
-        * @author Karsten Dambekalns <karsten@typo3.org>
-        */
-       public function removeInterceptor($interceptor) {
-               foreach ($interceptor->getInterceptionPoints() as $interceptionPoint) {
-                       if ($this->interceptors[$interceptionPoint]->contains($interceptor)) {
-                               $this->interceptors[$interceptionPoint]->detach($interceptor);
-                       }
-               }
-
-       }
-
-       /**
         * Returns all interceptors for a given Interception Point.
         *
-        * @param int $interceptionPoint one of the Tx_Fluid_Core_Parser_InterceptorInterface::INTERCEPT_* constants,
-        * @return \SplObjectStorage<Tx_Fluid_Core_Parser_InterceptorInterface>
+        * @param integer $interceptionPoint one of the Tx_Fluid_Core_Parser_InterceptorInterface::INTERCEPT_* constants,
+        * @return Tx_Extbase_Persistence_ObjectStorage<Tx_Fluid_Core_Parser_InterceptorInterface>
         * @author Karsten Dambekalns <karsten@typo3.org>
         */
        public function getInterceptors($interceptionPoint) {
-               if (isset($this->interceptors[$interceptionPoint]) && $this->interceptors[$interceptionPoint] instanceof SplObjectStorage) {
+               if (isset($this->interceptors[$interceptionPoint]) && $this->interceptors[$interceptionPoint] instanceof Tx_Extbase_Persistence_ObjectStorage) {
                        return $this->interceptors[$interceptionPoint];
                }
-               return new SplObjectStorage();
+               return t3lib_div::makeInstance('Tx_Extbase_Persistence_ObjectStorage');
        }
 
 }
index ef33a3d..d8b2b3a 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * A Parsing Exception
  *
- * @version $Id: Exception.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\Parser
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
index 439cd76..449defd 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * An interceptor adding the escape viewhelper to the suitable places.
  *
- * @version $Id: Escape.php 4040 2010-04-08 16:02:57Z k-fish $
- * @package Fluid
- * @subpackage Core\Parser\Interceptor
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 class Tx_Fluid_Core_Parser_Interceptor_Escape implements Tx_Fluid_Core_Parser_InterceptorInterface {
@@ -67,7 +64,7 @@ class Tx_Fluid_Core_Parser_Interceptor_Escape implements Tx_Fluid_Core_Parser_In
         */
        public function process(Tx_Fluid_Core_Parser_SyntaxTree_NodeInterface $node, $interceptorPosition) {
                if ($interceptorPosition === Tx_Fluid_Core_Parser_InterceptorInterface::INTERCEPT_OPENING_VIEWHELPER) {
-                       if (!$node->getViewHelper()->isEscapingInterceptorEnabled()) {
+                       if (!$node->getUninitializedViewHelper()->isEscapingInterceptorEnabled()) {
                                $this->interceptorEnabled = FALSE;
                                $this->viewHelperNodesWhichDisableTheInterceptor[] = $node;
                        }
index cd0d050..92745b4 100644 (file)
@@ -24,9 +24,6 @@
  * An interceptor interface. Interceptors are used in the parsing stage to change
  * the syntax tree of a template, e.g. by adding viewhelper nodes.
  *
- * @version $Id: InterceptorInterface.php 4004 2010-03-23 14:11:29Z k-fish $
- * @package Fluid
- * @subpackage Core\Parser
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 interface Tx_Fluid_Core_Parser_InterceptorInterface {
index 94e490f..b9eb61c 100644 (file)
@@ -24,9 +24,6 @@
  * This interface is returned by Tx_Fluid_Core_Parser_TemplateParser->parse()
  * method and is a parsed template
  *
- * @version $Id: ParsedTemplateInterface.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\Parser
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 interface Tx_Fluid_Core_Parser_ParsedTemplateInterface {
@@ -34,10 +31,10 @@ interface Tx_Fluid_Core_Parser_ParsedTemplateInterface {
        /**
         * Render the parsed template with rendering context
         *
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext The rendering context to use
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext The rendering context to use
         * @return Rendered string
         */
-       public function render(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext);
+       public function render(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext);
 
        /**
         * Returns a variable container used in the PostParse Facet.
index 33cd90c..3759c99 100644 (file)
@@ -25,9 +25,6 @@
  * and the current stack of open nodes (nodeStack) and a variable container used
  * for PostParseFacets.
  *
- * @version $Id: ParsingState.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\Parser
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -88,12 +85,11 @@ class Tx_Fluid_Core_Parser_ParsingState implements Tx_Fluid_Core_Parser_ParsedTe
        /**
         * Render the parsed template with rendering context
         *
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext The rendering context to use
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext The rendering context to use
         * @return Rendered string
         */
-       public function render(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext) {
-               $this->rootNode->setRenderingContext($renderingContext);
-               return $this->rootNode->evaluate();
+       public function render(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               return $this->rootNode->evaluate($renderingContext);
        }
 
        /**
index 6b2b63f..14362b0 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Abstract node in the syntax tree which has been built.
  *
- * @version $Id: AbstractNode.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -38,40 +35,24 @@ abstract class Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode implements Tx_Fluid_
        protected $childNodes = array();
 
        /**
-        * The rendering context containing everything to correctly render the subtree
-        * @var Tx_Fluid_Core_Rendering_RenderingContext
-        */
-       protected $renderingContext;
-
-       /**
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext Rendering Context to be used for this evaluation
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        */
-       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext) {
-               $this->renderingContext = $renderingContext;
-       }
-
-       /**
         * Evaluate all child nodes and return the evaluated results.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return mixed Normally, an object is returned - in case it is concatenated with a string, a string is returned.
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
         */
-       public function evaluateChildNodes() {
+       public function evaluateChildNodes(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
                $output = NULL;
                foreach ($this->childNodes as $subNode) {
-                       $subNode->setRenderingContext($this->renderingContext);
-
                        if ($output === NULL) {
-                               $output = $subNode->evaluate();
+                               $output = $subNode->evaluate($renderingContext);
                        } else {
                                if (is_object($output) && !method_exists($output, '__toString')) {
                                        throw new Tx_Fluid_Core_Parser_Exception('Cannot cast object of type "' . get_class($output) . '" to string.', 1248356140);
                                }
                                $output = (string)$output;
-                               $subNodeOutput = $subNode->evaluate();
+                               $subNodeOutput = $subNode->evaluate($renderingContext);
 
                                if (is_object($subNodeOutput) && !method_exists($subNodeOutput, '__toString')) {
                                        throw new Tx_Fluid_Core_Parser_Exception('Cannot cast object of type "' . get_class($subNodeOutput) . '" to string.', 1273753083);
index 91a32fc..aac9673 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Array Syntax Tree Node. Handles JSON-like arrays.
  *
- * @version $Id: ArrayNode.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -50,19 +47,16 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ArrayNode extends Tx_Fluid_Core_Parser_Syn
        /**
         * Evaluate the array and return an evaluated array
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return array An associative array with literal values
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
         */
-       public function evaluate() {
-               if ($this->renderingContext === NULL) {
-                       throw new Tx_Fluid_Core_Parser_Exception('Rendering Context is null in ArrayNode, but necessary. If this error appears, please report a bug!', 1242668976);
-               }
+       public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
                $arrayToBuild = array();
                foreach ($this->internalArray as $key => $value) {
                        if ($value instanceof Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode) {
-                               $value->setRenderingContext($this->renderingContext);
-                               $arrayToBuild[$key] = $value->evaluate();
+                               $arrayToBuild[$key] = $value->evaluate($renderingContext);
                        } else {
                                // TODO - this case should not happen!
                                $arrayToBuild[$key] = $value;
index 7eae719..c518bf3 100644 (file)
 /**
  * Node in the syntax tree.
  *
- * @version $Id: NodeInterface.php 3751 2010-01-22 15:56:47Z k-fish $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
 interface Tx_Fluid_Core_Parser_SyntaxTree_NodeInterface {
 
        /**
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext Rendering Context to be used for this evaluation
-        * @return void
-        */
-       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext);
-
-       /**
         * Evaluate all child nodes and return the evaluated results.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return mixed Normally, an object is returned - in case it is concatenated with a string, a string is returned.
         */
-       public function evaluateChildNodes();
+       public function evaluateChildNodes(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext);
 
        /**
         * Returns all child nodes for a given node.
@@ -62,9 +54,10 @@ interface Tx_Fluid_Core_Parser_SyntaxTree_NodeInterface {
        /**
         * Evaluates the node - can return not only strings, but arbitary objects.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return mixed Evaluated node
         */
-       public function evaluate();
+       public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext);
 }
 
 ?>
\ No newline at end of file
index 4f3039b..1671415 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * A node which handles object access. This means it handles structures like {object.accessor.bla}
  *
- * @version $Id: ObjectAccessorNode.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -61,23 +58,45 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ObjectAccessorNode extends Tx_Fluid_Core_P
         * The first part of the object path has to be a variable in the
         * TemplateVariableContainer.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return object The evaluated object, can be any object type.
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
-        * @todo Depending on the context, either fail or not!!!
         */
-       public function evaluate() {
-               $objectPathParts = explode('.', $this->objectPath);
-               $variableName = array_shift($objectPathParts);
-               if (!$this->renderingContext->getTemplateVariableContainer()->exists($variableName)) {
-                       return NULL;
-               }
-               $currentObject = $this->renderingContext->getTemplateVariableContainer()->get($variableName);
-               if (count($objectPathParts) > 0) {
-                       return Tx_Extbase_Reflection_ObjectAccess::getPropertyPath($currentObject, implode('.', $objectPathParts));
-               } else {
-                       return $currentObject;
+       public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               return $this->getPropertyPath($renderingContext->getTemplateVariableContainer(), $this->objectPath, $renderingContext);
+       }
+
+       /**
+        * Gets a property path from a given object or array.
+        *
+        * If propertyPath is "bla.blubb", then we first call getProperty($object, 'bla'),
+        * and on the resulting object we call getProperty(..., 'blubb').
+        *
+        * For arrays the keys are checked likewise.
+        *
+        * @param mixed $subject An object or array
+        * @param string $propertyPath
+        * @return mixed Value of the property
+        */
+       protected function getPropertyPath($subject, $propertyPath, Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               $propertyPathSegments = explode('.', $propertyPath);
+               foreach ($propertyPathSegments as $pathSegment) {
+                       if (is_object($subject) && Tx_Extbase_Reflection_ObjectAccess::isPropertyGettable($subject, $pathSegment)) {
+                               $subject = Tx_Extbase_Reflection_ObjectAccess::getProperty($subject, $pathSegment);
+                       } elseif ((is_array($subject) || $subject instanceof ArrayAccess) && isset($subject[$pathSegment])) {
+                               $subject = $subject[$pathSegment];
+                       } else {
+                               return NULL;
+                       }
+
+                       if ($subject instanceof Tx_Fluid_Core_Parser_SyntaxTree_RenderingContextAwareInterface) {
+                               $subject->setRenderingContext($renderingContext);
+                       }
                }
+               return $subject;
        }
+
+
 }
 ?>
\ No newline at end of file
index 2e0e22a..4917847 100644 (file)
@@ -25,9 +25,6 @@
  * marked with this interface will get the current rendering context injected
  * by the ObjectAccessorNode on trying to evaluate them.
  *
- * @version $Id$
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 interface Tx_Fluid_Core_Parser_SyntaxTree_RenderingContextAwareInterface {
@@ -35,10 +32,10 @@ interface Tx_Fluid_Core_Parser_SyntaxTree_RenderingContextAwareInterface {
        /**
         * Sets the current rendering context
         *
-        * @param $renderingContext
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return void
         */
-       public function setRenderingContext($renderingContext);
+       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext);
 
 }
 
index f98ea73..9cdd5e3 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Root node of every syntax tree.
  *
- * @version $Id: RootNode.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -34,15 +31,12 @@ class Tx_Fluid_Core_Parser_SyntaxTree_RootNode extends Tx_Fluid_Core_Parser_Synt
        /**
         * Evaluate the root node, by evaluating the subtree.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return mixed Evaluated subtree
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       public function evaluate() {
-               if ($this->renderingContext === NULL) {
-                       throw new Tx_Fluid_Core_Parser_Exception('Rendering Context is NULL in RootNode, but necessary. If this error appears, please report a bug!', 1242669004);
-               }
-               $result = $this->evaluateChildNodes();
-               return $result;
+       public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               return $this->evaluateChildNodes($renderingContext);
        }
 }
 
index e0fc9ef..9a05d3f 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Text Syntax Tree Node - is a container for strings.
  *
- * @version $Id: TextNode.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -54,11 +51,23 @@ class Tx_Fluid_Core_Parser_SyntaxTree_TextNode extends Tx_Fluid_Core_Parser_Synt
         * Return the text associated to the syntax tree. Text from child nodes is
         * appended to the text in the node's own text.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return string the text stored in this node/subtree.
         * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @todo TextNode shouldn't have child nodes
         */
-       public function evaluate() {
-               return $this->text . $this->evaluateChildNodes();
+       public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               return $this->text . $this->evaluateChildNodes($renderingContext);
+       }
+
+       /**
+        * Getter for text
+        *
+        * @return string The text of this node
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getText() {
+               return $this->text;
        }
 }
 
index f49a5db..baf654d 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Node which will call a ViewHelper associated with this node.
  *
- * @version $Id: ViewHelperNode.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\Parser\SyntaxTree
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
@@ -47,7 +44,14 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
         * The ViewHelper associated with this node
         * @var Tx_Fluid_Core_ViewHelper_ViewHelperInterface
         */
-       protected $viewHelper = NULL;
+       protected $uninitializedViewHelper = NULL;
+
+       /**
+        * A mapping RenderingContext -> ViewHelper to only re-initialize ViewHelpers
+        * when a context change occurs.
+        * @var Tx_Extbase_Persistence_ObjectStorage
+        */
+       protected $viewHelpersByContext = NULL;
 
        /**
         * List of comparators which are supported in the boolean expression language.
@@ -83,24 +87,25 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
         * @author Karsten Dambekalns <karsten@typo3.org>
         */
        public function __construct(Tx_Fluid_Core_ViewHelper_ViewHelperInterface $viewHelper, array $arguments) {
-               $this->viewHelper = $viewHelper;
+               $this->uninitializedViewHelper = $viewHelper;
+               $this->viewHelpersByContext = t3lib_div::makeInstance('Tx_Extbase_Persistence_ObjectStorage');
                $this->arguments = $arguments;
 
                if (FALSE /*FIXME*/) {
-                       $this->viewHelperClassName = $this->viewHelper->FLOW3_AOP_Proxy_getProxyTargetClassName();
+                       $this->viewHelperClassName = $this->uninitializedViewHelper->FLOW3_AOP_Proxy_getProxyTargetClassName();
                } else {
-                       $this->viewHelperClassName = get_class($this->viewHelper);
+                       $this->viewHelperClassName = get_class($this->uninitializedViewHelper);
                }
        }
 
        /**
-        * Returns the attached ViewHelper for this ViewHelperNode.
+        * Returns the attached (but still uninitialized) ViewHelper for this ViewHelperNode.
         * We need this method because sometimes Interceptors need to ask some information from the ViewHelper.
         *
         * @return Tx_Fluid_Core_ViewHelper_AbstractViewHelper the attached ViewHelper, if it is initialized
         */
-       public function getViewHelper() {
-               return $this->viewHelper;
+       public function getUninitializedViewHelper() {
+               return $this->uninitializedViewHelper;
        }
 
        /**
@@ -123,32 +128,30 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
         *
         * Afterwards, checks that the view helper did not leave a variable lying around.
         *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return object evaluated node after the view helper has been called.
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Karsten Dambekalns <karsten@typo3.org>
         * @todo check recreation of viewhelper when revisiting caching
         */
-       public function evaluate() {
-               if ($this->renderingContext === NULL) {
-                       throw new Tx_Fluid_Core_Parser_Exception('RenderingContext is null in ViewHelperNode, but necessary. If this error appears, please report a bug!', 1242669031);
-               }
+       public function evaluate(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               $objectManager = $renderingContext->getObjectManager();
+               $contextVariables = $renderingContext->getTemplateVariableContainer()->getAllIdentifiers();
 
-               $objectManager = $this->renderingContext->getObjectManager();
-               $contextVariables = $this->renderingContext->getTemplateVariableContainer()->getAllIdentifiers();
-
-               if ($this->viewHelper === NULL) {
-                               // we have been resurrected from the cache
-                       $this->viewHelper = $objectManager->create($this->viewHelperClassName);
+               if ($this->viewHelpersByContext->contains($renderingContext)) {
+                       $viewHelper = $this->viewHelpersByContext[$renderingContext];
+               } else {
+                       $viewHelper = clone $this->uninitializedViewHelper;
+                       $this->viewHelpersByContext->attach($renderingContext, $viewHelper);
                }
 
                $evaluatedArguments = array();
                $renderMethodParameters = array();
-               if (count($this->viewHelper->prepareArguments())) {
-                       foreach ($this->viewHelper->prepareArguments() as $argumentName => $argumentDefinition) {
+               if (count($viewHelper->prepareArguments())) {
+                       foreach ($viewHelper->prepareArguments() as $argumentName => $argumentDefinition) {
                                if (isset($this->arguments[$argumentName])) {
                                        $argumentValue = $this->arguments[$argumentName];
-                                       $argumentValue->setRenderingContext($this->renderingContext);
-                                       $evaluatedArguments[$argumentName] = $this->convertArgumentValue($argumentValue, $argumentDefinition->getType());
+                                       $evaluatedArguments[$argumentName] = $this->convertArgumentValue($argumentValue, $argumentDefinition->getType(), $renderingContext);
                                } else {
                                        $evaluatedArguments[$argumentName] = $argumentDefinition->getDefaultValue();
                                }
@@ -159,34 +162,28 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
                }
 
                $viewHelperArguments = $objectManager->create('Tx_Fluid_Core_ViewHelper_Arguments', $evaluatedArguments);
-               $this->viewHelper->setArguments($viewHelperArguments);
-               $this->viewHelper->setTemplateVariableContainer($this->renderingContext->getTemplateVariableContainer());
-               if ($this->renderingContext->getControllerContext() !== NULL) {
-                       $this->viewHelper->setControllerContext($this->renderingContext->getControllerContext());
+               $viewHelper->setArguments($viewHelperArguments);
+               $viewHelper->setTemplateVariableContainer($renderingContext->getTemplateVariableContainer());
+               if ($renderingContext->getControllerContext() !== NULL) {
+                       $viewHelper->setControllerContext($renderingContext->getControllerContext());
                }
-               $this->viewHelper->setViewHelperVariableContainer($this->renderingContext->getViewHelperVariableContainer());
-               $this->viewHelper->setViewHelperNode($this);
+               $viewHelper->setViewHelperVariableContainer($renderingContext->getViewHelperVariableContainer());
+               $viewHelper->setViewHelperNode($this);
+               $viewHelper->setRenderingContext($renderingContext);
 
-               if ($this->viewHelper instanceof Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface) {
-                       $this->viewHelper->setChildNodes($this->childNodes);
-                       $this->viewHelper->setRenderingContext($this->renderingContext);
+               if ($viewHelper instanceof Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface) {
+                       $viewHelper->setChildNodes($this->childNodes);
                }
 
-               $this->viewHelper->validateArguments();
-               $this->viewHelper->initialize();
+               $viewHelper->validateArguments();
+               $viewHelper->initialize();
                try {
-                       $output = call_user_func_array(array($this->viewHelper, 'render'), $renderMethodParameters);
+                       $output = call_user_func_array(array($viewHelper, 'render'), $renderMethodParameters);
                } catch (Tx_Fluid_Core_ViewHelper_Exception $exception) {
                                // @todo [BW] rethrow exception, log, ignore.. depending on the current context
                        $output = $exception->getMessage();
                }
 
-               if ($contextVariables != $this->renderingContext->getTemplateVariableContainer()->getAllIdentifiers()) {
-                       $endContextVariables = $this->renderingContext->getTemplateVariableContainer();
-                       $diff = array_intersect($endContextVariables, $contextVariables);
-
-                       throw new RuntimeException('The following context variable has been changed after the view helper "' . $this->viewHelperClassName . '" has been called: ' .implode(', ', $diff), 1236081302);
-               }
                return $output;
        }
 
@@ -199,11 +196,11 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
         */
-       protected function convertArgumentValue(Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode $syntaxTreeNode, $type) {
+       protected function convertArgumentValue(Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode $syntaxTreeNode, $type, Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
                if ($type === 'boolean') {
-                       return $this->evaluateBooleanExpression($syntaxTreeNode);
+                       return $this->evaluateBooleanExpression($syntaxTreeNode, $renderingContext);
                }
-               return $syntaxTreeNode->evaluate();
+               return $syntaxTreeNode->evaluate($renderingContext);
        }
 
        /**
@@ -229,23 +226,22 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
         * Then, we evaluate the obtained left and right side using the given comparator. This is done inside the evaluateComparator method.
         *
         * @param Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode $syntaxTreeNode Value to be converted
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
         * @return boolean Evaluated value
         * @throws Tx_Fluid_Core_Parser_Exception
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       protected function evaluateBooleanExpression(Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode $syntaxTreeNode) {
+       protected function evaluateBooleanExpression(Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode $syntaxTreeNode, Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
                $childNodes = $syntaxTreeNode->getChildNodes();
                if (count($childNodes) > 3) {
-                       throw new Tx_Fluid_Core_Parser_Exception('The expression "' . $syntaxTreeNode->evaluate() . '" has more than tree parts.', 1244201848);
+                       throw new Tx_Fluid_Core_Parser_Exception('The expression "' . $syntaxTreeNode->evaluate($renderingContext) . '" has more than tree parts.', 1244201848);
                }
 
                $leftSide = NULL;
                $rightSide = NULL;
                $comparator = NULL;
                foreach ($childNodes as $childNode) {
-                       $childNode->setRenderingContext($this->renderingContext);
-
-                       if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_TextNode && !preg_match(str_replace('COMPARATORS', implode('|', self::$comparators), self::$booleanExpressionTextNodeCheckerRegularExpression), $childNode->evaluate())) {
+                       if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_TextNode && !preg_match(str_replace('COMPARATORS', implode('|', self::$comparators), self::$booleanExpressionTextNodeCheckerRegularExpression), $childNode->evaluate($renderingContext))) {
                                $comparator = NULL;
                                        // skip loop and fall back to classical to boolean conversion.
                                break;
@@ -254,14 +250,14 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
                        if ($comparator !== NULL) {
                                        // comparator already set, we are evaluating the right side of the comparator
                                if ($rightSide === NULL) {
-                                       $rightSide = $childNode->evaluate();
+                                       $rightSide = $childNode->evaluate($renderingContext);
                                } else {
-                                       $rightSide .= $childNode->evaluate();
+                                       $rightSide .= $childNode->evaluate($renderingContext);
                                }
                        } elseif ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_TextNode
-                               && ($comparator = $this->getComparatorFromString($childNode->evaluate()))) {
+                               && ($comparator = $this->getComparatorFromString($childNode->evaluate($renderingContext)))) {
                                        // comparator in current string segment
-                               $explodedString = explode($comparator, $childNode->evaluate());
+                               $explodedString = explode($comparator, $childNode->evaluate($renderingContext));
                                if (isset($explodedString[0]) && trim($explodedString[0]) !== '') {
                                        $leftSide .= trim($explodedString[0]);
                                }
@@ -271,9 +267,9 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
                        } else {
                                        // comparator not found yet, on the left side of the comparator
                                if ($leftSide === NULL) {
-                                       $leftSide = $childNode->evaluate();
+                                       $leftSide = $childNode->evaluate($renderingContext);
                                } else {
-                                       $leftSide .= $childNode->evaluate();
+                                       $leftSide .= $childNode->evaluate($renderingContext);
                                }
                        }
                }
@@ -281,8 +277,7 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
                if ($comparator !== NULL) {
                        return $this->evaluateComparator($comparator, $leftSide, $rightSide);
                } else {
-                       $syntaxTreeNode->setRenderingContext($this->renderingContext);
-                       return $this->convertToBoolean($syntaxTreeNode->evaluate());
+                       return $this->convertToBoolean($syntaxTreeNode->evaluate($renderingContext));
                }
        }
 
@@ -349,12 +344,12 @@ class Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_Parse
                if (is_bool($value)) {
                        return $value;
                }
-               if (is_string($value)) {
-                       return (!empty($value) && strtolower($value) !== 'false');
-               }
                if (is_numeric($value)) {
                        return $value > 0;
                }
+               if (is_string($value)) {
+                       return (!empty($value) && strtolower($value) !== 'false');
+               }
                if (is_array($value) || (is_object($value) && $value instanceof Countable)) {
                        return count($value) > 0;
                }
index e6b1c18..8d65f6c 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Template parser building up an object syntax tree
  *
- * @version $Id: TemplateParser.php 2046 2010-03-16 10:31:00Z sebastian $
- * @package Fluid
- * @subpackage Core\Parser
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 class Tx_Fluid_Core_Parser_TemplateParser {
@@ -237,7 +234,7 @@ class Tx_Fluid_Core_Parser_TemplateParser {
        );
 
        /**
-        * @var \Tx_Fluid_Compatibility_ObjectManager
+        * @var Tx_Fluid_Compatibility_ObjectManager
         */
        protected $objectManager;
 
@@ -269,7 +266,7 @@ class Tx_Fluid_Core_Parser_TemplateParser {
 
        /**
         * Set the configuration for the parser.
-        *h
+        *
         * @param Tx_Fluid_Core_Parser_Configuration $configuration
         * @return void
         * @author Karsten Dambekalns <karsten@typo3.org>
@@ -581,7 +578,7 @@ class Tx_Fluid_Core_Parser_TemplateParser {
 
                        // Object Accessor
                if (strlen($objectAccessorString) > 0) {
-
+                       
                        $node = $this->objectManager->create('Tx_Fluid_Core_Parser_SyntaxTree_ObjectAccessorNode', $objectAccessorString);
                        $this->callInterceptor($node, Tx_Fluid_Core_Parser_InterceptorInterface::INTERCEPT_OBJECTACCESSOR);
 
@@ -809,7 +806,7 @@ class Tx_Fluid_Core_Parser_TemplateParser {
        protected function textHandler(Tx_Fluid_Core_Parser_ParsingState $state, $text) {
                $node = $this->objectManager->create('Tx_Fluid_Core_Parser_SyntaxTree_TextNode', $text);
                $this->callInterceptor($node, Tx_Fluid_Core_Parser_InterceptorInterface::INTERCEPT_TEXT);
-
+               
                $state->getNodeFromStack()->addChildNode($node);
        }
 
index 4ef84c2..8f96a95 100644 (file)
 /**
  *
  *
- * @version $Id: RenderingContext.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\Rendering
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
-class Tx_Fluid_Core_Rendering_RenderingContext {
+class Tx_Fluid_Core_Rendering_RenderingContext implements Tx_Fluid_Core_Rendering_RenderingContextInterface {
 
        /**
         * Template Variable Container. Contains all variables available through object accessors in the template
+        *
         * @var Tx_Fluid_Core_ViewHelper_TemplateVariableContainer
         */
        protected $templateVariableContainer;
@@ -40,18 +38,21 @@ class Tx_Fluid_Core_Rendering_RenderingContext {
        /**
         * Object manager which is bubbled through. The ViewHelperNode cannot get an ObjectManager injected because
         * the whole syntax tree should be cacheable
+        *
         * @var Tx_Fluid_Compatibility_ObjectManager
         */
        protected $objectManager;
 
        /**
         * Controller context being passed to the ViewHelper
+        *
         * @var Tx_Extbase_MVC_Controller_ControllerContext
         */
        protected $controllerContext;
 
        /**
         * ViewHelper Variable Container
+        *
         * @var Tx_Fluid_Core_ViewHelpers_ViewHelperVariableContainer
         */
        protected $viewHelperVariableContainer;
@@ -77,13 +78,13 @@ class Tx_Fluid_Core_Rendering_RenderingContext {
        }
 
        /**
-        * Sets the template variable container containing all variables available through ObjectAccessors
+        * Injects the template variable container containing all variables available through ObjectAccessors
         * in the template
         *
         * @param Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $templateVariableContainer The template variable container to set
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       public function setTemplateVariableContainer(Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $templateVariableContainer) {
+       public function injectTemplateVariableContainer(Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $templateVariableContainer) {
                $this->templateVariableContainer = $templateVariableContainer;
        }
 
@@ -124,7 +125,7 @@ class Tx_Fluid_Core_Rendering_RenderingContext {
         * @return void
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       public function setViewHelperVariableContainer(Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer) {
+       public function injectViewHelperVariableContainer(Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer) {
                $this->viewHelperVariableContainer = $viewHelperVariableContainer;
        }
 
diff --git a/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContextInterface.php b/typo3/sysext/fluid/Classes/Core/Rendering/RenderingContextInterface.php
new file mode 100644 (file)
index 0000000..e717c6a
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+/*                                                                        *
+ * This script belongs to the FLOW3 package "Fluid".                      *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ *
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+interface Tx_Fluid_Core_Rendering_RenderingContextInterface {
+
+       /**
+        * Returns the object manager. Only the ViewHelperNode should do this.
+        *
+        * @param Tx_Fluid_Compatibility_ObjectManager $objectManager
+        */
+       public function getObjectManager();
+
+       /**
+        * Injects the template variable container containing all variables available through ObjectAccessors
+        * in the template
+        *
+        * @param Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $templateVariableContainer The template variable container to set
+        */
+       public function injectTemplateVariableContainer(Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $templateVariableContainer);
+
+       /**
+        * Get the template variable container
+        *
+        * @return Tx_Fluid_Core_ViewHelper_TemplateVariableContainer The Template Variable Container
+        */
+       public function getTemplateVariableContainer();
+
+       /**
+        * Set the controller context which will be passed to the ViewHelper
+        *
+        * @param Tx_Extbase_MVC_Controller_ControllerContext $controllerContext The controller context to set
+        */
+       public function setControllerContext(Tx_Extbase_MVC_Controller_ControllerContext $controllerContext);
+
+       /**
+        * Get the controller context which will be passed to the ViewHelper
+        *
+        * @return Tx_Extbase_MVC_Controller_ControllerContext The controller context to set
+        */
+       public function getControllerContext();
+
+       /**
+        * Set the ViewHelperVariableContainer
+        *
+        * @param Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer
+        * @return void
+        */
+       public function injectViewHelperVariableContainer(Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer);
+
+       /**
+        * Get the ViewHelperVariableContainer
+        *
+        * @return Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer
+        */
+       public function getViewHelperVariableContainer();
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractConditionViewHelper.php b/typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractConditionViewHelper.php
new file mode 100644 (file)
index 0000000..e5f1d0e
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+
+/*                                                                        *
+ * This script belongs to the FLOW3 package "Fluid".                      *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * This view helper is an abstract ViewHelper which implements an if/else condition.
+ * @see Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode::convertArgumentValue() to find see how boolean arguments are evaluated
+ *
+ * = Usage =
+ *
+ * To create a custom Condition ViewHelper, you need to subclass this class, and
+ * implement your own render() method. Inside there, you should call $this->renderThenChild()
+ * if the condition evaluated to TRUE, and $this->renderElseChild() if the condition evaluated
+ * to FALSE.
+ *
+ * Every Condition ViewHelper has a "then" and "else" argument, so it can be used like:
+ * <[aConditionViewHelperName] .... then="condition true" else="condition false" />,
+ * or as well use the "then" and "else" child nodes.
+ *
+ * @see Tx_Fluid_ViewHelpers_IfViewHelper for a more detailed explanation and a simple usage example.
+ * Make sure to NOT OVERRIDE the constructor.
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @api
+ * @scope prototype
+ */
+abstract class Tx_Fluid_Core_ViewHelper_AbstractConditionViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface {
+
+       /**
+        * An array of Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode
+        * @var array
+        */
+       private $childNodes = array();
+
+       /**
+        * Setter for ChildNodes - as defined in ChildNodeAccessInterface
+        *
+        * @param array $childNodes Child nodes of this syntax tree node
+        * @return void
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function setChildNodes(array $childNodes) {
+               $this->childNodes = $childNodes;
+       }
+
+       /**
+        * Initializes the "then" and "else" arguments
+        *
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function __construct() {
+               $this->registerArgument('then', 'mixed', 'Value to be returned if the condition if met.', FALSE);
+               $this->registerArgument('else', 'mixed', 'Value to be returned if the condition if not met.', FALSE);
+       }
+
+       /**
+        * Returns value of "then" attribute.
+        * If then attribute is not set, iterates through child nodes and renders ThenViewHelper.
+        * If then attribute is not set and no ThenViewHelper is found, all child nodes are rendered
+        *
+        * @return string rendered ThenViewHelper or contents of <f:if> if no ThenViewHelper was found
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @api
+        */
+       protected function renderThenChild() {
+               if ($this->arguments->hasArgument('then')) {
+                       return $this->arguments['then'];
+               }
+               foreach ($this->childNodes as $childNode) {
+                       if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode
+                               && $childNode->getViewHelperClassName() === 'Tx_Fluid_ViewHelpers_ThenViewHelper') {
+                               $data = $childNode->evaluate($this->getRenderingContext());
+                               return $data;
+                       }
+               }
+               return $this->renderChildren();
+       }
+
+       /**
+        * Returns value of "else" attribute.
+        * If else attribute is not set, iterates through child nodes and renders ElseViewHelper.
+        * If else attribute is not set and no ElseViewHelper is found, an empty string will be returned.
+        *
+        * @return string rendered ElseViewHelper or an empty string if no ThenViewHelper was found
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @api
+        */
+       protected function renderElseChild() {
+               foreach ($this->childNodes as $childNode) {
+                       if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode
+                               && $childNode->getViewHelperClassName() === 'Tx_Fluid_ViewHelpers_ElseViewHelper') {
+                               return $childNode->evaluate($this->getRenderingContext());
+                       }
+               }
+               if ($this->arguments->hasArgument('else')) {
+                       return $this->arguments['else'];
+               }
+               return '';
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractTagBasedViewHelper.php b/typo3/sysext/fluid/Classes/Core/ViewHelper/AbstractTagBasedViewHelper.php
new file mode 100644 (file)
index 0000000..e6bdb53
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+
+/*                                                                        *
+ * This script belongs to the FLOW3 package "Fluid".                      *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * Tag based view helper.
+ * Sould be used as the base class for all view helpers which output simple tags, as it provides some
+ * convenience methods to register default attributes, ...
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @api
+ * @scope prototype
+ */
+abstract class Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
+
+       /**
+        * Names of all registered tag attributes
+        * @var array
+        */
+       protected $tagAttributes = array();
+
+       /**
+        * Tag builder instance
+        *
+        * @var Tx_Fluid_Core_ViewHelper_TagBuilder
+        * @api
+        */
+       protected $tag = NULL;
+
+       /**
+        * name of the tag to be created by this view helper
+        *
+        * @var string
+        * @api
+        */
+       protected $tagName = 'div';
+
+       /**
+        * Inject a TagBuilder
+        *
+        * @param Tx_Fluid_Core_ViewHelper_TagBuilder $tagBuilder Tag builder
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       public function injectTagBuilder(Tx_Fluid_Core_ViewHelper_TagBuilder $tagBuilder) {
+               $this->tag = $tagBuilder;
+       }
+
+       /**
+        * Constructor
+        *
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @api
+        */
+       public function __construct() {
+               $this->registerArgument('additionalAttributes', 'array', 'Additional tag attributes. They will be added directly to the resulting HTML tag.', FALSE);
+       }
+
+       /**
+        * Sets the tag name to $this->tagName.
+        * Additionally, sets all tag attributes which were registered in
+        * $this->tagAttributes and additionalArguments.
+        *
+        * Will be invoked just before the render method.
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @api
+        */
+       public function initialize() {
+               parent::initialize();
+               $this->tag->reset();
+               $this->tag->setTagName($this->tagName);
+               if (is_array($this->arguments['additionalAttributes'])) {
+                       $this->tag->addAttributes($this->arguments['additionalAttributes']);
+               }
+               foreach ($this->tagAttributes as $attributeName) {
+                       if ($this->arguments->hasArgument($attributeName) && $this->arguments[$attributeName] !== '') {
+                               $this->tag->addAttribute($attributeName, $this->arguments[$attributeName]);
+                       }
+               }
+       }
+
+       /**
+        * Register a new tag attribute. Tag attributes are all arguments which will be directly appended to a tag if you call $this->initializeTag()
+        *
+        * @param string $name Name of tag attribute
+        * @param strgin $type Type of the tag attribute
+        * @param string $description Description of tag attribute
+        * @param boolean $required set to TRUE if tag attribute is required. Defaults to FALSE.
+        * @return void
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @api
+        */
+       protected function registerTagAttribute($name, $type, $description, $required = FALSE) {
+               $this->registerArgument($name, $type, $description, $required, NULL);
+               $this->tagAttributes[] = $name;
+       }
+
+       /**
+        * Registers all standard HTML universal attributes.
+        * Should be used inside registerArguments();
+        *
+        * @return void
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @api
+        */
+       protected function registerUniversalTagAttributes() {
+               $this->registerTagAttribute('class', 'string', 'CSS class(es) for this element');
+               $this->registerTagAttribute('dir', 'string', 'Text direction for this HTML element. Allowed strings: "ltr" (left to right), "rtl" (right to left)');
+               $this->registerTagAttribute('id', 'string', 'Unique (in this file) identifier for this HTML element.');
+               $this->registerTagAttribute('lang', 'string', 'Language for this element. Use short names specified in RFC 1766');
+               $this->registerTagAttribute('style', 'string', 'Individual CSS styles for this element');
+               $this->registerTagAttribute('title', 'string', 'Tooltip text of element');
+               $this->registerTagAttribute('accesskey', 'string', 'Keyboard shortcut to access this element');
+               $this->registerTagAttribute('tabindex', 'integer', 'Specifies the tab order of this element');
+               $this->registerTagAttribute('onclick', 'string', 'JavaScript evaluated for the onclick event');
+       }
+}
+?>
\ No newline at end of file
index 789d471..cdac69d 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * The abstract base class for all view helpers.
  *
- * @version $Id: AbstractViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -72,6 +69,11 @@ abstract class Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_C
        protected $controllerContext;
 
        /**
+        * @var Tx_Fluid_Core_Rendering_RenderingContextInterface
+        */
+       private $renderingContext;
+
+       /**
         * ViewHelper Variable Container
         * @var Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer
         * @api
@@ -120,6 +122,16 @@ abstract class Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_C
        }
 
        /**
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+        $this->renderingContext = $renderingContext;
+       }
+
+
+       /**
         * @param Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer
         * @return void
         * @author Sebastian Kurfürst <sebastian@typo3.org>
@@ -172,6 +184,29 @@ abstract class Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_C
        }
 
        /**
+        * Overrides a registered argument. Call this method from your ViewHelper subclass
+        * inside the initializeArguments() method if you want to override a previously registered argument.
+        * @see registerArgument()
+        *
+        * @param string $name Name of the argument
+        * @param string $type Type of the argument
+        * @param string $description Description of the argument
+        * @param boolean $required If TRUE, argument is required. Defaults to FALSE.
+        * @param mixed $defaultValue Default value of argument
+        * @return Tx_Fluid_Core_ViewHelper_AbstractViewHelper $this, to allow chaining.
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @todo Object Factory usage!
+        * @api
+        */
+       protected function overrideArgument($name, $type, $description, $required = FALSE, $defaultValue = NULL) {
+               if (!array_key_exists($name, $this->argumentDefinitions)) {
+                       throw new Tx_Fluid_Core_ViewHelper_Exception('Argument "' . $name . '" has not been defined, thus it can\'t be overridden.', 1279212461);
+               }
+               $this->argumentDefinitions[$name] = new Tx_Fluid_Core_ViewHelper_ArgumentDefinition($name, $type, $description, $required, $defaultValue);
+               return $this;
+       }
+
+       /**
         * Sets all needed attributes needed for the rendering. Called by the
         * framework. Populates $this->viewHelperNode.
         * This is PURELY INTERNAL! Never override this method!!
@@ -206,7 +241,7 @@ abstract class Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_C
         * @api
         */
        protected function renderChildren() {
-               return $this->viewHelperNode->evaluateChildNodes();
+               return $this->viewHelperNode->evaluateChildNodes($this->renderingContext);
        }
 
        /**
@@ -333,6 +368,21 @@ abstract class Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_C
         * @api
         */
        //abstract public function render();
+
+       /**
+        * Get the rendering context interface.
+        * THIS METHOD IS NO PUBLIC API AND ONLY CALLABLE INSIDE THE FRAMEWORK!
+        *
+        * @return Tx_Fluid_Core_Rendering_RenderingContextInterface
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function getRenderingContext() {
+               if ($this instanceof Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface) {
+                       return $this->renderingContext;
+               } else {
+                       throw new Tx_Fluid_Core_ViewHelper_Exception_RenderingContextNotAccessibleException('It is forbidden to call getRenderingContext() if you do not implement Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface. But beware, this interface is NO PUBLIC API! If you want to implement conditions, you should subclass Tx_Fluid_Core_ViewHelper_AbstractConditionViewHelper.', 127895038);
+               }
+       }
 }
 
 ?>
\ No newline at end of file
index abb5081..b5f49a2 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * Argument definition of each view helper argument
  *
- * @version $Id: ArgumentDefinition.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 class Tx_Fluid_Core_ViewHelper_ArgumentDefinition {
index 7c76c79..3569c63 100644 (file)
@@ -25,9 +25,6 @@
  * Is available inside every view helper as $this->arguments - and you use it as if it was an array.
  * However, you can only read, and not write to it.
  *
- * @version $Id: Arguments.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 88db485..3f738c7 100644 (file)
 /**
  * A ViewHelper Exception
  *
- * @version $Id: Exception.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
 class Tx_Fluid_Core_ViewHelper_Exception extends Tx_Fluid_Core_Exception {
 }
-?>
\ No newline at end of file
+?>
index 0c88b2b..1a10c61 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * A "Invalid Variable" exception.
  *
- * @version $Id$
- * @package Fluid
- * @subpackage Core\ViewHelper\Exception
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
diff --git a/typo3/sysext/fluid/Classes/Core/ViewHelper/Exception/RenderingContextNotAccessibleException.php b/typo3/sysext/fluid/Classes/Core/ViewHelper/Exception/RenderingContextNotAccessibleException.php
new file mode 100644 (file)
index 0000000..ac2b676
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+/*                                                                        *
+ * This script belongs to the FLOW3 package "Fluid".                      *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * A "Rendering Context not Accessible" exception.
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @api
+ */
+class Tx_Fluid_Core_ViewHelper_Exception_RenderingContextNotAccessibleException extends Tx_Fluid_Core_ViewHelper_Exception {
+}
+
+?>
\ No newline at end of file
index dc2fee5..6af7d62 100644 (file)
  * need access to the direct children in the Syntax Tree at rendering-time.
  * This might happen if you only want to selectively render a part of the syntax
  * tree depending on some conditions.
+ * To render subnodes, you can fetch the RenderingContext via $this->getRenderingContext().
  *
- * In most cases, you will not need this view helper.
+ * In most cases, you will not need this facet, and it is NO PUBLIC API!
+ * Right now it is only used internally for conditions, so by subclassing Tx_Fluid_Core_ViewHelpers_AbstractConditionViewHelper, this should be all you need.
  *
  * See Tx_Fluid_ViewHelpers_IfViewHelper for an example how it is used.
  *
- * @version $Id: ChildNodeAccessInterface.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper\Facets
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 interface Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface {
-
        /**
         * Sets the direct child nodes of the current syntax tree node.
         *
@@ -44,15 +42,6 @@ interface Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface {
         * @return void
         */
        public function setChildNodes(array $childNodes);
-
-       /**
-        * Sets the rendering context which needs to be passed on to child nodes
-        *
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext the renderingcontext to use
-        * @return void
-        */
-       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext);
-
 }
 
 ?>
\ No newline at end of file
index 18c1088..cadc58c 100644 (file)
@@ -32,9 +32,6 @@
  *
  * Normally, this facet is not needed, except in really really rare cases.
  *
- * @version $Id: PostParseInterface.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper\Facets
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 interface Tx_Fluid_Core_ViewHelper_Facets_PostParseInterface {
index 91774ce..8c23284 100644 (file)
  *                                                                        */
 
 /**
- * Tag based view helper.
- * Sould be used as the base class for all view helpers which output simple tags, as it provides some
- * convenience methods to register default attributes, ...
+ * @deprecated. Extend Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper instead!
  *
- * @version $Id: TagBasedViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
  */
-abstract class Tx_Fluid_Core_ViewHelper_TagBasedViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
-
-       /**
-        * Names of all registered tag attributes
-        * @var array
-        */
-       protected $tagAttributes = array();
-
-       /**
-        * Tag builder instance
-        *
-        * @var Tx_Fluid_Core_ViewHelper_TagBuilder
-        * @api
-        */
-       protected $tag = NULL;
-
-       /**
-        * name of the tag to be created by this view helper
-        *
-        * @var string
-        * @api
-        */
-       protected $tagName = 'div';
-
-       /**
-        * Inject a TagBuilder
-        *
-        * @param Tx_Fluid_Core_ViewHelper_TagBuilder $tagBuilder Tag builder
-        * @return void
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       public function injectTagBuilder(Tx_Fluid_Core_ViewHelper_TagBuilder $tagBuilder) {
-               $this->tag = $tagBuilder;
-       }
+abstract class Tx_Fluid_Core_ViewHelper_TagBasedViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * Constructor
         *
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       public function __construct() {
-               $this->registerArgument('additionalAttributes', 'array', 'Additional tag attributes. They will be added directly to the resulting HTML tag.', FALSE);
-       }
-
-       /**
-        * Sets the tag name to $this->tagName.
-        * Additionally, sets all tag attributes which were registered in
-        * $this->tagAttributes and additionalArguments.
-        *
-        * Will be invoked just before the render method.
-        *
-        * @return void
         * @author Bastian Waidelich <bastian@typo3.org>
-        * @api
         */
-       public function initialize() {
-               parent::initialize();
-               $this->tag->reset();
-               $this->tag->setTagName($this->tagName);
-               if (is_array($this->arguments['additionalAttributes'])) {
-                       $this->tag->addAttributes($this->arguments['additionalAttributes']);
-               }
-               foreach ($this->tagAttributes as $attributeName) {
-                       if ($this->arguments->hasArgument($attributeName) && $this->arguments[$attributeName] !== '') {
-                               $this->tag->addAttribute($attributeName, $this->arguments[$attributeName]);
-                       }
-               }
-       }
-
-       /**
-        * Register a new tag attribute. Tag attributes are all arguments which will be directly appended to a tag if you call $this->initializeTag()
-        *
-        * @param string $name Name of tag attribute
-        * @param strgin $type Type of the tag attribute
-        * @param string $description Description of tag attribute
-        * @param boolean $required set to TRUE if tag attribute is required. Defaults to FALSE.
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       protected function registerTagAttribute($name, $type, $description, $required = FALSE) {
-               $this->registerArgument($name, $type, $description, $required, NULL);
-               $this->tagAttributes[] = $name;
-       }
-
-       /**
-        * Registers all standard HTML universal attributes.
-        * Should be used inside registerArguments();
-        *
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       protected function registerUniversalTagAttributes() {
-               $this->registerTagAttribute('class', 'string', 'CSS class(es) for this element');
-               $this->registerTagAttribute('dir', 'string', 'Text direction for this HTML element. Allowed strings: "ltr" (left to right), "rtl" (right to left)');
-               $this->registerTagAttribute('id', 'string', 'Unique (in this file) identifier for this HTML element.');
-               $this->registerTagAttribute('lang', 'string', 'Language for this element. Use short names specified in RFC 1766');
-               $this->registerTagAttribute('style', 'string', 'Individual CSS styles for this element');
-               $this->registerTagAttribute('title', 'string', 'Tooltip text of element');
-               $this->registerTagAttribute('accesskey', 'string', 'Keyboard shortcut to access this element');
-               $this->registerTagAttribute('tabindex', 'integer', 'Specifies the tab order of this element');
-               $this->registerTagAttribute('onclick', 'string', 'JavaScript evaluated for the onclick event');
+       public function __construct() {
+               t3lib_div::deprecationLog('the ViewHelper "' . get_class($this) . '" extends "Tx_Fluid_Core_ViewHelper_TagBasedViewHelper". This is deprecated since TYPO3 4.5. Please extend the class "Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper"');
+               parent::__construct();
        }
 }
 ?>
\ No newline at end of file
index 363493d..f789e32 100644 (file)
  *                                                                        */
 
 /**
- * Tag builder. Can be easily accessed in TagBasedViewHelper
+ * Tag builder. Can be easily accessed in AbstractTagBasedViewHelper
  *
- * @version $Id: TagBuilder.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 77a6d0e..117e903 100644 (file)
@@ -27,9 +27,6 @@
  * 1) Holds the current variables in the template
  * 2) Holds variables being set during Parsing (set in view helpers implementing the PostParse facet)
  *
- * @version $Id: TemplateVariableContainer.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -112,6 +109,16 @@ class Tx_Fluid_Core_ViewHelper_TemplateVariableContainer implements ArrayAccess
        }
 
        /**
+        * Returns the variables array.
+        *
+        * @return array Identifiers and values of all variables
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getAll() {
+               return $this->variables;
+       }
+
+       /**
         * Checks if this property exists in the VariableContainer.
         *
         * @param string $identifier
index adc113f..ccf6ae3 100644 (file)
@@ -21,9 +21,6 @@
  *                                                                        */
 
 /**
- * @version $Id: ViewHelperInterface.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 interface Tx_Fluid_Core_ViewHelper_ViewHelperInterface {
index af0a1f0..39dac0c 100644 (file)
@@ -21,9 +21,6 @@
  *                                                                        */
 
 /**
- * @version $Id: ViewHelperVariableContainer.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage Core\ViewHelper
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -39,7 +36,7 @@ class Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer {
 
        /**
         *
-        * @var Tx_Extbase_MVC_View_ViewInterface
+        * @var Tx_Fluid_View_AbstractTemplateView
         */
        protected $view;
 
@@ -126,11 +123,11 @@ class Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer {
        /**
         * Set the view to pass it to ViewHelpers.
         *
-        * @param Tx_Extbase_MVC_View_ViewInterface $view View to set
+        * @param Tx_Fluid_View_AbstractTemplateView $view View to set
         * @return void
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       public function setView(Tx_Extbase_MVC_View_ViewInterface $view) {
+       public function setView(Tx_Fluid_View_AbstractTemplateView $view) {
                $this->view = $view;
        }
 
@@ -139,7 +136,7 @@ class Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer {
         *
         * !!! This is NOT a public API and might still change!!!
         *
-        * @return Tx_Extbase_MVC_View_ViewInterface The View
+        * @return Tx_Fluid_View_AbstractTemplateView The View
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        public function getView() {
index c10d6d2..bc54149 100644 (file)
@@ -13,9 +13,6 @@
  *                                                                        */
 
 /**
- * @package
- * @subpackage
- * @version $Id: Exception.php 1734 2009-11-25 21:53:57Z stucki $
  */
 class Tx_Fluid_Exception extends Exception {
 
index 31bf0cc..acacc52 100644 (file)
@@ -14,9 +14,6 @@
  *                                                                        */
 
 /**
- * @package
- * @subpackage
- * @version $Id: Fluid.php 1734 2009-11-25 21:53:57Z stucki $
  */
 class Tx_Fluid_Fluid {
        const NAMESPACE_SEPARATOR = '_';
index 5c2d7db..63c9667 100644 (file)
@@ -24,9 +24,6 @@
  * XML Schema (XSD) Generator. Will generate an XML schema which can be used for autocompletion
  * in schema-aware editors like Eclipse XML editor.
  *
- * @version $Id: DocbookGenerator.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage Service
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 class Tx_Fluid_Service_DocbookGenerator extends Tx_Fluid_Service_AbstractGenerator {
diff --git a/typo3/sysext/fluid/Classes/View/AbstractTemplateView.php b/typo3/sysext/fluid/Classes/View/AbstractTemplateView.php
new file mode 100644 (file)
index 0000000..5cf95e5
--- /dev/null
@@ -0,0 +1,399 @@
+<?php
+
+/*                                                                        *
+ * This script belongs to the FLOW3 package "Fluid".                      *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * Abstract Fluid Template View.
+ *
+ * Contains the fundamental methods which any Fluid based template view needs.
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+abstract class Tx_Fluid_View_AbstractTemplateView implements Tx_Fluid_View_TemplateViewInterface {
+
+       /**
+        * Constants defining possible rendering types
+        */
+       const RENDERING_TEMPLATE = 1;
+       const RENDERING_PARTIAL = 2;
+       const RENDERING_LAYOUT = 3;
+
+       /**
+        * @var Tx_Extbase_MVC_Controller_ControllerContext
+        */
+       protected $controllerContext;
+
+       /**
+        * @var Tx_Fluid_Compatibility_ObjectManager
+        */
+       protected $objectManager;
+
+       /**
+        * @var Tx_Fluid_Core_Parser_TemplateParser
+        */
+       protected $templateParser;
+
+       /**
+        * The initial rendering context for this template view.
+        * Due to the rendering stack, another rendering context might be active
+        * at certain points while rendering the template.
+        *
+        * @var Tx_Fluid_Core_Rendering_RenderingContextInterface
+        */
+       protected $baseRenderingContext;
+
+       /**
+        * Stack containing the current rendering type, the current rendering context, and the current parsed template
+        * Do not manipulate directly, instead use the methods"getCurrent*()", "startRendering(...)" and "stopRendering()"
+        * @var array
+        */
+       protected $renderingStack = array();
+
+       /**
+        * Injects the Object Manager
+        *
+        * @param Tx_Fluid_Compatibility_ObjectManager $objectManager
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function injectObjectManager(Tx_Fluid_Compatibility_ObjectManager $objectManager) {
+               $this->objectManager = $objectManager;
+       }
+
+       /**
+        * Inject the Template Parser
+        *
+        * @param Tx_Fluid_Core_Parser_TemplateParser $templateParser The template parser
+        * @return void
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function injectTemplateParser(Tx_Fluid_Core_Parser_TemplateParser $templateParser) {
+               $this->templateParser = $templateParser;
+       }
+
+       /**
+        * Injects a fresh rendering context
+        *
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               $this->baseRenderingContext = $renderingContext;
+               $this->baseRenderingContext->getViewHelperVariableContainer()->setView($this);
+               $this->controllerContext = $renderingContext->getControllerContext();
+       }
+
+       /**
+        * Sets the current controller context
+        *
+        * @param Tx_Extbase_MVC_Controller_ControllerContext $controllerContext
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        * @api
+        */
+       public function setControllerContext(Tx_Extbase_MVC_Controller_ControllerContext $controllerContext) {
+               $this->controllerContext = $controllerContext;
+       }
+
+       /**
+        * Returns the template parser that is used to parse this views template
+        *
+        * @return Tx_Fluid_Core_Parser_TemplateParser
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @api
+        */
+       public function getTemplateParser() {
+               return $this->templateParser;
+       }
+
+       public function initializeView() {
+       }
+       // Here, the backporter can insert the initializeView method, which is needed for Fluid v4.
+
+       /**
+        * Assign a value to the variable container.
+        *
+        * @param string $key The key of a view variable to set
+        * @param mixed $value The value of the view variable
+        * @return Tx_Fluid_View_AbstractTemplateView the instance of this view to allow chaining
+        * @author Robert Lemke <robert@typo3.org>
+        * @api
+        */
+       public function assign($key, $value) {
+               $templateVariableContainer = $this->baseRenderingContext->getTemplateVariableContainer();
+               if ($templateVariableContainer->exists($key)) {
+                       $templateVariableContainer->remove($key);
+               }
+               $templateVariableContainer->add($key, $value);
+               return $this;
+       }
+
+       /**
+        * Assigns multiple values to the JSON output.
+        * However, only the key "value" is accepted.
+        *
+        * @param array $values Keys and values - only a value with key "value" is considered
+        * @return Tx_Fluid_View_AbstractTemplateView the instance of this view to allow chaining
+        * @author Robert Lemke <robert@typo3.org>
+        * @api
+        */
+       public function assignMultiple(array $values) {
+               $templateVariableContainer = $this->baseRenderingContext->getTemplateVariableContainer();
+               foreach ($values as $key => $value) {
+                       if ($templateVariableContainer->exists($key)) {
+                               $templateVariableContainer->remove($key);
+                       }
+                       $templateVariableContainer->add($key, $value);
+               }
+               return $this;
+       }
+
+       /**
+        * Loads the template source and render the template.
+        * If "layoutName" is set in a PostParseFacet callback, it will render the file with the given layout.
+        *
+        * @param string $actionName If set, the view of the specified action will be rendered instead. Default is the action specified in the Request object
+        * @return string Rendered Template
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @author Robert Lemke <robert@typo3.org>
+        * @api
+        */
+       public function render($actionName = NULL) {
+               $this->baseRenderingContext->setControllerContext($this->controllerContext);
+               $this->templateParser->setConfiguration($this->buildParserConfiguration());
+               $parsedTemplate = $this->templateParser->parse($this->getTemplateSource($actionName));
+
+               if ($this->isLayoutDefinedInTemplate($parsedTemplate)) {
+                       $this->startRendering(self::RENDERING_LAYOUT, $parsedTemplate, $this->baseRenderingContext);
+                       $parsedLayout = $this->templateParser->parse($this->getLayoutSource($this->getLayoutNameInTemplate($parsedTemplate)));
+                       $output = $parsedLayout->render($this->baseRenderingContext);
+                       $this->stopRendering();
+               } else {
+                       $this->startRendering(self::RENDERING_TEMPLATE, $parsedTemplate, $this->baseRenderingContext);
+                       $output = $parsedTemplate->render($this->baseRenderingContext);
+                       $this->stopRendering();
+               }
+
+               return $output;
+       }
+
+       /**
+        * Renders a given section.
+        *
+        * @param string $sectionName Name of section to render
+        * @param array the variables to use.
+        * @return string rendered template for the section
+        * @throws Tx_Fluid_View_Exception_InvalidSectionException
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       public function renderSection($sectionName, array $variables) {
+               $parsedTemplate = $this->getCurrentParsedTemplate();
+
+               $sections = $parsedTemplate->getVariableContainer()->get('sections');
+               if(!array_key_exists($sectionName, $sections)) {
+                       throw new Tx_Fluid_View_Exception_InvalidSectionException('The given section does not exist!', 1227108982);
+               }
+               $section = $sections[$sectionName];
+
+               $renderingContext = $this->getCurrentRenderingContext();
+               if ($this->getCurrentRenderingType() === self::RENDERING_LAYOUT) {
+                       // in case we render a layout right now, we will render a section inside a TEMPLATE.
+                       $renderingTypeOnNextLevel = self::RENDERING_TEMPLATE;
+               } else {
+                       $variableContainer = $this->objectManager->create('Tx_Fluid_Core_ViewHelper_TemplateVariableContainer', $variables);
+                       $renderingContext = clone $renderingContext;
+                       $renderingContext->injectTemplateVariableContainer($variableContainer);
+                       $renderingTypeOnNextLevel = $this->getCurrentRenderingType();
+               }
+
+               $renderingContext->getViewHelperVariableContainer()->add('Tx_Fluid_ViewHelpers_SectionViewHelper', 'isCurrentlyRenderingSection', 'TRUE');
+
+               $this->startRendering($renderingTypeOnNextLevel, $parsedTemplate, $renderingContext);
+               $output = $section->evaluate($renderingContext);
+               $this->stopRendering();
+
+               return $output;
+       }
+
+       /**
+        * Renders a partial.
+        *
+        * @param string $partialName
+        * @param string $sectionName
+        * @param array $variables
+        * @param Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer the View Helper Variable container to use.
+        * @return string
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function renderPartial($partialName, $sectionName, array $variables) {
+               $partial = $this->templateParser->parse($this->getPartialSource($partialName));
+               $variableContainer = $this->objectManager->create('Tx_Fluid_Core_ViewHelper_TemplateVariableContainer', $variables);
+               $renderingContext = clone $this->getCurrentRenderingContext();
+               $renderingContext->injectTemplateVariableContainer($variableContainer);
+
+               $this->startRendering(self::RENDERING_PARTIAL, $partial, $renderingContext);
+               if ($sectionName !== NULL) {
+                       $output = $this->renderSection($sectionName, $variables);
+               } else {
+                       $output = $partial->render($renderingContext);
+               }
+               $this->stopRendering();
+
+               return $output;
+       }
+
+       /**
+        * Resolve the template path and filename for the given action. If $actionName
+        * is NULL, looks into the current request.
+        *
+        * @param string $actionName Name of the action. If NULL, will be taken from request.
+        * @return string Full path to template
+        * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException in case the template was not found
+        */
+       abstract protected function getTemplateSource($actionName = NULL);
+
+       /**
+        * Resolve the path and file name of the layout file, based on
+        * $this->layoutPathAndFilename and $this->layoutPathAndFilenamePattern.
+        *
+        * In case a layout has already been set with setLayoutPathAndFilename(),
+        * this method returns that path, otherwise a path and filename will be
+        * resolved using the layoutPathAndFilenamePattern.
+        *
+        * @param string $layoutName Name of the layout to use. If none given, use "default"
+        * @return string Path and filename of layout file
+        * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException
+        */
+       abstract protected function getLayoutSource($layoutName = 'default');
+
+       /**
+        * Figures out which partial to use.
+        *
+        * @param string $partialName The name of the partial
+        * @return string the full path which should be used. The path definitely exists.
+        * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException
+        */
+       abstract protected function getPartialSource($partialName);
+
+       /**
+        * Build parser configuration
+        *
+        * @return Tx_Fluid_Core_Parser_Configuration
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       protected function buildParserConfiguration() {
+               $parserConfiguration = $this->objectManager->create('Tx_Fluid_Core_Parser_Configuration');
+               if ($this->controllerContext->getRequest()->getFormat() === 'html') {
+                       $parserConfiguration->addInterceptor($this->objectManager->get('Tx_Fluid_Core_Parser_Interceptor_Escape'));
+                       
+               }
+               return $parserConfiguration;
+       }
+
+       /**
+        * Returns TRUE if there is a layout defined in the given template via a <f:layout name="..." /> tag.
+        *
+        * @param Tx_Fluid_Core_Parser_ParsedTemplateInterface $parsedTemplate
+        * @return boolean TRUE if a layout has been defined, FALSE otherwise.
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function isLayoutDefinedInTemplate(Tx_Fluid_Core_Parser_ParsedTemplateInterface $parsedTemplate) {
+               $variableContainer = $parsedTemplate->getVariableContainer();
+               return ($variableContainer !== NULL && $variableContainer->exists('layoutName'));
+       }
+
+       /**
+        * Returns the name of the layout defined in the template, if one exists.
+        *
+        * @param Tx_Fluid_Core_Parser_ParsedTemplateInterface $parsedTemplate
+        * @return string the Layout name
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function getLayoutNameInTemplate(Tx_Fluid_Core_Parser_ParsedTemplateInterface $parsedTemplate) {
+               if ($this->isLayoutDefinedInTemplate($parsedTemplate)) {
+                       return $parsedTemplate->getVariableContainer()->get('layoutName');
+               }
+               return NULL;
+       }
+
+       /**
+        * Start a new nested rendering. Pushes the given information onto the $renderingStack.
+        *
+        * @param int $type one of the RENDERING_* constants
+        * @param Tx_Fluid_Core_Parser_ParsedTemplateInterface $parsedTemplate
+        * @param Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext
+        * @return void
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function startRendering($type, Tx_Fluid_Core_Parser_ParsedTemplateInterface $parsedTemplate, Tx_Fluid_Core_Rendering_RenderingContextInterface $renderingContext) {
+               array_push($this->renderingStack, array('type' => $type, 'parsedTemplate' => $parsedTemplate, 'renderingContext' => $renderingContext));
+       }
+
+       /**
+        * Stops the current rendering. Removes one element from the $renderingStack. Make sure to always call this
+        * method pair-wise with startRendering().
+        *
+        * @return void
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function stopRendering() {
+               array_pop($this->renderingStack);
+       }
+
+       /**
+        * Get the current rendering type.
+        *
+        * @return one of RENDERING_* constants
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function getCurrentRenderingType() {
+               $currentRendering = end($this->renderingStack);
+               return $currentRendering['type'];
+       }
+
+       /**
+        * Get the parsed template which is currently being rendered.
+        *
+        * @return Tx_Fluid_Core_Parser_ParsedTemplateInterface
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function getCurrentParsedTemplate() {
+               $currentRendering = end($this->renderingStack);
+               return $currentRendering['parsedTemplate'];
+       }
+
+       /**
+        * Get the rendering context which is currently used.
+        *
+        * @return Tx_Fluid_Core_Rendering_RenderingContextInterface
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       protected function getCurrentRenderingContext() {
+               $currentRendering = end($this->renderingStack);
+               return $currentRendering['renderingContext'];
+       }
+}
+
+?>
\ No newline at end of file
index bd0cc11..d53daeb 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * A generic Fluid View exception.
  *
- * @version $Id: Exception.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage View
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
index 15db8b8..2a69560 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * An "Invalid Section" exception
  *
- * @version $Id$
- * @package Fluid
- * @subpackage View\Exception
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
index 4f0792e..319ca24 100644 (file)
@@ -23,9 +23,6 @@
 /**
  * An "Invalid Template Resource" exception
  *
- * @version $Id: InvalidTemplateResourceException.php 3643 2010-01-15 14:38:07Z robert $
- * @package Fluid
- * @subpackage View\Exception
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
index 174d243..93209cc 100644 (file)
 /**
  * The main template view. Should be used as view if you want Fluid Templating
  *
- * @version $Id: TemplateView.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage View
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
  */
-class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implements Tx_Fluid_View_TemplateViewInterface {
-
-       /**
-        * @var Tx_Fluid_Core_Parser_TemplateParser
-        */
-       protected $templateParser;
+class Tx_Fluid_View_TemplateView extends Tx_Fluid_View_AbstractTemplateView {
 
        /**
         * Pattern to be resolved for @templateRoot in the other patterns.
@@ -104,31 +96,15 @@ class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implem
        protected $layoutPathAndFilename = NULL;
 
        public function __construct() {
-                                               $this->templateParser = Tx_Fluid_Compatibility_TemplateParserBuilder::build();
-                                               $this->objectManager = t3lib_div::makeInstance('Tx_Fluid_Compatibility_ObjectManager');
-                                       }
-       // Here, the backporter can insert a constructor method, which is needed for Fluid v4.
-
-       /**
-        * Inject the template parser
-        *
-        * @param Tx_Fluid_Core_Parser_TemplateParser $templateParser The template parser
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        */
-       public function injectTemplateParser(Tx_Fluid_Core_Parser_TemplateParser $templateParser) {
-               $this->templateParser = $templateParser;
-       }
+                       $this->injectTemplateParser(Tx_Fluid_Compatibility_TemplateParserBuilder::build());
+                       $this->injectObjectManager(t3lib_div::makeInstance('Tx_Fluid_Compatibility_ObjectManager'));
+                       $this->setRenderingContext($this->objectManager->create('Tx_Fluid_Core_Rendering_RenderingContext'));
+               }
 
-       /**
-        * Initialize view
-        *
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       public function initializeView() {
-       }
+               public function initializeView() {
+               }
+                                       
+       // Here, the backporter can insert a constructor method, which is needed for Fluid v4.
 
        /**
         * Sets the path and name of of the template file. Effectively overrides the
@@ -156,66 +132,33 @@ class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implem
        }
 
        /**
-        * Build the rendering context
-        *
-        * @param Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $variableContainer
-        * @return Tx_Fluid_Core_Rendering_RenderingContext
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        */
-       protected function buildRenderingContext(Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $variableContainer = NULL) {
-               if ($variableContainer === NULL) {
-                       $variableContainer = $this->objectManager->create('Tx_Fluid_Core_ViewHelper_TemplateVariableContainer', $this->variables);
-               }
-
-               $renderingContext = $this->objectManager->create('Tx_Fluid_Core_Rendering_RenderingContext');
-               $renderingContext->setTemplateVariableContainer($variableContainer);
-               if ($this->controllerContext !== NULL) {
-                       $renderingContext->setControllerContext($this->controllerContext);
-               }
-
-               $viewHelperVariableContainer = $this->objectManager->create('Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer');
-               $viewHelperVariableContainer->setView($this);
-               $renderingContext->setViewHelperVariableContainer($viewHelperVariableContainer);
-
-               return $renderingContext;
-       }
-
-       /**
-        * Build parser configuration
+        * Checks whether a template can be resolved for the current request context.
         *
-        * @return Tx_Fluid_Core_Parser_Configuration
+        * @return boolean
         * @author Karsten Dambekalns <karsten@typo3.org>
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @api
         */
-       protected function buildParserConfiguration() {
-               $parserConfiguration = $this->objectManager->create('Tx_Fluid_Core_Parser_Configuration');
-               if ($this->controllerContext->getRequest()->getFormat() === 'html') {
-                       $parserConfiguration->addInterceptor($this->objectManager->get('Tx_Fluid_Core_Parser_Interceptor_Escape'));
-
+       public function hasTemplate() {
+               try {
+                       $this->getTemplateSource();
+                       return TRUE;
+               } catch (Tx_Fluid_View_Exception_InvalidTemplateResourceException $e) {
+                       return FALSE;
                }
-               return $parserConfiguration;
        }
 
-       /**
-        * Find the XHTML template according to $this->templatePathAndFilenamePattern and render the template.
-        * If "layoutName" is set in a PostParseFacet callback, it will render the file with the given layout.
+               /**
+        * Set the root path to the templates.
+        * If set, overrides the one determined from $this->templateRootPathPattern
         *
-        * @param string $actionName If set, the view of the specified action will be rendered instead. Default is the action specified in the Request object
-        * @return string Rendered Template
+        * @param string $templateRootPath Root path to the templates. If set, overrides the one determined from $this->templateRootPathPattern
+        * @return void
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @api
         */
-       public function render($actionName = NULL) {
-               $templatePathAndFilename = $this->resolveTemplatePathAndFilename($actionName);
-
-               $this->templateParser->setConfiguration($this->buildParserConfiguration());
-               $parsedTemplate = $this->parseTemplate($templatePathAndFilename);
-
-               $variableContainer = $parsedTemplate->getVariableContainer();
-               if ($variableContainer !== NULL && $variableContainer->exists('layoutName')) {
-                       return $this->renderWithLayout($variableContainer->get('layoutName'));
-               }
-
-               return $parsedTemplate->render($this->buildRenderingContext());
+       public function setTemplateRootPath($templateRootPath) {
+               $this->templateRootPath = $templateRootPath;
        }
 
        /**
@@ -227,68 +170,39 @@ class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implem
         * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       protected function resolveTemplatePathAndFilename($actionName = NULL) {
+       protected function getTemplateSource($actionName = NULL) {
                if ($this->templatePathAndFilename !== NULL) {
-                       return $this->templatePathAndFilename;
-               }
-
-               $actionName = ($actionName !== NULL ? $actionName : $this->controllerContext->getRequest()->getControllerActionName());
-               $actionName = ucfirst($actionName);
-
-               $paths = $this->expandGenericPathPattern($this->templatePathAndFilenamePattern, FALSE, FALSE);
-
-               foreach ($paths as &$path) {
-                       // TODO remove fallback to lower case template files after grace period
-                       $fallbackPath = str_replace('@action', strtolower($actionName), $path);
-                       $path = str_replace('@action', $actionName, $path);
-                       if (file_exists($path)) {
-                               return $path;
-                       } else {
-                               if (file_exists($fallbackPath)) {
-                                       t3lib_div::deprecationLog('the template filename "' . $fallbackPath . '" is lowercase. This is deprecated since TYPO3 4.4. Please rename the template to "' . basename($path) . '"');
-                                       return $fallbackPath;
+                       $templatePathAndFilename = $this->templatePathAndFilename;
+               } else {
+                       $actionName = ($actionName !== NULL ? $actionName : $this->controllerContext->getRequest()->getControllerActionName());
+                       $actionName = ucfirst($actionName);
+
+                       $paths = $this->expandGenericPathPattern($this->templatePathAndFilenamePattern, FALSE, FALSE);
+                       $found = FALSE;
+                       foreach ($paths as &$templatePathAndFilename) {
+                               // These tokens are replaced by the Backporter for the graceful fallback in version 4.
+                               $fallbackPath = str_replace('@action', strtolower($actionName), $templatePathAndFilename);
+                               $templatePathAndFilename = str_replace('@action', $actionName, $templatePathAndFilename);
+                               if (file_exists($templatePathAndFilename)) {
+                                       $found = TRUE;
+                                       break;
+                               }  elseif (file_exists($fallbackPath)) {
+                                       $found = TRUE;
+                                       $templatePathAndFilename = $fallbackPath;
+                                       t3lib_div::deprecationLog('the template filename "' . $fallbackPath . '" is lowercase. This is deprecated since TYPO3 4.4. Please rename the template to "' . basename($templatePathAndFilename) . '"');
+                                       break;
                                }
                        }
+                       if (!$found) {
+                               throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('Template could not be loaded. I tried "' . implode('", "', $paths) . '"', 1225709595);
+                       }
                }
-               throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('Template could not be loaded. I tried "' . implode('", "', $paths) . '"', 1225709595);
-       }
-
-       /**
-        * Renders a given section.
-        *
-        * @param string $sectionName Name of section to render
-        * @return string rendered template for the section
-        * @throws Tx_Fluid_View_Exception_InvalidSectionException
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       public function renderSection($sectionName) {
-               $parsedTemplate = $this->parseTemplate($this->resolveTemplatePathAndFilename());
 
-               $sections = $parsedTemplate->getVariableContainer()->get('sections');
-               if(!array_key_exists($sectionName, $sections)) {
-                       throw new Tx_Fluid_View_Exception_InvalidSectionException('The given section does not exist!', 1227108982);
+               $templateSource = file_get_contents($templatePathAndFilename);
+               if ($templateSource === FALSE) {
+                       throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('"' . $templatePathAndFilename . '" is not a valid template resource URI.', 1257246929);
                }
-               $section = $sections[$sectionName];
-
-               $renderingContext = $this->buildRenderingContext();
-               $section->setRenderingContext($renderingContext);
-               return $section->evaluate();
-       }
-
-       /**
-        * Render a template with a given layout.
-        *
-        * @param string $layoutName Name of layout
-        * @return string rendered HTML
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       public function renderWithLayout($layoutName) {
-               $parsedTemplate = $this->parseTemplate($this->resolveLayoutPathAndFilename($layoutName));
-
-               $renderingContext = $this->buildRenderingContext();
-               return $parsedTemplate->render($renderingContext);
+               return $templateSource;
        }
 
        /**
@@ -304,41 +218,30 @@ class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implem
         * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       protected function resolveLayoutPathAndFilename($layoutName = 'default') {
-               if ($this->layoutPathAndFilename) {
-                       return $this->layoutPathAndFilename;
-               }
+       protected function getLayoutSource($layoutName = 'default') {
+               if ($this->layoutPathAndFilename !== NULL) {
+                        $layoutPathAndFilename = $this->layoutPathAndFilename;
+               } else {
+                       $paths = $this->expandGenericPathPattern($this->layoutPathAndFilenamePattern, TRUE, TRUE);
+                       $found = FALSE;
+                       foreach ($paths as &$layoutPathAndFilename) {
+                               $layoutPathAndFilename = str_replace('@layout', $layoutName, $layoutPathAndFilename);
+                               if (file_exists($layoutPathAndFilename)) {
+                                       $found = TRUE;
+                                       break;
+                               }
+                       }
 
-               $paths = $this->expandGenericPathPattern($this->layoutPathAndFilenamePattern, TRUE, TRUE);
-               foreach ($paths as &$path) {
-                       $path = str_replace('@layout', $layoutName, $path);
-                       if (file_exists($path)) {
-                               return $path;
+                       if (!$found) {
+                               throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('The template files "' . implode('", "', $paths) . '" could not be loaded.', 1225709595);
                        }
                }
-               throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('The template files "' . implode('", "', $paths) . '" could not be loaded.', 1225709595);
-       }
 
-       /**
-        * Renders a partial.
-        *
-        * @param string $partialName
-        * @param string $sectionToRender
-        * @param array $variables
-        * @param Tx_Fluid_Core_ViewHelper_ViewHelperVariableContainer $viewHelperVariableContainer the View Helper Variable container to use.
-        * @return string
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @author Bastian Waidelich <bastian@typo3.org>
-        * @author Robert Lemke <robert@typo3.org>
-        */
-       public function renderPartial($partialName, $sectionToRender, array $variables, $viewHelperVariableContainer = NULL) {
-               $partial = $this->parseTemplate($this->resolvePartialPathAndFilename($partialName));
-               $variableContainer = $this->objectManager->create('Tx_Fluid_Core_ViewHelper_TemplateVariableContainer', $variables);
-               $renderingContext = $this->buildRenderingContext($variableContainer);
-               if ($viewHelperVariableContainer !== NULL) {
-                       $renderingContext->setViewHelperVariableContainer($viewHelperVariableContainer);
+               $layoutSource = file_get_contents($layoutPathAndFilename);
+               if ($layoutSource === FALSE) {
+                       throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('"' . $layoutPathAndFilename . '" is not a valid template resource URI.', 1257246929);
                }
-               return $partial->render($renderingContext);
+               return $layoutSource;
        }
 
        /**
@@ -349,63 +252,24 @@ class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implem
         * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       protected function resolvePartialPathAndFilename($partialName) {
+       protected function getPartialSource($partialName) {
                $paths = $this->expandGenericPathPattern($this->partialPathAndFilenamePattern, TRUE, TRUE);
-               foreach ($paths as &$path) {
-                       $path = str_replace('@partial', $partialName, $path);
-                       if (file_exists($path)) {
-                               return $path;
+               $found = FALSE;
+               foreach ($paths as &$partialPathAndFilename) {
+                       $partialPathAndFilename = str_replace('@partial', $partialName, $partialPathAndFilename);
+                       if (file_exists($partialPathAndFilename)) {
+                               $found = TRUE;
+                               break;
                        }
                }
-               throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('The template files "' . implode('", "', $paths) . '" could not be loaded.', 1225709595);
-       }
-
-       /**
-        * Checks whether a template can be resolved for the current request context.
-        *
-        * @return boolean
-        * @author Karsten Dambekalns <karsten@typo3.org>
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       public function hasTemplate() {
-               try {
-                       $this->resolveTemplatePathAndFilename();
-                       return TRUE;
-               } catch (Tx_Fluid_View_Exception_InvalidTemplateResourceException $e) {
-                       return FALSE;
+               if (!$found) {
+                       throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('The template files "' . implode('", "', $paths) . '" could not be loaded.', 1225709595);
                }
-       }
-
-       /**
-        * Parse the given template and return it.
-        *
-        * Will cache the results for one call.
-        *
-        * @param string $templatePathAndFilename absolute filename of the template to be parsed
-        * @return Tx_Fluid_Core_Parser_ParsedTemplateInterface the parsed template tree
-        * @throws Tx_Fluid_View_Exception_InvalidTemplateResourceException
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        */
-       protected function parseTemplate($templatePathAndFilename) {
-               $templateSource = file_get_contents($templatePathAndFilename);
-               if ($templateSource === FALSE) {
-                       throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('"' . $templatePathAndFilename . '" is not a valid template resource URI.', 1257246929);
+               $partialSource = file_get_contents($partialPathAndFilename);
+               if ($partialSource === FALSE) {
+                       throw new Tx_Fluid_View_Exception_InvalidTemplateResourceException('"' . $partialPathAndFilename . '" is not a valid template resource URI.', 1257246929);
                }
-               return $this->templateParser->parse($templateSource);
-       }
-
-       /**
-        * Set the root path to the templates.
-        * If set, overrides the one determined from $this->templateRootPathPattern
-        *
-        * @param string $templateRootPath Root path to the templates. If set, overrides the one determined from $this->templateRootPathPattern
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       public function setTemplateRootPath($templateRootPath) {
-               $this->templateRootPath = $templateRootPath;
+               return $partialSource;
        }
 
        /**
@@ -535,6 +399,7 @@ class Tx_Fluid_View_TemplateView extends Tx_Extbase_MVC_View_AbstractView implem
 
                return $results;
        }
+
 }
 
 ?>
\ No newline at end of file
index ef3ea75..dc25741 100644 (file)
 /**
  * Interface of Fluids Template view
  *
- * @version $Id: TemplateViewInterface.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage View
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  */
 interface Tx_Fluid_View_TemplateViewInterface extends Tx_Extbase_MVC_View_ViewInterface {
 
        /**
-        * Sets the path and name of of the template file. Effectively overrides the
-        * dynamic resolving of a template file.
-        *
-        * @param string $templatePathAndFilename Template file path
-        * @return void
-        * @api
-        */
-       public function setTemplatePathAndFilename($templatePathAndFilename);
-
-       /**
-        * Sets the path and name of the layout file. Overrides the dynamic resolving of the layout file.
-        *
-        * @param string $layoutPathAndFilename Path and filename of the layout file
-        * @return void
-        * @api
-        */
-       public function setLayoutPathAndFilename($layoutPathAndFilename);
-
-       /**
-        * Renders a given section.
-        *
-        * @param string $sectionName Name of section to render
-        * @return rendered template for the section
-        * @api
-        */
-       public function renderSection($sectionName);
-
-       /**
-        * Render a template with a given layout.
-        *
-        * @param string $layoutName Name of layout
-        * @return string rendered HTML
-        * @api
-        */
-       public function renderWithLayout($layoutName);
-
-       /**
         * Checks whether a template can be resolved for the current request context.
         *
         * @return boolean
@@ -77,4 +37,4 @@ interface Tx_Fluid_View_TemplateViewInterface extends Tx_Extbase_MVC_View_ViewIn
        public function hasTemplate();
 
 }
-?>
\ No newline at end of file
+?>
index 75277eb..4bbed40 100644 (file)
@@ -46,9 +46,6 @@
  * depending on {foo.bar.baz}
  * </output>
  *
- * @version $Id: AliasViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -57,7 +54,7 @@ class Tx_Fluid_ViewHelpers_AliasViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
 
        /**
         *
-        * @param array $map
+        * @param array $map 
         * @return string Rendered string
         * @author Bastian Waidelich <bastian@typo3.org>
         * @api
@@ -74,4 +71,4 @@ class Tx_Fluid_ViewHelpers_AliasViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
        }
 }
 
-?>
\ No newline at end of file
+?>
index db445e7..dc32a41 100644 (file)
@@ -35,9 +35,6 @@
  * (depending on your domain)
  * </output>
  *
- * @version $Id: BaseViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -59,4 +56,4 @@ class Tx_Fluid_ViewHelpers_BaseViewHelper extends Tx_Fluid_Core_ViewHelper_Abstr
        }
 }
 
-?>
\ No newline at end of file
+?>
index d5b60db..2e0e6f6 100644 (file)
@@ -27,8 +27,6 @@
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be
  * @author      Steffen Kamper <info@sk-typo3.de>
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
index 4f380df..15ba9fa 100644 (file)
@@ -36,8 +36,6 @@
  * CSH button as known from the TYPO3 backend.
  *
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be\Buttons
  * @author             Steffen Kamper <info@sk-typo3.de>
  * @author             Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
index 652b8c3..a843321 100644 (file)
@@ -40,8 +40,6 @@
  * Output:
  * This time the "new_el" icon is returned, the button has the title attribute set and links to the "new" action of the current controller.
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be\Buttons
  * @author             Steffen Kamper <info@sk-typo3.de>
  * @author             Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
index 57df3d7..c7906ea 100644 (file)
@@ -43,8 +43,6 @@
  * Note:
  * Normally you won't need to set getVars & setVars parameters in Extbase modules
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be\Buttons
  * @author             Steffen Kamper <info@sk-typo3.de>
  * @author             Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
index 8b3f6b7..6b1cbfe 100644 (file)
@@ -41,8 +41,6 @@
  * "your module content" wrapped with propper head & body tags.
  * Custom CSS file EXT:your_extension/Resources/Public/styles/backend.css and JavaScript file EXT:your_extension/Resources/Public/scripts/main.js will be loaded
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
  * @version     SVN: $Id:
@@ -106,8 +104,8 @@ class Tx_Fluid_ViewHelpers_Be_ContainerViewHelper extends Tx_Fluid_ViewHelpers_B
                        $pageRenderer->addJsFile($addJsFile);
                }
 
-               $output = $doc->startPage($pageTitle);
-               $output .= $this->renderChildren();
+               $output = $this->renderChildren();
+               $output = $doc->startPage($pageTitle) . $output;
                $output .= $doc->endPage();
                return $output;
        }
index d6875b5..bf35746 100644 (file)
  * Note: This view helper is experimental!
  *
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be\Menus
  * @author      Steffen Kamper <info@sk-typo3.de>
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
  * @version     SVN: $Id:
  */
-class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuItemViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuItemViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * @var string
index b2b493f..60056f2 100644 (file)
  * </f:be.menus.actionMenu>
  * </code>
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be\Menus
  * @author      Steffen Kamper <info@sk-typo3.de>
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
  * @version     SVN: $Id:
  *
  */
-class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper implements Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface {
+class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper implements Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface {
 
        /**
         * @var string
@@ -66,11 +64,6 @@ class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuViewHelper extends Tx_Fluid_Core_V
        protected $childNodes = array();
 
        /**
-        * @var Tx_Fluid_Core_Rendering_RenderingContext
-        */
-       protected $renderingContext;
-
-       /**
         * Setter for ChildNodes - as defined in ChildNodeAccessInterface
         *
         * @param array $childNodes Child nodes of this syntax tree node
@@ -83,15 +76,6 @@ class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuViewHelper extends Tx_Fluid_Core_V
        }
 
        /**
-        * Sets the rendering context which needs to be passed on to child nodes
-        *
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext the renderingcontext to use
-        */
-       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext) {
-               $this->renderingContext = $renderingContext;
-       }
-
-       /**
         * Render FunctionMenu
         *
         * @param string $defaultController
@@ -102,8 +86,7 @@ class Tx_Fluid_ViewHelpers_Be_Menus_ActionMenuViewHelper extends Tx_Fluid_Core_V
                $options = '';
                foreach ($this->childNodes as $childNode) {
                        if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode) {
-                               $childNode->setRenderingContext($this->renderingContext);
-                               $options .= $childNode->evaluate();
+                               $options .= $childNode->evaluate($this->getRenderingContext());
                        }
                }
                $this->tag->setContent($options);
index d9c1aba..5fc3ed3 100644 (file)
@@ -32,8 +32,6 @@
  * Output:
  * Page info icon with context menu
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be
  * @author      Steffen Kamper <info@sk-typo3.de>
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
index 08bba12..a4bbec1 100644 (file)
@@ -33,8 +33,6 @@
  * Current page path, prefixed with "Path:" and wrapped in a span with the class "typo3-docheader-pagePath"
  *
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be
  * @author      Steffen Kamper <info@sk-typo3.de>
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
index a71b9a8..bc866db 100644 (file)
@@ -43,8 +43,6 @@
  * List of "Website user" records with a text property of "foo" stored on PID 1 and two levels down.
  * Clicking on a username will open the TYPO3 info popup for the respective record
  *
- * @package     Fluid
- * @subpackage  ViewHelpers\Be
  * @author      Bastian Waidelich <bastian@typo3.org>
  * @license     http://www.gnu.org/copyleft/gpl.html
  * @version     SVN: $Id:
index a6c5b80..15fbbb7 100644 (file)
@@ -16,9 +16,6 @@
 /**
  * This class is a TypoScript view helper for the Fluid templating engine.
  *
- * @package TYPO3
- * @subpackage Fluid
- * @version $Id: CObjectViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
  */
 class Tx_Fluid_ViewHelpers_CObjectViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
@@ -33,6 +30,11 @@ class Tx_Fluid_ViewHelpers_CObjectViewHelper extends Tx_Fluid_Core_ViewHelper_Ab
        protected $typoScriptSetup;
 
        /**
+        * @var t3lib_fe contains a backup of the current $GLOBALS['TSFE'] if used in BE mode
+        */
+       protected $tsfeBackup;
+
+       /**
         * Constructor. Used to create an instance of tslib_cObj used by the render() method.
         *
         * @param tslib_cObj $contentObject injector for tslib_cObj (optional)
@@ -48,10 +50,6 @@ class Tx_Fluid_ViewHelpers_CObjectViewHelper extends Tx_Fluid_Core_ViewHelper_Ab
                        $configurationManager = Tx_Extbase_Dispatcher::getConfigurationManager();
                        $this->typoScriptSetup = $configurationManager->loadTypoScriptSetup();
                }
-               if (TYPO3_MODE === 'BE') {
-                               // this is a hacky work around to enable this view helper for backend mode
-                       $GLOBALS['TSFE']->cObjectDepthCounter = 100;
-               }
        }
 
        /**
@@ -65,6 +63,10 @@ class Tx_Fluid_ViewHelpers_CObjectViewHelper extends Tx_Fluid_Core_ViewHelper_Ab
         * @author Niels Pardon <mail@niels-pardon.de>
         */
        public function render($typoscriptObjectPath, $data = NULL, $currentValueKey = NULL) {
+               if (TYPO3_MODE === 'BE') {
+                       $this->simulateFrontendEnvironment();
+               }
+
                if ($data === NULL) {
                        $data = $this->renderChildren();
                }
@@ -91,7 +93,37 @@ class Tx_Fluid_ViewHelpers_CObjectViewHelper extends Tx_Fluid_Core_ViewHelper_Ab
                        }
                        $setup = $setup[$segment . '.'];
                }
-               return $this->contentObject->cObjGetSingle($setup[$lastSegment], $setup[$lastSegment . '.']);
+               $content = $this->contentObject->cObjGetSingle($setup[$lastSegment], $setup[$lastSegment . '.']);
+
+               if (TYPO3_MODE === 'BE') {
+                       $this->resetFrontendEnvironment();
+               }
+
+               return $content;
+       }
+
+       /**
+        * Sets the $TSFE->cObjectDepthCounter in Backend mode
+        * This somewhat hacky work around is currently needed because the cObjGetSingle() function of tslib_cObj relies on this setting
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       protected function simulateFrontendEnvironment() {
+               $this->tsfeBackup = isset($GLOBALS['TSFE']) ? $GLOBALS['TSFE'] : NULL;
+               $GLOBALS['TSFE'] = new stdClass();
+               $GLOBALS['TSFE']->cObjectDepthCounter = 100;
+       }
+
+       /**
+        * Resets $GLOBALS['TSFE'] if it was previously changed by simulateFrontendEnvironment()
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @see simulateFrontendEnvironment()
+        */
+       protected function resetFrontendEnvironment() {
+               $GLOBALS['TSFE'] = $this->tsfeBackup;
        }
 }
 
index c32a1e2..c588d50 100644 (file)
@@ -1,24 +1,40 @@
 <?php
 
 /*                                                                        *
- * This script is part of the TYPO3 project - inspiring people to share!  *
+ * This script belongs to the FLOW3 package "Fluid".                      *
  *                                                                        *
- * TYPO3 is free software; you can redistribute it and/or modify it under *
- * the terms of the GNU General Public License version 2 as published by  *
- * the Free Software Foundation.                                          *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
  *                                                                        *
  * This script is distributed in the hope that it will be useful, but     *
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General      *
- * Public License for more details.                                       *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
  *                                                                        */
 
 /**
- * Counts the number of elements of a given property
+ * This ViewHelper counts elements of the specified array or countable object.
+ *
+ * = Examples =
  *
- * @package TYPO3
- * @subpackage Fluid
- * @version $Id: CountViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
+ * <code title="Count array elements">
+ * <f:count subject="{0:1, 1:2, 2:3, 3:4}" />
+ * </code>
+ * <output>
+ * 4
+ * </output>
+ *
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @api
+ * @scope prototype
  */
 class Tx_Fluid_ViewHelpers_CountViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
@@ -26,12 +42,17 @@ class Tx_Fluid_ViewHelpers_CountViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
         * Counts the items of a given property.
         *
         * @param array $subject The array or ObjectStorage to iterated over
-        * @return string The bumber of elements
+        * @return integer The number of elements
         * @author Jochen Rau <jochen.rau@typoplanet.de>
+        * @author Bastian Waidelich <bastian@typo3.org>
         * @api
         */
        public function render($subject) {
+               if (is_object($subject) && !$subject instanceof Countable) {
+                       throw new Tx_Fluid_Core_ViewHelper_Exception('CountViewHelper only supports arrays and objects implementing Countable interface', 1279808078);
+               }
                return count($subject);
        }
 }
-?>
\ No newline at end of file
+
+?>
index 025dd49..308d450 100644 (file)
@@ -51,9 +51,6 @@
  * </ul>
  * </output>
  *
- * @version $Id: CycleViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -61,7 +58,7 @@
 class Tx_Fluid_ViewHelpers_CycleViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
        /**
-        * @var array|\SplObjectStorage the values to be iterated through
+        * @var array|Tx_Extbase_Persistence_ObjectStorage the values to be iterated through
         */
        protected $values = NULL;
 
@@ -71,7 +68,7 @@ class Tx_Fluid_ViewHelpers_CycleViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
        protected $currentCycleIndex = NULL;
 
        /**
-        * @param array $values The array or SplObjectStorage to iterated over
+        * @param array $values The array or Tx_Extbase_Persistence_ObjectStorage to iterated over
         * @param string $as The name of the iteration variable
         * @return string Rendered result
         * @author Bastian Waidelich <bastian@typo3.org>
@@ -101,7 +98,7 @@ class Tx_Fluid_ViewHelpers_CycleViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
        /**
         * Sets this->values to the current values argument and resets $this->currentCycleIndex.
         *
-        * @param array $values The array or SplObjectStorage to be stored in $this->values
+        * @param array $values The array or Tx_Extbase_Persistence_ObjectStorage to be stored in $this->values
         * @return void
         * @author Bastian Waidelich <bastian@typo3.org>
         */
@@ -110,28 +107,12 @@ class Tx_Fluid_ViewHelpers_CycleViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
                        if (!$values instanceof Traversable) {
                                throw new Tx_Fluid_Core_ViewHelper_Exception('CycleViewHelper only supports arrays and objects implementing Traversable interface' , 1248728393);
                        }
-                       $this->values = $this->convertToArray($values);
+                       $this->values = iterator_to_array($values, FALSE);
                } else {
                        $this->values = array_values($values);
                }
                $this->currentCycleIndex = 0;
        }
-
-       /**
-        * Turns the given object into an array.
-        * The object has to implement the Traversable interface
-        *
-        * @param Traversable $object The object to be turned into an array. If the object implements Iterator the key will NOT be preserved.
-        * @return array The resulting array
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       protected function convertToArray(Traversable $object) {
-               $array = array();
-               foreach ($object as $singleElement) {
-                       $array[] = $singleElement;
-               }
-               return $array;
-       }
 }
 
-?>
\ No newline at end of file
+?>
index 6553502..f2daa98 100644 (file)
@@ -15,9 +15,6 @@
 
 /**
  *
- * @package
- * @subpackage
- * @version $Id: DebugViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
  */
 class Tx_Fluid_ViewHelpers_DebugViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
@@ -25,7 +22,7 @@ class Tx_Fluid_ViewHelpers_DebugViewHelper extends Tx_Fluid_Core_ViewHelper_Abst
         * Wrapper for TYPO3s famous debug()
         *
         * @param string $title
-        * @return string the altered string.
+        * @return string the altered string. 
         * @author Bastian Waidelich <bastian@typo3.org>
         */
        public function render($title = NULL) {
index 9f1b730..85d217d 100644 (file)
 
 /**
  * Else-Branch of a condition. Only has an effect inside of "If". See the If-ViewHelper for documentation.
- *
+ * 
  * @see Tx_Fluid_ViewHelpers_IfViewHelper
  *
- * @version $Id: ElseViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -44,4 +41,4 @@ class Tx_Fluid_ViewHelpers_ElseViewHelper extends Tx_Fluid_Core_ViewHelper_Abstr
        }
 }
 
-?>
\ No newline at end of file
+?>
index 52088d8..7362e5e 100644 (file)
@@ -47,9 +47,6 @@
  * Output:
  * Text encoded for URL use (rawurlencode applied).
  *
- * @version $Id: EscapeViewHelper.php 3751 2010-01-22 15:56:47Z k-fish $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 28fdece..b1ba18d 100644 (file)
  *  ...
  * </ul>
  *
- * @version $Id: ForViewHelper.php 2914 2009-07-28 18:26:38Z bwaidelich $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
  */
-class Tx_Fluid_ViewHelpers_FlashMessagesViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+class Tx_Fluid_ViewHelpers_FlashMessagesViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * @var string
@@ -60,7 +57,7 @@ class Tx_Fluid_ViewHelpers_FlashMessagesViewHelper extends Tx_Fluid_Core_ViewHel
         * Initialize arguments
         *
         * @return void
-        * @author Sebastian Kurfürst <sbastian@typo3.org>
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @api
         */
        public function initializeArguments() {
@@ -71,7 +68,7 @@ class Tx_Fluid_ViewHelpers_FlashMessagesViewHelper extends Tx_Fluid_Core_ViewHel
         * Render method.
         *
         * @return string rendered Flash Messages, if there are any.
-        * @author Sebastian Kurfürst <sbastian@typo3.org>
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @api
         */
        public function render() {
index 262d9aa..febfb7a 100644 (file)
  * </ul>
  * </output>
  *
- * @version $Id: ForViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
+ * <code title="Iteration information">
+ * <ul>
+ *   <f:for each="{0:1, 1:2, 2:3, 3:4}" as="foo" iteration="fooIterator">
+ *     <li>Index: {fooIterator.index} Cycle: {fooIterator.cycle} Total: {fooIterator.total}{f:if(condition: fooIterator.isEven, then: ' Even')}{f:if(condition: fooIterator.isOdd, then: ' Odd')}{f:if(condition: fooIterator.isFirst, then: ' First')}{f:if(condition: fooIterator.isLast, then: ' Last')}</li>
+ *   </f:for>
+ * </ul>
+ * </code>
+ * <output>
+ * <ul>
+ *   <li>Index: 0 Cycle: 1 Total: 4 Odd First</li>
+ *   <li>Index: 1 Cycle: 2 Total: 4 Even</li>
+ *   <li>Index: 2 Cycle: 3 Total: 4 Odd</li>
+ *   <li>Index: 3 Cycle: 4 Total: 4 Even Last</li>
+ * </ul>
+ * </output>
+ *
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -61,31 +74,38 @@ class Tx_Fluid_ViewHelpers_ForViewHelper extends Tx_Fluid_Core_ViewHelper_Abstra
        /**
         * Iterates through elements of $each and renders child nodes
         *
-        * @param array $each The array or SplObjectStorage to iterated over
+        * @param array $each The array or Tx_Extbase_Persistence_ObjectStorage to iterated over
         * @param string $as The name of the iteration variable
         * @param string $key The name of the variable to store the current array key
         * @param boolean $reverse If enabled, the iterator will start with the last element and proceed reversely
+        * @param string $iteration The name of the variable to store iteration information (index, cycle, isFirst, isLast, isEven, isOdd)
         * @return string Rendered string
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
         * @author Robert Lemke <robert@typo3.org>
         * @api
         */
-       public function render($each, $as, $key = '', $reverse = FALSE) {
+       public function render($each, $as, $key = '', $reverse = FALSE, $iteration = NULL) {
                $output = '';
                if ($each === NULL) {
                        return '';
                }
-               if (is_object($each)) {
-                       if (!$each instanceof Traversable) {
-                               throw new Tx_Fluid_Core_ViewHelper_Exception('ForViewHelper only supports arrays and objects implementing Traversable interface' , 1248728393);
-                       }
-                       $each = $this->convertToArray($each);
+               if (is_object($each) && !$each instanceof Traversable) {
+                       throw new Tx_Fluid_Core_ViewHelper_Exception('ForViewHelper only supports arrays and objects implementing Traversable interface' , 1248728393);
                }
 
                if ($reverse === TRUE) {
+                               // array_reverse only supports arrays
+                       if (is_object($each)) {
+                               $each = iterator_to_array($each);
+                       }
                        $each = array_reverse($each);
                }
+               $iterationData = array(
+                       'index' => 0,
+                       'cycle' => 1,
+                       'total' => count($each)
+               );
 
                $output = '';
                foreach ($each as $keyValue => $singleElement) {
@@ -93,30 +113,26 @@ class Tx_Fluid_ViewHelpers_ForViewHelper extends Tx_Fluid_Core_ViewHelper_Abstra
                        if ($key !== '') {
                                $this->templateVariableContainer->add($key, $keyValue);
                        }
+                       if ($iteration !== NULL) {
+                               $iterationData['isFirst'] = $iterationData['cycle'] === 1;
+                               $iterationData['isLast'] = $iterationData['cycle'] === $iterationData['total'];
+                               $iterationData['isEven'] = $iterationData['cycle'] % 2 === 0;
+                               $iterationData['isOdd'] = !$iterationData['isEven'];
+                               $this->templateVariableContainer->add($iteration, $iterationData);
+                               $iterationData['index'] ++;
+                               $iterationData['cycle'] ++;
+                       }
                        $output .= $this->renderChildren();
                        $this->templateVariableContainer->remove($as);
                        if ($key !== '') {
                                $this->templateVariableContainer->remove($key);
                        }
+                       if ($iteration !== NULL) {
+                               $this->templateVariableContainer->remove($iteration);
+                       }
                }
                return $output;
        }
-
-       /**
-        * Turns the given object into an array.
-        * The object has to implement the Traversable interface
-        *
-        * @param Traversable $object The object to be turned into an array. If the object implements Iterator the key will be preserved.
-        * @return array The resulting array
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       protected function convertToArray(Traversable $object) {
-               $array = array();
-               foreach ($object as $keyValue => $singleElement) {
-                       $array[$keyValue] = $singleElement;
-               }
-               return $array;
-       }
 }
 
-?>
\ No newline at end of file
+?>
index a990267..1609d51 100644 (file)
@@ -26,9 +26,6 @@
  * If you set the "property" attribute to the name of the property to resolve from the object, this class will
  * automatically set the name and value of a form element.
  *
- * @version $Id: AbstractFormFieldViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -63,14 +60,14 @@ abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormFieldViewHelper extends Tx_
         */
        protected function getName() {
                if ($this->isObjectAccessorMode()) {
-                       $formName = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName');
-                       if (!empty($formName)) {
+                       $formObjectName = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObjectName');
+                       if (!empty($formObjectName)) {
                                $propertySegments = explode('.', $this->arguments['property']);
                                $properties = '';
                                foreach ($propertySegments as $segment) {
                                        $properties .= '[' . $segment . ']';
                                }
-                               $name = $formName . $properties;
+                               $name = $formObjectName . $properties;
                        } else {
                                $name = $this->arguments['property'];
                        }
@@ -125,7 +122,7 @@ abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormFieldViewHelper extends Tx_
                        // hierarchical property. If there is no "." inside (thus $propertySegments == 1), we do not need to do anything
                        $formObject = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObject');
 
-                       $objectName = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName');
+                       $objectName = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObjectName');
                        // If Count == 2 -> we need to go through the for-loop exactly once
                        for ($i=1; $i < count($propertySegments); $i++) {
                                $object = Tx_Extbase_Reflection_ObjectAccess::getPropertyPath($formObject, implode('.', array_slice($propertySegments, 0, $i)));
@@ -164,7 +161,7 @@ abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormFieldViewHelper extends Tx_
         */
        protected function isObjectAccessorMode() {
                return $this->arguments->hasArgument('property')
-                       && $this->viewHelperVariableContainer->exists('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName');
+                       && $this->viewHelperVariableContainer->exists('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObjectName');
        }
 
        /**
@@ -203,11 +200,11 @@ abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormFieldViewHelper extends Tx_
                        return array();
                }
                $errors = $this->controllerContext->getRequest()->getErrors();
-               $formName = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName');
+               $formObjectName = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObjectName');
                $propertyName = $this->arguments['property'];
                $formErrors = array();
                foreach ($errors as $error) {
-                       if ($error instanceof Tx_Extbase_Validation_PropertyError && $error->getPropertyName() === $formName) {
+                       if ($error instanceof Tx_Extbase_Validation_PropertyError && $error->getPropertyName() === $formObjectName) {
                                $formErrors = $error->getErrors();
                                foreach ($formErrors as $formError) {
                                        if ($formError instanceof Tx_Extbase_Validation_PropertyError && $formError->getPropertyName() === $propertyName) {
@@ -218,6 +215,33 @@ abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormFieldViewHelper extends Tx_
                }
                return array();
        }
+
+       /**
+        * Renders a hidden field with the same name as the element, to make sure the empty value is submitted
+        * in case nothing is selected. This is needed for checkbox and multiple select fields
+        *
+        * @return string the hidden field.
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       protected function renderHiddenFieldForEmptyValue() {
+               $hiddenFieldNames = array();
+               if ($this->viewHelperVariableContainer->exists('Tx_Fluid_ViewHelpers_FormViewHelper', 'renderedHiddenFields')) {
+                       $hiddenFieldNames = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_FormViewHelper', 'renderedHiddenFields');
+               }
+
+               $fieldName = $this->getName();
+               if (substr($fieldName, -2) === '[]') {
+                       $fieldName = substr($fieldName, 0, -2);
+               }
+               if (!in_array($fieldName, $hiddenFieldNames)) {
+                       $hiddenFieldNames[] = $fieldName;
+                       $this->viewHelperVariableContainer->addOrUpdate('Tx_Fluid_ViewHelpers_FormViewHelper', 'renderedHiddenFields', $hiddenFieldNames);
+
+                       return '<input type="hidden" name="' . htmlspecialchars($fieldName) . '" value="" />';
+               }
+               return '';
+       }
 }
 
 ?>
\ No newline at end of file
index 857ac69..f2e0be4 100644 (file)
  * If you set the "property" attribute to the name of the property to resolve from the object, this class will
  * automatically set the name and value of a form element.
  *
- * @version $Id: AbstractFormViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
-abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+abstract class Tx_Fluid_ViewHelpers_Form_AbstractFormViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
-        * @var \Tx_Extbase_Persistence_ManagerInterface
+        * @var Tx_Extbase_Persistence_ManagerInterface
         */
        protected $persistenceManager;
 
index aaf8089..f00dffa 100644 (file)
@@ -48,9 +48,6 @@
  * <input type="checkbox" name="user[interests][]" value="TYPO3" checked="checked" />
  * (depending on property "interests")
  *
- * @version $Id: CheckboxViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -73,7 +70,7 @@ class Tx_Fluid_ViewHelpers_Form_CheckboxViewHelper extends Tx_Fluid_ViewHelpers_
                parent::initializeArguments();
                $this->registerTagAttribute('disabled', 'string', 'Specifies that the input element should be disabled when the page loads');
                $this->registerArgument('errorClass', 'string', 'CSS class to set if there are errors for this view helper', FALSE, 'f3-form-error');
-               #$this->registerArgument('value', 'string', 'Value of input tag. Required for checkboxes', TRUE);
+               $this->overrideArgument('value', 'string', 'Value of input tag. Required for checkboxes', TRUE);
                $this->registerUniversalTagAttributes();
        }
 
@@ -115,33 +112,6 @@ class Tx_Fluid_ViewHelpers_Form_CheckboxViewHelper extends Tx_Fluid_ViewHelpers_
                $hiddenField = $this->renderHiddenFieldForEmptyValue();
                return $hiddenField . $this->tag->render();
        }
-
-       /**
-        * Renders a hidden field with the same name as the element, to make sure the empty value is submitted
-        * in case the checkbox is not selected.
-        *
-        * @return string the hidden field.
-        */
-       protected function renderHiddenFieldForEmptyValue() {
-               if ($this->viewHelperVariableContainer->exists('Tx_Fluid_ViewHelpers_Form_CheckboxViewHelper', 'checkboxFieldNames')) {
-                       $checkboxFieldNames = $this->viewHelperVariableContainer->get('Tx_Fluid_ViewHelpers_Form_CheckboxViewHelper', 'checkboxFieldNames');
-               } else {
-                       $checkboxFieldNames = array();
-               }
-
-               $nameOfElement = $this->getName();
-               if (!in_array($nameOfElement, $checkboxFieldNames)) {
-                       $checkboxFieldNames[] = $nameOfElement;
-                       $this->viewHelperVariableContainer->addOrUpdate('Tx_Fluid_ViewHelpers_Form_CheckboxViewHelper', 'checkboxFieldNames', $checkboxFieldNames);
-
-                       $tagBuilder = t3lib_div::makeInstance('Tx_Fluid_Core_ViewHelper_TagBuilder', 'input');
-                       $tagBuilder->addAttribute('type', 'hidden');
-                       $tagBuilder->addAttribute('name', $nameOfElement);
-                       $tagBuilder->addAttribute('value', '');
-                       return $tagBuilder->render();
-               }
-               return '';
-       }
 }
 
 ?>
\ No newline at end of file
index 05bf093..91f5c94 100644 (file)
@@ -38,9 +38,6 @@
  *   <li>1234567890: Validation errors for argument "newBlog"</li>
  * </ul>
  *
- * @version $Id: ErrorsViewHelper.php 2074 2010-03-19 12:12:15Z sebastian $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 4b07a11..08f69a6 100644 (file)
@@ -35,9 +35,6 @@
  * You can also use the "property" attribute if you have bound an object to the form.
  * See <f:form> for more documentation.
  *
- * @version $Id: HiddenViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -81,4 +78,4 @@ class Tx_Fluid_ViewHelpers_Form_HiddenViewHelper extends Tx_Fluid_ViewHelpers_Fo
 }
 
 
-?>
\ No newline at end of file
+?>
index 53ebaa7..feddb5e 100644 (file)
@@ -32,9 +32,6 @@
  * Output:
  * <input type="password" name="myPassword" value="default value" />
  *
- * @version $Id: PasswordViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index c9afe6e..93b1a0d 100644 (file)
@@ -50,9 +50,6 @@
  * <input type="radio" name="user[newsletter]" value="0" /> no
  * (depending on property "newsletter")
  *
- * @version $Id: RadioViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -75,7 +72,7 @@ class Tx_Fluid_ViewHelpers_Form_RadioViewHelper extends Tx_Fluid_ViewHelpers_For
                parent::initializeArguments();
                $this->registerTagAttribute('disabled', 'string', 'Specifies that the input element should be disabled when the page loads');
                $this->registerArgument('errorClass', 'string', 'CSS class to set if there are errors for this view helper', FALSE, 'f3-form-error');
-               #$this->registerArgument('value', 'string', 'Value of input tag. Required for radio buttons', TRUE);
+               $this->overrideArgument('value', 'string', 'Value of input tag. Required for radio buttons', TRUE);
                $this->registerUniversalTagAttributes();
        }
 
index 0cef520..9f0142f 100644 (file)
@@ -60,9 +60,6 @@
  *
  * The "value" property now expects a domain object, and tests for object equivalence.
  *
- * @version $Id: SelectViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -96,6 +93,7 @@ class Tx_Fluid_ViewHelpers_Form_SelectViewHelper extends Tx_Fluid_ViewHelpers_Fo
                $this->registerArgument('optionValueField', 'string', 'If specified, will call the appropriate getter on each object to determine the value.');
                $this->registerArgument('optionLabelField', 'string', 'If specified, will call the appropriate getter on each object to determine the label.');
                $this->registerArgument('sortByOptionLabel', 'boolean', 'If true, List will be sorted by label.', FALSE, FALSE);
+               $this->registerArgument('selectAllByDefault', 'boolean', 'If specified options are selected if none was set before.', FALSE, FALSE);
                $this->registerArgument('errorClass', 'string', 'CSS class to set if there are errors for this view helper', FALSE, 'f3-form-error');
        }
 
@@ -123,10 +121,13 @@ class Tx_Fluid_ViewHelpers_Form_SelectViewHelper extends Tx_Fluid_ViewHelpers_Fo
 
                $this->setErrorClassAttribute();
 
+               $content = '';
+
                // register field name for token generation.
                // in case it is a multi-select, we need to register the field name
                // as often as there are elements in the box
-               if ($this->arguments->hasArgument('multiple')) {
+               if ($this->arguments->hasArgument('multiple') && $this->arguments['multiple'] !== '') {
+                       $content .= $this->renderHiddenFieldForEmptyValue();
                        for ($i=0; $i<count($options); $i++) {
                                $this->registerFieldNameForFormTokenGeneration($name);
                        }
@@ -134,7 +135,8 @@ class Tx_Fluid_ViewHelpers_Form_SelectViewHelper extends Tx_Fluid_ViewHelpers_Fo
                        $this->registerFieldNameForFormTokenGeneration($name);
                }
 
-               return $this->tag->render();
+               $content .= $this->tag->render();
+               return $content;
        }
 
        /**
@@ -212,16 +214,21 @@ class Tx_Fluid_ViewHelpers_Form_SelectViewHelper extends Tx_Fluid_ViewHelpers_Fo
        /**
         * Render the option tags.
         *
-        * @return boolean true if the
+        * @return boolean TRUE if the value should be marked a s selected; FALSE otherwise
         * @author Bastian Waidelich <bastian@typo3.org>
+        * @author Jochen Rau <jochen.rau@typoplanet.de>
         */
        protected function isSelected($value) {
                $selectedValue = $this->getSelectedValue();
                if ($value === $selectedValue || (string)$value === $selectedValue) {
                        return TRUE;
                }
-               if ($this->arguments->hasArgument('multiple') && is_array($selectedValue) && in_array($value, $selectedValue)) {
-                       return TRUE;
+               if ($this->arguments->hasArgument('multiple')) {
+                       if (is_null($selectedValue) && $this->arguments['selectAllByDefault'] === TRUE) {
+                               return TRUE;
+                       } elseif (is_array($selectedValue) && in_array($value, $selectedValue)) {
+                               return TRUE;
+                       }
                }
                return FALSE;
        }
index c188db9..5aded87 100644 (file)
@@ -39,9 +39,6 @@
   * Output:
  * <input type="submit" name="mySubmit" value="Send Mail" />
  *
- * @version $Id: SubmitViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 998445e..0d992dd 100644 (file)
@@ -33,9 +33,6 @@
  * Output:
  * <textarea name="myTextArea">This is shown inside the textarea</textarea>
  *
- * @version $Id: TextareaViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 8e673c0..1ba0e18 100644 (file)
@@ -34,9 +34,6 @@
  * Output:
  * <input type="text" name="myTextBox" value="default value" />
  *
- * @version $Id: TextboxViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 10b4c08..78a87d0 100644 (file)
@@ -32,9 +32,6 @@
  * Output:
  * <input type="text" name="myTextBox" value="default value" />
  *
- * @version $Id: TextfieldViewHelper.php 3628 2010-01-14 15:31:38Z robert $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 58ce48d..11bf8e5 100644 (file)
@@ -33,9 +33,6 @@
  * Output:
  * <input type="file" name="file" />
  *
- * @version $Id: UploadViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Form
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -82,4 +79,4 @@ class Tx_Fluid_ViewHelpers_Form_UploadViewHelper extends Tx_Fluid_ViewHelpers_Fo
 }
 
 
-?>
\ No newline at end of file
+?>
index 63f5ece..7e20aac 100644 (file)
@@ -21,9 +21,6 @@
  *                                                                        */
 
 /**
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: FormViewHelper.php 2049 2010-03-16 10:51:45Z sebastian $
  */
 
 /**
@@ -53,9 +50,6 @@
  * </code>
  * This automatically inserts the value of {customer.name} inside the textbox and adjusts the name of the textbox accordingly.
  *
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: FormViewHelper.php 2049 2010-03-16 10:51:45Z sebastian $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  * @scope prototype
  */
@@ -116,11 +110,20 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst
         * @param integer $pageUid Target page uid
         * @param mixed $object Object to use for the form. Use in conjunction with the "property" attribute on the sub tags
         * @param integer $pageType Target page type
+        * @param boolean $noCache set this to disable caching for the target page. You should not need this.
+        * @param boolean $noCacheHash set this to supress the cHash query parameter created by TypoLink. You should not need this.
+        * @param string $section The anchor to be added to the action URI (only active if $actionUri is not set)
+        * @param string $format The requested format (e.g. ".html") of the target page (only active if $actionUri is not set)
+        * @param array $additionalParams additional action URI query parameters that won't be prefixed like $arguments (overrule $arguments) (only active if $actionUri is not set)
+        * @param boolean $absolute If set, an absolute action URI is rendered (only active if $actionUri is not set)
+        * @param boolean $addQueryString If set, the current query parameters will be kept in the action URI (only active if $actionUri is not set)
+        * @param array $argumentsToBeExcludedFromQueryString arguments to be removed from the action URI. Only active if $addQueryString = TRUE and $actionUri is not set
         * @param string $fieldNamePrefix Prefix that will be added to all field names within this form. If not set the prefix will be tx_yourExtension_plugin
         * @param string $actionUri can be used to overwrite the "action" attribute of the form tag
+        * @param string $objectName name of the object that is bound to this form. If this argument is not specified, the name attribute of this form is used to determine the FormObjectName
         * @return string rendered form
         */
-       public function render($action = NULL, array $arguments = array(), $controller = NULL, $extensionName = NULL, $pluginName = NULL, $pageUid = NULL, $object = NULL, $pageType = 0, $fieldNamePrefix = NULL, $actionUri = NULL) {
+       public function render($action = NULL, array $arguments = array(), $controller = NULL, $extensionName = NULL, $pluginName = NULL, $pageUid = NULL, $object = NULL, $pageType = 0, $noCache = FALSE, $noCacheHash = FALSE, $section = '', $format = '', array $additionalParams = array(), $absolute = FALSE, $addQueryString = FALSE, array $argumentsToBeExcludedFromQueryString = array(), $fieldNamePrefix = NULL, $actionUri = NULL, $objectName = NULL) {
                $this->setFormActionUri();
 
                if (strtolower($this->arguments['method']) === 'get') {
@@ -129,24 +132,26 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst
                        $this->tag->addAttribute('method', 'post');
                }
 
-               $this->addFormNameToViewHelperVariableContainer();
+               $this->addFormObjectNameToViewHelperVariableContainer();
                $this->addFormObjectToViewHelperVariableContainer();
                $this->addFieldNamePrefixToViewHelperVariableContainer();
                $this->addFormFieldNamesToViewHelperVariableContainer();
 
                $formContent = $this->renderChildren();
 
-               $content = $this->renderHiddenIdentityField($this->arguments['object'], $this->arguments['name']);
+               $content = chr(10) . '<div style="display: none">';
+               $content .= $this->renderHiddenIdentityField($this->arguments['object'], $this->arguments['name']);
                $content .= $this->renderAdditionalIdentityFields();
                $content .= $this->renderHiddenReferrerFields();
                $content .= $this->renderRequestHashField(); // Render hmac after everything else has been rendered
+               $content .= chr(10) . '</div>' . chr(10);
                $content .= $formContent;
 
                $this->tag->setContent($content);
 
                $this->removeFieldNamePrefixFromViewHelperVariableContainer();
                $this->removeFormObjectFromViewHelperVariableContainer();
-               $this->removeFormNameFromViewHelperVariableContainer();
+               $this->removeFormObjectNameFromViewHelperVariableContainer();
                $this->removeFormFieldNamesFromViewHelperVariableContainer();
                $this->removeCheckboxFieldNamesFromViewHelperVariableContainer();
 
@@ -167,6 +172,14 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst
                                ->reset()
                                ->setTargetPageUid($this->arguments['pageUid'])
                                ->setTargetPageType($this->arguments['pageType'])
+                               ->setNoCache($this->arguments['noCache'])
+                               ->setUseCacheHash(!$this->arguments['noCacheHash'])
+                               ->setSection($this->arguments['section'])
+                               ->setCreateAbsoluteUri($this->arguments['absolute'])
+                               ->setArguments((array)$this->arguments['additionalParams'])
+                               ->setAddQueryString($this->arguments['addQueryString'])
+                               ->setArgumentsToBeExcludedFromQueryString((array)$this->arguments['argumentsToBeExcludedFromQueryString'])
+                               ->setFormat($this->arguments['format'])
                                ->uriFor($this->arguments['action'], $this->arguments['arguments'], $this->arguments['controller'], $this->arguments['extensionName'], $this->arguments['pluginName']);
                        $this->formActionUriArguments = $uriBuilder->getArguments();
                }
@@ -213,13 +226,14 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst
        }
 
        /**
-        * Adds the form name to the ViewHelperVariableContainer if the name attribute is specified.
+        * Adds the form object name to the ViewHelperVariableContainer if "objectName" argument or "name" attribute is specified.
         *
         * @return void
         */
-       protected function addFormNameToViewHelperVariableContainer() {
-               if ($this->arguments->hasArgument('name')) {
-                       $this->viewHelperVariableContainer->add('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName', $this->arguments['name']);
+       protected function addFormObjectNameToViewHelperVariableContainer() {
+               $formObjectName = $this->getFormObjectName();
+               if ($formObjectName !== NULL) {
+                       $this->viewHelperVariableContainer->add('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObjectName', $formObjectName);
                }
        }
 
@@ -228,13 +242,31 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst
         *
         * @return void
         */
-       protected function removeFormNameFromViewHelperVariableContainer() {
-               if ($this->arguments->hasArgument('name')) {
-                       $this->viewHelperVariableContainer->remove('Tx_Fluid_ViewHelpers_FormViewHelper', 'formName');
+       protected function removeFormObjectNameFromViewHelperVariableContainer() {
+               $formObjectName = $this->getFormObjectName();
+               if ($formObjectName !== NULL) {
+                       $this->viewHelperVariableContainer->remove('Tx_Fluid_ViewHelpers_FormViewHelper', 'formObjectName');
                }
        }
 
        /**
+        * Returns the name of the object that is bound to this form.
+        * If the "objectName" argument has been specified, this is returned. Otherwise the name attribute of this form.
+        * If neither objectName nor name arguments have been set, NULL is returned.
+        *
+        * @return string specified Form name or NULL if neither $objectName nor $name arguments have been specified
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       protected function getFormObjectName() {
+               $formObjectName = NULL;
+               if ($this->arguments->hasArgument('objectName')) {
+                       $formObjectName = $this->arguments['objectName'];
+               } elseif ($this->arguments->hasArgument('name')) {
+                       $formObjectName = $this->arguments['name'];
+               }
+               return $formObjectName;
+       }
+       /**
         * Adds the object that is bound to this form to the ViewHelperVariableContainer if the formObject attribute is specified.
         *
         * @return void
@@ -359,7 +391,7 @@ class Tx_Fluid_ViewHelpers_FormViewHelper extends Tx_Fluid_ViewHelpers_Form_Abst
 
                return 'tx_' . strtolower($extensionName) . '_' . strtolower($pluginName);
        }
-
+       
        /**
         * Remove Checkbox field names from ViewHelper variable container, to start from scratch when a new form starts.
         */
index bfe873f..5ea0cc8 100644 (file)
@@ -14,9 +14,6 @@
  *                                                                        */
 
 /**
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: CropViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
  */
 
 /**
  * Output:
  * This is so...
  *
- * WARNING: This tag doesn't care about multibyte charsets currently.
+ * <code title="Don't respect HTML tags">
+ * <f:format.crop maxCharacters="28" respectWordBoundaries="false" respectHtml="false">This is some text with <strong>HTML</strong> tags</f:format.crop>
+ * </code>
+ *
+ * Output:
+ * This is some text with <stro
  *
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: CropViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  * @scope prototype
  */
@@ -61,6 +60,11 @@ class Tx_Fluid_ViewHelpers_Format_CropViewHelper extends Tx_Fluid_Core_ViewHelpe
        protected $contentObject;
 
        /**
+        * @var t3lib_fe contains a backup of the current $GLOBALS['TSFE'] if used in BE mode
+        */
+       protected $tsfeBackup;
+
+       /**
         * Constructor. Used to create an instance of tslib_cObj used by the render() method.
         *
         * @param tslib_cObj $contentObject injector for tslib_cObj (optional)
@@ -75,29 +79,73 @@ class Tx_Fluid_ViewHelpers_Format_CropViewHelper extends Tx_Fluid_Core_ViewHelpe
         *
         * @param integer $maxCharacters Place where to truncate the string
         * @param string $append What to append, if truncation happened
-        * @param boolean $respectBoundaries If TRUE and division is in the middle of a word, the remains of that word is removed. This is currently ignored in backend mode!
+        * @param boolean $respectBoundaries If TRUE and division is in the middle of a word, the remains of that word is removed.
+        * @param boolean $respectHtml If TRUE the cropped string will respect HTML tags and entities. Technically that means, that cropHTML() is called rather than crop()
         * @return string cropped text
         * @author Andreas Pattynama <andreas.pattynama@innocube.ch>
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
         * @author Felix Oertel <oertel@networkteam.com>
         */
-       public function render($maxCharacters, $append = '...', $respectWordBoundaries = TRUE) {
+       public function render($maxCharacters, $append = '...', $respectWordBoundaries = TRUE, $respectHtml = TRUE) {
                $stringToTruncate = $this->renderChildren();
                if (TYPO3_MODE === 'BE') {
-                       if (strlen($stringToTruncate) > $maxCharacters) {
-                               $stringToTruncate = substr($stringToTruncate, 0, ($maxCharacters - strlen($append))) . $append;
-                       }
-                       return $stringToTruncate;
+                       $this->simulateFrontendEnvironment();
+               }
+
+               if ($respectHtml) {
+                       $content = $this->contentObject->cropHTML($stringToTruncate, $maxCharacters . '|' . $append . '|' . $respectWordBoundaries);
                } else {
-                       if (strip_tags($stringToTruncate) != $stringToTruncate) {
-                               return $this->contentObject->cropHTML($stringToTruncate, $maxCharacters . '|' . $append . '|' . $respectWordBoundaries);
+                       $content = $this->contentObject->crop($stringToTruncate, $maxCharacters . '|' . $append . '|' . $respectWordBoundaries);
+               }
+
+               if (TYPO3_MODE === 'BE') {
+                       $this->resetFrontendEnvironment();
+               }
+               return $content;
+       }
+
+       /**
+        * Sets the global variables $GLOBALS['TSFE']->csConvObj and $GLOBALS['TSFE']->renderCharset in Backend mode
+        * This somewhat hacky work around is currently needed because the crop() and cropHTML() functions of tslib_cObj rely on those variables to be set
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       protected function simulateFrontendEnvironment() {
+               $this->tsfeBackup = isset($GLOBALS['TSFE']) ? $GLOBALS['TSFE'] : NULL;
+               $GLOBALS['TSFE'] = new stdClass();
+
+                       // preparing csConvObj
+               if (!is_object($GLOBALS['TSFE']->csConvObj)) {
+                       if (is_object($GLOBALS['LANG'])) {
+                               $GLOBALS['TSFE']->csConvObj = $GLOBALS['LANG']->csConvObj;
+                       } else {
+                               $GLOBALS['TSFE']->csConvObj = t3lib_div::makeInstance('t3lib_cs');
+                       }
+               }
+
+                       // preparing renderCharset
+               if (!is_object($GLOBALS['TSFE']->renderCharset)) {
+                       if (is_object($GLOBALS['LANG'])) {
+                               $GLOBALS['TSFE']->renderCharset = $GLOBALS['LANG']->charSet;
                        } else {
-                               return $this->contentObject->crop($stringToTruncate, $maxCharacters . '|' . $append . '|' . $respectWordBoundaries);
+                               $GLOBALS['TSFE']->renderCharset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'];
                        }
                }
        }
+
+       /**
+        * Resets $GLOBALS['TSFE'] if it was previously changed by simulateFrontendEnvironment()
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @see simulateFrontendEnvironment()
+        */
+       protected function resetFrontendEnvironment() {
+               $GLOBALS['TSFE'] = $this->tsfeBackup;
+       }
 }
 
 
-?>
\ No newline at end of file
+?>
index d57e1ea..be9c6cb 100644 (file)
@@ -39,9 +39,6 @@
  * Output:
  * 54,321.00 $
  *
- * @version $Id: CurrencyViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Format
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 647ccb8..25f4df9 100644 (file)
@@ -57,9 +57,6 @@
  * 1980-12-13
  * (depending on the current date)
  *
- * @version $Id: DateViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Format
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 4cf5dab..192092f 100644 (file)
@@ -14,9 +14,6 @@
  *                                                                        */
 
 /**
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: HtmlViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
  */
 
 /**
@@ -41,9 +38,6 @@
  *
  * @see http://typo3.org/documentation/document-library/references/doc_core_tsref/4.2.0/view/1/5/#id4198758
  *
- * @package
- * @subpackage
- * @version $Id: HtmlViewHelper.php 2043 2010-03-16 08:49:45Z sebastian $
  */
 class Tx_Fluid_ViewHelpers_Format_HtmlViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
 
@@ -53,6 +47,11 @@ class Tx_Fluid_ViewHelpers_Format_HtmlViewHelper extends Tx_Fluid_Core_ViewHelpe
        protected $contentObject;
 
        /**
+        * @var t3lib_fe contains a backup of the current $GLOBALS['TSFE'] if used in BE mode
+        */
+       protected $tsfeBackup;
+
+       /**
         * If the escaping interceptor should be disabled inside this ViewHelper, then set this value to FALSE.
         * This is internal and NO part of the API. It is very likely to change.
         *
@@ -77,8 +76,42 @@ class Tx_Fluid_ViewHelpers_Format_HtmlViewHelper extends Tx_Fluid_Core_ViewHelpe
         * @author Niels Pardon <mail@niels-pardon.de>
         */
        public function render($parseFuncTSPath = 'lib.parseFunc_RTE') {
+               if (TYPO3_MODE === 'BE') {
+                       $this->simulateFrontendEnvironment();
+               }
+
                $value = $this->renderChildren();
-               return $this->contentObject->parseFunc($value, array(), '< ' . $parseFuncTSPath);
+               $content = $this->contentObject->parseFunc($value, array(), '< ' . $parseFuncTSPath);
+
+               if (TYPO3_MODE === 'BE') {
+                       $this->resetFrontendEnvironment();
+               }
+               return $content;
+       }
+
+       /**
+        * Copies the specified parseFunc configuration to $GLOBALS['TSFE']->tmpl->setup in Backend mode
+        * This somewhat hacky work around is currently needed because the parseFunc() function of tslib_cObj relies on those variables to be set
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       protected function simulateFrontendEnvironment() {
+               $this->tsfeBackup = isset($GLOBALS['TSFE']) ? $GLOBALS['TSFE'] : NULL;
+               $configurationManager = Tx_Extbase_Dispatcher::getConfigurationManager();
+               $GLOBALS['TSFE'] = new stdClass();
+               $GLOBALS['TSFE']->tmpl->setup = $configurationManager->loadTypoScriptSetup();
+       }
+
+       /**
+        * Resets $GLOBALS['TSFE'] if it was previously changed by simulateFrontendEnvironment()
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @see simulateFrontendEnvironment()
+        */
+       protected function resetFrontendEnvironment() {
+               $GLOBALS['TSFE'] = $this->tsfeBackup;
        }
 }
 
index f289a0a..bf465db 100644 (file)
@@ -33,9 +33,6 @@
  * Output:
  * text with line breaks replaced by <br />
  *
- * @version $Id: Nl2brViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Format
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 74e7971..1cf4a5e 100644 (file)
@@ -40,9 +40,6 @@
  * Output:
  * 423.423,2
  *
- * @version $Id: NumberViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Format
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 563f8f5..3f8d307 100644 (file)
@@ -40,9 +40,6 @@
  * Output:
  * TYPO3-=-=-
  *
- * @version $Id: PaddingViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Format
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 7fbc00c..48ffdf8 100644 (file)
@@ -48,9 +48,6 @@
  * Output:
  * We love TYPO3
  *
- * @version $Id: PrintfViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers\Format
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
index 5677ec9..52d8e0e 100644 (file)
@@ -74,9 +74,6 @@
  *   </li>
  * </ul>
  *
- * @version $Id: GroupedForViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -86,7 +83,7 @@ class Tx_Fluid_ViewHelpers_GroupedForViewHelper extends Tx_Fluid_Core_ViewHelper
        /**
         * Iterates through elements of $each and renders child nodes
         *
-        * @param array $each The array or SplObjectStorage to iterated over
+        * @param array $each The array or Tx_Extbase_Persistence_ObjectStorage to iterated over
         * @param string $as The name of the iteration variable
         * @param string $groupBy Group by this property
         * @param string $groupKey The name of the variable to store the current group
@@ -103,21 +100,13 @@ class Tx_Fluid_ViewHelpers_GroupedForViewHelper extends Tx_Fluid_Core_ViewHelper
                        if (!$each instanceof Traversable) {
                                throw new Tx_Fluid_Core_ViewHelper_Exception('GroupedForViewHelper only supports arrays and objects implementing Traversable interface' , 1253108907);
                        }
-                       $each = $this->convertToArray($each);
+                       $each = iterator_to_array($each);
                }
-               $groups = array();
-               foreach ($each as $keyValue => $singleElement) {
-                       if (is_array($singleElement)) {
-                               $currentGroupKey = isset($singleElement[$groupBy]) ? $singleElement[$groupBy] : NULL;
-                       } elseif (is_object($singleElement)) {
-                               $currentGroupKey = Tx_Extbase_Reflection_ObjectAccess::getProperty($singleElement, $groupBy);
-                       } else {
-                               throw new Tx_Fluid_Core_ViewHelper_Exception('GroupedForViewHelper only supports multi-dimensional arrays and objects' , 1253120365);
-                       }
-                       $groups[$currentGroupKey][$keyValue] = $singleElement;
-               }
-               foreach ($groups as $currentGroupKey => $group) {
-                       $this->templateVariableContainer->add($groupKey, $currentGroupKey);
+
+               $groups = $this->groupElements($each, $groupBy);
+
+               foreach ($groups['values'] as $currentGroupIndex => $group) {
+                       $this->templateVariableContainer->add($groupKey, $groups['keys'][$currentGroupIndex]);
                        $this->templateVariableContainer->add($as, $group);
                        $output .= $this->renderChildren();
                        $this->templateVariableContainer->remove($groupKey);
@@ -127,20 +116,32 @@ class Tx_Fluid_ViewHelpers_GroupedForViewHelper extends Tx_Fluid_Core_ViewHelper
        }
 
        /**
-        * Turns the given object into an array.
-        * The object has to implement the Traversable interface
+        * Groups the given array by the specified groupBy property.
         *
-        * @param Traversable $object The object to be turned into an array. If the object implements Iterator the key will be preserved.
-        * @return array The resulting array
+        * @param array $elements The array / traversable object to be grouped
+        * @param string $groupBy Group by this property
+        * @return array The grouped array in the form array('keys' => array('key1' => [key1value], 'key2' => [key2value], ...), 'values' => array('key1' => array([key1value] => [element1]), ...), ...)
         * @author Bastian Waidelich <bastian@typo3.org>
         */
-       protected function convertToArray(Traversable $object) {
-               $array = array();
-               foreach ($object as $keyValue => $singleElement) {
-                       $array[$keyValue] = $singleElement;
+       protected function groupElements(array $elements, $groupBy) {
+               $groups = array('keys' => array(), 'values' => array());
+               foreach ($elements as $key => $value) {
+                       if (is_array($value)) {
+                               $currentGroupIndex = isset($value[$groupBy]) ? $value[$groupBy] : NULL;
+                       } elseif (is_object($value)) {
+                               $currentGroupIndex = Tx_Extbase_Reflection_ObjectAccess::getProperty($value, $groupBy);
+                       } else {
+                               throw new Tx_Fluid_Core_ViewHelper_Exception('GroupedForViewHelper only supports multi-dimensional arrays and objects' , 1253120365);
+                       }
+                       $currentGroupKeyValue = $currentGroupIndex;
+                       if (is_object($currentGroupIndex)) {
+                               $currentGroupIndex = spl_object_hash($currentGroupIndex);
+                       }
+                       $groups['keys'][$currentGroupIndex] = $currentGroupKeyValue;
+                       $groups['values'][$currentGroupIndex][$key] = $value;
                }
-               return $array;
+               return $groups;
        }
 }
 
-?>
\ No newline at end of file
+?>
index 53a51eb..797b066 100644 (file)
  * Otherwise, everything the value of the "else"-attribute is displayed.
  *
  *
- * @version $Id: IfViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
  */
-class Tx_Fluid_ViewHelpers_IfViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper implements Tx_Fluid_Core_ViewHelper_Facets_ChildNodeAccessInterface {
-
-       /**
-        * An array of Tx_Fluid_Core_Parser_SyntaxTree_AbstractNode
-        * @var array
-        */
-       protected $childNodes = array();
-
-       /**
-        * @var Tx_Fluid_Core_Rendering_RenderingContext
-        */
-       protected $renderingContext;
-
-       /**
-        * Setter for ChildNodes - as defined in ChildNodeAccessInterface
-        *
-        * @param array $childNodes Child nodes of this syntax tree node
-        * @return void
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @api
-        */
-       public function setChildNodes(array $childNodes) {
-               $this->childNodes = $childNodes;
-       }
-
-       /**
-        * Sets the rendering context which needs to be passed on to child nodes
-        *
-        * @param Tx_Fluid_Core_Rendering_RenderingContext $renderingContext the renderingcontext to use
-        */
-       public function setRenderingContext(Tx_Fluid_Core_Rendering_RenderingContext $renderingContext) {
-               $this->renderingContext = $renderingContext;
-       }
+class Tx_Fluid_ViewHelpers_IfViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractConditionViewHelper {
 
        /**
         * renders <f:then> child if $condition is true, otherwise renders <f:else> child.
         *
         * @param boolean $condition View helper condition
-        * @param string $then String to be returned if the condition is met
-        * @param string $else String to be returned if the condition is not met
         * @return string the rendered string
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
         * @api
         */
-       public function render($condition, $then = NULL, $else = NULL) {
+       public function render($condition) {
                if ($condition) {
                        return $this->renderThenChild();
                } else {
                        return $this->renderElseChild();
                }
        }
-
-       /**
-        * Returns value of "then" attribute.
-        * If then attribute is not set, iterates through child nodes and renders ThenViewHelper.
-        * If then attribute is not set and no ThenViewHelper is found, all child nodes are rendered
-        *
-        * @return string rendered ThenViewHelper or contents of <f:if> if no ThenViewHelper was found
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       protected function renderThenChild() {
-               if ($this->arguments->hasArgument('then')) {
-                       return $this->arguments['then'];
-               }
-               foreach ($this->childNodes as $childNode) {
-                       if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode
-                               && $childNode->getViewHelperClassName() === 'Tx_Fluid_ViewHelpers_ThenViewHelper') {
-                               $childNode->setRenderingContext($this->renderingContext);
-                               $data = $childNode->evaluate();
-                               return $data;
-                       }
-               }
-               return $this->renderChildren();
-       }
-
-       /**
-        * Returns value of "else" attribute.
-        * If else attribute is not set, iterates through child nodes and renders ElseViewHelper.
-        * If else attribute is not set and no ElseViewHelper is found, an empty string will be returned.
-        *
-        * @return string rendered ElseViewHelper or an empty string if no ThenViewHelper was found
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       protected function renderElseChild() {
-               foreach ($this->childNodes as $childNode) {
-                       if ($childNode instanceof Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode
-                               && $childNode->getViewHelperClassName() === 'Tx_Fluid_ViewHelpers_ElseViewHelper') {
-                               $childNode->setRenderingContext($this->renderingContext);
-                               return $childNode->evaluate();
-                       }
-               }
-               if ($this->arguments->hasArgument('else')) {
-                       return $this->arguments['else'];
-               }
-               return '';
-       }
 }
-
-?>
\ No newline at end of file
+?>
index 987cfc0..5ec71ce 100644 (file)
  *
  * @todo documentation
  *
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: ImageViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
  */
 
 /**
  *
- * @package
- * @subpackage
- * @version $Id: ImageViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
  */
-class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * @var tslib_cObj
@@ -41,6 +35,16 @@ class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagB
        protected $tagName = 'img';
 
        /**
+        * @var t3lib_fe contains a backup of the current $GLOBALS['TSFE'] if used in BE mode
+        */
+       protected $tsfeBackup;
+
+       /**
+        * @var string
+        */
+       protected $workingDirectoryBackup;
+
+       /**
         * Constructor. Used to create an instance of tslib_cObj used by the render() method.
         *
         * @param tslib_cObj $contentObject injector for tslib_cObj (optional)
@@ -48,9 +52,6 @@ class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagB
         */
        public function __construct($contentObject = NULL) {
                $this->contentObject = $contentObject !== NULL ? $contentObject : t3lib_div::makeInstance('tslib_cObj');
-               if (TYPO3_MODE === 'BE') {
-                       throw new Tx_Fluid_Core_ViewHelper_Exception('ImageViewHelper does not (yet) work in backend mode' , 1253191784);
-               }
        }
 
        /**
@@ -85,6 +86,9 @@ class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagB
         * @author Bastian Waidelich <bastian@typo3.org>
         */
        public function render($src, $width = NULL, $height = NULL, $minWidth = NULL, $minHeight = NULL, $maxWidth = NULL, $maxHeight = NULL) {
+               if (TYPO3_MODE === 'BE') {
+                       $this->simulateFrontendEnvironment();
+               }
                $setup = array(
                        'width' => $width,
                        'height' => $height,
@@ -93,6 +97,9 @@ class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagB
                        'maxW' => $maxWidth,
                        'maxH' => $maxHeight
                );
+               if (TYPO3_MODE === 'BE' && substr($src, 0, 3) === '../') {
+                       $src = substr($src, 3);
+               }
                $imageInfo = $this->contentObject->getImgResource($src, $setup);
                $GLOBALS['TSFE']->lastImageInfo = $imageInfo;
                if (!is_array($imageInfo)) {
@@ -102,6 +109,10 @@ class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagB
                $GLOBALS['TSFE']->imagesOnPage[] = $imageInfo[3];
 
                $imageSource = $GLOBALS['TSFE']->absRefPrefix . t3lib_div::rawUrlEncodeFP($imageInfo[3]);
+               if (TYPO3_MODE === 'BE') {
+                       $imageSource = '../' . $imageSource;
+                       $this->resetFrontendEnvironment();
+               }
                $this->tag->addAttribute('src', $imageSource);
                $this->tag->addAttribute('width', $imageInfo[0]);
                $this->tag->addAttribute('height', $imageInfo[1]);
@@ -111,4 +122,41 @@ class Tx_Fluid_ViewHelpers_ImageViewHelper extends Tx_Fluid_Core_ViewHelper_TagB
 
                return $this->tag->render();
        }
+
+       /**
+        * Prepares $GLOBALS['TSFE'] for Backend mode
+        * This somewhat hacky work around is currently needed because the getImgResource() function of tslib_cObj relies on those variables to be set
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        */
+       protected function simulateFrontendEnvironment() {
+               $this->tsfeBackup = isset($GLOBALS['TSFE']) ? $GLOBALS['TSFE'] : NULL;
+                       // set the working directory to the site root
+               $this->workingDirectoryBackup = getcwd();
+               chdir(PATH_site);
+
+               $configurationManager = Tx_Extbase_Dispatcher::getConfigurationManager();
+               $typoScriptSetup = $configurationManager->loadTypoScriptSetup();
+               $GLOBALS['TSFE'] = new stdClass();
+               $template = t3lib_div::makeInstance('t3lib_TStemplate');
+               $template->tt_track = 0;
+               $template->init();
+               $template->getFileName_backPath = PATH_site;
+               $GLOBALS['TSFE']->tmpl = $template;
+               $GLOBALS['TSFE']->tmpl->setup = $typoScriptSetup;
+               $GLOBALS['TSFE']->config = $typoScriptSetup;
+       }
+
+       /**
+        * Resets $GLOBALS['TSFE'] if it was previously changed by simulateFrontendEnvironment()
+        *
+        * @return void
+        * @author Bastian Waidelich <bastian@typo3.org>
+        * @see simulateFrontendEnvironment()
+        */
+       protected function resetFrontendEnvironment() {
+               $GLOBALS['TSFE'] = $this->tsfeBackup;
+               chdir($this->workingDirectoryBackup);
+       }
 }
\ No newline at end of file
index 8f138bb..f467d27 100644 (file)
 /**
  * With this tag, you can select a layout to be used..
  * <code><f:layout name="main" /></code>
+ * 
  *
  *
- *
- * @version $Id: LayoutViewHelper.php 1734 2009-11-25 21:53:57Z stucki $
- * @package Fluid
- * @subpackage ViewHelpers
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @api
  * @scope prototype
@@ -58,8 +55,7 @@ class Tx_Fluid_ViewHelpers_LayoutViewHelper extends Tx_Fluid_Core_ViewHelper_Abs
         */
        static public function postParseEvent(Tx_Fluid_Core_Parser_SyntaxTree_ViewHelperNode $syntaxTreeNode, array $viewHelperArguments, Tx_Fluid_Core_ViewHelper_TemplateVariableContainer $variableContainer) {
                if (isset($viewHelperArguments['name'])) {
-                       $viewHelperArguments['name']->setRenderingContext(new Tx_Fluid_Core_Rendering_RenderingContext());
-                       $layoutName = $viewHelperArguments['name']->evaluate();
+                       $layoutName = $viewHelperArguments['name']->getText();
                } else {
                        $layoutName = 'default';
                }
@@ -79,4 +75,4 @@ class Tx_Fluid_ViewHelpers_LayoutViewHelper extends Tx_Fluid_Core_ViewHelper_Abs
 }
 
 
-?>
\ No newline at end of file
+?>
index b482373..bcd2c6f 100644 (file)
  * <a href="index.php?id=123&tx_myextension_plugin[action]=show&tx_myextension_plugin[controller]=Standard&cHash=xyz">action link</f:link.action>
  * (depending on the current page and your TS configuration)
  *
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: ActionViewHelper.php 1492 2009-10-21 16:02:16Z bwaidelich $
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
-class Tx_Fluid_ViewHelpers_Link_ActionViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+class Tx_Fluid_ViewHelpers_Link_ActionViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * @var string
index bc329d1..74d4596 100644 (file)
@@ -14,9 +14,6 @@
  *                                                                        */
 
 /**
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: EmailViewHelper.php 1492 2009-10-21 16:02:16Z bwaidelich $
  */
 
 /**
  * Output:
  * <a href="javascript:linkTo_UnCryptMailto('ocknvq,hqqBdct0vnf');">some custom content</a>
  *
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: EmailViewHelper.php 1492 2009-10-21 16:02:16Z bwaidelich $
  */
-class Tx_Fluid_ViewHelpers_Link_EmailViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+class Tx_Fluid_ViewHelpers_Link_EmailViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * @var string
index 411b8fa..e981d79 100644 (file)
@@ -1,16 +1,23 @@
 <?php
 
 /*                                                                        *
- * This script is part of the TYPO3 project - inspiring people to share!  *
+ * This script belongs to the FLOW3 package "Fluid".                      *
  *                                                                        *
- * TYPO3 is free software; you can redistribute it and/or modify it under *
- * the terms of the GNU General Public License version 2 as published by  *
- * the Free Software Foundation.                                          *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
  *                                                                        *
  * This script is distributed in the hope that it will be useful, but     *
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General      *
- * Public License for more details.                                       *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
  *                                                                        */
 
 /**
  * Output:
  * <a href="http://www.typo3.org" target="_blank">external link</a>
  *
- * @package Fluid
- * @subpackage ViewHelpers
- * @version $Id: ExternalViewHelper.php 1492 2009-10-21 16:02:16Z bwaidelich $
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @api
  * @scope prototype
  */
-class Tx_Fluid_ViewHelpers_Link_ExternalViewHelper extends Tx_Fluid_Core_ViewHelper_TagBasedViewHelper {
+class Tx_Fluid_ViewHelpers_Link_ExternalViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractTagBasedViewHelper {
 
        /**
         * @var string
@@ -39,10 +44,11 @@ class Tx_Fluid_ViewHelpers_Link_ExternalViewHelper extends Tx_Fluid_Core_ViewHel
        protected $tagName = 'a';
 
        /**
-        * Arguments initialization
+        * Initialize arguments
         *
         * @return void
-        * @author Bastian Waidelich <bastian@typo3.org>
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        * @api
         */
        public function initializeArguments() {
                $this->registerUniversalTagAttributes();
@@ -55,8 +61,8 @@ class Tx_Fluid_ViewHelpers_Link_ExternalViewHelper extends Tx_Fluid_Core_ViewHel
        /**
         * @param string $uri the URI that will be put in the href attribute of the rendered link tag
         * @return string Rendered link
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @author Bastian Waidelich <bastian@typo3.org>
+        * @api
         */
        public function render($uri) {
                $this->tag->addAttribute('href', $uri);
@@ -67,4