Magento 2 dữ liệu bổ sung cho phương thức vận chuyển


10

Tôi đang thực hiện phương thức giao hàng mới và tôi cần thêm cột mới để kiểm tra giá vận chuyển. Dữ liệu sẽ đến từ các cài đặt phương thức vận chuyển tùy chỉnh, ví dụ mô tả phương thức. Hoặc một số trường đầu vào nơi khách hàng có thể thêm thông tin (dữ liệu có thể sẽ được lưu trong trích dẫn và sau đó theo thứ tự).

Có lẽ phần dễ nhất trong tất cả là mẫu triển khai bằng cách sử dụng

Magento_Checkout/web/template/shipping.html

Nó chỉ cần cái này

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

Vấn đề là tôi không thể tìm ra cách thêm dữ liệu tùy chỉnh. Nó không đủ để thêm điều này:

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

Dữ liệu cho html đến từ js Rate (), lấy dữ liệu từ 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>

Sau này, có nhiều bước trong khi một cái gì đó thực sự được thu thập. tôi đã tìm thấy

Magento \ Trích dẫn \ Model \ Giỏ hàng \ ShippingMethodConverter modelToDataObject ()

Điều đó có vẻ hứa hẹn nhất nhưng nếu tôi cố gắng thêm thuộc tính của mình vào đó, không có gì xảy ra.

Vì vậy, câu hỏi của tôi là, nếu thực sự có một cách để thêm dữ liệu mới vào giá vận chuyển? Ở M1, điều đó là có thể. Sẽ thật điên rồ nếu M2 không thể.

Có nhiều lý do tại sao điều này nên có thể. Ví dụ: nếu tôi muốn thực hiện phương thức lấy hàng trong cửa hàng với nhiều cửa hàng thả xuống hoặc một cái gì đó tương tự.


Xin chào, nếu bạn có giải pháp, bạn có thể vui lòng chia sẻ không?
konika

Vâng, giải pháp nào cho việc này?
Piyush Dangre

Tôi đang chờ câu trả lời này.
Diego Queiroz

Câu trả lời:


5

Bạn cần làm điều này bằng cách thêm mô tả dưới dạng một thuộc tính mở rộng như dưới đây:

/etc/extension_attribut.xml nên như thế này:

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

Trong tệp etc / di.xml, hãy thêm một plugin để ghi đè modelToDataObject () trong Magento \ Trích dẫn \ Model \ Cart \ ShippingMethodConverter như dưới đây:

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

Tệp plugin Nhà cung cấp \ mô-đun \ Plugin \ Carrier \ Mô tả.php phải như thế này:

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

Sau tất cả, bạn sẽ nhận được mô tả đó trên fronend như dưới đây:

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

Đây không phải là làm việc.
Dhaduk Mitesh

1

Câu trả lời được xếp hạng cao nhất không hoạt động vì anh ta quên đặt giá trị "mô tả" bên trong lớp \ Magento \ Trích dẫn \ Mô hình \ Trích dẫn \ Địa chỉ \ Tỷ lệ . Nếu chúng ta không tạo Plugin để đặt giá trị Mô tả cho lớp này, thì $ RateModel-> getMethodDescrip () sẽ luôn trả về sản phẩm nào. Đây là một phiên bản đầy đủ của giải pháp:

[Nhà cung cấp] / [Mô-đun] /etc/extension_attribut.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>

[Nhà cung cấp] / [Mô-đun] /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>

[Nhà cung cấp] / [Mô-đun] /Plugin/Carrier/Descrip.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;
    }
}

Và cuối cùng:

[Nhà cung cấp] / [Mô-đun] /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;
    }
}

Đừng quên chạy thiết lập bin / magento: di: biên dịch, nếu không thuộc tính mở rộng sẽ không được tạo.

Bạn có thể liên kết dữ liệu với mẫu của bạn bằng cách này:

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

Hoặc như một nhận xét, như thế này:

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

Cũng đừng quên sử dụng $ method-> setDes mô tả ('Mô tả tùy chỉnh của bạn ở đây') hoặc $ method-> setData ('mô tả', 'Mô tả tùy chỉnh của bạn ở đây') bên trong tiện ích mở rộng Carrier tùy chỉnh của bạn (xem câu hỏi ban đầu cho tài liệu tham khảo).


-1

Bạn cần khai báo tên phương thức trong tệp giao diện, đường dẫn cho tệp này là

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

Ví dụ:
Khai báo hằng số ở trên cùng

const KEY_DESCRIPTION = 'description';  

sau đó định nghĩa phương thức như sau

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

Sau đó, bạn cần gán giá trị cho tệp sau

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

như sau

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

Thêm phương thức vào api công khai (nhà cung cấp / magento / module-quote / Api / Data / ShippingMethodInterface.php) ??? Không bao giờ làm điều đó.
Pete Jaworski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.