La documentation officielle qui explique comment créer des méthodes de livraison dans Ibexa Commerce omet une explication cruciale : comment calculer les frais pour la méthode en question.
Je vais donc combler ce manque et expliquer comment créer un calculateur de frais pour une méthode de livraison. Je vais prendre comme exemple un cas simple où on a des produits avec frais de port offert :
Comme beaucoup d'autres choses dans Ibexa ou Symfony de manière générale, ce calculateur sera un service tagué.
Voici la classe src/Commerce/Attribute/String/StringStorageDefinition.php :
<?php
declare(strict_types=1);
namespace App\Commerce\Shipping;
use Ibexa\Contracts\Cart\Value\CartInterface;
use Ibexa\Contracts\ProductCatalog\CurrencyServiceInterface;
use Ibexa\Contracts\ProductCatalog\Values\AttributeInterface;
use Ibexa\Contracts\Shipping\ShippingMethod\CostCalculatorInterface;
use Ibexa\Contracts\Shipping\Value\ShippingMethod\ShippingMethodInterface;
use Ibexa\ProductCatalog\Money\DecimalMoneyFactory;
use Money\Currency;
use Money\Money;
class CostCalculator implements CostCalculatorInterface
{
public function __construct(
private readonly DecimalMoneyFactory $decimalMoneyFactory,
private readonly CurrencyServiceInterface $currencyService
) {
}
public function calculate(ShippingMethodInterface $method, CartInterface $cart): Money
{
$isFree = true;
// On itère sur chaque article du panier et on vérifie si les frais de port sont offerts
foreach ($cart->getEntries() as $entry) {
/** @var array<AttributeInterface> $attributes */
$attributes = iterator_to_array($entry->getProduct()->getAttributes());
if (!$attributes['free_shipping']->getValue()) {
$isFree = false;
break;
}
}
// On récupère la configuration de la méthode
$price = $method->getOptions()->get('price');
$currencyId = $method->getOptions()->get('currency');
$currency = $this->currencyService->getCurrency($currencyId);
// Tous les produits ont les frais de port offerts, on retourne un montant de 0
if ($isFree) {
return new Money('0', new Currency($currency->getCode()));
}
return $this->decimalMoneyFactory->getMoneyParser()->parse(
$price,
new Currency($currency->getCode())
);
}
}
Il ne reste plus qu'à taguer notre service dans le fichier de configuration config/services.yaml :
App\Commerce\Shipping\CostCalculator:
tags:
- name: ibexa.shipping.shipping.cost_calculator
method: custom_method # custom_method à remplacer par l'identifiant de la méthode de livraison
Pour célébrer la sortie de Dataflow 5 pour Symfony 7, voici un retour d'expérience sur ...
🎯 Nous relevons le défi de lancer un grand concours : Vous faire gagner un ...
Comment calculer dynamiquement des frais de port ? La documentation officielle qui explique comment créer ...
Comment créer un nouveau type d'attribut produit dans Ibexa Commerce ?
A la recherche d'un poste de travail temporaire ou permanent ? Vous recherchez un environnement ...
Après une découverte de surface d'Ibexa Commerce, entrons plus dans le détail pour comprendre son ...
Ibexa DXP propose un module pour gérer des produits pour la réalisation d'un site e-commerce. ...
Voici une présentation d'IbexaMailing, un module qui ajoute la gestion des newsletters à Ibexa. IbexaMailing est ...
C'est la dernière occasion de vous souhaitez le meilleur pour cette année 2024 et surtout ...
Pour célébrer la sortie de Dataflow 5 pour Symfony 7, voici un retour d'expérience sur ...
🎯 Nous relevons le défi de lancer un grand concours : Vous faire gagner un ...
Comment calculer dynamiquement des frais de port ? La documentation officielle qui explique comment créer ...
Comment créer un nouveau type d'attribut produit dans Ibexa Commerce ?
A la recherche d'un poste de travail temporaire ou permanent ? Vous recherchez un environnement ...
Après une découverte de surface d'Ibexa Commerce, entrons plus dans le détail pour comprendre son ...
Ibexa DXP propose un module pour gérer des produits pour la réalisation d'un site e-commerce. ...
Voici une présentation d'IbexaMailing, un module qui ajoute la gestion des newsletters à Ibexa. IbexaMailing est ...
C'est la dernière occasion de vous souhaitez le meilleur pour cette année 2024 et surtout ...