Ich habe bereits etwas ähnliches in meinem vorherigen Projekt entwickelt.
Dafür benutze ich einen Dienst, der meine Form annimmt und dynamisches Fieldset und natürlich benutzerdefinierte Validierungsregeln festlegt.
In Ihrem Controller, Ihre Form erhalten (über die Dependency Injection Formmanager (polyfilled oder nicht).
$form = $this->formManager->get('{your form}');
Ihren Dienst aufrufen und es Ihre Form geben.
Und in Ihrem Service können Sie tun alles wollen Sie mögen:
- Ihr Material erhalten (von DB oder andere) wich Felder sind Pflicht
bestimmen
- Für jeweils auf dem Formular
- hinzufügen oder entfernen Fieldset
- Hinzufügen oder Entfernen von Validation Felder
- hinzufügen oder entfernen Filter
- Hinzufügen oder Entfernen von Validatoren
Ich führte diejenigen, die über (Probe) in einer foreach wo $stuff
ist ein Element der Lehre Sammlung
$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);
Wo setFilters und setValidato rs sind benutzerdefinierte Methoden, die Filter und Validator zu meinen Feldern hinzufügen (auch benutzerdefiniert)
/**
* @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;
}
Vielen Dank für eine detaillierte Antwort! Aber ich denke, es ist nicht, wonach ich suche: 1. Ich "kompiliere" meine "Form" auf eine andere Art und Weise - es gibt nur eine "Form" und sie (und ihre "Fieldsets") werden anders (sub -) 'Fieldset 'hängt vom Kontext ab. 2. Das eigentliche Problem besteht darin, Felder zu validieren, wenn diese Validierung von Feldern eines anderen 'Fieldsets' abhängt. – automatix
In diesem Beispiel habe ich nur ein Formular, und wie Sie in dieser Antwort sehen können, füge ich so viel fieldset hinzu, wie ich Sachen in meiner Sammlung habe. – Hooli