[+FEATURE] Extbase (MVC): Added support of @dontvalidate annotations. Relates to...
authorSebastian Kurfürst <sebastian@typo3.org>
Thu, 6 Aug 2009 21:21:13 +0000 (21:21 +0000)
committerSebastian Kurfürst <sebastian@typo3.org>
Thu, 6 Aug 2009 21:21:13 +0000 (21:21 +0000)
typo3/sysext/extbase/Classes/MVC/Controller/ActionController.php
typo3/sysext/extbase/Classes/MVC/Controller/Argument.php
typo3/sysext/extbase/Classes/MVC/Controller/ArgumentsValidator.php

index a1ea5b9..f9cf031 100644 (file)
@@ -173,7 +173,31 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
                $validatorConjunctions = $this->validatorResolver->buildMethodArgumentsValidatorConjunctions(get_class($this), $this->actionMethodName);
                foreach ($validatorConjunctions as $argumentName => $validatorConjunction) {
                        if (!isset($this->arguments[$argumentName])) throw new Tx_Extbase_MVC_Exception_NoSuchArgument('Found custom validation rule for non existing argument "' . $argumentName . '" in ' . get_class($this) . '->' . $this->actionMethodName . '().', 1239853108);
-                       $this->arguments[$argumentName]->setValidator($validatorConjunction);
+                       $argument = $this->arguments[$argumentName];
+                       $existingValidator = $argument->getValidator();
+                       if ($existingValidator !== NULL) {
+                               $validatorConjunction->addValidator($existingValidator);
+                       }
+                       $argument->setValidator($validatorConjunction);
+               }
+
+               $this->evaluateDontValidateAnnotations();
+       }
+
+       /**
+        * Parses @dontvalidate annotations of an action method an disables validation for
+        * the specified arguments.
+        *
+        * @return void
+        */
+       protected function evaluateDontValidateAnnotations() {
+               $methodTagsValues = $this->reflectionService->getMethodTagsValues(get_class($this), $this->actionMethodName);
+               if (isset($methodTagsValues['dontvalidate'])) {
+                       foreach ($methodTagsValues['dontvalidate'] as $dontValidateValue) {
+                               $argumentName = substr($dontValidateValue, 1);
+                               if (!isset($this->arguments[$argumentName])) throw new Tx_Extbase_MVC_Exception_NoSuchArgument('Found @dontvalidate annotation for non existing argument "$' . $argumentName . '" in ' . get_class($this) . '->' . $this->actionMethodName . '().', 1249484908);
+                               $this->arguments[$argumentName]->disableValidation();
+                       }
                }
        }
 
index 3dff6fc..8157291 100644 (file)
@@ -92,6 +92,12 @@ class Tx_Extbase_MVC_Controller_Argument {
         */
        protected $validator = NULL;
 
+       /**
+        * If validation for this argument is temporarily disabled
+        * @var boolean
+        */
+       protected $validationDisabled = FALSE;
+
        /**
         * Uid for the argument, if it has one
         * @var string
@@ -276,6 +282,40 @@ class Tx_Extbase_MVC_Controller_Argument {
                return $this->validator;
        }
 
+       /**
+        * Returns TRUE if validation is temporarily disabled for this argument and
+        * FALSE if it's enabled.
+        *
+        * Note that this is flag is only informational and does not have any real impact
+        * on other validation methods of this argument.
+        *
+        * @return boolean If validation is disabled
+        * @api
+        */
+       public function isValidationDisabled() {
+               return $this->validationDisabled;
+       }
+
+       /**
+        * Enables validation for this argument.
+        *
+        * @return void
+        * @api
+        */
+       public function enableValidation() {
+               $this->validationDisabled = FALSE;
+       }
+
+       /**
+        * Disables validation for this argument.
+        *
+        * @return void
+        * @api
+        */
+       public function disableValidation() {
+               $this->validationDisabled = TRUE;
+       }
+
        /**
         * Sets the value of this argument.
         *
index 847c7a9..b5e0929 100644 (file)
@@ -50,6 +50,9 @@ class Tx_Extbase_MVC_Controller_ArgumentsValidator extends Tx_Extbase_Validation
 
                $result = TRUE;
                foreach ($arguments->getArgumentNames() as $argumentName) {
+                       if ($arguments[$argumentName]->isValidationDisabled()) {
+                               continue;
+                       }
                        if ($this->isPropertyValid($arguments, $argumentName) === FALSE) {
                                $result = FALSE;
                        }