воскресенье, 13 декабря 2009 г.

Валидатор для проверки чет-нечет

При вводе, например, размера одежды в российском стандарте (42,44,46,...) нужно проверить, чтобы число было четным (или, в каком-то другом случае, оно должно быть нечетным). Для проверки пользуемся валидатором NumberEvenOdd, который наследуется от обычного sfValidatorNumber.

Пользоваться так:

$this->validatorSchema['clothes_size']=new sfValidatorNumberEvenOdd(array(
  'min'=>'40',
  'max'=>'70',
  'even_odd'=>'even',
  ),
  array(
    'min'=>'Некорректное значение',
    'max'=>'Некорректное значение',
    'even'=>'Размер одежды должен быть четным',
  )
);

/**
 * sfValidatorBoolean validates a number is even or odd.
 *
 * @author     Evgeny Babin <psylosss@gmail.com>
 */
class sfValidatorNumberEvenOdd extends sfValidatorNumber
{
  /**
   * Configures the current validator.
   *
   * Available options:
   *
   *  * even_odd:  even|odd
   *
   * @param array $options    An array of options
   * @param array $messages   An array of error messages
   *
   * @see sfValidatorNumber
   */
  protected function configure($options = array(), $messages = array())
  {
    parent::configure($options,$messages);
    
    $this->addMessage('odd', 'Only odd values accepted.');
    $this->addMessage('even', 'Only even values accepted.');
    $this->addMessage('invalid_option_value', 'Option even_odd accepts only "even" or "odd", %option% given.');
    
    $this->addRequiredOption('even_odd');
  }

  /**
   * @see sfValidatorBase
   */
  protected function doClean($value)
  {
    $clean=parent::doClean($value);
    
    if (!in_array($this->getOption('even_odd'),array('even','odd')))
    {
      throw new sfValidatorError($this, 'invalid_option_value', array('option' => $this->getOption('even_odd')));
    }
    
    if ($this->getOption('even_odd')=='even' and ($value % 2 == 1))
    {
      throw new sfValidatorError($this, 'even', array('value' => $value));
    }
    
    if ($this->getOption('even_odd')=='odd' and ($value % 2 == 0))
    {
      throw new sfValidatorError($this, 'odd', array('value' => $value));
    }
    
    return $clean;
  }
}

Комментариев нет:

Отправить комментарий