Magento 2 zusätzliche Daten zur Versandart

10

Ich mache eine neue Versandart und muss eine neue Spalte zu den Versandkosten hinzufügen. Die Daten stammen aus benutzerdefinierten Versandmethodeneinstellungen, z. B. Methodenbeschreibung. Oder ein Eingabefeld, in das der Kunde Informationen hinzufügen kann (Daten würden wahrscheinlich im Angebot und später in der Reihenfolge gespeichert).

Der wahrscheinlich einfachste Teil von allen ist die Implementierung von Vorlagen mithilfe von

Magento_Checkout/web/template/shipping.html

Es braucht nur das

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

Das Problem ist, dass ich nicht herausfinden kann, wie benutzerdefinierte Daten hinzugefügt werden. Es reicht nicht aus, dies hinzuzufügen:

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

Daten für HTML stammen von js Raten (), die Daten von der API abrufen:

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

Danach gibt es viele Schritte, während tatsächlich etwas gesammelt wird. ich fand

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

Das sah am vielversprechendsten aus, aber wenn ich versuche, mein Attribut hinzuzufügen, passiert nichts.

Meine Frage ist also, ob es tatsächlich eine Möglichkeit gibt, neue Daten zu den Versandkosten hinzuzufügen. In M1 war es möglich. Es wäre verrückt, wenn M2 es nicht möglich wäre.

Es gibt viele Gründe, warum dies möglich sein sollte. Zum Beispiel, wenn ich die Abholmethode im Geschäft mit mehreren Dropdown-Geschäften oder ähnlichem durchführen wollte.

Artis Z.
quelle
Hallo, wenn du die Lösung hast, könntest du sie bitte teilen?
Konika
Nun, irgendeine Lösung dafür?
Piyush Dangre
Ich warte auf diese Antwort.
Diego Queiroz

Antworten:

5

Sie müssen dies tun, indem Sie eine Beschreibung als Erweiterungsattribut wie folgt hinzufügen:

/etc/extension_attributes.xml sollte folgendermaßen aussehen:

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

Fügen Sie in der Datei etc / di.xml ein Plugin zum Überschreiben von modelToDataObject () in Magento \ Quote \ Model \ Cart \ ShippingMethodConverter wie folgt hinzu:

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

Die Plugin-Datei Vendor \ module \ Plugin \ Carrier \ Description.php sollte folgendermaßen aussehen:

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

Nach all dem erhalten Sie diese Beschreibung auf fronend wie folgt:

<div data-bind="text: method.extension_attributes.method_description"></div>
VIPIN A ROY
quelle
Das funktioniert nicht.
Dhaduk Mitesh
1

Die am besten bewertete Antwort funktioniert nicht, da er vergessen hat, den Wert "description" in der Klasse \ Magento \ Quote \ Model \ Quote \ Address \ Rate festzulegen. Wenn wir kein Plugin erstellen, um den Beschreibungswert für diese Klasse festzulegen , gibt $ rateModel-> getMethodDescription () immer leer zurück. Hier ist eine voll funktionsfähige Version der Lösung:

[Anbieter] / [Modul] /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>

[Anbieter] / [Modul] /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>

[Anbieter] / [Modul] /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;
    }
}

Und schlussendlich:

[Anbieter] / [Modul] /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;
    }
}

Vergessen Sie nicht, bin / magento setup: di: compile auszuführen, da sonst das erweiterte Attribut nicht generiert wird.

Sie können die Daten folgendermaßen an Ihre Vorlage binden:

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

Oder als Kommentar wie folgt:

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

Vergessen Sie auch nicht, $ method-> setDescription ('Ihre benutzerdefinierte Beschreibung hier') oder $ method-> setData ('description', 'Ihre benutzerdefinierte Beschreibung hier') in Ihrer benutzerdefinierten Carrier-Erweiterung zu verwenden (siehe die ursprüngliche Frage für Referenz).

Andresa Krul
quelle
-1

Sie müssen die Methodennamen in der Schnittstellendatei deklarieren. Der Pfad für diese Datei lautet

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

Beispiel:
Deklarieren Sie die Konstante oben

const KEY_DESCRIPTION = 'description';  

Definieren Sie dann die Methode wie folgt

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

Dann müssen Sie der folgenden Datei Werte zuweisen

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

wie folgt

public function getDescription()
{
  return $this->_get(self::KEY_DESCRIPTION);
}
public function setDescription($desc)
{
  return $this->setData(self::KEY_DESCRIPTION, $desc);
}   
Ranjith Kumar
quelle
Hinzufügen einer Methode zur öffentlichen API (Anbieter / Magento / Modul-Zitat / API / Daten / Versandmethode.Interface.php) ??? TU das niemals.
Pete Jaworski