2016-07-24 2 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' 
     ) 
    )); 
    } 
} 

и сообщение FIELDSET:

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 
    )); 
    } 

и сообщение InputFilter:

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 view:

<?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 объекта, а также дамп данные показывают два заголовка и два текста и Fieldset имени, я не понимаю. , и если я удалю $this->postForm->setInputFilter(new PostFilter()); данные гидрата в Post объект.

Почему валидация не работает и ошибки формы не отображаются, и почему данные не гидратируются в объект Post?

ответ

0

Я могу только перенаправить вас на документы: https://framework.zend.com/manual/2.3/en/modules/zend.input-filter.intro.html

Для возобновления:

  • вы не можете объявить новый объект InputFilter, как это, это будет создавать новые входы, но ваш объект уже имеет их. Так вот почему у вас есть у вас обоих в вас 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

вашей проверка не работает, потому что ваша гидратация терпит неудачу из-за ваш inputfilter.

EDIT:

Я видел ваши комментарии и я не согласен, вот почему:

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

Когда вы сделаете это вы говорите в форму, чтобы добавить несколько полей, и с тех пор у вас нет набора группы проверки, il будет validate_all. Но когда вы добавляете в свой контроллер свой класс PostFilter, вы добавляете снова новые входы, поэтому у вас будет 2 ввода заголовка и 2 ввода текста, один в поле с гидратором и один без гидратора. Вот почему у вас есть свои входы в гильзы fieldset, а ваши другие входы терпят неудачу, потому что валидатор класса вашего входного фильтра терпит неудачу!

Как я уже сказал, попробуйте мое решение и посмотрим, что произойдет.

Эта ссылка может помочь вам понять, почему ваш постфильтр не правильно настроен в вашу форму: Adding input filter to fieldset in ZF2

+0

Проблема не в объявлении InputFilter как так, тратить искать я уже проверить его без использования 'Fieldset' а валидация работает, и в документе есть пример, аналогичный этому: 'class TaskFilter расширяет InputFilter'. Проблема в том, что я использую 'Fieldset', becuz, если я использую' Form 'без' FieldSet', все работает нормально –

+0

обновил мой ответ – Hooli