Zend Framework Form Нерациональное поведение - PullRequest
2 голосов
/ 30 августа 2009

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

$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, иначе обычно применяются фильтры и валидаторы).

Ответы [ 2 ]

3 голосов
/ 30 августа 2009

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

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

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

<?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';
}

?>
1 голос
/ 31 августа 2009

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

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

...