Jump to content

Ajouter mon hook perso


Recommended Posts

Bonjour à Tous,

 

Après chaque commande payée (que ce soit en front avec Paypal ou Saferpay) ou en back office lorsqu'on valide une commande chèque, virement ou autre, j'ai besoin d'ajouter un traitement perso qui envoie la commande dans un XML.

 

Si on prend l'exemple de Saferpay, j'ai ajouté l'appel de ma fonction dans le hook (existant) de la page saferpay.php du module Saferpay :

    public function hookPaymentReturn($params)
    {
        if (!$this->active)
            return ;

        $smarty = $this->context->smarty;
        $state = $params['objOrder']->getCurrentState();
        if ($state == Configuration::get('SAFERPAY_ID_ORDER_STATE') OR $state == _PS_OS_OUTOFSTOCK_)
		{
                $smarty->assign(array(
                        'total_to_pay' => Tools::displayPrice($params['total_to_pay'], $params['currencyObj'], false),
                        'status' => 'ok',
                        'id_order' => $params['objOrder']->id
                ));
		
		$this->MA_FONCTION_PERSO($params['objOrder']->id);
		}else{
                $smarty->assign('status', 'failed');
		}
        return $this->display(__FILE__, 'payment_return.tpl');
    }

et ça fonctionne.

Du coup j'ai voulu faire pareil pour le BO quand le statut passe à "Payé avec Saferpay" et j'ai ajouté ce hook:

	 public function hookActionOrderStatusPostUpdate($params)
	{
	  if(!empty($params['newOrderStatus'])) {
		if ($params['newOrderStatus']->id == 16){ //statut "payé avec saferpay"
		  $this->MA_FONCTION_PERSO($params['objOrder']->id);
		}
	  }
	} 

Mais là ça ne fonctionne pas. Il faut déclarer ce hook quelque part ?

Et du coup, comme j'ai besoin de ces fonctions perso dans pas mal de fichiers (chèque, bankwire, Paypal...) c'est assez lourd. Il serait possible de créer un module perso avec les fonctions dont j'ai besoin à chaque paiement validé quel que soit le moyen et la provenance, front ou BO.

Mais comment appeler les méthodes/hooks de ce module perso et où ?

Merci de vos lumières bienvenues.

Link to comment
Share on other sites

Bonjour,

 

Ce dont tu as besoin, n'est pas d'ajouter un "hook perso" mais plustôt, comment appelé un mon bout de code lors de l’exécution ou l'appel d'un hook ?

Par "Hook", comprendre :

Ce que tu as fait peut marcher , voir le pblm dans ton 

 

 

$this->MA_FONCTION_PERSO($params['objOrder']->id);

Apres c'est pas tres propre de modifier directement dans les modules des autres

 

Je te propose de creer ton propre module, d'appeler les hook ActionOrderStatusPostUpdate et PaymentReturn dedans, si besoin, vois ici http://doc.prestashop.com/pages/viewpage.action?pageId=15171738#CréerunmodulePrestaShop-Implémenterdeshooks BO ou FO c'est exactement pareil pour le fonctionnement globale des modules.

 

Enfin, à chaque post, n'oublie pas de mentionner :

Version presta

Version php

et si possible l'OS (linux, windows, mac)

 

Bon dev

Link to comment
Share on other sites

Bonjour et merci pour ta réponse complète.

Oui j'ai compris qu'il y avait des hooks "de vue" et des hooks "d'action"...ce dont j'ai besoin.

 

J'ai donc crée mon module "dropship" et je l'ai installé. Puis j'ai enregistré, dans un premier temps pour les commandes BO, le hook ActionOrderStatusUpdate.

Pas bien compris la nuance avec ActionOrderStatusPostUpdate mais je veux pouvoir gérer deux cas, quel que soit le paiement :

 

1- La commande est enregistrée avant le paiement et l'admin bascule à "payé" quand il a le chèque ou autre. Donc il update le statut via un post.

2- La commande est créée dans l'admin alors que le paiement est reçu. Dans ce cas le statut est directement "payé avec...". Pas de update de statut dans ce cas.

 

Il me semblait que ActionOrderStatusUpdate convenait pour ça. Mais je peux me tromper.

 

Voici mon hook:

    public function hookActionOrderStatusUpdate($params)
    {        
		if(!empty($params['newOrderStatus'])) {
			if ($params['newOrderStatus']->id == Configuration::get('PS_OS_WS_PAYMENT') || $params['newOrderStatus']->id == Configuration::get('PS_OS_PAYMENT') 
			|| $params['newOrderStatus']->id == Configuration::get('SAFERPAY_ID_ORDER_STATE')){
				
		
				mail("[email protected]", $titre1, print_r($params, true));
				$drop = new SHDropship();
				$drop->CreeXml($params['cart']->id);
			}
				
		}
    }

Lorsque je teste une commande BO avec statut réglé, je reçois l'email avec les vars, OK. Puis à l'appel de ma classe: Fatal Error. Su je mets DEBUG à true, j'obtiens un print_r de tous les arrays et objets du site, mais pas d'erreur ni de notice...

 

Ma classe est dans le dossier classes du module, le fichier se nomme SHDropship.php et contient la classe du même nom. Je l'appelle via un include dans mon fichier dropship.php à la base du module. Les méthodes de ma classe n'ont pas de Parse Error et je la commence comme ça :

  public function __construct()
  {
	$this->context = Context::getContext();
	 
  }

Car j'ai besoin de context dans les fonctions.

Qu'est ce qui cloche ?

Edited by renaud2263 (see edit history)
Link to comment
Share on other sites

Concernant le hook DisplayPaymentReturn: je ne sais pas si c'est celui qui convient...

Mon besoin:

Quand depuis le front, le client choisit CB ou Paypal et que la réponse OK est renvoyée par les serveurs de banque, ALORS, je déclenche mon traitement dropship.

Je n'ai aucun "display" à faire, le client ne voit rien que la page de confirmation de paiement OK mais l'important pour moi est que mon traitement ne s'exécute que si et seulement si le paiement est OK.

Link to comment
Share on other sites

J'ai simplifié au max pour tests.

 

dans mon dropship.php du module un seul hook :

    public function hookActionOrderStatusUpdate($params)
    {        
		if(!empty($params['newOrderStatus'])) {
			if ($params['newOrderStatus']->id == Configuration::get('PS_OS_WS_PAYMENT') || $params['newOrderStatus']->id == Configuration::get('PS_OS_PAYMENT') 
			|| $params['newOrderStatus']->id == Configuration::get('SAFERPAY_ID_ORDER_STATE')){
				$titre1    = "Test Status UPDATE pour la commande ".$params['cart']->id."\n";
				$tete1     = "From: [email protected]\n";
				$tete1    .= "Content-Type: text/html;charset=\"utf-8\"";
		
				mail("[email protected]", $titre1, print_r($params, true), $tete1);
				//$drop = new SHDropship();
				//$drop->CreeXml($params['cart']->id);
			}
				
		}
    }

Dans la BDD, seul ce hook est enregistré.

Lorsque je crée une commande BO avec statut "payé" j'ai une page blanche sans aucun message sur :

index.php?controller=AdminOrders&token=7ce0779578535615131bbf22c3e18de3&submitAddorder=1

 

En mode debug un tableau des arrays et objets du site mais pas d'erreur.

Il n'y a plus d'affichage, alors que le hook s'exécute bien : la commande est validée avec le bon statut et le mail test part bien.

Qu'est ce que j'ai encore raté ? Il faut déclarer d'autres hooks ?

Edited by renaud2263 (see edit history)
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...