2009-08-30 44 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