Проверка наборов полей в 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, и думаю, проблема в нем

0 ответов

Другие вопросы по тегам