
Drupal Commerce – Vendre des produits électroniques
Drupal Commerce est un outil complet pour vendre des produits physiques sur Internet. Dans cet article, nous vous montrerons comment configurer une boutique avec peu d'efforts, afin de vendre des produits électroniques, ou plus précisément, pour vendre l'accès à des fichiers. En plus de Commerce, j'utiliserai le module Group pour atteindre cet objectif.
Dans le précédent article sur la création d'une boutique dans Drupal, nous avons montré comment configurer le module Commerce pour commencer à vendre divers types de produits physiques.
Nous allons maintenant aller plus loin – je vous montrerai comment configurer le système pour vendre des produits électroniques, tels que des livres électroniques, de la musique ou tout autre fichier, en utilisant Commerce dans Drupal.
Cet objectif peut être atteint de plusieurs façons, et l'une d'elles est la combinaison de la puissance de Commerce et du module Group.
Pourquoi cette méthode ?
- Peu de codage,
- les autorisations gérées par le système et le module Group,
- vous vendez l'accès à un groupe privé dans lequel le client voit son contenu,
- moyen simple d'étendre le système pour vendre, par exemple, des cours vidéo composés de plusieurs parties,
- les fichiers sont téléchargés via le champ de téléchargement, attaché au type de contenu,
- le produit contient une simple référence (champ) au groupe auquel il doit être disponible après paiement.
Comment cela fonctionne-t-il pour l'administrateur ?
- Vous vendez l'accès au groupe où les fichiers à télécharger sont disponibles.
- Vous ajoutez un fichier privé au contenu associé au groupe.
- Vous créez un produit (Commerce) et fournissez le groupe sélectionné en tant que référence.
Comment cela fonctionne-t-il pour le client ?
- Produit ajouté au panier.
- Création d'un compte pour le client lors du processus d'achat. Cela doit être configuré dans la configuration de Commerce. Avoir un compte est nécessaire pour attribuer le client au groupe où les fichiers auxquels ils doivent avoir accès après un paiement réussi sont ajoutés.
- Redirection vers le paiement.
- Après la finalisation du paiement, l'accès au groupe est accordé. L'ajout du client au groupe se fait automatiquement et est réalisé par un code supplémentaire qui doit être ajouté.
- L'utilisateur est redirigé vers le profil où il a accès aux fichiers et aux groupes.
Configuration
Installez les modules Commerce et Group avec leurs dépendances.
Group
En plus du module Group lui-même, activez le module Group Node (il fait partie du module Group) – grâce à lui, vous serez en mesure de déterminer quel type de contenu sera associé à un groupe donné.
Ajoutez le type de groupe – la sous-page admin/group/types
À ce stade, dans l'édition du type, vous pouvez ajouter des champs, définir ses permissions, ses rôles et définir le type de contenu associé au groupe.
Ajoutez le nouveau groupe – la sous-page admin/group
Si un seul type de groupe est créé, alors chaque groupe créé sera de ce type. S'il y en a plusieurs, sélectionnez à quel type il doit appartenir lors de l'ajout du groupe.
Sur la page admin/structure/types, ajoutez le type de contenu à utiliser comme type de contenu dans le groupe.
Ajoutez un champ de fichier privé à celui-ci.
Assurez-vous d'avoir un système de fichiers privé correctement configuré dans votre Drupal. Ensuite, dans la configuration du champ, définissez le fichier pour qu'il soit conservé comme privé, grâce à cela, il ne sera pas visible par les personnes non autorisées.
Créez un type de contenu lié au groupe.
La page admin/group/types/manage/GROUPTYPENAME/content répertorie les types de contenu que vous pouvez associer à un type de groupe donné.
Vous pouvez le faire en utilisant le bouton Installer
Grâce à cela, il sera possible de créer du contenu destiné uniquement aux membres d'un groupe donné. Ainsi, chaque fichier connecté au contenu sera également disponible pour être consulté uniquement par les personnes du groupe.
Ajoutez le contenu avec le fichier au groupe
Éditez le groupe et allez dans l'onglet Nœuds
Ici, vous pouvez ajouter au groupe le contenu existant ou en créer un nouveau.
Lors de la création d'une nouvelle entrée, ajoutez-y un fichier. Maintenant, vous pouvez tester si, en fait, seuls les membres du groupe ont accès au fichier.
Commerce
Ajoutez un nouveau type de produit qui sera utilisé pour vendre des produits électroniques. Une description détaillée de la façon de le faire se trouve dans la section précédente concernant la configuration de Commerce.
Dans le type de produit, ajoutez un nouveau champ qui sera une référence au groupe créé.
Type de champ : Référence -> Autre…
Type de position : Groupe
Le champ peut être à valeur unique ou multiple.
Dans les paramètres de champ, vérifiez les types de groupes auxquels la référence doit s'appliquer.
Dans Commerce, vous devriez avoir au moins une méthode de paiement configurée.
C'est après un processus d'achat réussi, et lorsque le statut de la commande devient "complété", que l'adhésion au groupe sélectionné sera accordée.
Code
La fonctionnalité principale qui consiste à assigner le client au groupe sélectionné avec le fichier est réalisée à l'aide du code PHP, que vous devez écrire vous-même, par exemple dans un nouveau module.
L'exemple de tel code qui assigne le client aux groupes du champ de référence est construit en utilisant EventSubscriber, car votre système doit surveiller et réagir uniquement lorsque la commande est payée.
La solution que j'ai utilisée
J'ai créé un nouveau module commerce_groups
Un service a été ajouté au module – le fichier commerce_groups.services.yml
services:
commerce_groups:
class: '\Drupal\commerce_groups\EventSubscriber\AttachUserToGroup'
arguments: ['@entity_type.manager']
tags:
- { name: 'event_subscriber' }
Le service est défini dans la classe AttachUserToGroup
Un argument a été ajouté – entity_type.manager, car j'ai besoin de l'injecter en tant que dépendance dans le constructeur de l'objet (Injection de Dépendance)
Le tag event_subscriber informe Drupal que la classe souhaite enregistrer les événements déclenchés par d'autres modules.
L'événement que nous voulons enregistrer est défini dans la méthode getSubscribedEvents dans la classe AttachUserToGroup, héritant de EventSubscriberInterface
static function getSubscribedEvents() {
$events['commerce_order.place.post_transition'] = ['orderCompleteHandler'];
return $events;
}
commerce_order.place.post_transition est un événement déclenché après un paiement réussi pour le produit.
orderCompleteHandler est une méthode qui contient toute la logique de ce qui doit se passer lorsque l'événement donné se produit.
Ci-dessous un exemple de code fonctionnel qui, après une transaction réussie, assigne le client à tous les groupes du champ de référence field_group_ref.
/**
* Ajouter le client au groupe.
*
* @param WorkflowTransitionEvent $event
* @throws \Drupal\Core\Entity\EntityStorageException
*/
public function orderCompleteHandler(WorkflowTransitionEvent $event) {
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
$order = $event->getEntity();
$uid_value = $order->get('uid')->getValue();
$gids = [];
foreach ($order->getItems() as $order_item) {
/** @var \Drupal\commerce_product\Entity\ProductVariation $product_variation */
$product_variation = $order_item->getPurchasedEntity();
$product = $product_variation->getProduct();
$group_value = $product->get('field_group_ref')->getValue();
foreach ($group_value as $group) {
$gids[] = $group['target_id'];
}
}
/** @var \Drupal\user\Entity\User $account */
$account = User::load($uid_value[0]['target_id']);
foreach ($gids as $gid) {
/** @var \Drupal\group\Entity\Group $group */
$group = Group::load($gid);
if ($group) {
$group->addMember($account);
$group->save();
}
}
}
Affichage des fichiers dans le groupe.
La méthode la plus rapide est de créer une vue qui, sur la page principale du groupe, affichera tous les fichiers ajoutés dans le contenu lié au groupe.
Résumé
Commerce et Group sont deux modules importants, activement supportés, qui, une fois combinés, montrent la véritable puissance de Drupal. D'une manière simple, avec une quantité minimale de codage, vous êtes capable de construire un système complexe et extensible pour vendre à la fois des produits physiques et électroniques. Les deux modules seront disponibles dans Drupal 9 – la dernière version du système.