Magento 2 dati aggiuntivi al metodo di spedizione


10

Sto creando un nuovo metodo di spedizione e devo aggiungere una nuova colonna per verificare le tariffe di spedizione. I dati verrebbero dalle impostazioni personalizzate del metodo di spedizione, ad esempio la descrizione del metodo. O qualche campo di input in cui il cliente può aggiungere informazioni (probabilmente i dati verrebbero salvati tra virgolette e successivamente nell'ordine).

Probabilmente la parte più semplice di tutte è implementare template usando

Magento_Checkout/web/template/shipping.html

Ne ha solo bisogno

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

Il problema è che non riesco a capire come aggiungere dati personalizzati. Non è sufficiente aggiungere questo:

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;
}

I dati per HTML provengono da js rate (), che ottiene i dati dall'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>

Dopo questo ci sono molti passaggi mentre qualcosa viene effettivamente raccolto. ho trovato

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

sembrava il più promettente ma se provo ad aggiungere il mio attributo ad esso, non succede nulla.

Quindi la mia domanda è: se esiste effettivamente un modo per aggiungere nuovi dati alle tariffe di spedizione? In M1 era possibile. Sarebbe folle se M2 non fosse possibile.

Ci sono molte ragioni per cui questo dovrebbe essere possibile. Ad esempio, se volessi fare il ritiro nel metodo store con drop store multipli o qualcosa di simile.


Ciao, se hai la soluzione potresti per favore condividere?
Konika,

Bene, qualche soluzione a questo?
Piyush Dangre,

Sto aspettando questa risposta.
Diego Queiroz,

Risposte:


5

Devi farlo aggiungendo la descrizione come attributo di estensione come di seguito:

/etc/extension_attributes.xml dovrebbe essere così:

<?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>

Nel file etc / di.xml aggiungi un plugin per sovrascrivere modelToDataObject () in Magento \ Quote \ Model \ Cart \ ShippingMethodConverter come di seguito:

<?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>

Il file plug-in Venditore \ module \ Plugin \ Carrier \ Description.php dovrebbe essere così:

<?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;
    }
}

Dopo tutto questo otterrai quella descrizione su fronend come di seguito:

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

Questo non sta funzionando.
Dhaduk Mitesh

2

La risposta più votata non funziona perché si è dimenticato di impostare il valore "descrizione" all'interno della classe \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Se non creiamo un plugin per impostare il valore Descrizione su questa classe, allora $ rateModel-> getMethodDescription () restituirà sempre vuoto. Ecco una versione completamente funzionante della soluzione:

[Fornitore] / [Modulo] /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>

[Fornitore] / [Modulo] /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>

[Fornitore] / [Modulo] /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;
    }
}

E infine:

[Fornitore] / [Modulo] /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;
    }
}

Non dimenticare di eseguire l'installazione bin / magento: di: compilare, altrimenti l'attributo esteso non verrà generato.

Puoi associare i dati al tuo modello usando questo:

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

O come commento, in questo modo:

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

Inoltre, non dimenticare di utilizzare $ method-> setDescription ('La tua descrizione personalizzata qui') o $ method-> setData ('descrizione', 'La tua descrizione personalizzata qui') all'interno dell'estensione Carrier personalizzata (guarda la domanda originale per riferimento).


-1

È necessario dichiarare i nomi dei metodi nel file di interfaccia, il percorso per questo file è

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

Esempio:
dichiara costante in alto

const KEY_DESCRIPTION = 'description';  

quindi definire il metodo come segue

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

Quindi è necessario assegnare valori al seguente file

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

come segue

public function getDescription()
{
  return $this->_get(self::KEY_DESCRIPTION);
}
public function setDescription($desc)
{
  return $this->setData(self::KEY_DESCRIPTION, $desc);
}   

Aggiunta del metodo all'API pubblico (fornitore / magento / module-quote / Api / Data / ShippingMethodInterface.php) ??? Non farlo mai.
Pete Jaworski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.