8710 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis en train de réaliser un système de questions/réponses sur un article commandé.
J'aimerais qu'un utilisateur puisse poser une question sur un produit. Une fois la question posée je sélectionne la liste des autres utilisateurs ayant acheté ce produit avec un certain critère et je les envoie un mail pour qu'il puisse répondre à la question. J'ai fait mon traitement mais je n'arrive pas à envoyer mon mail. Pourtant la question elle est bien enregistrée en base de données seulement le mail qui n'est pas envoyé. Le message d'erreur que j'obtienne m'indique que mes variables sont "indifined" dans le template d'email. Je n'arrive pas à mettre le doigt sur l'origine. Est-ce l'erreur vient d'ailleurs puisque mes variables sont bien définis ou un autre dysfonctionnement ? J'ai besoin d'aide. Merci par avance !

CI-dessous mon code :

Mon formType:

namespace AppBundle\Form;
 
use AppBundle\Entity\Question;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
 
class QuestionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', TextType::class)
            ->add('title', TextType::class)
            ->add('content', TextareaType::class)
        ;
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Question::class,
        ));
    }
}


Mon formulaire:

{{ form_start(form) }}
    {{ form_widget(form.username) }}
    {{ form_widget(form.title) }}
    {{ form_widget(form.content) }}
 
    <input type="submit" value="Send"/>
{{ form_end(form) }}


Mon controller:

public function newAction(Request $request)
{
    $question = new Question();
    $form = $this->createForm(TblQuestionType::class, $question);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($question);
        $em->flush();

        $title = $request->request->get('title');
        $content = $request->request->get('content');
        $ref = $request->query->get('ref');
 
        // requêtes pour récupérer les emails utilisateurs
        $qb = $em->createQueryBuilder();
        $query1 = $qb->select('n')
            ->from('AppBundle\Entity\Note', 'n')
            ->where('n.ref = :ref')
            ->andWhere('n.note = 2 OR n.note is null')
            ->setParameter('ref', $ref)
            ->getQuery()
            ->getDQL();
        $query2 = $qb->select('m')
            ->from('AppBundle\Entity\SendMail', '')
            ->where('m.rob = :rob')
            ->setParameter('rob', '1')
            ->getQuery()
            ->getDQL();    
        $queries = $qb->select('c.commandeId', 'c.dateExpe', 'u.userId', 'u.email')
            ->from('AppBundle\Entity\Commande', 'c')
            ->join('AppBundle\Entity\Users', 'u', 'WITH', $qb->expr()->eq('c.userId', 'u.userId'))
            ->where($qb->expr()->andX(
                $qb->expr()->in('c.commandeId', ':query1'),
                $qb->expr()->notIn('u.email', ':query2')
            ))
            ->andWhere(date_diff(D, 'c.dateExpe', NOW()) > 5)
            ->setParameters('query1', $query1)
            ->setParameters('query2', $query2)
            ->getQuery()
            ->getResult();    
 
            $message = \Swift_Message::newInstance();
            $message->setSubject('Envoi mail');
            $message->setFrom(array('noreply@domaine.com' => 'domaine'));
            foreach ($queries as $query) {
                $email = $query->getEmail();
                $username = $query->getUsername();
                $message->setTo($email);
            }    
            $message->setBody($this->renderView('mail_user.html.twig', array(
                'username' => $username,
                'title' => $title,
                'content' => $content
            )));
            $message->setCharset('utf-8');
            $message->setContentType('text/html');
 
            $this->get('mailer')->send($message)   
            
           $response = new JsonResponse();
            $response->setData(array(
                'formSuccess' => $this->render('layout.html.twig', array(
                        'form' => $form->createView())
                ),
                'successMessage' => 'Success d\'envoi'
            ));
            return $response; 
    } else {
        $response = new JsonResponse();
        $response->setData(array(
                'formErrors' => $this->render('layout.html.twig', array(
                        'form' => $form->createView())
                ),
                'errorMessage' => 'Echec lors d\'envoie'
                //$this->addFlash('warning', $translator->trans('c2c.message_error'))
            ));
            return $response;
    }
}


Mon template mail:

{% block mail %}
    {{ username }}
    {{ title }}
    {{ content }}
{% endblock %}

Modifié par mecano31 (28 May 2018 - 12:06)
Salut @Jencal,

Merci d'avoir pris le temps de me répondre.
En effet, ma configuration SMTP est bonne puisque j'arrive à envoyer de mail si j'enlève les paramètres suivants :

array(
     'username' => $username,
     'title' => $title,
     'content' => $content
);


Je pense que j'ai un souci au niveau de la récupération des paramètres dans le template suivant :

$message->setBody($this->renderView('mail_user.html.twig');

et un
var_dump($queries);
me renvoie un array vide. Pourtant mes requêtes semblent bonnes. Je ne comprends le problème.
Merci
Modifié par mecano31 (28 May 2018 - 14:02)
Ok,,

Regarde donc également dans ton profiler pour voir la véritable requête qui est écrite, celle de queries. pour savoir si tu tape dans la bonne entity (parce que des fois c'est ":" des fois c'est "/" donc bon...)
Dans le profiler ma requête s'affiche bizarrement. Je pense que je ne tape pas dans la bonne entité. Ça m'affiche ceci : AppBundle\\Entity\\Commande.

J'ai modifié mes requêtes de cette manière :

         // requêtes pour récupérer les emails utilisateurs
        $qb1 = $em->createQueryBuilder();
        $query1 = $qb1->select('n')
            ->from(Note::class, 'n')
            ->where('n.ref = :ref')
            ->andWhere('n.note = 2 OR n.note is null')
            ->setParameter('ref', $ref)
            ->getQuery()
            ->getDQL();

        $qb2 = $em->createQueryBuilder();
        $query2 = $qb2->select('m')
            ->from(SendMail::class, '')
            ->where('m.rob = :rob')
            ->setParameter('rob', '1')
            ->getQuery()
            ->getDQL();  

        $qb3 = $em->createQueryBuilder();  
        $queries = $qb3->select('c.commandeId', 'c.dateExpe', 'u.userId', 'u.email')
            ->from(Commande::class, 'c')
            ->join(Users::class, 'u', 'WITH', $qb->expr()->eq('c.userId', 'u.userId'))
            ->where($qb->expr()->andX(
                $qb3->expr()->in('c.commandeId', ':query1'),
                $qb3->expr()->notIn('u.email', ':query2')
            ))
            ->andWhere(date_diff(D, 'c.dateExpe', NOW()) > 5)
            ->setParameters('query1', $query1)
            ->setParameters('query2', $query2)
            ->getQuery()
            ->getResult();    

Maintenant je récupères les bonnes entités mais le
var_dump($queries)
me renvoie toujours un array vide. Ma requête renvoie belle et bien des résultats dans la console phpMyAdmin.

La question que je me pose : est-ce que c'est dû au fait que je récupère du DQL avec getDQL() comme sous-requêtes que je mette en paramètre de ma requête queryBuilder ?
Modifié par mecano31 (28 May 2018 - 15:58)
Moi je me suis pas fait chier, je suis pas passé par le createQueryBuilder mais directement par un prepare pdo. :

            
$session = $this->get('session');
            $connection = $em->getConnection();
            $statement = $connection->prepare("SELECT TOP (1) * FROM MATABLE
                                                WHERE 1=1
                                                AND A= :a
                                                AND B= :b
                                                ORDER BY dt_dep_pack");

            $a= $session->get('a');
            $b = $session->get('b');

            $statement->bindValue('a', $a);
            $statement->bindValue('b', $b);
            $statement->execute();
            $results = $statement->fetchAll();


et mon résult est plein.
Merci @JENCAL pour ton aide.
Désolé pour le retard.
La solution que tu m'avais proposé m'a beaucoup aidé.

A bientôt !
Modifié par mecano31 (08 Jun 2018 - 16:06)