Проверка наборов полей в Zend Framework 2
У меня есть форма с коллекцией WorkingHours с полями weekDay, workStart ... Мой метод $form->isValid() в updateAction всегда верен для любых значений полей коллекции! Я не понимаю, как проверить эти поля
public function updateAction(ServerRequestInterface $request, DelegateInterface $delegate)
{
if (! $this->_allowUpdate) {
return $this->err(400, 'Action forbidden');
}
$user = $this->getUserFromMiddleware($request);
if (!$user) {
return $this->err(403, 'user not found');
}
$id = $request->getAttribute('id');
if (! $id) {
return $this->err(400, 'ID missing');
}
try {
$item = $this->_getItem(['id' => $id, 'client' => $user]);
} catch (\Exception $ex) {
return $this->err(500, 'Search error');
}
if (! $item) {
return $this->err(400, 'No item found');
}
$this->_checkAccessRights($item, $user);
if (!$this->_form) {
return $this->err(500, 'form not defined');
}
$form = new $this->_form($this->getEntityManager(), $user, true);
$this->_preUpdateItem($item, $user);
$form->bind($item);
$this->_preUpdateForm($form, $item, $user);
if ($request->getMethod() == RequestMethodInterface::METHOD_POST) {
$post = $this->getJsonBody($request);
if ($post === null) {
return $this->err(400, 'No Post Data');
}
$post = $this->_preValidateForm($form, $post, $user);
$form->setData($post);
if ($form->isValid()) {
$this->getEntityManager()->flush();
$this->_postUpdateItem($item, $form, $user);
return $this->res(['ok' => true]);
} else {
return $this->err(400, $form->getMessages());
}
}
return $this->err(405);
}
Форма
class Activity extends Form
{
use UserFields;
use GeneralFields;
protected $em = null;
/**
* Activity constructor.
* @param \Doctrine\ORM\EntityManager $em
* @param Client $identity
* @param null $submitButtonText
*/
public function __construct(\Doctrine\ORM\EntityManager $em, Client $identity, $submitButtonText = null)
{
parent::__construct();
$this->setAttribute('method', 'post');
$this->setAttribute('enctype', 'multipart/form-data');
$hydrator = new DoctrineObject($em);
$this->setHydrator($hydrator);
$this->em = $em;
$textCollection = new Translation($em, $identity);
$this->add($textCollection);
$workingHours = new WorkingHours($em);
$this->add($workingHours);
$this->addGeneralFields();
$this->addSubmit($submitButtonText);
}
public function bind($object, $flags = FormInterface::VALUES_NORMALIZED)
{
if ($object->getType() === 0) {
$this->setInputFilter(new ActivityInputFilter($this->em));
$this->addMapFields();
} else {
$this->setInputFilter(new RecommendationInputFilter($this->em));
}
parent::bind($object, $flags);
if ($this->getObject()->getThumbnail()) {
$this->getInputFilter()->get('thumb')->setRequired(false);
}
if ($this->getObject()->getImages() && $this->getObject()->getImages()->count() > 0) {
$this->getInputFilter()->get('image')->setRequired(false);
}
}
public function setData($data)
{
if (isset($data['workingHours'])) {
if ($data['workingHours'][0] === null) {
foreach (\Core\Model\WorkingHours::$daysOfTheWeek as $key => $day) {
$day = new \Core\Model\WorkingHours();
$day->weekDay = $key;
$data['workingHours'][$key] = (array) $day;
}
}
}
return parent::setData($data);
}
}
Коллекция
class WorkingHours extends \Zend\Form\Element\Collection
{
public function bindValues(array $values = [], array $validationGroup = null)
{
$collection = [];
foreach ($values as $name => $value) {
$collection[] = $this->getHydrator()->hydrate($value, new \Core\Model\WorkingHours());
}
return $collection;
}
public function __construct($em)
{
parent::__construct('workingHours');
$this->setOptions([
'count' => 7
]);
$this->setAttribute('class', 'row');
$this->setAttribute('id', 'WorkingHours');
$activityTextFieldset = new \Api\V2\Form\Admin\Fieldset\Client\WorkingHours($em);
$activityTextFieldset->setAttribute('class', 'col-lg-fit');
$this->setHydrator(new \Core\Model\Hydrator\WorkingHours());
$this->setTargetElement($activityTextFieldset);
}
}
Fieldset
class WorkingHours extends Fieldset implements InputFilterProviderInterface
{
public function __construct(EntityManager $em)
{
parent::__construct('workingHours');
$this->setHydrator(new \Core\Model\Hydrator\WorkingHours($em))
->setObject(new \Core\Model\WorkingHours());
$this->addFields();
}
public function addFields()
{
$hours = range(0, 23, 1);
$minutes = range(0, 45, 15);
$rangeHours = [];
foreach ($hours as $hour) {
foreach ($minutes as $minute) {
$str = (strlen($hour) === 1 ? "0".$hour : $hour) . ':' .(strlen($minute) === 1 ? "0".$minute : $minute);
$rangeHours[$str] = $str;
}
}
$this->add([
'name' => 'weekDay',
'type' => 'hidden',
]);
$this->add([
'name' => 'workStart',
'type' => 'select',
'options' => [
'label' => 'Start',
'empty_option' => 'select',
'value_options' => $rangeHours
],
]);
$this->add([
'name' => 'workEnd',
'type' => 'select',
'options' => [
'label' => 'End',
'empty_option' => 'select',
'value_options' => $rangeHours
],
]);
$this->add([
'name' => 'launchStart',
'type' => 'select',
'options' => [
'label' => 'Lunch Start',
'empty_option' => 'select',
'value_options' => $rangeHours
],
]);
$this->add([
'name' => 'launchEnd',
'type' => 'select',
'options' => [
'label' => 'Lunch End',
'empty_option' => 'select',
'value_options' => $rangeHours
],
]);
$this->add([
'name' => 'dayoff',
'type' => 'checkbox',
'options' => [
'label' => 'Day off',
],
'attributes' => [
'class' => 'filled-in',
],
]);
}
public function getInputFilterSpecification()
{
return [
'weekDay' => [
'required' => true,
'validators' => [
new \Zend\Validator\Between(['min' => 0, 'max' => 6]),
]
],
'workStart' => [
'required' => true,
'validators' => [
new \Zend\Validator\Regex(['pattern' => '/^([0-1]\d|2[0-3]):[0-5]\d$/']),
]
],
'workEnd' => [
'required' => true,
'validators' => [
new \Zend\Validator\Regex(['pattern' => '/^([0-1]\d|2[0-3]):[0-5]\d$/']),
]
],
'launchStart' => [
'required' => true,
'validators' => [
new \Zend\Validator\Regex(['pattern' => '/^([0-1]\d|2[0-3]):[0-5]\d$/']),
]
],
'launchEnd' => [
'required' => true,
'validators' => [
new \Zend\Validator\Regex(['pattern' => '/^([0-1]\d|2[0-3]):[0-5]\d$/']),
]
],
'dayoff' => [
'required' => false,
]
];
}
}
Гидратор
class WorkingHours implements HydratorInterface
{
protected $hydrator;
public function __construct()
{
$this->hydrator = new Client();
}
public function extract($object)
{
$workingHourObject = [];
if (!$object){
foreach (\Core\Model\WorkingHours::$daysOfTheWeek as $day) {
$dayOfWeek = new \Core\Model\WorkingHours();
$dayOfWeek->weekDay = $day;
$workingHourObject[$day] = $dayOfWeek;
}
return $workingHourObject;
}
foreach ($object as $key => $value) {
$workingHourObject[$key] = $value;
}
return $workingHourObject;
}
public function hydrate(array $data, $object)
{
return $data;
}
}
Я не знаю, как работает метод getInputFilterSpecification, и думаю, проблема в нем