Einstellung der Daten, die mit einem Ereignis-listener und die FormEvent::PRE_SET_DATA Veranstaltung in Symfony2
Versuche ich zu ändern, einige Daten in ein Formular basierend auf anderen Daten, die in die form. Von die docs:
Den FormEvents::PRE_SET_DATA-Ereignis wird am Anfang des Formulars::setData () - Methode. Es kann verwendet werden, um:
- Ändern Sie die Daten, die Sie während der pre-Bevölkerung
- Ändern eines Formulars abhängig von den vorgegebenen Daten (hinzufügen oder entfernen von Feldern, die dynamisch).
Diese Fett gedruckten Zeile machte mir glauben, es sollte möglich sein, tun Sie etwas wie das folgende in meine buildForm
Funktion:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SET_DATA,
function(\Symfony\Component\Form\FormEvent $event) use ($options) {
if ($options['default_to_nickname']) {
$securityContext = $this->container->get('security.context');
$nickname = null;
if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
$user = $securityContext->getToken()->getUser();
$nickname = $user->getNickName();
if (isset($nickname))
{
$options['data'] = $nickname;
//$event->setData($nickname); //this doesn't work either
}
}
}
}
);
}
Jedoch weder options['data'] = $nickname;
noch $event->setData($nickname);
Ergebnis in das Formular ausgefüllt mit den korrekten Daten. Ich kann sehen, dass die Daten durch die Lage in der FormEvent Objekt, wenn ich rufe $event->setData($nickname);
, aber wenn das Formular neu gezeichnet wird, werden die Daten nicht gesetzt wurde. Bin ich erwarten, dass die falsche Sache? Ich habe mir in sofern etwas anderes sein könnte, ändern Sie es nach dieser, und gibt es nicht. Jede Hilfe wäre sehr willkommen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu nennen
$event->getForm()->get('your_property')->setData($nickname)
. Ersetzenget()
Methode vonadd($property, $type, ['data' => $nickname])
wenn die Eigenschaft noch nicht vorhanden.Finden Sie unter : http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#adding-an-event-subscriber-to-a-form-class
"During FormEvents::PRE_SET_DATA, Form::setData() is locked and will throw an exception if used. If you wish to modify data, you should use FormEvent::setData() instead."
Tun, was Sie vorschlagen, erhalten Sie die folgende Fehlermeldung:"A cycle was detected. Listeners to the PRE_SET_DATA event must not call setData(). You should call setData() on the FormEvent object instead."
eine Idee, wie man mit dieser arbeiten?$event->setData()
sollten erwarten, dass für ein array, indiziert durch Ihre Eigenschaften, Namen.setData()
mit einem string nur, aber tatsächlich funktioniert (schrittweise über Sie, es legt Sie in ein array für mich, das ist verwirrend, wenn man auf die Tatsache, dass die übergabe in ein array gab Fehlermeldungen). So wie es aussieht$event->setData($nickname)
ist richtig!!!! Es stellt sich heraus, was war, ändern Sie dieses Feld, Weg nach der Tat. Ich glaube, ich könnte zu löschen, wie diese Frage ich bin nicht sicher, wie viel es anderen Menschen helfen