2015-11-13 1 views
0

J'ai effectivement fait quelques trucs pour pouvoir persister un utilisateur si son identifiant est passé par un paramètre url. (Action personnalisée de la liste d'utilisateurs).Symfony2, Sonata, FormMapper, ajouter un champ masqué à traiter dans PrePersist/PreUpdate

/admin/se/api/bundle/créer? user = 7

En fait, je ne pouvais pas trouver comment envoyer l'entité utilisatrice retourné par un findByOne (array (« id » => $ user_id)) donc je suppose que je vais devoir passer le user_id $ par un champ caché et de gérer sa valeur dans un PrePersist

passant Sinon, l'identifiant de cette façon

->add('user', 'hidden', array('data' => $user_id)) 

renverra une erreur:

Cette valeur est pas valide.

Symfony \ Composant \ Validateur \ ConstraintViolation objet (Symfony \ Composant \ Form \ Form) .children [user] = 7

causés par:

Symfony \ Composant \ Forme \ Exception \ TransformationFailedException Les formes composées attendent un tableau ou une valeur NULL à la soumission.

Ceci est ma première tentative qui est pas travail:

$container = $this->getConfigurationPool()->getContainer(); 

$request = $container->get('request'); 

$user_id = $request->get('user'); 

if(!empty($user_id)){ 

    $em = $this->getModelManager()->getEntityManager($this->getClass()); 

    $user = $em->getRepository('ApiBundle:User')->findOneBy(array('id' => $user_id)); 

    if($user){ 

     $formMapper 
      ->with('User', array('description' => '<strong>User : </strong>'.$user->getDisplayName())) 
       ->add('user', 'hidden', array('data' => $user_id)) 
       // this of course doesn't work as explained above. How can i have my own hidden input not related to any property 
      ->end(); 

    } 

Alors, comment pourrais-je faire cela? Toute meilleure solution est la bienvenue.

+0

Je sais que cette question est ancienne mais ne serait pas -> ajouter ("user.id", "hidden") faire l'affaire? – Tofandel

Répondre

0

Eh bien c'est le meilleur truc que j'ai trouvé. Je souhaite 'sonata_type_model_hidden' a plus d'options. Je suppose que je pourrais faire mon propre champ personnalisé pour être en mesure de le faire. Mais je ne sais pas comment et de toute façon cette solution est rapide à mettre en œuvre.

$formMapper 
    ->with('Guide', array('description' => '<strong>Guide : </strong>'.$guide->getDisplayName())) 
     ->add('guide', 'sonata_type_model_autocomplete', array(
      'property' => array('firstname', 'lastname', 'username', 'email'), 
      'data_class' => null, // IMPORTANT 
      'data' => $guide, 
      'attr' => array('class' => 'sonata-autocomplete-hidden'), // custom class 
      'label_attr' => array('class' => 'sonata-autocomplete-hidden'), // custom class 
     ) 
    ) 
->end(); 

Pour masquer le champ:

.sonata-autocomplete-hidden{ 
    display:none; 
} 

Si vous avez des meilleures solutions, vous êtes les bienvenus.