пятница, 19 марта 2010 г.

Валидатор для проверки вхождения значения одного поля в значение другого

Простите, мне не удалось упростить заголовок поста. Итак, мне потребовалось проверить в форме, является ли значение поля А элементом массива, переданного в поле Б. После недолгих споров, я принял совет Павла наследовать валидатор-схему. Действительно, других способов получить доступ к двум и более полям формы, кажется, нет. Для одного поля подошел бы валидатор sfValidatorShemaFilter, но в нашем случае это решение не подходит - поля два.
Итак, валидатор:

<?php 
/** Валидатор проверяет, содержится ли значение поля $needleField в значении поля $haystackField
  *
  *
  */
  

class sfValidatorShemaContains extends sfValidatorSchema
{
  public function __construct($needleField, $haystackField, $messages = array())
  {
    $this->addOption('neeldle_field', $needleField);
    $this->addOption('haystack_field', $haystackField);
    $this->addOption('throw_global_error', false);

    parent::__construct(null, array(), $messages);
  }
  
  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');
    }
    
    
    $needleValue  = isset($values[$this->getOption('neeldle_field')]) ? $values[$this->getOption('neeldle_field')] : null;
    $haystackValue = isset($values[$this->getOption('haystack_field')]) ? $values[$this->getOption('haystack_field')] : null;
    
    if (!is_array($haystackValue))
      $haystackValue=array($haystackValue);
    
    $valid = in_array($needleValue,$haystackValue) ? true:false;
    
    if (!$valid)
    {
      $error = new sfValidatorError($this, 'invalid', array(
        'neelde_field'  => $needleValue,
        'haystack_field' => $haystackValue,
      ));
      if ($this->getOption('throw_global_error'))
      {
        throw $error;
      }

      throw new sfValidatorErrorSchema($this, array($this->getOption('neelde_field') => $error));
    }

    return $values;
  }
}

Валидатор на 90% состоит из кода наиболее подходящего родного симфониевского валидатора - sfValidatorShemaCompare.

Применять так:
<?php
$this->validatorSchema->setPostValidator(
      new sfValidatorShemaContains('current_user_id','visible_to_users_list',array(
        'invalid'=>'Нельзя сделать ответственным того, кто не видит тикет',
      )
    ));
?>

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

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