2014-02-26 23 views
1

是否可以將完整的表單作爲上下文傳遞給驗證器?使用Fieldset或Collection時的ZF2驗證器上下文

我想創建用於在字段集A元素X條件驗證器,其檢查在不同的字段集B.元件Y的值

的問題是,所述的isValid功能僅接收用於字段集的上下文中是這個元素X對元素Y一無所知。

所有答案大大收到!

回答

2

你可以使用集合和ZendCollectionInputFilter是的。

這裏沒有像本文檔的負荷,知道了Zend傢伙了,雖然排序此(認爲唯一一提的是在http://framework.zend.com/apidoc/2.2/classes/Zend.InputFilter.CollectionInputFilter.html),但現在的資源,真正幫助我是這樣的:

http://www.aronkerr.com/2013/11/zf2-form-collection-validation-unique.html

很聰明的東西,一旦你把你的頭圍繞這些。由於您的問題並不具體,您的表單,代碼字段和輸入過濾器沒有任何代碼,您現在已經使用過,但希望這有助於您。如果您在任何時候遇到困難,都樂於運行更具體的代碼

+0

謝謝@Jon - 該指南正是我所需要的 –

0

假設我們的字段集A和B屬於Sample的形式。我們需要從這個父窗體,以訪問這種形式的情況下添加驗證驗證任何孩子的fieldsets時:

<?php 

namespace App\Form; 

use Zend\Form\Form; 
use Zend\InputFilter\InputFilterProviderInterface; 

class Sample extends Form InputFilterProviderInterface 
{ 
    public function init() 
    { 
     $this->add([ 
      'type' => 'App:Fieldset:A', 
      'name' => 'fieldsetA', 
     ]); 

     $this->add([ 
      'type' => 'App:Fieldset:B', 
      'name' => 'fieldsetB', 
     ]); 

     $this->add([ 
      'type' => 'submit', 
      'name' => 'submit', 

      'attributes' => [ 
       'value' => 'Submit', 
      ], 
     ]); 
    } 

    public function getInputFilterSpecification() 
    { 
     return [ 
      'fieldsetA' => [ 
       'type' => 'InputFilter', 

       'X' => [ 
        'required' => true, 
        'allow_empty' => true, 
        'continue_if_empty' => true, 

        'validators' => [ 
         [ 
          'name' => 'Callback', 
          'options' => [ 
           'callback' => function ($value) 
           { 
            if ($this->data['fieldsetB']['Y']) 
            { 
             // do something 
            } 
            // do something else 
           }, 
          ], 
         ], 
        ], 
       ], 
      ], 
     ]; 
    } 
} 

注意如何我們在一個從內Sample使用InputFilter類型添加驗證器X。接下來我們直接訪問$this->data並遍歷它以得到Y中的Y.