zend_form установить поля обязательны, только если флажок установлен

Я использую Zend_Form со страницей регистрации. У меня есть флажок, если он установлен, будут отображаться дополнительные поля для выставления счетов. В моем экземпляре формы я хочу, чтобы эти дополнительные поля были только setRequired (true), если этот флажок установлен. Есть ли способ сделать это? Теперь проблема в том, что я должен установить все поля биллинга как setRequired (false), но если пользователь установит флажок, логике будет все равно, если поля пусты, потому что они не требуются.

alt text


person Jeremy Hicks    schedule 08.09.2010    source источник


Ответы (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;

    }
}
person Marcin Hubert    schedule 04.02.2011

Хорошо, вот что я в итоге сделал. Я создал платежную информацию как Zend_Form_SubForm и добавил ее в основную форму регистрации. Затем в своем контроллере при публикации я проверяю, установлен ли флажок. Если нет, то я удаляю подчиненную форму из основной формы и проверяю ее. Если возникает ошибка, я повторно добавляю подчиненную форму, чтобы поля отображались при повторном рисовании формы. Надеюсь, это кому-нибудь поможет.

person Jeremy Hicks    schedule 09.09.2010

Почему бы просто не проверить, был ли выпущен 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);
    }
}
person Nils    schedule 05.06.2012