Dir. Tech @lequipetech
2007: Drupal 5 puis 6 et Ubercart.
2010: Drupal 7, Réécriture complète, création du module Commerce porté majoritairement par les Commerce Guys, société créée pour l’occasion.
Commerce premier à utiliser au maximum les nouvelles fonctionnalités de Drupal 7 (entités, bundles etc) et contribue à l’amélioration du core.
Commerce 2.x, réécriture pour Drupal 8
Une trentaine des 60 modules contrib les plus utilisés ont eu leurs fonctionnalités intégrées à Commerce 2.x.
Toujours une référence pour suivre les bonnes pratiques de développement.
Toujours contributeur au core Drupal 8.
... NON
Qui dit métier, dit développement spécifique.
Terrain de prédilection de Commerce 2.x.
Quasiment tout peut être étendu, modifié, ajouter ses plugins, réagir à des événements, processors etc.
Exemple: Un affichage de formulaire spécifique pour les entreprises, un autre affichage pour les particuliers.
Drupal 8 implémente les form view display.
Plusieurs affichages de formulaire d’une même entité suivant des conditions souhaités:
Pour chacun, des étapes et des processus d’achats différents.
Pour cela:
Exemple: Besoin de faire un store par pays.
Store: entité
Payment: plugin
Ex: Réservation d’une chambre, possibilité de calculer le prix dynamiquement à partir du prix de base et en fonction de la période, du nombre de personnes etc.
Lors de l’affichage ou de l’utilisation d’un prix calculé, possibilité d’ajouter ses propres règles de calcul.
services:
booking.room_price_resolver:
class: Drupal\booking\Resolver\RoomPriceResolver
tags:
- { name: commerce_price.price_resolver, priority: 0 }
Il est possible d’ajouter des modifications à un total de commande ou de ligne de commande.
Les promotions (anciennement discount) sont un exemple d’ajustement proposé par défaut. Ils permettent d’ajouter des plugins configurables par l’utilisateur.
Les taxes sont un autre exemple d'ajustement fourni par le core.
Le module de promotion ajoute un service au transformateur de commande qui lui permet ensuite de sélectionner et appliquer les promotions et ajustements souhaités.
services:
commerce_promotion.promotion_order_processor:
class: Drupal\commerce_promotion\PromotionOrderProcessor
arguments: ['@entity_type.manager']
tags:
- { name: commerce_order.order_processor, priority: 50 }
Exemple pour appliquer une réduction de n%.
$order->addAdjustment(new Adjustment([
'type' => 'promotion',
'label' => t('Discount'),
'amount' => $adjustment_amount->multiply('-1'),
'percentage' => $this->getPercentage(),
'source_id' => $promotion->id(),
]));
Promotions (ex discount) et coupons font désormais parties de commerce et sont des plugins facilement extensibles.
/**
* Provides the product condition for order items.
*
* @CommerceCondition(
* id = "order_item_product",
* label = @Translation("Product"),
* display_label = @Translation("Limit by product"),
* category = @Translation("Product"),
* entity_type = "commerce_order_item",
* )
*/
class OrderItemProduct extends ConditionBase implements ContainerFactoryPluginInterface {}
/**
* Provides the percentage off offer for orders.
*
* @CommercePromotionOffer(
* id = "order_external_off",
* label = @Translation("Fixed amount off the order total depending of external service"),
* entity_type = "commerce_order",
* )
*/
class OrderExternalOff extends FixedAmountOffBase {
/**
* {@inheritdoc}
*/
public function apply(EntityInterface $entity, PromotionInterface $promotion) {
$this->assertEntity($entity);
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
$order = $entity;
$total_price = $order->getTotalPrice();
$adjustment_amount = $this->getAmount();
$external_service = \Drupal::service('order.promotion.external.service');
$order->addAdjustment(new Adjustment([
'type' => 'promotion',
// @todo Change to label from UI when added in #2770731.
'label' => t('Discount'),
'amount' => $external_service->getPromotionAmount($entity),
'source_id' => $promotion->id(),
]));
}
}
Plus besoin de module spécifique pour gérer les migrations de commerce 2.x.
id: import_products
label: 'Import products to Commerce'
source:
...
process:
type:
plugin: default_value
default_value: default
title: title_from_import
...
destination:
plugin: 'entity:commerce_product'
Si vous souhaitez migrer un commerce depuis D7 ou Ubercart. Le module commerce_migrate peut vous aider.
Une équipe disponible et réactive.
Une adoption constante avec 2k utilisations depuis sa release en septembre.
La roadmap de commerce 2.x est disponible sur https://www.drupal.org/node/2913801