Блок проверки допустимости формы зенда: элемент A или элемент B

У меня есть два поля в моей Форме Зенда, и я хочу применить правило проверки, которое гарантирует, что пользователь вводит любое из этих двух полей.

    $companyname = new Zend_Form_Element_Text('companyname');
    $companyname->setLabel('Company Name');
    $companyname->setDecorators($decors);
    $this->addElement($companyname);

    $companyother = new Zend_Form_Element_Text('companyother');
    $companyother->setLabel('Company Other');
    $companyother->setDecorators($decors);
    $this->addElement($companyother);

Как я могу добавить блок проверки допустимости, который посмотрит на оба поля?

13
задан emeraldjava 6 March 2010 в 18:42
поделиться

3 ответа

См. "Примечание: Контекст проверки" на этой странице. Zend_Form передает контекст в каждом вызове Zend_Form_Element::isValid в качестве второго параметра. Поэтому просто напишите свой собственный валидатор, который анализирует контекст.

EDIT:
Ладно, я решил попробовать сам. Это не проверено и не является средством для достижения всех целей, но это даст вам основную идею.

class My_Validator_OneFieldShouldBePresent extend Zend_Validator_Abstract
{
    const NOT_PRESENT = 'notPresent';

    protected $_messageTemplates = array(
        self::NOT_PRESENT => 'Field %field% is not present'
    );

    protected $_messageVariables = array(
        'field' => '_field'
    );

    protected $_field;

    protected $_listOfFields;

    public function __construct( array $listOfFields )
    {
        $this->_listOfFields = $listOfFields;
    }

    public function isValid( $value, $context = null )
    {
        if( !is_array( $context ) )
        {
            $this->_error( self::NOT_PRESENT );

            return false;
        }

        foreach( $this->_listOfFields as $field )
        {
            if( isset( $context[ $field ] ) )
            {
                return true;
            }
        }

        $this->_field = $field;
        $this->_error( self::NOT_PRESENT );

        return false;
    }
}

Использование:

$oneOfTheseFieldsShouldBePresent = array( 'companyname', 'companyother' );

$companyname = new Zend_Form_Element_Text('companyname');
$companyname->setLabel('Company Name');
$companyname->setDecorators($decors);
$companyname->addValidator( new My_Validator_OneFieldShouldBePresent( $oneOfTheseFieldsShouldBePresent ) );
$this->addElement($companyname);

$companyother = new Zend_Form_Element_Text('companyother');
$companyother->setLabel('Company Other');
$companyother->setDecorators($decors);
$companyname->addValidator( new My_Validator_OneFieldShouldBePresent( $oneOfTheseFieldsShouldBePresent ) );
$this->addElement($companyother);
12
ответ дан 2 December 2019 в 00:46
поделиться

Я согласен с @chelmertz в том, что такой функции не существует.

Я не согласен с расширением Your_Form :: isValid () . Вместо этого я бы написал специальный валидатор , который принимает значения обоих элементов формы, которые должны иметь значение. Таким образом, я мог повторно использовать его для произвольных элементов формы. Это чем-то похоже на Identical Validator.

0
ответ дан 2 December 2019 в 00:46
поделиться

Я не сталкивался с таким решением, но оно совершенно справедливо, так что +1.

Я бы расширил Your_Form::isValid(), включив в него ручную проверку значений этих двух элементов.

Если все поля проходят свои собственные индивидуальные валидаторы, эта проверка, вероятно, относится к форме как целому, и поэтому она может быть помещена на проверку формы, а не на поля. Согласны ли вы с этой линией мышления?

0
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: