Magento 2 ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดส่ง


12

ฉันกำลังสร้างวิธีการจัดส่งใหม่และฉันต้องการเพิ่มคอลัมน์ใหม่เพื่อเช็คเอาต์การจัดส่ง ข้อมูลจะมาจากการตั้งค่าวิธีการจัดส่งที่กำหนดเองเช่นคำอธิบายวิธีการ หรือฟิลด์ป้อนข้อมูลบางอย่างที่ลูกค้าสามารถเพิ่มข้อมูล (ข้อมูลอาจจะถูกบันทึกไว้ในใบเสนอราคาและในภายหลังตามลำดับ)

น่าจะเป็นส่วนที่ง่ายที่สุดของทั้งหมดคือการใช้แม่แบบโดยใช้

Magento_Checkout/web/template/shipping.html

มันแค่ต้องการสิ่งนี้

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

ปัญหาคือฉันไม่สามารถหาวิธีเพิ่มข้อมูลที่กำหนดเองได้ ยังไม่พอที่จะเพิ่ม:

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

ข้อมูลสำหรับ html มาจากอัตรา js () ซึ่งรับข้อมูลจาก 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>

หลังจากนี้มีหลายขั้นตอนในขณะที่บางสิ่งบางอย่างได้รับการรวบรวมจริง ฉันพบ

วีโอไอพี \ อ้าง \ แบบจำลอง \ รถเข็น \ การจัดส่งวิธีการแปลงรูปแบบไปยัง DataObject ()

ที่ดูมีแนวโน้มมากที่สุด แต่ถ้าฉันพยายามที่จะเพิ่มคุณลักษณะของฉันไปที่มันไม่มีอะไรเกิดขึ้น

ดังนั้นคำถามของฉันคือถ้ามีวิธีเพิ่มข้อมูลใหม่ในอัตราค่าจัดส่งจริงหรือไม่ ใน M1 มันเป็นไปได้ มันคงจะบ้าถ้า M2 มันเป็นไปไม่ได้

มีหลายสาเหตุที่ควรเป็นไปได้ ตัวอย่างเช่นถ้าฉันต้องการทำให้วิธีการรับสินค้าที่มีร้านค้าหลายรายการเลื่อนลงหรือสิ่งที่คล้ายกัน


สวัสดีถ้าคุณมีวิธีแก้ปัญหาคุณสามารถแบ่งปันได้มั้ย
konika

ทีนี้วิธีแก้ปัญหานี้คืออะไร?
Piyush Dangre

ฉันรอคำตอบนี้
Diego Queiroz

คำตอบ:


6

คุณต้องทำสิ่งนี้โดยเพิ่มคำอธิบายเป็นแอตทริบิวต์ส่วนขยายดังนี้:

/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="method_description" type="string" />
    </extension_attributes>
</config>

ในไฟล์ etc / di.xml เพิ่มปลั๊กอินสำหรับแทนที่ modelToDataObject () ใน Magento \ Quote \ Model \ Cart \ ShippingMethodConverter ดังด้านล่าง:

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

ไฟล์ปลั๊กอิน Vendor \ module \ Plugin \ Carrier \ Description.php ควรเป็นดังนี้:

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

หลังจากทั้งหมดนี้คุณจะได้รับคำอธิบายเกี่ยวกับการเสริมดังต่อไปนี้:

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

สิ่งนี้ไม่ทำงาน
Dhaduk Mitesh

3

คำตอบที่ติดอันดับยอดนิยมใช้งานไม่ได้เพราะเขาลืมตั้งค่า "คำอธิบาย" ด้านในของ\ Magento \ Quote \ Model \ Quote \ Address \ Rate class หากเราไม่สร้างปลั๊กอินเพื่อตั้งค่าคำอธิบายในคลาสนี้จากนั้น$ rateModel-> getMethodDescription ()จะส่งคืนค่าว่างเสมอ นี่เป็นวิธีแก้ไขปัญหาเวอร์ชันเต็มการทำงาน:

[ผู้ขาย] / [โมดูล] /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>

[ผู้ขาย] / [โมดูล] /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>

[ผู้ขาย] / [โมดูล] /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;
    }
}

และในที่สุดก็:

[ผู้ขาย] / [โมดูล] /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;
    }
}

อย่าลืมเรียกใช้การตั้งค่า bin / magento: di: compile มิฉะนั้นจะไม่สร้างแอตทริบิวต์เพิ่มเติม

คุณสามารถผูกข้อมูลกับแม่แบบของคุณโดยใช้สิ่งนี้:

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

หรือเป็นความคิดเห็นเช่นนี้:

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

อย่าลืมใช้$ method-> setDescription ('คำอธิบายที่กำหนดเองของคุณที่นี่')หรือ$ method-> setData ('คำอธิบาย', 'คำอธิบายที่กำหนดเองของคุณที่นี่')ภายในส่วนขยายผู้ให้บริการกำหนดเองของคุณ อ้างอิง)


0

คุณต้องประกาศชื่อเมธอดในไฟล์อินเตอร์เฟสพา ธ สำหรับไฟล์นี้คือ

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

ตัวอย่าง:
ประกาศค่าคงที่ที่ด้านบน

const KEY_DESCRIPTION = 'description';  

จากนั้นกำหนดวิธีการดังต่อไปนี้

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

จากนั้นคุณต้องกำหนดค่าให้กับไฟล์ต่อไปนี้

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

ดังนี้

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

การเพิ่มวิธีการสาธารณะ api (ผู้ขาย / วีโอไอพี / module-quote / Api / ข้อมูล / ShippingMethodInterface.php) ??? ไม่เคยทำอย่างนั้น
Pete Jaworski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.