Magento 2 अतिरिक्त डेटा शिपिंग विधि के लिए


13

मैं नई शिपिंग विधि बना रहा हूं और मुझे शिपिंग दरों की जांच करने के लिए नए कॉलम को जोड़ने की आवश्यकता है। डेटा कस्टम शिपिंग विधि सेटिंग्स से आएगा, उदाहरण के लिए विधि विवरण। या कुछ इनपुट क्षेत्र जहां ग्राहक जानकारी जोड़ सकते हैं (डेटा संभवतः उद्धरण में और बाद में क्रम में सहेजा जाएगा)।

संभवतः सभी का सबसे आसान हिस्सा उपयोग करके टेम्पलेट को लागू करना है

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 दरों () से आता है, जो एपीआई से डेटा प्राप्त करता है:

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

इसके बाद कई चरण होते हैं जबकि कुछ वास्तव में एकत्र हो जाता है। मुझे मिला

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

यह सबसे अधिक आशाजनक लग रहा था, लेकिन अगर मैं इसमें अपनी विशेषता जोड़ने की कोशिश करता हूं, तो कुछ भी नहीं होता है।

तो मेरा सवाल है, अगर वास्तव में शिपिंग दरों में नए डेटा को जोड़ने का कोई तरीका है? एम 1 में यह संभव था। यदि यह संभव नहीं था तो यह पागल होगा।

ऐसा होने के कई कारण हैं। उदाहरण के लिए अगर मैं स्टोर मेथड में पिक अप करना चाहता हूं, तो कई स्टोर ड्रॉप डाउन या कुछ इसी तरह के होते हैं।


नमस्ते, अगर आपको समाधान मिल गया तो कृपया आप साझा कर सकते हैं?
कोनिका

खैर, इसका कोई हल?
पीयूष डांगरे

मैं इस जवाब का इंतजार कर रहा हूं।
डिएगो क्विरोज़

जवाबों:


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 फ़ाइल में नीचे दिए गए मॉडल के अनुसार माडेंटो \ उद्धरण \ मॉडल \ कार्ट \ शिपिंग \ शिपिंगमिथोडकोड में ओवरराइड करने के लिए एक प्लगइन जोड़ें:

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

प्लगइन फ़ाइल विक्रेता \ मॉड्यूल \ प्लगइन \ कैरियर \ विवरण.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>

ये काम नहीं कर रहा है।
धादुक मितेश

4

शीर्ष-रेटेड उत्तर काम नहीं करता है क्योंकि वह \ "Magento \ Quote \ Model \ Quote \ Address \ Address \" वर्ग के अंदर "विवरण" मान सेट करना भूल गया । यदि हम इस वर्ग पर विवरण मान सेट करने के लिए एक प्लगइन नहीं बनाते हैं, तो $ 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;
    }
}

बिन / मजेंटो सेटअप चलाने के लिए मत भूलना: di: संकलित करें, अन्यथा विस्तारित विशेषता उत्पन्न नहीं होगी।

आप इसका उपयोग करके डेटा को अपने टेम्पलेट में बांध सकते हैं:

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

या एक टिप्पणी के रूप में, इस तरह:

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

इसके अलावा $ पद्धति-> सेट डिस्क्रिप्शन ('आपका कस्टम विवरण यहां') या $ पद्धति-> सेटडेटा (' विवरण', 'आपका कस्टम विवरण यहां') का उपयोग अपने कस्टम कैरियर एक्सटेंशन के अंदर करना न भूलें (मूल प्रश्न के लिए मूल प्रश्न देखें) संदर्भ)।


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

1
सार्वजनिक एपीआई (विक्रेता / Magento / मॉड्यूल-उद्धरण / Api / डेटा / ShippingMethodInterface.pp) ??? के लिए विधि जोड़ना कभी मत करो।
पेटे जॉर्स्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.