배송 방법에 대한 마 젠토 2 추가 데이터


11

새 배송 방법을 만들고 있는데 배송 요금을 확인하려면 새 열을 추가해야합니다. 데이터는 사용자 정의 운송 방법 설정 (예 : 분석법 설명)에서 가져옵니다. 또는 고객이 정보를 추가 할 수있는 일부 입력 필드 (데이터는 따옴표로 묶고 나중에 순서대로 저장 될 수 있음)

아마도 가장 쉬운 부분은 다음을 사용하여 템플릿을 구현하는 것입니다.

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 rates ()에서 가져옵니다. 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>

그 후 무언가 실제로 수집되는 동안 많은 단계가 있습니다. 나는 찾았다

마 젠토 \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject ()

가장 유망한 것처럼 보였지만 속성을 추가하려고하면 아무 일도 일어나지 않습니다.

내 질문은 실제로 배송료에 새로운 데이터를 추가하는 방법이 있는지 여부입니다. 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 파일에서 아래와 같이 Magento \ Quote \ Model \ Cart \ ShippingMethodConverter의 modelToDataObject ()를 재정의하는 플러그인을 추가하십시오.

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

이 모든 것이 끝나면 fronend에서 다음과 같은 설명을 얻을 수 있습니다.

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

작동하지 않습니다.
Dhaduk Mitesh

3

\ Magento \ Quote \ Model \ Quote \ Address \ Rate 클래스 내에 "설명"값을 설정하는 것을 잊었 기 때문에 최상위 답변이 작동하지 않습니다 . 이 클래스에서 Description 값을 설정하기 위해 플러그인을 만들지 않으면 $ 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>

[공급 업체] / [모듈] / 플러그인 / 캐리어 /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 setup : di : compile을 실행하는 것을 잊지 마십시오. 그렇지 않으면 확장 속성이 생성되지 않습니다.

다음을 사용하여 데이터를 템플릿에 바인딩 할 수 있습니다.

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

또는 다음과 같이 의견으로 :

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

또한 맞춤 이동 통신사 확장 프로그램 내에서 $ method-> setDescription ( '귀하의 사용자 정의 설명 여기') 또는 $ method-> setData ( 'description', '귀하의 사용자 정의 설명 여기') 를 사용하는 것을 잊지 마십시오 ( 원래 질문 참조). 참고).


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에 메소드 추가하기 (공급 업체 / 마 젠토 / 모듈 따옴표 / Api / 데이터 /ShippingMethodInterface.php) ??? 그렇게하지 마십시오.
피트 Jaworski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.