Permettre aux visiteurs d'être notifié d'une nouvelle variation de produit avec Drupal commerce 2

Un bloc note

Pour les sites e-commerce proposant des formations ou encore des événements, une fonction extrêmement intéressante est de proposer aux visiteurs de s'abonner sur la formation ou l'événement en question afin d'être notifié dès qu'une nouvelle session, une nouvelle date, est disponible. L'intérêt est double : ceci permet à l'utilisateur de recevoir en temps réel une notification dès qu'une nouvelle session est disponible, et pour le site e-commerce cela lui permet de connaître l'intérêt que suscite ses différents événements ou formations, et peux l'inciter à renforcer certains produits plutôt que d'autres, en d'autres termes répondre à une demande qui s'exprime.

C'est l'objectif principal du module Commerce Product Reminder, que nous allons découvrir ici.

La configuration du module est assez simple. Son concept principal consiste à fournir un formulaire d'abonnement, permettant à l'utilisateur de s'abonner avec un email, sur les entités Produits de Drupal Commerce, puis de notifier tous les abonnés dès qu'une nouvelle variation du produit en question est publiée (ou si une variation existante non publié est à nouveau publiée).

Configuration du module

Le module nous propose plusieurs options de configuration générale

Commerce Product Reminder general settings

Nous pouvons donc :

  • Désactiver l'envoi des mails de notification si besoin
  • Utiliser les taches d'arrière plan pour l'envoi des mails de notifications (option recommandée)
  • Journaliser l'envoi de chaque notification
  • Et enfin, sélectionner les différents types de Produit de Drupal Commerce sur lesquels activer le formulaire d'abonnement.

Les options de configurations du module permettent également de personnaliser les différents éléments textuels du formulaire d'abonnement ainsi que ceux des mails de notification envoyés.

Commerce Product Reminder form settings

Les différents éléments textuels configurable du formulaire d'abonnement sont

  • Un texte d'introduction
  • Le label du bouton de soumission du formulaire
  • Le message de confirmation d'un abonnement
  • Et enfin un texte d'introduction sur la page permettant aux visiteurs anonymes de gérer leurs différents abonnements (Le lien vers cette page est disponible automatiquement sur tous les mails de notification envoyés aux abonnées)

Commerce Product Reminder mail settings

Les éléments textuels configurables pour les mails de notifications sont :

  • Le mail expéditeur (laisser vide pour utiliser par défaut le mail principal du site)
  • Le corps du mail (les tokens associés aux entités Produit et Variation de produit sont disponibles)
  • Le sujet du mail

Une fois ces différents éléments configurés, il ne reste plus qu'à activer le formulaire d'abonnement sur les différents types de produits, sur le mode d'affichage pertinent (généralement le mode d'affichage Contenu complet).

Commerce Product Reminder Extra field

Et désormais tous les visiteurs anonymes peuvent s'abonner pour recevoir une notification dès qu'une nouvelle variation est publié en rapport avec le produit en question.

Commerce Product Reminder subscription form

Extension du périmètre fonctionnel du module

Le périmètre fonctionnel du module consiste avant tout à notifier les utilisateurs d'une nouvelle variation publiée sur un produit de Drupal Commerce. Et son principal apport consiste à fournir le stockage des abonnés, leur donner un accès à une page leur permettant de gérer leurs abonnements tout en étant visiteur anonyme, puis de gérer l'envoi des mails de notifications.

La logique qui détermine l'envoi des mails de notifications représente au final une part très modeste du module et peut être facilement modifiée par un développeur Drupal 8, comme par exemple si on souhaite générer l'envoi des notifications sur toute autre propriété ou champs d'une variation de produit.

Il suffit d'implémenter un EventSubscriber qui va réagir sur les événements liés à une variation de produit, événements propagés par Drupal Commerce lui-même, ou encore de surcharger l'EventSubscriber utilisé par le module lui-même.

/**
 * Class ProductVariationSubscriber.
 */
class ProductVariationSubscriber implements EventSubscriberInterface {

  /**
   * Drupal\commerce_product_reminder\HelperServiceInterface definition.
   *
   * @var \Drupal\commerce_product_reminder\HelperServiceInterface
   */
  protected $helper;

  /**
   * Queue factory.
   *
   * @var \Drupal\Core\Queue\QueueFactory
   */
  protected $queueFactory;

  /**
   * ProductVariationSubscriber constructor.
   *
   * @param \Drupal\commerce_product_reminder\HelperServiceInterface $helper
   * @param \Drupal\Core\Queue\QueueFactory $queue_factory
   */
  public function __construct(HelperServiceInterface $helper, QueueFactory $queue_factory) {
    $this->helper = $helper;
    $this->queueFactory = $queue_factory;
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[ProductEvents::PRODUCT_VARIATION_INSERT] = ['onProductVariationInsert'];
    $events[ProductEvents::PRODUCT_VARIATION_UPDATE] = ['onProductVariationUpdate'];
    return $events;
  }

  /**
   * This method is called when the product_variation_insert event is dispatched.
   *
   * @param \Drupal\commerce_product\Event\ProductVariationEvent $event
   *   The dispatched event.
   */
  public function onProductVariationInsert(ProductVariationEvent $event) {
    $product_variation = $event->getProductVariation();
    if ($product_variation->isPublished()) {
      $this->sendMailForReminderRelated($product_variation);
    }
  }

  /**
   * This method is called when the product_variation_update event is dispatched.
   *
   * @param \Drupal\commerce_product\Event\ProductVariationEvent $event
   *   The dispatched event.
   */
  public function onProductVariationUpdate(ProductVariationEvent $event) {
    $product_variation = $event->getProductVariation();
    $product_variation_original = $product_variation->original;
    if (!$product_variation_original instanceof ProductVariationInterface) {
      return;
    }
    if ($product_variation->isPublished() && !$product_variation_original->isPublished()) {
      $this->sendMailForReminderRelated($product_variation);
    }
  }

  /**
   * Send reminder mails or queue them.
   *
   * @param \Drupal\commerce_product\Entity\ProductVariationInterface $product_variation
   */
  protected function sendMailForReminderRelated(ProductVariationInterface $product_variation) {
    if (!$this->helper->isEnabled()) {
      return;
    }
    $data = [];
    $data['product_variation_id'] = $product_variation->id();
    $reminders = $this->helper->getRemindersFromVariation($product_variation);
    foreach ($reminders as $reminder) {
      $data['reminder_id'] = $reminder->id();
      if ($this->helper->useCron()) {
        $this->queueFactory->get('commerce_product_reminder_worker')->createItem($data);
      }
      else {
        $this->helper->sendMail($product_variation, $reminder);
      }
    }
  }
}

Et alors vous pouvez modifier les méthodes qui sont en charge d'agir sur les événement de mise à jour ou de création d'une variation de produit, et ainsi d'introduire votre propre logique métier. Le module se chargera quant à lui de toute la gestion des abonnements et de l'envoi des mails de notification selon vos propres besoins.

Une évolution très probable du module sera certainement de permettre une modification plus aisée de la logique déclenchant les notifications, que ce soit via un système de plugin ou des options de configuration supplémentaire, voire de supporter d'autres modules contribués tels que ceux par exemple relatifs à la gestion des stocks.

 

Commentaires

Soumis par Patrick Labarrière (non vérifié) le 06/12/2023 à 10:13 - Permalien

Bonjour,

Merci pour cette contribution.
Sera-t-elle adaptée pour Drupal 10 ?

Coopérativement,
Patrick

Ajouter un commentaire