Jump to content

Déclencher des évènement en base de donnée


Recommended Posts

Bonjour à tous, et merci pour l'aide que vous pourrez m'apporter !

 

Contexte : Je développe un script qui va me permettre d'utiliser l'API des mails transactionnels de sendinblue.

Ma requête en base fonctionne.

Mon script appel bien l'API et le mail part lorsque je charge l'url de mon script. Les données du clients sont récupérées puis envoyées au client avec les données dans une template sendinblue "confirmation de commande" .

 

Maintenant, j'aimerai faire la chose la suivante :

Appeler cette URL à chaque fois que le statut d'une commande est passée en "commande confirmée"

Je sais que le statut de la commande est lié à current_state dans la table order ( quelque chose ), est-ce possible de mettre un écouteur à chaque fois qu'une nouvelle ligne apparaît en base ?

 

Merci pour votre aide !

Link to comment
Share on other sites

Top ça fonctionne :D ( du moins sur mon localhost )

 

J'ai pu générer un module ici -> https://validator.prestashop.com/generator

Puis à la fin j'ai fait ceci :

 

public function hookpostUpdateOrderStatus($params)
    {
        if($params['newOrderStatus']->id == 3){
            file_get_contents('http://localhost:8888/prestashop/requete-test.php');
        }
    }

 

Merci Media COM

Link to comment
Share on other sites

Hello en faîtes j'ai crié victoire trop rapidement :(

 

en effet le problème c'est que dès que je met un statut à jour l'url est appelée mais vu que ce n'est pas en corrélation avec chaque commande ça pose problème :

 

exemple : lorsqu'une nouvelle commande arrive, " paiement accepté " activé -> donc URL appelé par le module et là je peux envoyer au dernier contact trouvé dans la boucle, pas de soucis dans ce cas..

Par contre dans le cas de "commande expédiée" j'ai un autre module qui met à jours automatiquement toutes les commandes en expédition, conséquence l'url sera appelé autant de fois qu'il y a de "commande expédiée" et donc derrière les mails envoyés 1 fois au premier contact 2 fois au second etc ...

 

Une piste ? J'imagine que le hookpostUpdateOrder sait reconnaître chaque client, peut être puis-je récupérer des paramètres de ce côté là ?

 

Ou sinon avec file_get_contents('mon url'); je peux bloquer l'appel à une fois ??

 

Si quelqu'un à une idée merci :):):)

Link to comment
Share on other sites

Je reformule mon problème :

 

Contexte :

1. J'ai un module qui va appeler l'url dès que le statut d'une commande va changer, dans notre cas "commande expédiée".
2. Cette url fait une requête et envoi les données avec l'API sendinblue.
3. Les statuts expédiés sont tous mis à jours en même temps et de façon automatique.

 

Exemple :

Lorsque je met à jours avec le module automatique, mon URL est appelée 3 fois car 3 commandes donc pas bon

1. cmd1 -> 3 mails
2. cmd2 -> 2 mails
3. cmd3 -> 1 mails

 

Lorsque je charge L’URL une seule fois pour appeler l'api pas de soucis :

1. cmd1 -> 1 mail
2. cmd2 -> 1 mail
3. cmd3 -> 1 mail

 

Solution :

Existe-t-il un moyen limiter une fois l'appel de cette URL dans mon module ? J'ai essayé return avec le file_get_contents ça ne marche pas ..

 

if($params['newOrderStatus']->id == 4){
file_get_contents('mon-url');
}

 

Merci beaucoup !!

Link to comment
Share on other sites

  • 4 weeks later...

Bonjour moi même, j'ai bien avancé mais il me reste encore une "merdouille"

 

   if($params['newOrderStatus']->id == 4){

            include '..requete.php';
            
            foreach ($res_order as $res_order_unique=>$value) {
            
                // INITIER LES VARIABLES
                require_once('../vendor/autoload.php');

                $client = new \GuzzleHttp\Client();

                $ref_unique = $value['reference'];
                $adresse_livraison = $value['address_delivery'];
                $adresse_facturation = $value['address_invoice'];
                $client_site = $value['customer'];
                $mode_livraison = $value['carrier_name'];
                $date_cmd = $value['date_add'];
                $email_client = $value['email'];
                $num_suivi = $value['tracking_number'];
                $track_num_suivi = "https://www.laposte.fr/outils/suivre-vos-envois?code=$num_suivi";


                    $request = $client->createRequest('POST', 'https://api.sendinblue.com/v3/smtp/email', [

                      'body' => "{\"sender\":{"some info"}",

                      'headers' => [

                        'Accept' => 'application/json',

                        'Content-Type' => 'application/json',

                        'api-key' => 'Key',

                      ],
                      
                    ]);                 
                    $response=$client->send($request);
                }    
        }

    }
}

 

$response=$client->send($request); ----> cette ligne renvoi bien un mail à chaque utilisateur, par contre ça créer un bug dans prestashop, le statut est à jours dans le menu général de la commande mais pas DANS la commande, en plus de ça si je change le statut en expédié ( donc ici statut 4 ) j'ai une erreur : 500

J'ai remarqué qu'en faisant un return ça ne buguait pas côté prestashop, par contre le return envoi les mails au dernier utilisateur trouvé dans le tableau.

Quelqu'un aurait une piste ???

S'il vous plaît je marche tout seul dans le désert :)

Bonne journée !

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...