[+FEATURE] Extbase (MVC): Added automatic form highlighting if there is an error...
authorSebastian Kurfürst <sebastian@typo3.org>
Tue, 21 Jul 2009 20:14:50 +0000 (20:14 +0000)
committerSebastian Kurfürst <sebastian@typo3.org>
Tue, 21 Jul 2009 20:14:50 +0000 (20:14 +0000)
[+TASK] Extbase (Property): Updated Property Mapper to latest FLOW3 version.
[+BUGFIX] Extbase (Persistence): Fixed cache clearing. Now it works and takes pageTSConfig into account.

typo3/sysext/extbase/Classes/Error/Error.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Controller/ActionController.php
typo3/sysext/extbase/Classes/MVC/Controller/ArgumentError.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Controller/ArgumentsValidator.php
typo3/sysext/extbase/Classes/MVC/Request.php
typo3/sysext/extbase/Classes/Persistence/Storage/Typo3DbBackend.php
typo3/sysext/extbase/Classes/Property/Mapper.php
typo3/sysext/extbase/Classes/Property/MappingResults.php
typo3/sysext/extbase/Classes/Validation/Error.php

diff --git a/typo3/sysext/extbase/Classes/Error/Error.php b/typo3/sysext/extbase/Classes/Error/Error.php
new file mode 100644 (file)
index 0000000..411db65
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This class is a backport of the corresponding class of FLOW3. 
+*  All credits go to the v5 team.
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+/**
+ * An object representation of a generic error. Subclass this to create
+ * more specific errors if necessary.
+ *
+ * @version $Id: Error.php 2813 2009-07-16 14:02:34Z k-fish $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @scope prototype
+ */
+class Tx_Extbase_Error_Error {
+
+       /**
+        * @var string The default (english) error message.
+        */
+       protected $message = 'Unknown error';
+
+       /**
+        * @var string The error code
+        */
+       protected $code;
+
+       /**
+        * Constructs this error
+        *
+        * @param string $message: An english error message which is used if no other error message can be resolved
+        * @param integer $code: A unique error code
+        * @api
+        */
+       public function __construct($message, $code) {
+               $this->message = $message;
+               $this->code = $code;
+       }
+
+       /**
+        * Returns the error message
+        * @return string The error message
+        * @api
+        */
+       public function getMessage() {
+               return $this->message;
+       }
+
+       /**
+        * Returns the error code
+        * @return string The error code
+        * @api
+        */
+       public function getCode() {
+               return $this->code;
+       }
+
+       /**
+        * Converts this error into a string
+        *
+        * @return string
+        * @api
+        */
+       public function __toString() {
+               return $this->message . ' (#' . $this->code . ')';
+       }
+}
+?>
\ No newline at end of file
index 2fc1080..246fc43 100644 (file)
@@ -292,17 +292,29 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * A special action which is called if the originally intended action could
         * not be called, for example if the arguments were not valid.
         *
+        * The default implementation sets a flash message, request errors and forwards back
+        * to the originating action. This is suitable for most actions dealing with form input.
+        *
         * @return string
+        * @api
         */
        protected function errorAction() {
+               $this->request->setErrors($this->argumentsMappingResults->getErrors());
+
+               if ($this->request->hasArgument('__referrer')) {
+                       $referrer = $this->request->getArgument('__referrer');
+                       $this->forward($referrer['actionName'], $referrer['controllerName'], $referrer['extensionName'], $this->request->getArguments());
+               }
+
                $message = 'An error occurred while trying to call ' . get_class($this) . '->' . $this->actionMethodName . '().' . PHP_EOL;
                foreach ($this->argumentsMappingResults->getErrors() as $error) {
-                       $message .= 'Error:   ' . $error . PHP_EOL;
+                       $message .= 'Error:   ' . $error->getMessage() . PHP_EOL;
                }
                foreach ($this->argumentsMappingResults->getWarnings() as $warning) {
-                       $message .= 'Warning: ' . $warning . PHP_EOL;
+                       $message .= 'Warning: ' . $warning->getMessage() . PHP_EOL;
                }
                return $message;
        }
+       
 }
 ?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Controller/ArgumentError.php b/typo3/sysext/extbase/Classes/MVC/Controller/ArgumentError.php
new file mode 100644 (file)
index 0000000..89320b3
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This class is a backport of the corresponding class of FLOW3.
+*  All credits go to the v5 team.
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * @package Extbase
+ * @subpackage MVC
+ * @version $Id: PropertyError.php 2523 2009-06-02 10:35:40Z k-fish $
+ */
+
+/**
+ * This object holds validation errors for one argument.
+ *
+ * @package Extbase
+ * @subpackage MVC
+ * @version $Id: PropertyError.php 2523 2009-06-02 10:35:40Z k-fish $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @scope prototype
+ */
+class Tx_Extbase_MVC_Controller_ArgumentError extends Tx_Extbase_Validation_PropertyError {
+
+       /**
+        * @var string The default (english) error message.
+        */
+       protected $message = 'Validation errors for argument "%s"';
+
+       /**
+        * @var string The error code
+        */
+       protected $code = 1245107351;
+}
+
+?>
\ No newline at end of file
index 959df6a..88de469 100644 (file)
@@ -48,12 +48,13 @@ class Tx_Extbase_MVC_Controller_ArgumentsValidator extends Tx_Extbase_Validation
                if (!$arguments instanceof Tx_Extbase_MVC_Controller_Arguments) throw new InvalidArgumentException('Expected Tx_Extbase_MVC_Controller_Arguments, ' . gettype($arguments) . ' given.', 1241079561);
                $this->errors = array();
 
+               $result = TRUE;
                foreach ($arguments->getArgumentNames() as $argumentName) {
                        if ($this->isPropertyValid($arguments, $argumentName) === FALSE) {
-                               return FALSE;
+                               $result = FALSE;
                        }
                }
-               return TRUE;
+               return $result;
        }
 
        /**
@@ -86,12 +87,29 @@ class Tx_Extbase_MVC_Controller_ArgumentsValidator extends Tx_Extbase_Validation
 
                $argumentValue = $argument->getValue();
                if ($argumentValue === $argument->getDefaultValue() && $argument->isRequired() === FALSE) return TRUE;
+               
                if ($validatorConjunction->isValid($argumentValue) === FALSE) {
-                       $this->errors = $validatorConjunction->getErrors();
+                       $this->addErrorsForArgument($validatorConjunction->getErrors(), $argumentName);
                        return FALSE;
                }
                return TRUE;
        }
 
+       /**
+        * Adds the given errors to $this->errors and creates an ArgumentError
+        * instance if needed.
+        *
+        * @param array $errors Array of \F3\FLOW3\Validation\Error
+        * @param string $argumentName Name of the argument to add errors for
+        * @return void
+        * @internal
+        */
+       protected function addErrorsForArgument(array $errors, $argumentName) {
+               if (!isset($this->errors[$argumentName])) {
+                       $this->errors[$argumentName] = t3lib_div::makeInstance('Tx_Extbase_MVC_Controller_ArgumentError', $argumentName);
+               }
+               $this->errors[$argumentName]->addErrors($errors);
+       }
+       
 }
 ?>
\ No newline at end of file
index f688db6..d4ce2bd 100644 (file)
@@ -78,6 +78,11 @@ class Tx_Extbase_MVC_Request {
         * @var boolean If this request has been changed and needs to be dispatched again
         */
        protected $dispatched = FALSE;
+       
+       /**
+        * @var array Errors that occured during this request
+        */
+       protected $errors = array();
 
        /**
         * Constructs this request
@@ -340,5 +345,25 @@ class Tx_Extbase_MVC_Request {
        public function hasArgument($argumentName) {
                return isset($this->arguments[$argumentName]);
        }
+       
+       /**
+        * Set errors that occured during the request (e.g. argument mapping errors)
+        *
+        * @param array $errors An array of Tx_Extbase_Error_Error objects
+        * @return void
+        */
+       public function setErrors(array $errors) {
+               $this->errors = $errors;
+       }
+
+       /**
+        * Get errors that occured during the request (e.g. argument mapping errors)
+        *
+        * @return array The errors that occured during the request
+        */
+       public function getErrors() {
+               return $this->errors;
+       }
+       
 }
 ?>
\ No newline at end of file
index 8867f3e..b9233f9 100644 (file)
@@ -621,19 +621,18 @@ class Tx_Extbase_Persistence_Storage_Typo3DbBackend implements Tx_Extbase_Persis
                if (!$storagePage) {
                        return;
                }
-               
+
                $pageTSConfig = t3lib_BEfunc::getPagesTSconfig($storagePage);
-               
-               if ($pageTSConfig['clearCacheCmd'])     {
-                       $clearCacheCommands = t3lib_div::trimExplode(',',strtolower($TSConfig['clearCacheCmd']),1);
-                               $clearCacheCommands = array_unique($clearCacheCommands);
-                               foreach ($clearCacheCommands as $clearCacheCommand)     {
-                                       if (t3lib_div::testInt($clearCacheCommand))     {
-                                               $pageIdsToClear[] = $clearCacheCommand;
-                                       }
+               if (isset($pageTSConfig['TCEMAIN.']['clearCacheCmd']))  {
+                       $clearCacheCommands = t3lib_div::trimExplode(',',strtolower($pageTSConfig['TCEMAIN.']['clearCacheCmd']),1);
+                       $clearCacheCommands = array_unique($clearCacheCommands);
+                       foreach ($clearCacheCommands as $clearCacheCommand)     {
+                               if (t3lib_div::testInt($clearCacheCommand))     {
+                                       $pageIdsToClear[] = $clearCacheCommand;
                                }
                        }
-               
+               }
+
                foreach ($pageIdsToClear as $pageIdToClear) {
                        $pageCache->flushByTag('pageId_' . $pageIdToClear);
                        $pageSectionCache->flushByTag('pageId_' . $pageIdToClear);
index 43a0d8b..7812fdc 100644 (file)
@@ -99,7 +99,7 @@ class Tx_Extbase_Property_Mapper {
                if ($this->mappingResults->hasErrors()) return FALSE;
 
                if ($targetObjectValidator->isValid($target) !== TRUE) {
-                       $this->mappingResults->addError('Validation errors: ' . implode('. ', $targetObjectValidator->getErrors()), '*');
+                       $this->addErrorsFromObjectValidator($targetObjectValidator->getErrors());
                        $backupMappingResult = $this->mappingResults;
                        $this->map($propertyNames, $backupProperties, $source, $optionalPropertyNames);
                        $this->mappingResults = $backupMappingResult;
@@ -108,6 +108,21 @@ class Tx_Extbase_Property_Mapper {
        }
 
        /**
+        * Add errors to the mapping result from an object validator (property errors).
+        *
+        * @param array Array of Tx_Extbase_Validation_PropertyError
+        * @return void
+        */
+       protected function addErrorsFromObjectValidator($errors) {
+               foreach ($errors as $error) {
+                       if ($error instanceof Tx_Extbase_Validation_PropertyError) {
+                               $propertyName = $error->getPropertyName();
+                               $this->mappingResults->addError($error, $propertyName);
+                       }
+               }
+       }
+
+       /**
         * Maps the given properties to the target object WITHOUT VALIDATING THE RESULT.
         * If the properties could be set, this method returns TRUE, otherwise FALSE.
         * Returning TRUE does not mean that the target object is valid and secure!
@@ -140,10 +155,10 @@ class Tx_Extbase_Property_Mapper {
                                if (is_array($target)) {
                                        $target[$propertyName] = $source[$propertyName];
                                } elseif (Tx_Extbase_Reflection_ObjectAccess::setProperty($target, $propertyName, $propertyValues[$propertyName]) === FALSE) {
-                                       $this->mappingResults->addError("Property '$propertyName' could not be set.", $propertyName);
+                                       $this->mappingResults->addError(t3lib_div::makeInstance('Tx_Extbase_Error_Error', "Property '$propertyName' could not be set." , 1236783102), $propertyName);
                                }
                        } elseif (!in_array($propertyName, $optionalPropertyNames)) {
-                               $this->mappingResults->addError("Required property '$propertyName' does not exist.", $propertyName);
+                               $this->mappingResults->addError(t3lib_div::makeInstance('Tx_Extbase_Error_Error', "Required property '$propertyName' does not exist." , 1236785359), $propertyName);
                        }
                }
                return (!$this->mappingResults->hasErrors() && !$this->mappingResults->hasWarnings());
index f96e86e..e39ed9f 100644 (file)
@@ -49,17 +49,17 @@ class Tx_Extbase_Property_MappingResults {
         * Adds an error to the mapping results. This might be for example a
         * validation or mapping error
         *
-        * @param string $error The occured error
+        * @param Tx_Extbase_Error_Error $error The occured error
         * @param string $propertyName The name of the property which caused the error
         */
-       public function addError($error, $propertyName) {
+       public function addError(Tx_Extbase_Error_Error $error, $propertyName) {
                $this->errors[$propertyName] = $error;
        }
        
        /**
         * Returns all errors that occured so far
         *
-        * @return array Array of error messages
+        * @return array Array of Tx_Extbase_Error_Error
         */
        public function getErrors() {
                return $this->errors;
index 9ead8bc..65661c1 100644 (file)
@@ -34,7 +34,7 @@
  * @version $ID:$
  * @scope prototype
  */
-class Tx_Extbase_Validation_Error {
+class Tx_Extbase_Validation_Error extends Tx_Extbase_Error_Error {
 
        /**
         * @var string The default (english) error message.
@@ -45,42 +45,6 @@ class Tx_Extbase_Validation_Error {
         * @var string The error code
         */
        protected $code = 1201447005;
-
-       /**
-        * Constructs this error
-        *
-        * @param string $message: An english error message which is used if no other error message can be resolved
-        * @param integer $code: A unique error code
-        */
-       public function __construct($message, $code) {
-               $this->message = $message;
-               $this->code = $code;
-       }
-
-       /**
-        * Returns the error message
-        * @return string The error message
-        */
-       public function getMessage() {
-               return $this->message;
-       }
-
-       /**
-        * Returns the error code
-        * @return string The error code
-        */
-       public function getCode() {
-               return $this->code;
-       }
-
-       /**
-        * Converts this error into a string
-        *
-        * @return string
-        */
-       public function __toString() {
-               return $this->message . ' (#' . $this->code . ')';
-       }
 }
 
 ?>
\ No newline at end of file