2009-08-30 50 views
2

让我们开始这一关的短代码片段,我会用它来证明我的观点:Zend框架形式非理性行为

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

回答

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

?> 
+0

还没解决,因为你不能离开必填字段为空,所以你会得到一个异常。而不是必需的字段不处理过滤器和验证器,所以它也不会在那里工作。 – 2009-08-30 19:05:09

+0

我可能找到了你的解决方案;在allowEmpty元命令,请参见: http://tinyurl.com/lcyadz 不过,你确定过滤器没有被应用或者如果不需要现场? (我稍后会做一个测试,因为我现在很好奇)但是这听起来很奇怪。 http://framework.zend.com/manual/en/zend.filter.input.html#zend.filter.input.metacommands。allow-empty – 2009-08-30 19:58:40

+0

所以基本上,要得到你想要的:将字段设置为required,应用验证器和过滤器,并将空值应用于空过滤器,并将meta命令设置为allowEmpty。这应该做的伎俩(我认为) – 2009-08-30 20:00:47

1

其实,你的描述为你的期望是Zend_Form的是如何工作的。如果标记元素为不需要的,那么会发生以下情况:(1)如果没有值传递,它跳过验证,但如果(B)的值传递,那么它必须通过所有验证才能有效。

BTW,问ZF问题,最好的地方是在ZF邮件列表:http://framework.zend.com/archives