2014-01-05 2 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] = 'Yeti' site[domains][0][language] = 'nl_NL'

Это дает ошибку на сайте [имя] говорит это должно по крайней мере 200 символов, поэтому проверки «работают» Но также должно быть сообщение об ошибке site[domains][0][host], что оно должно быть как минимум 200 символов (код был скопирован и правильное использование).

Так почему же не проверка умирает, и или как я могу решить этот вопрос так элемент/поле устанавливается внутри коллекции должным образом подтвержден

+0

может быть попробуйте 'zend-form-generator.123easywebsites.com' – Patrioticcow

+0

Вы не можете добавить к нему набор полей, насколько я вижу – MKroeders

ответ

2

Попробуйте использовать setValidationGroup в методе формы __construct

как:

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

Смежные вопросы