Jump to content

Activer Hook Manuellement


Recommended Posts

Bonjour, j'utilise le module "mailalerts" afin d'envoyer des notifications quand un produit redevient disponible.

 

Cependant je met à jour manuellement les quantité dans la base de donnée, et la fonction d'envoi du mail qui est normalement appellé lors de la mise à jour des quantité ("hookActionUpdateQuantity") n'est pas appellé, je suis obligé de remodifier la quantité en back office pour chaque produit si je veux que les mails d'alertes partent.

 

Y'a t-il un moyen d'activer le hook "hookActionUpdateQuantity" pour chaque produit sans avoir a modifier chaque produit ?

Ou alors une autre façon simple d'envoyer les mails en utilisant une autre astuce ?

 

Ci-dessous ce que je cherche a lancer sans passer par une update manuel en BO : (MailAlert::sendCustomerAlert)

public function hookActionUpdateQuantity($params)
	{
		$id_product = (int)$params['id_product'];
		$id_product_attribute = (int)$params['id_product_attribute'];

		$quantity = (int)$params['quantity'];
		$context = Context::getContext();
		$id_shop = (int)$context->shop->id;
		$id_lang = (int)$context->language->id;
		$product = new Product($id_product, false, $id_lang, $id_shop, $context);
		$product_has_attributes = $product->hasAttributes();
		$configuration = Configuration::getMultiple(
			array(
				'MA_LAST_QTIES',
				'PS_STOCK_MANAGEMENT',
				'PS_SHOP_EMAIL',
				'PS_SHOP_NAME'
			), null, null, $id_shop
		);
		$ma_last_qties = (int)$configuration['MA_LAST_QTIES'];

		$check_oos = ($product_has_attributes && $id_product_attribute) || (!$product_has_attributes && !$id_product_attribute);

		if ($check_oos && $product->active == 1 && (int)$quantity <= $ma_last_qties && !(!$this->_merchant_oos || empty($this->_merchant_mails)) && $configuration['PS_STOCK_MANAGEMENT'])
		{
			$iso = Language::getIsoById($id_lang);
			$product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang);
			$template_vars = array(
				'{qty}' => $quantity,
				'{last_qty}' => $ma_last_qties,
				'{product}' => $product_name
			);

			if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') &&
				file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html')
			)
			{
				// Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients
				$merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails);
				foreach ($merchant_mails as $merchant_mail)
				{
					Mail::Send(
						$id_lang,
						'productoutofstock',
						Mail::l('Product out of stock', $id_lang),
						$template_vars,
						$merchant_mail,
						null,
						strval($configuration['PS_SHOP_EMAIL']),
						strval($configuration['PS_SHOP_NAME']),
						null,
						null,
						dirname(__FILE__).'/mails/',
						false,
						$id_shop
					);
				}
			}
		}

		if ($this->_customer_qty && $quantity > 0)
			MailAlert::sendCustomerAlert((int)$product->id, (int)$params['id_product_attribute']);
	}
Link to comment
Share on other sites

Cependant je met à jour manuellement les quantité dans la base de donnée, et la fonction d'envoi du mail qui est normalement appellé lors de la mise à jour des quantité ("hookActionUpdateQuantity") n'est pas appellé

 

 

Bonjour,

 

J'imagine que le problème vient du fait que vous faites une mise-à-jour des quantités via un fichier d'import (CSV, XML,...) ou un système de type "connecteur web".

 

C'est bien ça ?

Link to comment
Share on other sites

 

Non j'importe un fichier CSV d'environ 14000 références dans ma base SQL avec deux colonnes, "ID_STOCK" et "QUANTITY" avec "ON DUPLICATE KEY UPDATE quantity=values(quantity)",

 

 

Ok ça me rassure.

 

L'idée est à mûrir mais on peut imaginer que vous conceviez un module pour gérer vos imports.

 

La classe Module possède une méthode "getInstanceByName()" qui va permettre d’instancier un module (mailalerts dans votre cas) pour pouvoir utiliser ses fonctions/méthodes propres.

 

Le nouveau module en question pourrait vous permettre :

1. d'uploader le fichier csv

2. de vérifier ligne par ligne si le nouveau stock est différent de l'ancien

3. de le mettre à jour si c'est le cas

4. d’exécuter les envois de mails tels qu'ils sont prévus dans mailalerts

 

Avec un fichier de 14000 lignes j'aurais tendance à dire qu'il vaudrait mieux passer par un cron pour éviter le timeout du serveur.

 

Evidemment la solution idéale serait plutôt d'utiliser les webservices Prestashop mais bien sûr il faut que la source des données (un ERP ?), le permette.

Link to comment
Share on other sites

J'aurais pensé a une solution pour vérifier chaque ligne de la table "ps_mailalert_customer_oos" car ça ne dépasse pas les 50 lignes, au lieu de vérifier chaque changement de prix de chaque produit.

 

Y'a t-il un moyen d'appeller (je sais pas si le terme est bon) le hook "hookActionUpdateQuantity" pour chaque produit de la table "ps_mailalert_customer_oos" ?

 

Merci pour tes éclaircissements.

Link to comment
Share on other sites

Boucler 2 fois le fichier CSV ?

Une 1ère fois pour mettre-à-jour les stocks et une 2nde pour envoyer les mails ?

Si c'est à ça que tu penses ça me semble être la meilleure alternative.

 

Sinon à ta place je créerais une table dans laquelle tu "déplacerais" les infos du fichier CSV avant traitement.

De cette manière tu peux "flager" les lignes qui ont déjà été traitées en cas de plantage du script pendant le traitement.

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...