首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend框架形成非理性行为

Zend框架形成非理性行为
EN

Stack Overflow用户
提问于 2009-08-30 15:52:57
回答 2查看 602关注 0票数 2

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

代码语言:javascript
复制
$title = new Zend_Form_Element_Text('title', array(
    'label' => 'Title',
    'required' => false,
    'filters' => array(
        'StringTrim',
        'HtmlEntities'
    ),
    'validators' => array(
        array('StringLength', false, array(3, 100))
    ),
));

这一重要的一行是:

代码语言:javascript
复制
'required' => false,

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-30 18:20:36

这并不是对您问题的完整回答,但是由于注释没有语法格式;如果字段值为空,则可以使用下面的过滤器将字段值设置为null。

代码语言:javascript
复制
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

编辑:好的,现在我自己做了一些测试,因为你所说的一切听起来都违背了我的直觉。你的例子对我来说很好。这就是我所使用的:

代码语言:javascript
复制
<?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';
}

?>
票数 3
EN

Stack Overflow用户

发布于 2009-08-31 18:48:01

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1354146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档