У меня есть набор полей, который используется как в форме «добавить», так и «отредактировать».NoRecordExists inputfilter
Набор для ввода InputFilterProviderInterface
для его проверки.
При проверке операции добавления мне нужно проверить запись базы данных с тем же значением, которое еще не существует в базе данных, поэтому я использую валидатор NoRecordExists
.
Все до сих пор. Но, когда я использую один и тот же набор полей в форме редактирования, проверка не будет выполнена, поскольку, очевидно, уже есть запись с определенным значением, ее редактируемая запись.
Итак, я перехожу к опции exclude
валидатора NoRecordExists
и исключаю запись с «id» (это мое основное поле ключа) записи, которую я редактирую.
Так что я почти там, единственное, что я не могу решить, - это получить значение «id», которое я хочу исключить, в момент, когда я создаю входной фильтр в getInputFilterSpecification
.
Вот мой код на поле. Если кто-нибудь скажет мне, как получить доступ к другим свойствам формы (или связанного объекта) с getInputFilterSpecification
, я бы очень сильно хотел.
Возможно, мне нужно реализовать свой imputfilter по-другому, чтобы это сделать? Или даже реализовать пользовательский валидатор? Но, безусловно, пользовательский валидатор был бы излишним для того, что казалось бы довольно обычным случаем использования ...
Большое спасибо заранее. : WQ
<?php
namespace Kickoff\Form\Competition;
use Kickoff\Form\AbstractFieldset,
Kickoff\Model\Entities\Competition,
DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator,
Zend\InputFilter\InputFilterProviderInterface;
class CompetitionFieldset extends AbstractFieldset implements InputFilterProviderInterface
{
public function init()
{
$this->setName('Competition')
->setHydrator(new DoctrineHydrator($this->getObjectManager(),'Kickoff\Model\Entities\Competition'))
->setObject(new Competition())
->setLabel('Competition')
->setAttribute('class','form-collection');
$this->add(array(
'type' => 'Zend\Form\Element\Hidden',
'name' => 'id',
));
$this->add(array(
'name' => 'name',
'options' => array(
'label' => 'Competition name',
'admin_inline' => true,
),
));
$this->add(array(
'name' => 'long_name',
'options' => array(
'label' => 'Competition long name',
'admin_inline' => true,
),
'attributes' => array(
'class' => 'input-xxlarge',
),
));
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'leagues',
'options' => array(
'label' => 'Leagues',
'count' => 0,
'should_create_template' => true,
'allow_add' => true,
'target_element' => array(
'type' => 'LeagueFieldset',
),
),
));
}
/**
* Implement InputFilterProviderInterface
*/
public function getInputFilterSpecification()
{
return array(
'name' => array(
'filters' => array(
array('name' => 'Zend\Filter\StringTrim'),
),
'validators' => array(
'notempty' => array(
'name' => 'NotEmpty',
'break_chain_on_failure' => true,
'options' => array(
'messages' => array('isEmpty' => 'Competition name is required.',),
),
),
'length' => array(
'name' => 'StringLength',
'options' => array(
'max' => '64',
'messages' => array(
'stringLengthTooLong' => 'Competition name must be no more than 64 characters.',
),
),
),
'unique' => array(
'name' => 'Db\NoRecordExists',
'options' => array(
'table' => 'competition',
'field' => 'name',
'adapter' => $this->serviceManager->getServiceLocator()->get('db'),
'exclude' => array(
'field' => 'id',
'value' => '',
),
'messages' => array(
'recordFound' => 'A competition already exists with this name',
),
),
),
),
),
'long_name' => array(
'filters' => array(
array('name' => 'Zend\Filter\StringTrim'),
),
'validators' => array(
'length' => array(
'name' => 'StringLength',
'options' => array(
'max' => '128',
'messages' => array(
'stringLengthTooLong' => 'Competition long name must be no more than 128 characters.',
),
),
),
),
),
);
}
}
Edit: добавление моего 'изменить' действие контроллера на этот пост:
public function editCompetitionAction()
{
$id = $this->params()->fromRoute('competition_id');
$repository = $this->getEntityManager()->getRepository('Kickoff\Model\Entities\Competition');
$competition = $repository->find($id);
if (null == $competition) {
$this->getResponse()->setStatusCode(404);
return;
}
$formManager = $this->serviceLocator->get('FormElementManager');
$form = $formManager->get('Kickoff\Form\Competition\CompetitionForm');
$form->bind($competition);
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
$this->logger->debug("Validator is ".print_r($form->getValidator(),1));
if ($form->isValid()) {
$this->getEntityManager()->persist($competition);
$this->getEntityManager()->flush();
}
}
return array(
'form' => $form,
);
}
Доступ к валидатор от контроллера после того, как форма была отправлена, а затем вы изменить валидатор к вашему желанию;) – Sam
Спасибо Сэму, я посмотрю на это и предложение Эндрю ниже. – familymangreg