Les données de réglage avec un écouteur d'événement et le FormEvent::PRE_SET_DATA Événement dans Symfony2
Je suis d'essayer de modifier des données dans un formulaire basé sur d'autres données dans le formulaire. De les docs:
La FormEvents::PRE_SET_DATA événement est distribué au début de la Forme::méthode setData (). Il peut être utilisé pour:
- Modifier les données au cours de la pré-population
- Modifier un formulaire en fonction de la pré-rempli de données (ajout ou la suppression de champs dynamiquement).
Cette ligne en gras m'a fait croire qu'il devrait être possible de faire quelque chose comme ce qui suit dans mon buildForm
fonction:
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
}
}
}
}
);
}
Toutefois, ni options['data'] = $nickname;
ni $event->setData($nickname);
résultat sous la forme étant remplie avec les données correctes. Je peux voir que les données sont définies dans la FormEvent objet quand je l'appelle $event->setData($nickname);
, mais quand la forme est effectivement rendu, les données n'a pas été définie. Suis-je attendre quelque chose de mal? J'ai regardé dans si quelque chose peut être de le modifier après, et il n'y en a pas. Toute aide serait la bienvenue!
Vous devez vous connecter pour publier un commentaire.
Vous devez appeler
$event->getForm()->get('your_property')->setData($nickname)
. Remplacerget()
méthode paradd($property, $type, ['data' => $nickname])
si la propriété n'existe pas encore.Voir : 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."
Faire ce que vous suggérez, vous obtenez l'erreur suivante:"A cycle was detected. Listeners to the PRE_SET_DATA event must not call setData(). You should call setData() on the FormEvent object instead."
Aucune idée de comment travailler avec cela?$event->setData()
doit s'attendre pour un tableau indexé par les propriétés de votre nom.setData()
avec une chaîne seule, cependant, ne fait travailler (marcher à travers elle, il la met dans un tableau pour moi, ce qui est source de confusion lorsque l'on regarde le fait que le passage dans un tableau donné les erreurs). De sorte qu'il ressemble$event->setData($nickname)
est correct! Il s'avère que quelque chose est en train de modifier ce domaine après le fait. Je pense que je pourrais supprimer cette question car je ne suis pas sûr de savoir comment cela va aider d'autres personnes