2

让我们从一个简短的代码片段开始,我将用它来证明我的观点:

$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 否则过滤器和验证器通常适用)。

4

2 回答 2

3

不是您问题的完整答案,但由于注释没有语法格式;这是一个过滤器,您可以使用它来使您的字段值为空(如果为空)。

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

关于所需部分:我不确定。您可以尝试在 Nabble 上搜索 ZF 邮件列表:

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

?>
于 2009-08-30T18:20:36.447 回答
1

实际上,您所描述的期望正是 Zend_Form 的工作方式。如果将元素标记为不需要,则会发生以下情况:(a) 如果没有传递值,则跳过验证,但如果 (b) 传递了值,则它必须通过所有验证器才能有效。

顺便说一句,询问 ZF 问题的最佳地点是 ZF 邮件列表: http: //framework.zend.com/archives

于 2009-08-31T18:48:01.120 回答