Bonjour à tous, et bonne fêtes. j'ai une petite question. Je voudrait faire apparaître des champs dans un formulaire twigs mais les champs qui ne sont pas afficher dans la condition apparaissent sous le boutons. Par exemple je voudrait faire un formulaire qui est différant si on est enregistrer ou pas mais mais les champs qui doivent pas être afficher apparaissent sous le bouton de validation. Je voudrait savoir l'astuce pour ce problème? Cordialement.
Voici ma vue

<html>
    <head></head>
    <body>
        {{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}

            {{ form_row(form.adresse) }}
            {{ form_row(form.ville) }}
            {{ form_row(form.codepostal) }}
            <button type="submit" class="btn btn-primary">Créer</button>
        {{ form_end(form) }}
    </body>
</html>

et voici mon formtype

<?php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SocieteType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('adresse')
            ->add('ville')
            ->add('codepostal')
            ->add('siret')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

et voici mon controelur

<?php
// src/Controller/FormController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Form\SocieteType;
use App\Entity\Societe;

class SocieteController extends AbstractController
{
    /**
 * @Route("/societe")
 */
public function new(Request $request)
{
    $societe = new Societe();

    $societe->setAdresse('adresse');
    $societe->setVille('ville');
    $societe->setCodepostal('code postal');
    $form = $this->createForm(SocieteType::class, $societe);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();

        $formValues = $request->request->get('societe_form');
        $nom = $formValues['nom'] ?? null;

        $em->persist($societe);
        $em->flush();
    }

    return $this->render('default/societe.html.twig', array(
        'form' => $form->createView(),
    ));
}
}

1 réponse


Salut et bonne fêtes ,

bon j'ai eu du mal à te relire ;) mais bon ...

Dans ton cas twig affichera TOUJOURS tous les champs de ton FormType.
Dans ton cas si tu veux afficher 2 formulaires différents il te faudra 2 formType différent.

Le premier avec tous les champs

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('adresse')
            ->add('ville')
            ->add('codepostal')
            ->add('siret')
        ;
    }

Le second avec les champs que tu ne veux pas afficher

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('adresse')
            ->add('ville')
            ->add('codepostal')
            ->remove('siret')
        ;
    }

nota: si le champs et obilgatoire il faudra le gérer dans ton controller lors de la soumission.

Après il faudra gérer l'affcihage de l'un ou l'autre dans ton controller en fonction que ton utilisateur soit ou non enrigistré.