Как передать параметр в пользовательский валидатор Zend? - PullRequest
0 голосов
/ 25 февраля 2011

Я пытаюсь написать валидатор в Zend Framework.

Валидатор запрашивает базу данных, чтобы проверить, существует ли конкретная запись, этот запрос использует предложение where. Значение для предложения where указывается другим полем в форме, так как мне передать это значение в валидатор?

Вот как я добавляю свой валидатор:

$adgroup_name->addValidator(new Generic_ValidateUniqueAdGroupName() ); break;

В моем валидаторе у меня есть:

// Query which gets an array of existing ad group names in db
$q = Doctrine_Query::create()
->select('a.name')
->from('AdGroup a')
->where('a.name = ?', $value)
->andWhere('a.campaign_id = ?', $campaign_id);      
$adgroup_names_result = $q->fetchOne(array(), Doctrine::HYDRATE_ARRAY);     

Как мне перейти в $ campaign_id? Я пробовал следующее, и это не работает:

$adgroup_name->addValidator(new Generic_ValidateUniqueAdGroupName($campaign_id) ); break;

Ответы [ 3 ]

4 голосов
/ 25 февраля 2011

Принцип тот же, что и в валидаторах «Подтверждение пароля».Вам необходимо указать значение другого элемента в форме в поле при отправке формы .Вот почему попытка создать экземпляр валидатора с помощью campaign_id не работает: значение $campaign_id еще не установлено.

Когда элемент вызывает isValid() для своих валидаторов, он передает второй параметр, называемый $context который заполнен массивом отправленных значений формы.Таким образом, ваш isValid() метод в вашем валидаторе должен выглядеть примерно так:

public function isValid($value, $context = null)
{
    $campaign_id = $context['campaign_id'];
    // Now build your query using $value - from the element to which this 
    // validator is attached - and the $campaign_id provided by the context.
    // And, of course, return true/false as required.
}
2 голосов
/ 25 февраля 2011

Я думаю, чтобы new Generic_ValidateUniqueAdGroupName($campaign_id) работал, вам нужно определить конструктор для класса Generic_ValidateUniqueAdGroupName и переменную с именем, например, например. $ _Campaign_id. Черновик ниже:

class  Generic_ValidateUniqueAdGroupName extends Zend_Validate_Abstract {

   protected $_campaign_id;

   public function __construct($campaign_id) {
      $this->_campaign_id = $campaign_id;
   }

}

При этом вы получите доступ к идентификатору в вашем запросе как $this->_campaign_id.

0 голосов
/ 25 февраля 2011

Вам необходимо указать аргумент $options:

Реализация в Zend_Form_Element :

public function addValidator($validator, $breakChainOnFailure = false, $options = array())

Итак, высделал бы что-то вроде этого:

$validator = new new Generic_ValidateUniqueAdGroupName();
$adgroup_name
    ->addValidator($validator, false, array('campaign_id' => 1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...