Définition de restrictions d'expédition avancées dans Magento 2

Publié: 2017-05-17

Dans cet article, nous vous expliquons comment masquer un mode de livraison lorsque certaines conditions s'appliquent.

Dans certains scénarios, les propriétaires de magasins peuvent souhaiter restreindre les options d'expédition car :

  • un produit a de grandes dimensions et un poids important, il ne peut donc pas être expédié de manière standard,
  • les conditions de stockage en surgelé ne permettent pas de livrer un produit à temps
  • l'expédition est limitée en raison de l'emplacement du client (pays, région, ville )
  • le panier total ne permet pas à un acheteur de bénéficier d'une offre d'expédition,
  • etc.

La sélection par défaut des options d'expédition de Magento n'offre pas beaucoup de flexibilité. Il n'est possible de restreindre l'expédition que pour certains comtés et régions ou lorsque le total du panier est inférieur au montant défini.

Si vous pensez que cela ne suffit pas, lisez la suite.

Je vais vous expliquer comment créer votre propre plugin qui vous permettra de restreindre les options d'expédition en fonction de votre modèle commercial, de vos objectifs et de vos conditions.

REMARQUE

Je ne vais pas passer par les étapes spécifiques nécessaires pour créer une extension pour Magento 2. Vous pouvez voir comment faire ici ou ici.

Afin de désactiver dynamiquement une méthode d'expédition donnée, nous avons besoin d'un nouvel ensemble de classes dans notre extension - ce sont 2 plugins . Le 1er sera en charge de la validation des méthodes d'expédition, tandis que le 2ème se chargera de les filtrer.

En un mot, chaque méthode qui ne passe pas la validation sera marquée comme " is_disabled ", et à l'étape suivante, toutes les méthodes " is_disabled " seront filtrées et supprimées de la liste principale.

Roulons.

* Puisque l'approche que je vais décrire est basée sur les principes utilisés dans l'extension Shipping Suite , j'utiliserai le nom du fournisseur 'Mageworx' et le nom de l'extension 'ShippingRules'. REMARQUE! Afin d'éviter les erreurs, vous devez les remplacer par vos propres noms !

Commençons par créer un plugin (classe) qui sera utilisé pour le filtrage. Voici comment :

 > MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append 
 espace de noms MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result ;

classe Ajouter
{
    /**
     * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote
     */
    $session protégée ;

    /**
     * @param \Magento\Checkout\Model\Session $checkoutSession
     * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession
     * @param \Magento\Framework\App\State $state
     * @paramètre interne Session $session
     */
    fonction publique __construct(
        \Magento\Checkout\Model\Session $checkoutSession,
        \Magento\Backend\Model\Session\Quote $backendQuoteSession,
        \Magento\Framework\App\State $state
    ) {
        if ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) {
            $this->session = $backendQuoteSession ;
        } autre {
            $this->session = $checkoutSession ;
        }
    }

    /**
     * Validez chaque méthode d'expédition avant de l'ajouter.
     * Appliquer l'action des règles si la validation a réussi.
     * Peut marquer certaines règles comme désactivées. Les règles désactivées seront supprimées de la classe
     * @voir MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
     * en vérifiant la valeur de cette marque dans l'objet tarif.
     *
     * REMARQUE : si vous rencontrez des problèmes avec les règles et les méthodes d'expédition, commencez le débogage à partir d'ici.
     *
     * @param \Magento\Shipping\Model\Rate\Result $subject
     * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result
     * tableau @return
     */
    fonction publique avantAppend($sujet, $résultat)
    {
        if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) {
            retourner [$résultat] ;
        }

        $filtableMethods = [
            'flatrate_flatrate',
            'ups_XDM',
            'ups_XPR',
            'ups_WXS',
            'carrier_method',
            // ... ajoutez ici vos codes de méthode
        ] ;
        $methodCode = $result->getCarrier() . '_' . $result->getMethod();
        if (!in_array($methodCode, $filtableMethods)) {
            retourner [$résultat] ;
        }

        /** @var \Magento\Quote\Model\Quote $quote */
        $quote = $this->session->getQuote();
        $quoteItems = $quote->getAllItems();
        $heavyWeightFlag = faux ;
        foreach ($quoteItems as $item) {
            si ($item->getWeight() > 100) {
                $heavyWeightFlag = vrai ;
                Continuez;
            }
        }

        si ($heavyWeightFlag == vrai) {
            $result->setIsDisabled(true);
        }

        retourner [$résultat] ;
    }
}

Nous exécutons 3 vérifications dans le corps de notre plugin :

1.

!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method

– garantit qu'au point d'entrée, nous obtenons ce dont nous avons besoin : c'est un exemple d'une méthode d'expédition. Si ce n'est pas le cas, nous le retournons tel quel.

2.

 !in_array($methodCode, $filtableMethods)

– ensuite, nous vérifions si la méthode actuelle figure dans la liste des méthodes de filtrage. Si ce n'est pas le cas, nous le retournons tel quel.

3.

 $heavyWeightFlag == vrai

– est le dernier et le principal contrôle. Si le drapeau est appliqué à la valeur réelle, la méthode courante est désactivée : $result->setIsDisabled(true);

Nous essaierons de filtrer au moins un produit ajouté au panier et ayant un poids supérieur à 100 unités standard (livres ou kilos).
Les méthodes disponibles pour le filtrage sont 'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' . Ils sont codés en dur et stockés dans le tableau $filtableMethods .

Nous opérons sur le code en utilisant le code complet de la méthode d'expédition qui, en règle générale, se compose du code du transporteur ($result->getCarrier()) et du code de la méthode elle-même ($result->getMethod()) connecté avec " _” .

Les produits nécessaires au contrôle sont tirés directement du devis du client en cours.
REMARQUE

Un petit morceau de code dans le constructeur de classe de tableau vous permettra de définir le devis à la fois sur le frontend et dans le backend (à condition qu'une commande ait été créée dans le panneau d'administration).

En utilisant \Magento\Framework\App\State, nous pouvons vérifier dans quelle zone nous nous trouvons actuellement et sélectionner le devis nécessaire :
1. \Magento\Backend\Model\Session\Quote pour l'administrateur
2. \Magento\Checkout\Model\Session pour le Frontend

C'est ça!

Nous pouvons maintenant valider les méthodes d'expédition et passer à l'étape suivante : créer un plug-in pour désactiver les méthodes d'expédition invalides (selon nos conditions).

Voici comment :

 > MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates 
 /**
 * Copyright 2016 MageWorx. Tous les droits sont réservés.
 * Voir LICENSE.txt pour les détails de la licence.
 */

espace de noms MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result ;

classe GetAllRates
{

    /**
     * Désactivez les tarifs d'expédition marqués.
     *
     * REMARQUE : Si vous ne pouvez pas voir certains des tarifs d'expédition, commencez le débogage à partir d'ici. Au début, cochez 'is_disabled'
     * paramètre dans l'objet tarif d'expédition.
     *
     * @param \Magento\Shipping\Model\Rate\Result $subject
     * tableau @param $résultat
     * tableau @return
     */
    fonction publique afterGetAllRates($subject, $result)
    {
        foreach ($result as $key => $rate) {
            si ($rate->getIsDisabled()) {
                unset($résultat[$clé]);
            }
        }

        retourne $résultat ;
    }
}

Ce plugin est utilisé pour récupérer toutes les données de méthodes d'expédition disponibles et vérifier chacune d'entre elles. Si certaines des méthodes ont la marque "is_disabled" , nous l'excluons simplement de la liste, ce qui nous permet de ne voir que les méthodes qui correspondent aux conditions créées dans le validateur. Ces méthodes sont exclues sur n'importe quelle page d'un site Web, qu'il s'agisse d'un bloc d'expédition d'estimation dans le panier ou de la page de paiement.

Maintenant, pour vérifier le fonctionnement des plugins, nous devons les enregistrer dans le fichier :

> MageWorx/ShippingRules/etc/di.xml 
 <?xml version="1.0"?>
<config xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Shipping\Model\Rate\Result">
        <nom du plugin="mageworx_shippingrules_update_rate_result"
                type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append"
                sortOrder="10"
                désactivé="false"/>
        <plugin name="mageworx_shippingrules_update_disabled_or_enabled_rates"
                type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates"
                sortOrder="11"
                désactivé="false"/>
    </type>
</config>

REMARQUE

Pour des raisons descriptives, les plugins sont divisés en 2 classes différentes. Dans un scénario ordinaire, vous pouvez utiliser une seule classe pour modifier 2 méthodes différentes de la classe Magento\Shipping\Model\Rate\Result.

Pourquoi ça marche comme ça ?

Magento\Shipping\Model\Rate\Result est la classe principale de Magento 2 qui est responsable de la procession des méthodes d'expédition. Sa méthode getAllRates est utilisée pour récupérer les listes de méthodes d'expédition.

Pendant ce temps, l'ajout de méthodes d'expédition se fait généralement à l'aide de la méthode "append". Après avoir validé les méthodes lors de l'ajout et les avoir exclues de la collection, nous pouvons obtenir une liste des méthodes valides.

La validation elle-même peut également être modifiée.

Notre extension a une grande classe spéciale qui stocke une collection de filtres personnalisés avec différentes conditions (telles que store_id, customer_group_id, date from/to, jours de la semaine, etc. ). il a également une classe distincte avec une collection d'actions qui doivent être appliquées à une méthode d'expédition (par exemple , l'activer ou la désactiver, réécrire son coût selon différentes conditions, ajouter des coûts supplémentaires ou des remises, etc. )

Le résultat du 1er plugin en debug ressemble un peu à ceci (pour un produit pesant 1 unité) :
1

Voici à quoi cela ressemble dans le panier (ups_WXS est toujours disponible, car la limite de poids n'est pas dépassée) :

2

Cependant, si vous changez le poids du produit en 101, ce mode de livraison devient indisponible :

3

Il redevient disponible si vous l'avez exclu de la liste :
4

5

À la caisse:

f3d3cac03678318af2d569d757fc7e79

REMARQUE

Vous pouvez obtenir la liste de toutes les méthodes d'expédition système disponibles directement dans le code de la manière suivante :

 /**
 * Tableau de retour des transporteurs.
 * Si $isActiveOnlyFlag est défini sur true, ne renverra que les transporteurs actifs
 *
 * @param booléen $isActiveOnlyFlag
 * tableau @return
 */
fonction publique getAvailableMethods($isActiveOnlyFlag = false)
{
    $carriers = $this->shippingConfig->getAllCarriers();
    foreach ($carriers as $carrierCode => $carrierModel) {
        if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) {
            Continuez;
        }
        $carrierMethods = $carrierModel->getAllowedMethods();
        si (!$carrierMethods) {
            Continuez;
        }
        foreach ($carrierMethods as $methodCode => $methodTitle) {
            $methods[] = $carrierCode . '_' . $methodCode ;
        }
    }

    return !empty($methods) ? $methodes : [];
}

`$this->shippingConfig` est une instance de la classe `Magento\Shipping\Model\Config` . En utilisant ce code, vous pouvez créer le modèle source pour le sélecteur de méthodes d'expédition dans les paramètres de l'extension (ainsi, vous n'aurez pas à le coder en dur dans le plugin).

Et pour couronner le tout.

Si vous ne souhaitez pas créer votre propre extension pour désactiver les méthodes d'expédition, vous pouvez utiliser notre solution Shipping Suite pour Magento 2 .

L'extension vous permet d'exclure toute méthode d'expédition chaque fois que nécessaire en quelques clics de souris.
1. Créez une nouvelle règle d'expédition avec la condition suivante :

8

2. Sélectionnez l'action Masquer la méthode d'expédition dans la liste et choisissez les méthodes à désactiver :

9

REMARQUE

Si vous ne trouvez pas l'attribut "poids" dans la liste des conditions, vérifiez s'il est activé pour être utilisé dans les règles promotionnelles :

dix

Si vous avez des questions ou des idées sur la façon d'améliorer encore notre extension , veuillez partager votre opinion dans la section des commentaires ci-dessous.