Fluid:
authorSebastian Kurfürst <sebastian@typo3.org>
Fri, 17 Apr 2009 21:42:47 +0000 (21:42 +0000)
committerSebastian Kurfürst <sebastian@typo3.org>
Fri, 17 Apr 2009 21:42:47 +0000 (21:42 +0000)
* Fixed bug #3122
* Performance improvements from v5 Fluid

typo3/sysext/fluid/Classes/Compatibility/Validation/ValidatorResolver.php
typo3/sysext/fluid/Classes/Core/AbstractViewHelper.php
typo3/sysext/fluid/Classes/Core/ArgumentDefinition.php
typo3/sysext/fluid/Classes/Core/SyntaxTree/ViewHelperNode.php
typo3/sysext/fluid/Classes/Core/TagBasedViewHelper.php
typo3/sysext/fluid/Classes/Core/TemplateParser.php

index f120949..5499ba4 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 class Tx_Fluid_Compatibility_Validation_ValidatorResolver implements t3lib_Singleton {
-       public function getValidator($dataType) {
+       public function createValidator($dataType) {
                return t3lib_div::makeInstance('Tx_Fluid_Compatibility_Validation_DummyValidator');
        }
 }
index b10d858..bb50714 100644 (file)
@@ -16,7 +16,7 @@
 /**
  * @package Fluid
  * @subpackage Core
- * @version $Id: AbstractViewHelper.php 2104 2009-03-27 21:29:03Z robert $
+ * @version $Id: AbstractViewHelper.php 2168 2009-04-17 17:51:52Z sebastian $
  */
 
 /**
@@ -24,7 +24,7 @@
  *
  * @package Fluid
  * @subpackage Core
- * @version $Id: AbstractViewHelper.php 2104 2009-03-27 21:29:03Z robert $
+ * @version $Id: AbstractViewHelper.php 2168 2009-04-17 17:51:52Z sebastian $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  * @scope prototype
  */
@@ -190,7 +190,7 @@ abstract class Tx_Fluid_Core_AbstractViewHelper implements Tx_Fluid_Core_ViewHel
                        if (isset($parameterInfo['defaultValue'])) {
                                $defaultValue = $parameterInfo['defaultValue'];
                        }
-                       $this->registerArgument($parameterName, $dataType, $description, ($parameterInfo['optional'] === FALSE), $defaultValue);
+                       $this->argumentDefinitions[$parameterName] = new Tx_Fluid_Core_ArgumentDefinition($parameterName, $dataType, $description, ($parameterInfo['optional'] === FALSE), $defaultValue, TRUE);
                        $i++;
                }
        }
@@ -198,6 +198,7 @@ abstract class Tx_Fluid_Core_AbstractViewHelper implements Tx_Fluid_Core_ViewHel
        /**
         * Validate arguments, and throw exception if arguments do not validate.
         *
+        * @return void
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @internal
         */
@@ -211,11 +212,11 @@ abstract class Tx_Fluid_Core_AbstractViewHelper implements Tx_Fluid_Core_ViewHel
                                if ($this->arguments[$argumentName] === $registeredArgument->getDefaultValue()) continue;
 
                                if ($type === 'array') {
-                                       if (!is_array($this->arguments[$argumentName]) && !$this->arguments[$argumentName] instanceof ArrayAccess) {
+                                       if (!is_array($this->arguments[$argumentName]) && !$this->arguments[$argumentName] instanceof ArrayAccess && !$this->arguments[$argumentName] instanceof Traversable) {
                                                throw new Tx_Fluid_Core_RuntimeException('The argument "' . $argumentName . '" was registered with type array, but is of type ' . gettype($this->arguments[$argumentName]), 1237900529);
                                        }
                                } else {
-                                       $validator = $this->validatorResolver->getValidator($type);
+                                       $validator = $this->validatorResolver->createValidator($type);
                                        if (is_null($validator)) {
                                                throw new Tx_Fluid_Core_RuntimeException('No validator found for argument name "' . $argumentName . '" with type "' . $type . '" in view helper "' . get_class($this) . '".', 1237900534);
                                        }
index 152d599..153d831 100644 (file)
@@ -16,7 +16,7 @@
 /**
  * @package Fluid
  * @subpackage Core
- * @version $Id: ArgumentDefinition.php 2098 2009-03-27 00:05:08Z sebastian $
+ * @version $Id: ArgumentDefinition.php 2168 2009-04-17 17:51:52Z sebastian $
  */
 
 /**
@@ -24,7 +24,7 @@
  *
  * @package Fluid
  * @subpackage Core
- * @version $Id: ArgumentDefinition.php 2098 2009-03-27 00:05:08Z sebastian $
+ * @version $Id: ArgumentDefinition.php 2168 2009-04-17 17:51:52Z sebastian $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  */
 class Tx_Fluid_Core_ArgumentDefinition {
@@ -55,25 +55,34 @@ class Tx_Fluid_Core_ArgumentDefinition {
 
        /**
         * Default value for argument
-        * @var null
+        * @var mixed
         */
        protected $defaultValue = NULL;
 
        /**
+        * TRUE if it is a method parameter
+        * @var boolean
+        */
+       protected $isMethodParameter = FALSE;
+
+       /**
         * Constructor for this argument definition.
         *
         * @param string $name Name of argument
         * @param string $type Type of argument
         * @param string $description Description of argument
         * @param boolean $required TRUE if argument is required
+        * @param mixed $defaultValue Default value
+        * @param boolean $isMethodParameter TRUE if this argument is a method parameter
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       public function __construct($name, $type, $description, $required, $defaultValue = NULL) {
+       public function __construct($name, $type, $description, $required, $defaultValue = NULL, $isMethodParameter = FALSE) {
                $this->name = $name;
                $this->type = $type;
                $this->description = $description;
                $this->required = $required;
                $this->defaultValue = $defaultValue;
+               $this->isMethodParameter = $isMethodParameter;
        }
 
        /**
@@ -125,6 +134,16 @@ class Tx_Fluid_Core_ArgumentDefinition {
        public function getDefaultValue() {
                return $this->defaultValue;
        }
+
+       /**
+        * TRUE if it is a method parameter
+        *
+        * @return boolean TRUE if it's a method parameter
+        * @author Sebastian Kurfürst <sebastian@typo3.org>
+        */
+       public function isMethodParameter() {
+               return $this->isMethodParameter;
+       }
 }
 
 ?>
\ No newline at end of file
index 4a625ce..e437aa3 100644 (file)
@@ -16,7 +16,7 @@
 /**
  * @package Fluid
  * @subpackage Core
- * @version $Id: ViewHelperNode.php 2098 2009-03-27 00:05:08Z sebastian $
+ * @version $Id: ViewHelperNode.php 2168 2009-04-17 17:51:52Z sebastian $
  */
 
 /**
@@ -24,7 +24,7 @@
  *
  * @package Fluid
  * @subpackage Core
- * @version $Id: ViewHelperNode.php 2098 2009-03-27 00:05:08Z sebastian $
+ * @version $Id: ViewHelperNode.php 2168 2009-04-17 17:51:52Z sebastian $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  * @scope prototype
  */
@@ -96,6 +96,7 @@ class Tx_Fluid_Core_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_SyntaxTree_A
                $contextVariables = $variableContainer->getAllIdentifiers();
 
                $evaluatedArguments = array();
+               $evaluatedArgumentsWhichAreMethodParameters = array();
                if (count($argumentDefinitions)) {
                        foreach ($argumentDefinitions as $argumentName => $argumentDefinition) {
                                if (isset($this->arguments[$argumentName])) {
@@ -104,6 +105,9 @@ class Tx_Fluid_Core_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_SyntaxTree_A
                                } else {
                                        $evaluatedArguments[$argumentName] = $argumentDefinition->getDefaultValue();
                                }
+                               if ($argumentDefinition->isMethodParameter()) {
+                                       $evaluatedArgumentsWhichAreMethodParameters[$argumentName] = $evaluatedArguments[$argumentName];
+                               }
                        }
                }
 
@@ -116,7 +120,8 @@ class Tx_Fluid_Core_SyntaxTree_ViewHelperNode extends Tx_Fluid_Core_SyntaxTree_A
                }
 
                $viewHelper->validateArguments();
-               $out = call_user_func_array(array($viewHelper, 'render'), $evaluatedArguments);
+
+               $out = call_user_func_array(array($viewHelper, 'render'), $evaluatedArgumentsWhichAreMethodParameters);
 
                if ($contextVariables != $variableContainer->getAllIdentifiers()) {
                        $endContextVariables = $variableContainer->getAllIdentifiers();
index 2dc6c4c..5183214 100644 (file)
@@ -16,7 +16,7 @@
 /**
  * @package Fluid
  * @subpackage Core
- * @version $Id: TagBasedViewHelper.php 2095 2009-03-26 22:34:13Z bwaidelich $
+ * @version $Id: TagBasedViewHelper.php 2121 2009-04-02 14:29:21Z sebastian $
  */
 
 /**
@@ -26,7 +26,7 @@
  *
  * @package Fluid
  * @subpackage Core
- * @version $Id: TagBasedViewHelper.php 2095 2009-03-26 22:34:13Z bwaidelich $
+ * @version $Id: TagBasedViewHelper.php 2121 2009-04-02 14:29:21Z sebastian $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  * @scope prototype
  */
@@ -44,7 +44,7 @@ abstract class Tx_Fluid_Core_TagBasedViewHelper extends Tx_Fluid_Core_AbstractVi
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        public function __construct() {
-               $this->registerArgument('additionalAttributes', 'array', 'Additional tag attributes', FALSE);
+               $this->registerArgument('additionalAttributes', 'array', 'Additional tag attributes. They will be added directly to the resulting HTML tag.', FALSE);
        }
 
        /**
@@ -60,7 +60,7 @@ abstract class Tx_Fluid_Core_TagBasedViewHelper extends Tx_Fluid_Core_AbstractVi
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        protected function registerTagAttribute($name, $type, $description, $required = FALSE) {
-               $this->registerArgument($name, $type, $description, $required);
+               $this->registerArgument($name, $type, $description, $required, '');
                $this->tagAttributes[] = $name;
        }
 
@@ -115,4 +115,4 @@ abstract class Tx_Fluid_Core_TagBasedViewHelper extends Tx_Fluid_Core_AbstractVi
                return implode(' ', $attributes);
        }
 }
-?>
+?>
\ No newline at end of file
index 167401a..db54a83 100644 (file)
@@ -16,7 +16,7 @@
 /**
  * @package Fluid
  * @subpackage Core
- * @version $Id: TemplateParser.php 2101 2009-03-27 16:33:37Z sebastian $
+ * @version $Id: TemplateParser.php 2118 2009-04-01 13:34:28Z sebastian $
  */
 
 /**
  *
  * @package Fluid
  * @subpackage Core
- * @version $Id: TemplateParser.php 2101 2009-03-27 16:33:37Z sebastian $
+ * @version $Id: TemplateParser.php 2118 2009-04-01 13:34:28Z sebastian $
  * @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
  */
 class Tx_Fluid_Core_TemplateParser {
 
-       public static $SCAN_PATTERN_NAMESPACEDECLARATION = '/(?:^|[^\\\\]){namespace\s*([a-zA-Z]+[a-zA-Z0-9]*)\s*=\s*((?:F3|Tx)(?:FLUID_NAMESPACE_SEPARATOR\w+)+)\s*}/m';
+       public static $SCAN_PATTERN_NAMESPACEDECLARATION = '/(?<!\\\\){namespace\s*([a-zA-Z]+[a-zA-Z0-9]*)\s*=\s*((?:F3|Tx)(?:FLUID_NAMESPACE_SEPARATOR\w+)+)\s*}/m';
 
        /**
         * This regular expression splits the input string at all dynamic tags, AND on all <![CDATA[...]]> sections.
@@ -64,7 +64,7 @@ class Tx_Fluid_Core_TemplateParser {
         *
         * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       public static $SCAN_PATTERN_CDATA = '/<!\[CDATA\[(.*?)\]\]>/s';
+       public static $SCAN_PATTERN_CDATA = '/^<!\[CDATA\[(.*?)\]\]>/s';
 
        /**
         * Pattern which splits the shorthand syntax into different tokens. The "shorthand syntax" is everything like {...}