Gestion de l'héritage de formulaire

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour ou bonsoir à tous,

je travaille sur un petit projet (en fait je suis un tutoriel, je suis débutant symfony) où j'ai réalisé un formulaire qui me permet d'ajouter une annonce de job. J'ai voulu faire le formulaire d'édition en utilisant l'héritage de formulaire et en enlevant un champ "date". Seulement j'ai une erreur dont je n'arrive pas à comprendre l'origine

Method "date" for object "Symfony\Component\Form\FormView" does not exist in OCPlatformBundle:Advert:form.html.twig at line 34".

Cette fameuse ligne 34 contient l'instruction suivante

1
{{ form_row(form.date) }}

Voici ce que j'ai écris dans mon constructeur de formulaire AdvertEditType.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->remove('date');
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'oc_platformbundle_advert_edit';
    }

    public function getParent()
    {
        return new AdvertType();
    }

Et voici ce que j'ai écris dans mon contrôleur

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 public function editAction($id, Request $request)
  {
    // Récupération du manager
    $em = $this->getDoctrine()->getManager();

    // On récupère l'annonce $id
    $advert = $em->getRepository('OCPlatformBundle:Advert')->find($id);

    if (null === $advert) {
      throw new NotFoundHttpException("L'annonce d'id ".$id." n'existe pas.");
    }

    //On crée le formulaire
    $form = $this->get('form.factory')->create(new AdvertEditType(), $advert);

    // On fait le lien Requête <-> Formulaire
    // À partir de maintenant, la variable $advert contient les valeurs entrées dans le formulaire par le visiteur
    $form->handleRequest($request);

    // On vérifie que les valeurs entrées sont correctes
    // (Nous verrons la validation des objets en détail dans le prochain chapitre)
    if ($form->isValid()) {
      $em->persist($advert);
      $em->flush();

      $request->getSession()->getFlashBag()->add('notice', 'Annonce modifiée.');

      // On redirige vers la page de visualisation de l'annonce modifiée
      return $this->redirect($this->generateUrl('oc_platform_view', array('id' => $advert->getId())));
    }

    return $this->render('OCPlatformBundle:Advert:edit.html.twig', array(
      'advert' => $advert,
      'form'   => $form->createView()
    ));
  }

Si quelqu'un peut me donner un indice sur ce qui ne va pas, ce serait sympa. Merci d'avance :)

+0 -0

Cette réponse a aidé l'auteur du sujet

Salut !

Il ne va pas intelligemment le masquer si tu lui demandes expressément de l'afficher, ce que fait justement {{ form_row(form.date) }}.

Symfony va générer intelligemment les classes de formulaires, les ***Type. Mais pour ce qui est d'afficher ou pas des champs, tu restes maître à bord, Symfony ne peut pas savoir à ta place ce que tu veux ou ne veux pas. Et là, justement, il ne pourrait savoir si tu ne veux pas le champ parce que les données pour l'afficher ne sont pas là, ou si tu le veux et les données ne sont pas là. Dans le doute, il prend le dernier cas, ce qui est au final logique : si tu demandes d'afficher quelque chose, c'est que tu le veux.

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Cette réponse a aidé l'auteur du sujet

Tu peux utiliser la même vue sans la modifier, dans la mesure où tu affiches exactement le même formulaire. Sauf que dans ton cas, pour l'update, tu supprimes un champ. Du coup à l'affichage, Symfony rencontre une méthode qu'il ne connaît pas (form.date) et lève donc une erreur.

Selon moi, soit tu modifies le champ date en hidden pour l'update (mais bof), soit dans le twig, tu vérifies l'existence de form.date avant de l'afficher.

+0 -0
Auteur du sujet

Bonjour,

merci à vous pour ses explications, cependant, j'ai rajouté cette condition dans mon formulaire (ma vue) mais ça ne marche pas mieux :(

1
2
3
{% if form.date is not null %}
  {{ form_row(form.date) }}
  {% endif %}
+0 -0

Parce que le champ n'existe même pas, donc il n'est pas possible de tester ce qu'il vaut. Ce qu'il te faut, c'est un équivalent de isset(), et dans ce cas, c'est plutôt is not none, il me semble.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte