2016-07-24 30 views
0

我遵循了ZF2.4手冊第12章(介紹我們的第一個「博客」模塊),並創建了Blog模塊。 我有帖子形式:ZF2窗體在使用現場集時不驗證

class PostForm extends Form{ 
    public function __construct($name = null, $options = array()){ 
    parent::__construct($name, $options); 

    $this->add(array(
     'name' => 'post-fieldset', 
     'type' => 'Blog\Form\PostFieldset', 
     'options' => array(
      'use_as_base_fieldset' => true 
     ) 
    ) 
    ); 

    $this->add(array(
     'type' => 'submit', 
     'name' => 'submit', 
     'attributes' => array(
      'value' => 'Insert new Post', 
      'class' => 'btn btn-primary' 
     ) 
    )); 
    } 
} 

和郵政字段集:

class PostFieldset extends Fieldset{ 
public function __construct($name = null, $options = array()){ 
    parent::__construct($name, $options); 

    $this->setHydrator(new ClassMethods(false)); 
    $this->setObject(new Post()); 

    $this->add(array(
     'type' => 'hidden', 
     'name' => 'id' 
    )); 

    $this->add(array(
     'type' => 'text', 
     'name' => 'text', 
     'options' => array(
      'label' => 'The Text' 
     ), 
     'attributes' => array(
      'class' => 'form-control' 
     ) 
    )); 

    $this->add(array(
     'type' => 'text', 
     'name' => 'title', 
     'options' => array(
      'label' => 'Blog Title' 
     ), 
     'attributes' => array(
      'class' => 'form-control' 
     ) 
    )); 
} 
} 

這是我的行動:

public function addAction(){ 
    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $this->postForm->setInputFilter(new PostFilter()); 
     $this->postForm->setData($request->getPost()); 
     if ($this->postForm->isValid()) { 
      echo "The form is valid\n"; 
      //Debug:: dump($this->postForm->getData()); die(); 
      // save post... 
     }else{ 
      echo "The form is not valid\n"; 
      Debug:: dump($this->postForm->getData()); die();  
     } 
    } 
    return new ViewModel(array(
     'form' => $this->postForm 
    )); 
    } 

和郵政輸入過濾:

class PostFilter extends InputFilter { 
public function __construct(){ 
    $title = new Input('title'); 
    $title->setRequired(true); 
    $title->setValidatorChain($this->getTextTitleValidatorChain()); 
    $title->setFilterChain($this->getStringTrimFilterChain()); 

    $text = new Input('text'); 
    $text->setRequired(true); 
    $text->setValidatorChain($this->getTextTitleValidatorChain()); 
    $text->setFilterChain($this->getStringTrimFilterChain()); 

    $this->add($title); 
    $this->add($text); 
    } 
protected function getTextTitleValidatorChain(){ 
    $notEmpty = new NotEmpty(); 
    $stringLength = new StringLength(); 
    $stringLength->setMin(5); 
    $stringLength->setMax(20); 

    $validatorChain = new ValidatorChain(); 
    $validatorChain->attach($notEmpty); 
    $validatorChain->attach($stringLength); 

    return $validatorChain; 
} 
protected function getStringTrimFilterChain(){ 
    $filterChain = new FilterChain(); 
    $filterChain->attach(new StringTrim()); 

    return $filterChain; 
} 
} 

和add.phtml查看:

<?php 
$form = $this->form; 
$form->setAttribute('action', $this->url()); 
$form->prepare(); 
echo $this->form()->openTag($form); 
?> 
<div class="form-group" > 
    <?php echo $this->formRow($form->get('post-fieldset')->get('title')); ?> 
</div> 

<div class="form-group" > 
    <?php echo $this->formRow($form->get('post-fieldset')->get('text')); ?> 
</div> 
<?php echo $this->formSubmit($form->get('submit')); ?> 
<?php echo $this->form()->closeTag(); ?> 

如果我提交表單,表單錯誤不顯示。 另外,如果我輸入有效的數據,我看到的數據轉儲如下所示:

The form is not valid 
array(4) { 
    ["title"] => NULL 
    ["text"] => NULL 
    ["submit"] => string(15) "Insert new Post" 
["post-fieldset"] => array(3) { 
    ["id"] => NULL 
    ["text"] => string(7) "my text" 
    ["title"] => string(8) "my title" 
} 
} 

未水進入Post對象中的數據,也轉儲數據顯示了兩個冠軍和兩個文本字段集的名字,我不明白。 ,如果我刪除$this->postForm->setInputFilter(new PostFilter());數據水合物到Post對象。

爲什麼驗證無法正常工作,並且沒有顯示錯誤,以及爲什麼數據不會水化爲Post對象?

回答

0

我只能重定向你的文檔: https://framework.zend.com/manual/2.3/en/modules/zend.input-filter.intro.html

要恢復:

  • 不能聲明這樣一個新的輸入過濾的對象,這將創造新的投入,但你的對象已經有他們。所以這就是爲什麼你有他們都在你var_dump
  • 我建議你在你的Fieldset的對象InputFilterProviderInterface用這個方法:public function getInputFilterSpecification()在那裏你可以設置你的過濾器和驗證,因爲你的控制器沒有變化,你我們將有一個簡單的代碼 文檔:https://framework.zend.com/manual/2.0/en/modules/zend.form.quick-start.html#hinting-to-the-input-filter

您的驗證不工作,因爲你的水合作用,由於您的輸入過濾器失敗。

編輯:

我看到了你的意見,我不同意這裏的原因:

$this->add(array(
     'name' => 'post-fieldset', 
     'type' => 'Blog\Form\PostFieldset', 
     'options' => array(
      'use_as_base_fieldset' => true 
     ) 
    ) 
    ); 

當你這樣做,你告訴你的窗體上添加一些字段,因爲你沒有驗證組集, il將是validate_all。但是當你在你的控制器中添加你的類PostFilter時,你會再次添加新的輸入,所以你將有2個輸入標題和2個輸入文本,一個輸入到帶水合器的fieldset中,一個沒有水合器。這就是爲什麼你將輸入輸入到fieldset中,並且其他輸入失敗,因爲inputfilter類的驗證器失敗!

所以正如我所說,試試我的解決方案,看看會發生什麼。

這個鏈接可以幫助你理解爲什麼你的後置濾波器未正確配置到表單: Adding input filter to fieldset in ZF2

+0

的問題是不是在聲明輸入過濾像這樣,becuz我已經測試它,而無需使用'FieldSet中'和驗證正在工作,並且在doc中有一個類似於這個例子的例子:class TaskFilter擴展了InputFilter。問題是當我使用'Fieldset'時,如果我只使用'Form'而不使用FieldSet'一切正常, –

+0

已更新我的答案 – Hooli