THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Mon problème est le suivant : j'essais d'écouter l'événement de création de promotion, pour ensuite récupérer les produits associés.

Je me demande si il faut que j'utilise ProductEvent ou ProductSaleElementEvent dans ma fonction sendMail, pour pouvoir récupérer les produits.

J'aimerais aussi savoir comment peut-on vérifier qu'une action donnée nous fais bien entrer dans la boucle ?
Ceci étant mon plus gros problème car je n'arrive pas à débuger mon code du coup.

Merci d'avance et bonne année 2016 tongue

class SendMail implements EventSubscriberInterface
{
	private $mailer;

	public function __construct(MailerFactory $mailer){
		$this->mailer = $mailer;
	}

	public function sendMail(ProductEvent $event)

	{
		$product_id = $event->getProduct()->getId();

		$customersId = [];

		$q = CustomerAlertePromoQuery::getCustomersAlertePromoByProductId($product_id);

		foreach ($q as $customeralertepromo) {
		    $customersId[]=$customeralertepromo->getCustomerId();
		}

		$customers = CustomerQuery::create()->filterById($customersId);

		foreach($customers as $customer)
		{
			$this->mailer->sendEmailToCustomer("Produit en promo", $customer, array());
		}
	}

	public static function getSubscribedEvents()
	{
		return array(
				"action.createProductSaleElement" => array("sendMail", 256);
				TheliaEvents::PRODUCT_ADD_PRODUCT_SALE_ELEMENT => array("sendMail", 256);
			);
	}
}

Offline


Si je comprends bien, tu veux faire partir un mail lorsqu'un ou plusieurs produits passent en promotion. La mise à jour de l'état promo est faite à 4 occasions :

1) Lors de la génération des combinaisons de declinaison (TheliaEvents::PRODUCT_COMBINATION_GENERATION)
2) A la modification d'un produit (TheliaEvents::PRODUCT_UPDATE_PRODUCT_SALE_ELEMENT)
3) Lors de la mise en place d'une promotion, via Outils -> Gestion des promotions (TheliaEvents::UPDATE_PRODUCT_SALE_STATUS)
4) Lors de l'importation du catalogue via Outils -> Import -> Importer vos prix Hors-Taxes (pas vraiment d’évènement défini)

Mais bon, si tu essaie de gérer ces events, tu vas avoir un problème : comment savoir que l'état "promo" d'un produit a changé ? En effet, tu n'est pas capable de déterminer quand tu reçois ces events si le produit était déjà en promo ou s'il vient tout juste d'être mis en promo.  Tu dois donc gérer ça dans ton module, avec une table spécifique qui mémorise quels sont les produits en promo.

Mais étant donné que tu es obligé de gérer cet état, il est bien plus simple de lancer un script que à intervalles réguliers (par exemple dans un cron, toutes les heures), qui contrôle l'état "promo" de chaque produit auquel au moins un client s'est abonné, et envoie les mails à bon escient :

Si le produit est en promo, tu vas regarder dans une table de ton module si l'ID du produit d'y trouve.
Si l'ID ne se trouve pas dans cette table, tu le met et tu envoie tes mails.
Si l'ID du produit se trouve déjà dans cette table, tu ne fais rien.

Si le produit n'est pas en promo, tu le supprime de ta table.

Ainsi, tu n'as pas besoin de te tracasser avec les events smile Dans ton module, tu définis une route vers le contrôleur qui va lancer l'examen des produits, et tu rajoutes ton script dans ton cron (ou web cron).

My 2 cents.


OpenStudio Toulouse

Offline


Ok, merci pour le conseil et pour prendre le temps de répondre smile

Je voudrais cependant savoir comment je peux récupérer mes produits, une fois un event écouté, quel type d'argument dois-je utilisé dans ma fonction sendMail ?
Et puis comment puis-je débugger ma fonction, ou puis-je avoir accès aux erreurs ?

Offline


Je voudrais cependant savoir comment je peux récupérer mes produits, une fois un event écouté, quel type d'argument dois-je utilisé dans ma fonction sendMail ?

Je ne comprends pas la question.

Et puis comment puis-je débugger ma fonction

Avec un debugger, comme celui de PHPStorm, ou alors avec des print()...

, ou puis-je avoir accès aux erreurs ?

Utilise le mode développement: http://thelia.net/forum/viewtopic.php?id=11787


OpenStudio Toulouse

Offline


Ma première question concerne ma fonction sendMail, lorsque j'écoute mon event, je passe dans ma fonction sendMail où j'ai mis un type ProductEvent en argument, le fait est que je veux récupérer les id des products qui ont été mis en promos, je ne sais pas si c'est la bonne façon de faire (cf mon premier msg).

Offline


Ta méthode sendMail sera appelé chaque fois qu'un produit a été modifié / créé. Le ProductEvent contient l'ID du produit concerné ($event->getProduct()->getId())


OpenStudio Toulouse