2017-02-20 30 views
0

Я попытался проверить простую форму в zend framework 2 в течение нескольких дней. Я проверил документацию и много сообщений, рассматривающих эту тему, но не нашел решения!ZF2 простая форма проверки

У меня есть очень простой вид:

class AlimentForm extends Form 
{ 
public function __construct($name = null) 
{ 
    parent::__construct('aliment'); 

    $this->add(array(
     'required'=>true, 
     'name' => 'year', 
     'type' => 'Text', 
     'options' => array(
      'label' => 'Jahr', 
     ), 
    )); 
    $this->add(array(
     'required'=>true, 
     'name' => 'number', 
     'type' => 'Text', 
     'options' => array(
      'label' => 'Number', 
     ), 
    )); 
    $this->add(array(
     'name' => 'submit', 
     'type' => 'Submit', 
     'attributes' => array(
      'value' => 'Go', 
      'id' => 'submitbutton', 
     ), 
    )); 
} 
} 

Я создал пользовательский InputFilter:

namespace Application\Form; 

use Zend\InputFilter\InputFilter; 
class AlimentInputFilter extends InputFilter { 
    public function init() 
    { 
    $this->add([ 
     'name'  => AlimentForm::year, 
     'required' => true, 
     'validators' => array(
      array(
       'name' => 'Between', 
       'options' => array(
        'min' => 1900, 
        'max' => 3000, 
      ), 
     ), 
     ), 
    ]); 
} 
} 

и, наконец, в мой контроллер я пытаюсь проверить форму

public function alimentAction(){ 
    $form = new AlimentForm(); 

    $form->setInputFilter(new AlimentInputFilter()); 

    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $form->setData($request->getPost()); 

     if ($form->isValid()) { 
      $year = $form->get('year')->getValue(); 
      $number = $form->get('number')->getValue(); 

      return array('result' => array(
       "msg" => "In the Year ".$year." you get ".$number." Points" 
      )); 
     } 
    } 
    return array('form' => $form); 
} 

It не может быть так сложно, но из всех тех разных способов проверки формы, которую я нашел в сети, я немного смущен ed ...

Что мне не хватает?

Поздравления и благодарности U.H.

ответ

0

Хорошо, я решил проблему.

Я создал модель для формы ALIMENT, которая имеет в год, а число атрибутов и я определил входной фильтр в рамках этой модели:

use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 

class Aliment implements InputFilterAwareInterface 
{ 
    public $year; 
    public $number; 

    public function exchangeArray($data){ 
     $this->year    = (!empty($data['year']))?$data['year']:null; 
     $this->number   = (!empty($data['number']))?$data['number']:null; 
    } 

    public function setInputFilter(InputFilterInterface $inputFilter) 
    { 
     throw new \Exception("Not used"); 
    } 

    public function getInputFilter() 
    { 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 


      $inputFilter->add(array(
       'name'  => 'year', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'Between', 
         'options' => array(
          'min' => 1900, 
          'max' => 3000 
         ) 
        ) 
       ), 
      )); 

      $inputFilter->add(array(
       'name'  => 'number', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' => 'Between', 
         'options' => array(
          'min' => 1, 
          'max' => 10 
         ) 
        ) 
       ), 
      )); 

      $this->inputFilter = $inputFilter; 
     } 

     return $this->inputFilter; 
    } 

} 

В методе действия контроллера, я был в состоянии установить InputFilter модели к форме и вуаля! Это сработало!

public function alimentAction(){ 
    $form = new AlimentForm(); 

    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $aliment = new \Application\Model\Aliment; 
     $form->setInputFilter($aliment->getInputFilter()); 
     $form->setData($request->getPost()); 


     if ($form->isValid()) { 
      $aliment->exchangeArray($form->getData()); 
      $year   = $form->get('year')->getValue(); 
      return array(
       'result' => array(
        //your result 
       ) 
      ); 
     } 
    } 
    return array('form' => $form); 
} 

Форма корректно проверена сейчас и возвращает соответствующие сообщения об ошибках.

Надеюсь, это поможет кому-то, у кого возникли подобные проблемы с проверкой!