2013-07-08 14 views
16

他の入力フィールドに依存する入力フィルタを設定する方法を教えてください。 'apDepTime'フィールドが 'apArrTime'以上であることを確認します。zf2 validation:従属フィールドの検証方法を教えてください。

これはどのようにzf2で処理できますか?

また、「Date validator」を使用しています。

誰かを助けてください。

FlightDataForm.php

<?php 

namespace FcFlight\Form; 

use Zend\Form\Form; 
use Zend\Form\Element; 

class FlightDataForm extends Form 
{ 
/** 
* @var string 
*/ 
protected $_formName = 'flightData'; 

/** 
* @param null $name 
* @param array $options 
*/ 
public function __construct($name = null) 
{ 
    if (!is_null($name)) { 
     $this->_formName = $name; 
    } 

    parent::__construct($this->_formName); 

    //Fieldset Ap Dep 
    $this->add(array(
     'name'   => 'apDep', 
     'type'   => 'Zend\Form\Fieldset', 
     'options'  => array(
      'legend'  => 'App Dep', 
     ), 
     'elements'  => array(
      array(
       'spec' => array(
        'name' => 'apDepTime', 
        'type' => 'Zend\Form\Element\Text', 
        'attributes' => array(
         'required' => true, 
         'maxlength' => '5', 
         'id' => 'apDepTime', 
        ), 
        'options' => array(
         'label' => 'Time', 
         'hint' => 'HH:MM', 
         'description' => 'UTC', 
        ), 
       ), 
      ), 
     ), 
    )); 

    //Fieldset Ap Arr 
    $this->add(array(
     'name'   => 'apArr', 
     'type'   => 'Zend\Form\Fieldset', 
     'options'  => array(
      'legend'  => 'App Arr', 
     ), 
     'elements'  => array(
      //apArrTime 
      array(
       'spec' => array(
        'name' => 'apArrTime', 
        'type' => 'Zend\Form\Element\Text', 
        'attributes' => array(
         'required' => true, 
         'maxlength' => '5', 
         'id' => 'apArrTime', 
        ), 
        'options' => array(
         'label' => 'Time', 
         'hint' => 'HH:MM', 
         'description' => 'UTC', 
        ), 
       ), 
      ), 
     ), 
    )); 

    $this->add(new Element\Csrf('csrf')); 

    //Submit button 
    $this->add(array(
     'name' => 'submitBtn', 
     'attributes' => array(
      'type' => 'submit', 
      'value' => 'Add', 
     ), 
    )); 

} 
} 

FlightDataFilter.php

<?php 
namespace FcFlight\Filter; 

use Zend\InputFilter\Factory as InputFactory; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 
use Zend\Db\Adapter\Adapter; 

class FlightDataFilter implements InputFilterAwareInterface 
{ 

/** 
* @var $inputFilter 
*/ 
protected $inputFilter; 

/** 
* @var $dbAdapter 
*/ 
protected $dbAdapter; 

/** 
* @var string 
*/ 
protected $table = ''; 

public $apDepTime; 
public $apArrTime; 

/** 
* @param \Zend\Db\Adapter\Adapter $dbAdapter 
*/ 
public function __construct(Adapter $dbAdapter) 
{ 
    $this->dbAdapter = $dbAdapter; 
} 

/** 
* @return \Zend\Db\Adapter\Adapter 
*/ 
public function getDbAdapter() 
{ 
    return $this->dbAdapter; 
} 

/** 
* Array to Object 
* 
* @param array $data 
*/ 
public function exchangeArray(array $data) 
{ 
    $this->apDepTime = (isset($data['apDep']['apDepTime'])) ? $data['apDep']['apDepTime'] : null; 
    $this->apArrTime = (isset($data['apArr']['apArrTime'])) ? $data['apArr']['apArrTime'] : null; 
} 

/** 
* @return array 
*/ 
public function getArrayCopy() 
{ 
    return get_object_vars($this); 
} 

/** 
* @param InputFilterInterface $inputFilter 
* @return void|InputFilterAwareInterface 
* @throws \Exception 
*/ 
public function setInputFilter(InputFilterInterface $inputFilter) 
{ 
    throw new \Exception("Not used"); 
} 


/** 
* @return \Zend\InputFilter\InputFilter|\Zend\InputFilter\InputFilterInterface 
*/ 
public function getInputFilter() 
{ 
    if (!$this->inputFilter) { 

     $inputFilter = new InputFilter(); 
     $factory = new InputFactory(); 

     $flightNumberInputFilter = new InputFilter(); 

     $flightNumberInputFilter->add($factory->createInput(array(
      'name' => 'flightNumberIdIcao', 
      'required' => true, 
     ))); 

     $apDepInputFilter = new InputFilter(); 

     $apDepInputFilter->add($factory->createInput(array(
      'name' => 'apDepTime', 
      'required' => true, 
      'validators' => array(
       array(
        'name' => 'Date', 
        'options' => array(
         'format' => 'H:i', 
        ), 
       ), 
      ), 
     ))); 

     $inputFilter->add($apDepInputFilter, 'apDep'); 

     $apArrInputFilter = new InputFilter(); 

     $apArrInputFilter->add($factory->createInput(array(
      'name' => 'apArrTime', 
      'required' => true, 
      'validators' => array(
       array(
        'name' => 'Date', 
        'options' => array(
         'format' => 'H:i', 
        ), 
       ), 
       array(
        'name' => 'Callback', 
        'options' => array(
         'messages' => array(
          \Zend\Validator\Callback::INVALID_VALUE => 'The arrival time is less than the departure time', 
         ), 
         'callback' => function($value, $context = array()) { 
          // value of this input 
          $apArrTime = \DateTime::createFromFormat('H:i', $value); 
          // value of input to check against from context 
          $apDepTime = \DateTime::createFromFormat('H:i', $context['apDepTime']); 
          // compare times, eg.. 
          return $apDepTime > $apArrTime; 
         }, 
        ), 
       ), 
      ), 
     ))); 

     $inputFilter->add($apArrInputFilter, 'apArr'); 

     $this->inputFilter = $inputFilter; 
    } 

    return $this->inputFilter; 
} 
} 

答えて

29

あなたのコールバックに渡される最初のパラメータが値である。この

ためZend\Validator\Callbackバリデータを使用することができますバリデータが適用される入力の値。

第2パラメータは、入力名でキー入力された他のフォーム値の配列で、値を比較するコンテキストを表します。簡単な例として

...

$apArrInputFilter->add($factory->createInput(array(
     'name' => 'apArrTime', 
     'required' => true, 
     'validators' => array(
       array(
        'name' => 'Callback', 
        'options' => array(
         'messages' => array(
          \Zend\Validator\Callback::INVALID_VALUE => 'The departure time is less than the arrival time', 
         ), 
         'callback' => function($value, $context=array()) { 
          // value of this input 
          $apArrTime = $value; 
          // value of input to check against from context 
          $apDepTime = $context['apDepTime']; 
          // compare times, eg.. 
          $isValid = $apDepTime > $apArrTime; 
          return $isValid; 
         }, 
        ), 
       ), 
     ), 
    ))); 

明らかに、実際の日付の比較のために、あなたのニーズにコードを記述する必要がありますが、それはあなたが始める必要があります。

+0

クリスプ。どうもありがとうございました。私はZFの新人です。あなたのソリューションは私を大いに助けました。 しかし、apDepTimeが別のInputFilter($ apDepInputFilter)にあるため、私のコードで$ context ['apDepTime']が表示されず、$ thisを匿名関数で見ることができません。 –

+0

あなたの決定を使用して自分のコードを更新しました。左に値apDepTimeを取得する方法を考えてください。 –

0

また、別のアプローチを使用することもできます。あなた自身のisValid()関数を定義するInputFilterを使用します。

InputFilterを使用するには、フォームを教えてください。

$this->setInputFilter(new Filter\MyFilter()); 

独自のisValid()関数を実装します。

namespace Application\Form\Filter; 

use Zend\InputFilter\InputFilter; 
use Zend\Validator; 
use Zend\Filter; 

class MyFilter extends InputFilter 
{ 
    public function isValid($context = null) 
    { 
     // add your dependent validation 
    } 

    public function __construct() 
    { 
     // Add youre form field validations 
    } 

http://theabstract.de/zf2-dynamic-form-validation/

関連する問題