Magento 2 gönderim yöntemine ek veriler


13

Yeni gönderim yöntemi yapıyorum ve gönderim ücretlerini kontrol etmek için yeni sütun eklemem gerekiyor. Veriler, örneğin yöntem açıklaması gibi özel gönderim yöntemi ayarlarından gelir. Veya müşterinin bilgi ekleyebileceği bazı giriş alanları (veriler büyük olasılıkla alıntıya ve daha sonra sırayla kaydedilir).

Muhtemelen en kolay kısmı kullanarak şablon uygulamaktır

Magento_Checkout/web/template/shipping.html

Sadece buna ihtiyacı var

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

Sorun, nasıl özel veri ekleneceğini anlayamıyorum. Bunu eklemek yeterli değil:

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 için veriler, API'dan veri alan js rate () yönteminden gelir:

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

Bundan sonra bir şey gerçekten toplanırken birçok adım vardır. buldum

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

en ümit verici görünüyordu ama niteliğimi ona eklemeye çalışırsam hiçbir şey olmaz.

Dolayısıyla sorum şu: Gönderim ücretlerine yeni veri eklemenin bir yolu varsa? M1'de mümkün oldu. M2 mümkün olmasaydı deli olurdu.

Bunun mümkün olmasının birçok nedeni vardır. Örneğin, birden fazla mağaza açılır veya benzer bir şey ile mağaza yönteminde pick up yapmak istedim.


Merhaba, Çözüme sahipseniz lütfen paylaşır mısınız?
konika

Buna bir çözüm var mı?
Piyush Dangre

Bu cevabı bekliyorum.
Diego Queiroz

Yanıtlar:


6

Bunu, aşağıdaki gibi bir uzantı özelliği olarak açıklama ekleyerek yapmanız gerekir:

/etc/extension_attributes.xml şöyle olmalıdır:

<?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 dosyasına Magento \ Quote \ Model \ Cart \ ShippingMethodConverter içindeki modelToDataObject () 'i geçersiz kılmak için bir eklenti ekleyin:

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

Eklenti dosyası Satıcı \ modül \ Plugin \ Carrier \ Description.php şöyle olmalıdır:

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

Tüm bunlardan sonra fronend üzerinde bu açıklamayı aşağıdaki gibi alacaksınız:

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

Bu çalışmıyor.
Dhaduk Mitesh

4

\ Magento \ Quote \ Model \ Quote \ Address \ Rate sınıfının içindeki "description" değerini ayarlamayı unuttuğu için en yüksek puanlı yanıt çalışmaz . Bu sınıftaki Açıklama değerini ayarlamak için bir Eklenti oluşturmazsak, $ rateModel-> getMethodDescription () her zaman boş döner. İşte çözümün tam çalışan bir sürümü:

[Satıcı] / [Modül] /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>

[Satıcı] / [Modül] /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>

[Satıcı] / [Modül] /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;
    }
}

Ve sonunda:

[Satıcı] / [Modül] /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 kurulumunu çalıştırmayı unutmayın: di: compile, aksi takdirde genişletilmiş özellik üretilmez.

Bunu kullanarak verileri şablonunuza bağlayabilirsiniz:

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

Veya yorum olarak, şöyle:

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

Ayrıca , özel Taşıyıcı uzantınızın içinde $ method-> setDescription ('Burada Özel Açıklamanız') veya $ method-> setData ('açıklama', 'Burada Özel Tanımınız') kullanmayı unutmayın (orijinal soruna bakın) referans).


0

Arabirim dosyasındaki yöntem adlarını bildirmeniz gerekir, bu dosyanın yolu

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

Örnek:
Üstte sabit beyan et

const KEY_DESCRIPTION = 'description';  

sonra yöntemi aşağıdaki gibi tanımlayın

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

Ardından aşağıdaki dosyaya değerler atamanız gerekir

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

aşağıdaki gibi

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

1
Genel API'ye yöntem ekleme (vendor / magento / module-quote / Api / Data / ShippingMethodInterface.php) ??? Bunu asla yapma.
Pete Jaworski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.