Magento 2 données supplémentaires à la méthode d'expédition

10

Je crée une nouvelle méthode d'expédition et je dois ajouter une nouvelle colonne pour vérifier les tarifs d'expédition. Les données proviendraient de paramètres de méthode d'expédition personnalisés, par exemple la description de la méthode. Ou un champ de saisie où le client peut ajouter des informations (les données seront probablement enregistrées dans le devis et plus tard dans l'ordre).

Probablement la partie la plus simple de tous est d'implémenter un modèle en utilisant

Magento_Checkout/web/template/shipping.html

Il a juste besoin de ça

<div data-bind="text: method.description"></div>

Le problème est que je ne peux pas comprendre comment ajouter des données personnalisées. Il ne suffit pas d'ajouter ceci:

public function collectRates(RateRequest $request)
{
    if (!$this->isActive()) return false;

    $method = $this->rateMethodFactory->create();
    $method->setData('carrier', $this->getCarrierCode());
    $method->setData('carrier_title', $this->getConfigData('title'));
    $method->setData('method_title', $this->getConfigData('title'));
    $method->setData('method', $this->getCarrierCode());
    $method->setPrice($this->_price);
    $method->setData('cost', $this->_price);

    // custom
    $method->setData('description', $this->getConfigData('description'));

    $result = $this->rateResultFactory->create();
    $result->append($method);

    return $result;
}

Les données html proviennent de js rates (), qui obtient les données de l'API:

<route url="/V1/carts/:cartId/shipping-methods" method="GET">
    <service class="Magento\Quote\Api\ShippingMethodManagementInterface" method="getList"/>
    <resources>
        <resource ref="Magento_Cart::manage" />
    </resources>
</route>

Après cela, il y a de nombreuses étapes pendant que quelque chose est collecté. j'ai trouvé

Magento \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject ()

qui avait l'air le plus prometteur mais si j'essaye d'y ajouter mon attribut, rien ne se passe.

Ma question est donc la suivante: s'il existe réellement un moyen d'ajouter de nouvelles données aux tarifs d'expédition? En M1, c'était possible. Ce serait fou si M2 ce n'était pas possible.

Il existe de nombreuses raisons pour lesquelles cela devrait être possible. Par exemple, si je voulais faire la méthode de ramassage en magasin avec plusieurs magasins déroulants ou quelque chose de similaire.

Artis Z
la source
Bonjour, Si vous avez la solution, pourriez-vous la partager?
konika
Eh bien, une solution à cela?
Piyush Dangre
J'attends cette réponse.
Diego Queiroz

Réponses:

5

Vous devez le faire en ajoutant la description en tant qu'attribut d'extension comme ci-dessous:

/etc/extension_attributes.xml devrait ressembler à ceci:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Quote\Api\Data\ShippingMethodInterface">
        <attribute code="method_description" type="string" />
    </extension_attributes>
</config>

Dans le fichier etc / di.xml, ajoutez un plugin pour remplacer modelToDataObject () dans Magento \ Quote \ Model \ Cart \ ShippingMethodConverter comme ci-dessous:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Quote\Model\Cart\ShippingMethodConverter">
        <plugin name="add_description_to_carrier" type="<Vendor>\<module>\Plugin\Carrier\Description" disabled="false" sortOrder="30"/>
    </type>
</config>

Le fichier du plugin Vendor \ module \ Plugin \ Carrier \ Description.php devrait être comme ceci:

<?php

namespace Vendor\module\Plugin\Carrier;

use Magento\Quote\Api\Data\ShippingMethodExtensionFactory;

/**
 * Class Description
 * 
 */
class Description
{
    /**
     * @var ShippingMethodExtensionFactory
     */
    protected $extensionFactory;

    /**
     * Description constructor.
     * @param ShippingMethodExtensionFactory $extensionFactory
     */
    public function __construct(
        ShippingMethodExtensionFactory $extensionFactory
    )
    {
        $this->extensionFactory = $extensionFactory;
    }

    /**
     * @param $subject
     * @param $result
     * @param $rateModel
     * @return mixed
     */
    public function afterModelToDataObject($subject, $result, $rateModel)
    {
        $extensionAttribute = $result->getExtensionAttributes() ?
            $result->getExtensionAttributes()
            :
            $this->extensionFactory->create()
        ;
        $extensionAttribute->setMethodDescription($rateModel->getMethodDescription());
        $result->setExtensionAttributes($extensionAttribute);
        return $result;
    }
}

Après tout cela, vous obtiendrez cette description sur fronend comme ci-dessous:

<div data-bind="text: method.extension_attributes.method_description"></div>
VIPIN A ROY
la source
Cela ne fonctionne pas.
Dhaduk Mitesh
1

La réponse la mieux notée ne fonctionne pas car il a oublié de définir la valeur "description" à l'intérieur de la classe \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Si nous ne créons pas de plugin pour définir la valeur Description sur cette classe, alors $ rateModel-> getMethodDescription () sera toujours retourné vide. Voici une version complète de la solution:

[Fournisseur] / [Module] /etc/extension_attributes.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Quote\Api\Data\ShippingMethodInterface">
        <attribute code="description" type="string" />
    </extension_attributes>
</config>

[Fournisseur] / [Module] /etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Quote\Model\Cart\ShippingMethodConverter">
        <plugin name="add_description_to_method" type="<Vendor>\<module>\Plugin\Carrier\Description" disabled="false" sortOrder="30"/>
    </type>

<type name="Magento\Quote\Model\Quote\Address\Rate">
        <plugin name="add_description_to_method_rate" type="<Vendor>\<module>\Plugin\Quote\Address\Rate" disabled="false" sortOrder="3"/>
    </type>
</config>

[Fournisseur] / [Module] /Plugin/Carrier/Description.php

<?php

namespace Vendor\module\Plugin\Carrier;

use Magento\Quote\Api\Data\ShippingMethodExtensionFactory;


class Description
{
    /**
     * @var ShippingMethodExtensionFactory
     */
    protected $extensionFactory;

    /**
     * Description constructor.
     * @param ShippingMethodExtensionFactory $extensionFactory
     */
    public function __construct(
        ShippingMethodExtensionFactory $extensionFactory
    )
    {
        $this->extensionFactory = $extensionFactory;
    }

    /**
     * @param $subject
     * @param $result
     * @param $rateModel
     * @return mixed
     */
    public function afterModelToDataObject($subject, $result, $rateModel)
    {
        $extensionAttribute = $result->getExtensionAttributes() ?
            $result->getExtensionAttributes()
            :
            $this->extensionFactory->create()
        ;
        $extensionAttribute->setDescription($rateModel->getDescription());
        $result->setExtensionAttributes($extensionAttribute);
        return $result;
    }
}

Et enfin:

[Fournisseur] / [Module] /Plugin/Quote/Address/Rate.php

<?php
namespace <Vendor>\<Module>\Plugin\Quote\Address;

class Rate
{
    /**
     * @param \Magento\Quote\Model\Quote\Address\AbstractResult $rate
     * @return \Magento\Quote\Model\Quote\Address\Rate
     */
    public function afterImportShippingRate($subject, $result, $rate)
    {
        if ($rate instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) {
            $result->setDescription(
                $rate->getDescription()
            );
        }

        return $result;
    }
}

N'oubliez pas d'exécuter la configuration bin / magento: di: compile, sinon l'attribut étendu ne sera pas généré.

Vous pouvez lier les données à votre modèle en utilisant ceci:

<div data-bind="text: method.extension_attributes.description"></div>

Ou comme un commentaire, comme ceci:

<!-- ko text: $data.extension_attributes.description --><!-- /ko -->

N'oubliez pas non plus d'utiliser $ method-> setDescription ('Your Custom Description Here') ou $ method-> setData ('description', 'Your custom Description Here') à l' intérieur de votre extension Carrier personnalisée (regardez la question d'origine pour référence).

Andresa Martins
la source
-1

Vous devez déclarer les noms de méthode dans le fichier d'interface, le chemin de ce fichier est

vendor/magento/module-quote/Api/Data/ShippingMethodInterface.php 

Exemple:
déclarer une constante en haut

const KEY_DESCRIPTION = 'description';  

puis définissez la méthode comme suit

public function getDescription();
public function setDescription($desc);

Ensuite, vous devez attribuer des valeurs au fichier suivant

vendor/magento/module-quote/Model/Cart/ShippingMethod.php 

comme suit

public function getDescription()
{
  return $this->_get(self::KEY_DESCRIPTION);
}
public function setDescription($desc)
{
  return $this->setData(self::KEY_DESCRIPTION, $desc);
}   
Ranjith Kumar
la source
Ajout d'une méthode à une API publique (vendeur / magento / module-quote / Api / Data / ShippingMethodInterface.php) ??? Ne fais jamais cela.
Pete Jaworski