代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

Zend框架形成非理性行为

  •  2
  • Richard Knop  · 技术社区  · 15 年前

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

    $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,
    

    这意味着输入字段不是必需的,您可以提交表单而无需填写。然而,这也意味着,如果您选择填写此字段,任何过滤器和验证器都不会应用于它。

    常识告诉我这是一种非理性的行为。我对单词“required”与HTML输入字段的理解是:如果输入字段没有填写,则不需要的输入字段应该返回NULL,但如果用户决定填写,则过滤器和验证器都应该应用于该字段。这对我来说是有意义的。你同意我的看法吗?还是我的常识不那么普通?

    现在更实际的问题是,因为这是Zend_表单的行为方式,所以我如何实现不需要的字段,这些字段将像我前面描述的那样工作(如果用户没有键入任何内容,它将返回NULL,否则过滤器和验证器通常会应用)。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Decent Dabbler    15 年前

    这并不是你问题的完整答案,但由于评论没有语法格式;如果字段值为空,可以使用以下筛选器使其为空。

    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';
    }
    
    ?>
    
        2
  •  1
  •   weierophinney    15 年前

    事实上,你所描述的期望正是Zend_表单的工作原理。如果您将元素标记为非必需,则会发生以下情况:(a)如果未传递任何值,它将跳过验证,但如果(b)传递了值,则它必须通过所有验证程序才能有效。

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