Zend Framework формирует иррациональное поведение

Давайте начнем с короткого фрагмента кода, который я буду использовать, чтобы продемонстрировать свое мнение:

$title = new Zend_Form_Element_Text('title', array(
    'label' => 'Title',
    'required' => false,
    'filters' => array(
        'StringTrim',
        'HtmlEntities'
    ),
    'validators' => array(
        array('StringLength', false, array(3, 100))
    ),
));

Эта важная строка:

'required' => false,

Это означает, что поле ввода не требуется, и вы можете отправить форму, не заполняя ее. Однако это также означает, что никакие фильтры и валидаторы не будут применяться к нему, если вы решите заполнить это поле.

Здравый смысл подсказывает мне, что это иррациональное поведение. То, как я понимаю слово «обязательный» в отношении полей ввода HTML: поле ввода, которое не является обязательным, должно возвращать NULL, если оно не заполнено, но если пользователь решает заполнить его, к нему должны применяться как фильтры, так и валидаторы. Это то, что имеет смысл для меня. Вы со мной согласны или мой здравый смысл не так уж и здрав?

Теперь более практический вопрос, поскольку именно так ведет себя Zend_Form, как я могу добиться того, чтобы необязательные поля работали так, как я описал выше (если пользователь ничего не вводит, он возвращает NULL, в противном случае обычно применяются фильтры и валидаторы).


person Richard Knop    schedule 30.08.2009    source источник


Ответы (2)


На самом деле это не полный ответ на ваш вопрос, но, поскольку комментарии не имеют форматирования синтаксиса; вот фильтр, который вы можете использовать, чтобы сделать ваши значения полей нулевыми, если они пусты.

class My_Filter_NullIfEmpty implements Zend_Filter_Interface
{
    public function filter( $value )
    {
          // maybe you need to expand the conditions here
        if( 0 == strlen( $value ) )
        {
            return null;
        }
        return $value;
    }
}

Насчет обязательной части: на самом деле я не уверен. Вы можете попробовать поискать в списках рассылки ZF на Nabble:

http://www.nabble.com/Zend-Framework-Community-f16154.html

Или подпишитесь на их список рассылки и задайте им вопрос. Либо через Nabble, либо напрямую по адресам на framework.zend.com: http://tinyurl.com/y4f9lz

Редактировать: Хорошо, теперь я сам провел несколько тестов, потому что все, что вы сказали, звучало для меня нелогично. Ваш пример отлично работает со мной. Это то, что я использовал:

<?php

class Form extends Zend_Form
{
    public function init()
    {

        $title = new Zend_Form_Element_Text('title', array(
                'label' => 'Title',
                'required' => false,
                'filters' => array(
                    'StringTrim',
                    'HtmlEntities',
                    'NullIfEmpty' // be sure this one is available
                ),
                'validators' => array(
                    array('StringLength', false, array(3, 100))
                ),
            ));

        $this->addElement( $title );
    }
}

$form = new Form();

$postValues = array( 'title' => '' ); // or
$postValues = array( 'title' => '        ' ); // or
$postValues = array( 'title' => 'ab' ); // or
$postValues = array( 'title' => ' ab ' ); // or
$postValues = array( 'title' => '<abc>' ); // all work perfectly fine with me

// validate the form (which automatically sets the values in the form object)
if( $form->isValid( $postValues ) )
{
    // retrieve the relevant value
    var_dump( $form->getValue( 'title' ) );
}
else
{
    echo 'form invalid';
}

?>
person Decent Dabbler    schedule 30.08.2009
comment
Все еще не решение, потому что вы не можете оставить обязательные поля пустыми, поэтому вы получите исключение. А необязательные поля не обрабатывают фильтры и валидаторы, так что и там это не сработает. - person Richard Knop; 30.08.2009
comment
Я мог бы найти ваше решение; метакоманду allowEmpty, см.: tinyurl.com/lcyadz Тем не менее, вы уверены, что фильтры не применяются? если поле не обязательно? (Позже я сам проведу тест, потому что мне сейчас любопытно) Но это звучит чертовски странно. framework.zend. ком/руководство/ru/ - person Decent Dabbler; 30.08.2009
comment
Итак, в основном, чтобы получить то, что вы хотите: установите для поля обязательное значение, примените свои валидаторы и фильтры и примените мой фильтр для нулевого, если пустой бит, и установите для метакоманды значение allowEmpty. Это должно помочь (я думаю) - person Decent Dabbler; 31.08.2009
comment
Итак, теперь я сам проверил ваш пример. Ваш пример отлично работает со мной. Валидаторы действительно выполняются, даже без метакоманды allowEmpty. Я думаю, что вы используете неправильный тип методов для извлечения очищенных значений. Вы уверены, что используете: $yourForm->getValues() или $yourForm->getValue('title')? PS: не забудьте добавить фильтр NullIfEmpty последним, потому что StringTrim и/или HtmlEntities будут преобразованы в строку. - person Decent Dabbler; 31.08.2009

На самом деле то, что вы называете своими ожиданиями, и есть то, как работает Zend_Form. Если вы пометите элемент как необязательный, произойдет следующее: (а) если значение не передано, он пропускает проверку, но если (б) значение передано, то он должен пройти все валидаторы, чтобы быть действительным.

Кстати, вопросы ZF лучше всего задавать в списках рассылки ZF: http://framework.zend.com/archives

person weierophinney    schedule 31.08.2009