Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je travaille avec Symfony 3.3.10
Alors, je dois afficher un formulaire qui permet de lier des matières à des classes. Lorsque je sélectionne une matière pour une classe donnée, lors de l'ajout d'une autre matières, la/les matière/s déjà liée/s ne doit/vent par apparaître dans la liste des matières qui est un select.

Voici mon controller:

public function lierClassesMatieresAction(Request $request, $as, $classeId)
{
  $em = $this->getDoctrine()->getManager();

  $classe       = $em->getRepository('ISIBundle:Classe')->find($classeId);
  $enseignement = new Enseignement;

  // $interview_form = $this->createForm(new InterviewType($id), $interview);

  $form = $this->createForm(EnseignementType::class, $enseignement, [
    'entity_manager' => $em,
    'as'             => $as,
    'classeId'   => $classeId]);
  return $this->render('ISIBundle:Parametres:lierClassesMatieres.html.twig', array(
    'asec'        => $as,
    'classeId' => $classeId,
    'form'      => $form->createView()
  ));
}

EntityType:

<?php

namespace ISIBundle\Form;

use Symfony\Component\Form\Type;

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

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

use ISIBundle\Repository\MatiereRepository;

class EnseignementType extends AbstractType
{

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $em = $options['entity_manager'];
      $as       = $options["as"];
      $classeId = $options["classeId"];
        $builder
          ->add('coefficient',    NumberType::class)
          ->add('statuMatiere',   CheckboxType::class)
          ->add('matiere',          EntityType::class,
              array(
                'class'         => 'ISIBundle:Matiere',
                'query_builder' => function (MatiereRepository $matiere)/* use ($as, $classeId)*/
                                  {

                                    $subquery = $matiere->classesMatieres($as, $classeId);
                                    return $matiere->createQueryBuilder()
                                                   ->select('*')
                                                   ->from('matiere', 'm')
                                                   ->where('m.matiereid', 'NOT IN', $subquery);
                                  },
                'choice_label'  => 'm.libelleMatiere',
                'multiple'      => false
            ))
            ->add('save',          SubmitType::class, array('label' => 'Ajouter la metière'))
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'ISIBundle\Entity\Enseignement'
        ));

        $resolver->setRequired('entity_manager');
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'isibundle_enseignement';
    }
}

Ce que je veux

Je veux afficher ce formulaire dans lequel j'ai un champ (select) dont les données sont le résultat d'une requête que je fais avec le QueryBuilder. Ladite requête contient des paramètres car la sélection de données se fait selon des critères.

Ce que j'obtiens

The options "as", "classeId" do not exist. Defined options are: "action", "allow_extra_fields", "attr", "auto_initialize", "block_name", "by_reference", "compound", "constraints", "csrf_field_name", "csrf_message", "csrf_protection", "csrf_token_id", "csrf_token_manager", "data", "data_class", "disabled", "empty_data", "entity_manager", "error_bubbling", "error_mapping", "extra_fields_message", "inherit_data", "invalid_message", "invalid_message_parameters", "label", "label_attr", "label_format", "mapped", "method", "post_max_size_message", "property_path", "required", "translation_domain", "trim", "upload_max_size_message", "validation_groups".

Il semblerait que la transmission de paramètres au formulaire ne soit pas prise en compte:

Controller->createForm('ISIBundle\\Form\\EnseignementType', object(Enseignement), array('entity_manager' => object(EntityManager), 'as' => '1', 'classeId' => '1'))
in src\ISIBundle\Controller\ParametresController.php (line 224)
    // $interview_form = $this->createForm(new InterviewType($id), $interview);     $form = $this->createForm(EnseignementType::class, $enseignement, [       'entity_manager' => $em,       'as'             => $as,       'classeId'       => $classeId]);     return $this->render('ISIBundle:Parametres:lierClassesMatieres.html.twig', array(       'asec'     => $as,       'classeId' => $classeId,       'form'     => $form->createView()     ));

2 réponses


nova
Réponse acceptée

Bien le bonsoir,

Pour l'erreur, dans ton Form et dans la fonction configureOptions, il faut que tu ajoutes tes paramètres "as" et "classeId"

 $resolver->setRequired( [
            'entity_manager' ,
            'as',
            'classeId',
        ] );

Pour ma part je te conseille de faire ta requête dans le repository adéquat, d'appeler cette bonne fonction dans le contrôler ou un service et enfin à la création de ton form de passer ta collection d'objets par le setRequired.

youstra
Auteur

Absolument!!!
C'est ce qui me manquait. Cela fait maintenant deux jours que je galérais là-dessus. Merci infiniment. Je suis confronté à d'autres erreurs mais cette réponse me permet de faire un grand pas. Pour ta proposition aussi je vais y pensé. ça m'a l'air intéressant.
Je souligne aussi que je débute avec Symfony et donc certaines approche propre ce framework ne me sont pas familière.