Я уже разработал нечто подобное в своем предыдущем проекте.
Для этого я использовал сервис, который принимает мою форму и устанавливает динамический набор полей и, очевидно, пользовательские правила валидации.
В контроллере, получить форму (с помощью инъекции зависимостей formManager (polyfilled или нет).
$form = $this->formManager->get('{your form}');
Позвоните в службу и придать ему форму.
И в службе вы можете сделать что вы хотите нравится:
- получить свои вещи (из БД или других), чтобы определить, Wich поля являются обязательными
- для каждый на форме
- Добавить или удалить FIELDSET
- Добавить или удалить поля ValidationGroup
- Добавить или удалить фильтры
- Добавить или удалить валидатор
я выполнил те через (образец) в Еогеаспе где $stuff
является элементом коллекции доктрины
$nameFieldset = 'my_fieldset-'.$stuff->getId();
$globalValidator = new GlobalValidator();
$globalValidator->setGlobalValue($gloablValue);
$uoValidator = new UcValidator();
$uoValidator->setOptions(array(
'idToValidate' => $stuff->getId(),
'translator' => $this->translator
));
$globalValidator->setOptions(array(
'idToValidate' => $stuff->getId(),
'translator' => $this->translator
));
$name = 'qty-'.$stuff->getId();
$form = $this->setFilters($form, $name, $nameFieldset);
$globalValidator->setData($data);
$form = $this->setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset);
Где setFilters и setValidato rs - это настраиваемые методы, которые добавляют фильтры и валидатор в мои поля (также пользовательские)
/**
* @param myForm $form
* @param $name
* @param string $nameFieldset
* @return myForm
*/
public function setFilters($form, $name, $nameFieldset)
{
$form->getInputFilter()->get('items')->get($nameFieldset)
->get($name)
->getFilterChain()
->getFilters()
->insert(new StripTags())
->insert(new StringTrim());
return $form;
}
/**
* @param myForm $form
* @param $name
* @param $globalValidator
* @param $uoValidator
* @param $nameFieldset
* @return myForm
*/
public function setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset)
{
$optionsSpace = [
'translator' => $this->translator,
'type' => NotEmpty::SPACE
];
$optionsString = [
'translator' => $this->translator,
'type' => NotEmpty::STRING
];
$optionsDigits = [
'translator' => $this->translator,
];
$form->getInputFilter()->get('items')
->get($nameFieldset)
->get($name)
->setRequired(true)
->getValidatorChain()
->attach($uoValidator, true, 1)
->attach($globalValidator, true, 1)
// We authorize zéro but not space nor strings
->attach(new NotEmpty($optionsSpace), true, 2)
->attach(new NotEmpty($optionsString), true, 2)
->attach(new Digits($optionsDigits), true, 2);
return $form;
}
Благодарим вас за подробный ответ! Но я думаю, что это не то, что я ищу: 1. Я «скомпилирую» свою «форму» по-другому - есть только одна «форма», и она (и ее 'Fieldset') становится другой (sub -) 'Fieldset' в зависимости от контекста. 2. Фактическая проблема заключается в проверке полей, когда эта проверка зависит от полей другого «Полевого набора». – automatix
В этом примере у меня есть только одна форма, и, как вы можете видеть в этом ответе, я добавляю столько же набора полей, сколько у меня в моей коллекции. – Hooli