The official documentation that explains how to create shipping methods in Ibexa Commerce omits a crucial explanation: how to calculate the fees for the method in question?
So I'm going to fill this gap and explain how to create a fee calculator for a shipping method. I'll take as an example a simple case where we have products with free shipping:
Like many other things in Ibexa or Symfony in general, this calculator will be a tagged service.
Here is the class 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;
// Check for each item in the cart if it has free shipping
foreach ($cart->getEntries() as $entry) {
/** @var array<AttributeInterface> $attributes */
$attributes = iterator_to_array($entry->getProduct()->getAttributes());
if (!$attributes['free_shipping']->getValue()) {
$isFree = false;
break;
}
}
// Get shipping method configuration
$price = $method->getOptions()->get('price');
$currencyId = $method->getOptions()->get('currency');
$currency = $this->currencyService->getCurrency($currencyId);
// All items have free shipping, return a amount of 0
if ($isFree) {
return new Money('0', new Currency($currency->getCode()));
}
return $this->decimalMoneyFactory->getMoneyParser()->parse(
$price,
new Currency($currency->getCode())
);
}
}
All that remains is to tag our service in configuration file 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
To celebrate the release of Dataflow 5 for Symfony 7, here is some feedback on ...
🎯 Nous relevons le défi de lancer un grand concours : Vous faire gagner un ...
How to dynamically calculate shipping costs? The official documentation that explains how to create shipping ...
How to create a new product attribute type in 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 ...
To celebrate the release of Dataflow 5 for Symfony 7, here is some feedback on ...
🎯 Nous relevons le défi de lancer un grand concours : Vous faire gagner un ...
How to dynamically calculate shipping costs? The official documentation that explains how to create shipping ...
How to create a new product attribute type in 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 ...