2012-04-02 5 views
1

У меня есть текстовое поле, в котором ваши значения добавляются в значениях, разделенных запятой. Как только форма отправляется, я хочу проверить каждое значение CSV по таблице базы данных, если каждый из них уже существует. Если это так, я хочу отправить сообщение об ошибке, в противном случае это нормально.Zend Validate: как проверить каждое отдельное значение в значениях, разделенных запятыми, в textarea для zend_validate_DbRecordExist?

Как это реализовать?

ответ

4

Что вам нужно, это пользовательский валидатор. вы можете сделать это, продлевая Zend_Validate_Abstract, или вы можете просто использовать валидатор обратного вызова .

Чтобы сделать это, вам нужно добавить это к вашему элементу:

$elem = new Zend_Form_Element_Text('elem_name'); 
$elem->setLabel('Label Name:') 
     ->setRequired(true) 
     ->addValidator('callback', true, array('callback' => array($this, 'functionName'))); 
$this->addElement($elem); 

И в том же классе (как правило, ваша форма находится в классе, который расширяет Zend_Form), добавить этот метод:

public function functionName($csvString) { 
    // stuff here using explode(',', $csvString) 
    // foreach() to iterate over the result and match against the db each $value 
} 

Для получения дополнительной информации см. explode().

Однако, если ваш элемент формы будет вызываться более одного раза и в разных формах, то я не рекомендую использовать обратный вызов, но вам лучше написать свой собственный валидатор, теория остается все же. Take a look here для получения дополнительной информации о том, как писать валидаторы.

+0

Ваш ответ прекрасен, но в моем случае мне нужно извлечь все недопустимые значения, разделенные запятой, и показать все эти значения, как в ошибке, как элемент текстовой области. Поэтому по предложенному методу я могу вернуть только true или false для проверки валидатора, но не может собирать недопустимые значения. Итак, что я сделал, наконец, когда-то проверяю форму с помощью $ form-> isValid ($ _ POST), я взорвав значения и проверяю отдельно, что они находятся в базе данных, я собираю тогда все и генерирую ошибку msg, используя $ element-> addError ($ invalid_csv. инвалид'); –

2

Я действительно сомневаюсь, что это можно достичь напрямую, используя Zend_Validate_Db_RecordExists. Я думаю, что лучшим решением было бы создать для этой цели специальный валидатор. Что-то, что возьмет ваше значение, затем взорвет его на основе a, $valueArray = explode(',', $value);, а затем для каждого $ valueArray проверьте, существует ли элемент в db. Это не должно быть слишком сложно. Если у вас нет идеи о настраиваемых валидаторах, возможно, вам будет полезно использовать this.

Смежные вопросы