2014-01-05 134 views
1

所以我有一個「簡單」的形式ZF2表單元素集合驗證

class SiteAddForm extends Form 
{ 
    public function __construct() 
    { 
     parent::__construct('add_site_form'); 

     $site = new SiteFieldSet(); 
     $this->add($site); 
    } 

    public function getTemplate() 
    { 
     return 'site_add.phtml'; 
    } 
} 

的形式,它自身不執行任何操作。它添加一個field_set並返回一個模板名稱。

的SiteFieldSet看起來喜歡:

class SiteFieldSet 
    extends FieldSet 
    implements InputFilterProviderInterface 
{ 
    public function __construct() 
    { 
     parent::__construct('site'); 

     $name = new Text('name'); 
     $this->add($name); 

     $domains = new Collection('domains'); 
     $domains->setTargetElement(new DomainFieldSet()) 
      ->setShouldCreateTemplate(true); 
     $this->add($domains); 
    } 

    public function getTemplate() 
    { 
     return 'site.phtml'; 
    } 

    /** 
    * Should return an array specification compatible with 
    * {@link Zend\InputFilter\Factory::createInputFilter()}. 
    * 
    * @return array 
    */ 
    public function getInputFilterSpecification() 
    { 
     return [ 
      'name' => [ 
       'required' => true, 
       'validators' => [ 
        new StringLength([ 
         'min' => 200, 
        ]) 
       ] 
      ], 
      'domains' => [ 
       'required' => true, 
      ], 
     ]; 
    } 
} 

它增加了文本和集合元素的字段集。該字段集執行InputFilterProviderInterface以驗證投入到其中的數據。

該名稱必須至少200個字符(用於測試)並且需要收集。

但現在來了我的問題。隨着現場集被扔進集合,代碼:

class DomainFieldSet 
    extends FieldSet 
    implements InputFilterProviderInterface 
{ 
    public function __construct() 
    { 
     parent::__construct('domain'); 

     $host = new Url('host'); 
     $this->add($host); 

     $language = new Select('language', [ 
      'value_options' => [ 
       'nl_NL' => 'NL', 
      ], 
     ]); 
     $this->add($language); 

     $theme = new Select('theme', [ 
      'value_options' => [ 
       'yeti' => 'Yeti', 
      ] 
     ]); 
     $this->add($theme); 
    } 

    public function getTemplate() 
    { 
     return 'domain.phtml'; 
    } 

    /** 
    * Should return an array specification compatible with 
    * {@link Zend\InputFilter\Factory::createInputFilter()}. 
    * 
    * @return array 
    */ 
    public function getInputFilterSpecification() 
    { 
     return [ 
      'host' => [ 
       'required' => true, 
       'validators' => [ 
        new StringLength([ 
         'min' => 200, 
        ]) 
       ] 
      ], 
      'language' => [ 
       'required' => true, 
      ], 
      'theme' => [ 
       'required' => true, 
      ], 
     ]; 
    } 
} 

再次沒有什麼特別的。現在有三個元素定義主機,主題爲&語言。該字段集再次實現InputFilterProviderInterface。所以在這個類中必須有一個getInputFilterSpecification。

當我填寫表格 site[name] = 「測試」 site[domains][0][host] = '測試' site[domains][0][theme] = '雪人' site[domains][0][language] = 'nl_NL'

它給出了網站的錯誤[名]說它必須至少200個字符,所以驗證「有效」 但它也應該給出site[domains][0][host]上的錯誤,它需要至少200個字符(代碼被複制粘貼,並且使用是正確的)。

那麼,爲什麼不驗證踢,和或我怎麼能解決這個問題,使一元/場中的集合內設置相應有效

+0

也許嘗試'zend-form-generator.123easywebsites.com'' – Patrioticcow

+0

你不能添加一個字段集,據我所見 – MKroeders

回答

2

嘗試在形式__construct方法使用setValidationGroup

像:

public function __construct() 
    { 
    $this->add(array(
      'type' => 'Your\Namespace\SiteFieldSet', 
      'options' => array(
        'use_as_base_fieldset' => true, 
      ), 
    )); 


    $this->setValidationGroup(array(
      'site' => array(
       'domain' => array(
        'host', 
        'language', 
        'theme', 
       ), 
      ), 
    )); 

    } 

或者這也可能工作...

$this->setValidationGroup(FormInterface::VALIDATE_ALL); 
+0

'$ this-> setValidationGroup(FormInterface :: VALIDATE_ALL);'做了竅門,也改變了代碼一點,但謝謝。現在檢查它的作用:P – MKroeders