Communication entre Controller-Repository-Formulaire

a marqué ce sujet comme résolu.

Bonjour tout le monde ; SVP, comment récupérer les valeurs de deux champs d’un formulaire, les transmettre au Repository pour exécuter une requête (count) à deux paramètres, en suite enregistrer ou non les données issu du formulaire en fonction du résultat de la dite requête. Quelle sont les étapes à suivre ? Merci

Bonjour tout le monde ;

SVP, comment récupérer les valeurs de deux champs champ1 et champ2 d’un formulaire, les transmettre au Repository pour exécuter une requête (count) à deux paramètres (champ1 et champ2 ), en suite enregistrer ou non les données issu du formulaire en fonction du résultat de la dite requête. Quelle sont les étapes à suivre ?

Merci

Merci beaucoup john

Je travail avec Symfony 3 Je vous transmis ci dessous mon code

Repository:

class AffectationRepository extends \Doctrine\ORM\EntityRepository { public function findByIdAndNomClasse($id,$nomClasse) { $valeur1= $form->get('champ1')->getData(); $valeur2= $form->get('champ1')->getData();

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    $qb=$this->createQueryBuilder('a');
    return $qb
               ->select('count(a.id)')
               ->where('a.id=:id')
               ->setParameter('id',$valeur1)
               ->andWhere('a.nomClasse=:nomClasse')
               ->setParameter('nomClasse',$valeur2)
               ->getQuery
               ->getSingleScalarResult()
               ;
}

}


Formulaire:

class AffectationType extends AbstractType { /* * @param FormBuilderInterface $builder * @param array $options / public function buildForm(FormBuilderInterface $builder, array $options) { $builder

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        ->add('client', EntityType::class, array('class'=>'B105Bundle\Entity\Client',
            'choice_label'=>'nomPrenomClt',
            'expanded'=>false,
            'multiple'=>false,
            'data'=>$options['defaultClient']
        ))
        ->add('nomClasse', TextType::class) 
        ->add('dtAffectation', DateType::class, array('widget' => 'choice', ))  
        ->add('commentaireAff', TextareaType::class)            
    ;
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'B105Bundle\Entity\Affectation'
    ));

    $resolver->setRequired(array('defaultClient'));
}

}


Controller:(Methode AddAffectation) class AffectationController extends Controller { / * @Route("/Add", name="AddAffectation") * @Route \symfony\Component\HttpFoundation\Response / public function addAction(Request $request) {

 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
    $repository = $this->getDoctrine()->getRepository('B105Bundle:Affectation');
    $test=$repository->findByIdAndNomClasse($id,$nomClasse);

    //On recupere le client qui doit etre associée par défaut à l'affectation
    $em=$this->getDoctrine()->getRepository('B105Bundle:Client');
    $defaultClient=$em->find(1);

    //creer un nouvelle affectation
    $affectation=new Affectation();

    //On recuper le formulaire
    $form = $this->createForm(AffectationType::class,$affectation, array('defaultClient'=>$defaultClient));
    $form->handleRequest($request);

    //Si le formulure est soumis
    if($form->isSubmitted() && $form->isValid() ){
        if ($test=0)
        {
            //Enregistre l'affectation dans la base de données
            $em=$this->getDoctrine()->getManager();
            $em->persist($affectation);
            $em->flush();
            return new \Symfony\Component\HttpFoundation\Response('Affectation ajoutée !');

            //On génére le HTML du formulaire creé
            $formView = $form->createView();

    //on rend la vue
    return $this->render('affectationAdd.html.twig', array('form'=>$formView));


        }
    }
}

Dans ton controller, soit tu récupères directement les infos rentrés, à coup de $form->getData(), soit tu récupères l'attribut de ton objet (puisque celui-ci est hydraté par le formulaire). Tu peux alors passer directement l'objet à la méthode de ton repository :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
# Ton repository

public function nomMethode(Application $application) {
    $qb = $this
        ->createQueryBuilder('a')
        # [...]
        ->andWhere('a.id = :id')
        ->andWhere('a.nomClasse = :nomClasse')
        ->setParameter('id', $application->getId())
        ->setParameter('nomClasse',$application->getNomClasse())
        [...]
    ;
}

Ceci étant dit, si tu instancies toi-même ton objet Application, il n'aura pas d'ID, ta requête risque donc de ne rien retourner.

Par ailleurs, tu peux directement, dans ton controller, faire un

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$result = $this->getDoctrine()->getRepository('B105Bundle:Client')->findBy([
    'id' => $application->getId(),
    'nomClasse' => $application->getNomClass()
]);

// S'il y a des résultats
if ($result) {
    // Tu enregistres, ou pas, selon ce que tu souhaites
}

Je n'ai évidemment pas testé ce code, mais dans le principe ça devrait être ce que tu veux.

+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