Gestion de l'héritage de formulaire

Le problème exposé dans ce sujet a été résolu.

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 :)

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.

+0 -0

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
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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