How can I set a input filter which is dependent from another input field.
I want to verify that the 'apDepTime' field is more than 'apArrTime'.
How can i handle this in zf2?
I also want to note that I am using 'Date validator'.
Please help me anybody.
FlightDataForm.php
<?php
namespace FcFlightForm;
use ZendFormForm;
use ZendFormElement;
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' => 'ZendFormFieldset',
'options' => array(
'legend' => 'App Dep',
),
'elements' => array(
array(
'spec' => array(
'name' => 'apDepTime',
'type' => 'ZendFormElementText',
'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' => 'ZendFormFieldset',
'options' => array(
'legend' => 'App Arr',
),
'elements' => array(
//apArrTime
array(
'spec' => array(
'name' => 'apArrTime',
'type' => 'ZendFormElementText',
'attributes' => array(
'required' => true,
'maxlength' => '5',
'id' => 'apArrTime',
),
'options' => array(
'label' => 'Time',
'hint' => 'HH:MM',
'description' => 'UTC',
),
),
),
),
));
$this->add(new ElementCsrf('csrf'));
//Submit button
$this->add(array(
'name' => 'submitBtn',
'attributes' => array(
'type' => 'submit',
'value' => 'Add',
),
));
}
}
FlightDataFilter.php
<?php
namespace FcFlightFilter;
use ZendInputFilterFactory as InputFactory;
use ZendInputFilterInputFilter;
use ZendInputFilterInputFilterAwareInterface;
use ZendInputFilterInputFilterInterface;
use ZendDbAdapterAdapter;
class FlightDataFilter implements InputFilterAwareInterface
{
/**
* @var $inputFilter
*/
protected $inputFilter;
/**
* @var $dbAdapter
*/
protected $dbAdapter;
/**
* @var string
*/
protected $table = '';
public $apDepTime;
public $apArrTime;
/**
* @param endDbAdapterAdapter $dbAdapter
*/
public function __construct(Adapter $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
/**
* @return endDbAdapterAdapter
*/
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 endInputFilterInputFilter|endInputFilterInputFilterInterface
*/
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(
endValidatorCallback::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;
}
}
See Question&Answers more detail:
os