* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * sfValidatorSchemaCompare compares several values from an array. * * @package symfony * @subpackage validator * @author Fabien Potencier * @version SVN: $Id: sfValidatorSchemaCompare.class.php 21908 2009-09-11 12:06:21Z fabien $ */ class sfValidatorSchemaCompare extends sfValidatorSchema { const EQUAL = '=='; const NOT_EQUAL = '!='; const IDENTICAL = '==='; const NOT_IDENTICAL = '!=='; const LESS_THAN = '<'; const LESS_THAN_EQUAL = '<='; const GREATER_THAN = '>'; const GREATER_THAN_EQUAL = '>='; /** * Constructor. * * Available options: * * * left_field: The left field name * * operator: The comparison operator * * self::EQUAL * * self::NOT_EQUAL * * self::IDENTICAL * * self::NOT_IDENTICAL * * self::LESS_THAN * * self::LESS_THAN_EQUAL * * self::GREATER_THAN * * self::GREATER_THAN_EQUAL * * right_field: The right field name * * throw_global_error: Whether to throw a global error (false by default) or an error tied to the left field * * @param string $leftField The left field name * @param string $operator The operator to apply * @param string $rightField The right field name * @param array $options An array of options * @param array $messages An array of error messages * * @see sfValidatorBase */ public function __construct($leftField, $operator, $rightField, $options = array(), $messages = array()) { $this->addOption('left_field', $leftField); $this->addOption('operator', $operator); $this->addOption('right_field', $rightField); $this->addOption('throw_global_error', false); parent::__construct(null, $options, $messages); } /** * @see sfValidatorBase */ protected function doClean($values) { if (null === $values) { $values = array(); } if (!is_array($values)) { throw new InvalidArgumentException('You must pass an array parameter to the clean() method'); } $leftValue = isset($values[$this->getOption('left_field')]) ? $values[$this->getOption('left_field')] : null; $rightValue = isset($values[$this->getOption('right_field')]) ? $values[$this->getOption('right_field')] : null; switch ($this->getOption('operator')) { case self::GREATER_THAN: $valid = $leftValue > $rightValue; break; case self::GREATER_THAN_EQUAL: $valid = $leftValue >= $rightValue; break; case self::LESS_THAN: $valid = $leftValue < $rightValue; break; case self::LESS_THAN_EQUAL: $valid = $leftValue <= $rightValue; break; case self::NOT_EQUAL: $valid = $leftValue != $rightValue; break; case self::EQUAL: $valid = $leftValue == $rightValue; break; case self::NOT_IDENTICAL: $valid = $leftValue !== $rightValue; break; case self::IDENTICAL: $valid = $leftValue === $rightValue; break; default: throw new InvalidArgumentException(sprintf('The operator "%s" does not exist.', $this->getOption('operator'))); } if (!$valid) { $error = new sfValidatorError($this, 'invalid', array( 'left_field' => $leftValue, 'right_field' => $rightValue, 'operator' => $this->getOption('operator'), )); if ($this->getOption('throw_global_error')) { throw $error; } throw new sfValidatorErrorSchema($this, array($this->getOption('left_field') => $error)); } return $values; } /** * @see sfValidatorBase */ public function asString($indent = 0) { $options = $this->getOptionsWithoutDefaults(); $messages = $this->getMessagesWithoutDefaults(); unset($options['left_field'], $options['operator'], $options['right_field']); $arguments = ''; if ($options || $messages) { $arguments = sprintf('(%s%s)', $options ? sfYamlInline::dump($options) : ($messages ? '{}' : ''), $messages ? ', '.sfYamlInline::dump($messages) : '' ); } return sprintf('%s%s %s%s %s', str_repeat(' ', $indent), $this->getOption('left_field'), $this->getOption('operator'), $arguments, $this->getOption('right_field') ); } }