Я использую Zend_Form со страницей регистрации. У меня есть флажок, если он установлен, будут отображаться дополнительные поля для выставления счетов. В моем экземпляре формы я хочу, чтобы эти дополнительные поля были только setRequired (true), если этот флажок установлен. Есть ли способ сделать это? Теперь проблема в том, что я должен установить все поля биллинга как setRequired (false), но если пользователь установит флажок, логике будет все равно, если поля пусты, потому что они не требуются.
zend_form установить поля обязательны, только если флажок установлен
Ответы (3)
У меня была такая же проблема, и я закончил писать свой собственный валидатор:
<?
class Mh_Validator_RequiredIfCheckbox extends Zend_Validate_Abstract
{
const SHOULD_BE_NOT_EMPTY = 'shouldBeNotEmpty';
private $_field;
//protected $_field;
public function __construct($field)
{
$this->_field = $field;
}
protected $_messageTemplates = array(
self::SHOULD_BE_NOT_EMPTY =>"This field is required"
);
/**
* Defined by Zend_Validate_Interface
*
* @param string $value
* @return boolean
*/
public function isValid($value, $context = null)
{
if($context[$this->_field]==0 && $value == null)
{
$this->_error(self::SHOULD_BE_NOT_EMPTY);
return false;
}
return true;
}
}
Хорошо, вот что я в итоге сделал. Я создал платежную информацию как Zend_Form_SubForm и добавил ее в основную форму регистрации. Затем в своем контроллере при публикации я проверяю, установлен ли флажок. Если нет, то я удаляю подчиненную форму из основной формы и проверяю ее. Если возникает ошибка, я повторно добавляю подчиненную форму, чтобы поля отображались при повторном рисовании формы. Надеюсь, это кому-нибудь поможет.
Почему бы просто не проверить, был ли выпущен POST (если это метод вашей формы), и если да, посмотрите значение флажка и установите значение false для всех элементов (возможно, удобно хранить их в массиве) перед проверкой с помощью $ form- > isValid ($ formData)?
Пример:
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($formData['billing_information_different'] == '1') {
$billingElement1->setRequired(true);
$billingElement2->setRequired(true);
}
}