Magento 2 Gönderim yöntemine açılır liste ekle


16

Bazı lojistik şirketleri için nakliye yöntemi geliştiriyorum. Bu şirketin müşterinin siparişini alabileceği birçok ofisi vardır. API listesi tarafından ofisler listesi alabilirsiniz ama şimdi nasıl daha iyi bu adımı temsil yok?

Şimdilik sadece \Magento\Quote\Model\Quote\Address\RateResult\Method şehirdeki her ofise yeni ayarladım , büyük şehirde sayım> 100 ve kasada 100 satır ayarlamak çok iyi değil.

Farklı ödeme tasarımı için genel modül olacak, bu yüzden nakliye yöntemimin yakınında, ofislerin listesini içeren bir açılır liste nasıl oluşturabilirim ve kullanıcı birini seçtikten sonra fiyat ve yöntemi ayarlayabilirim.


@Zefiryn Bu yazıyı çok ilginç buldum, ancak bir sorum var, seçimlerde ofislerde değil, Amasty'nin modülündeki mağazalarda göstermek zorunda kalırsam, yazınızın ikinci bölümünü nasıl yaparım? Demek istediğim: Nerede xml bileşeni "vendor_carrier_form" doldurmak için Amasty yardımcısı diyoruz? Teşekkürler
maverickk89

Yeni bir sorunuz varsa, lütfen Soru Sor düğmesini tıklayarak sorun . Bağlam sağlamaya yardımcı oluyorsa bu soruya bir bağlantı ekleyin. - Yorumdan
Jai

bu yeni bir soru değil, Zefiryn'in kullandığı yolun bir varyasyonu ... çünkü yazının ilk bölümünü olduğu gibi kullandım
maverickk89

Yanıtlar:


17

Magento checkout, gönderim yöntemi ek verileri için herhangi bir formu desteklemez. Ancak shippingAdditionalkasada bunun için kullanılabilecek blok sağlar . Aşağıdaki çözüm standart magento kasası için çalışacaktır.

Önce kabımızı bir form koyabileceğimiz yere hazırlayalım. Bunu yapmak için bir dosya oluşturunview/frontend/layout/checkout_index_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="checkout.root">
            <arguments>
                <argument name="jsLayout" xsi:type="array">
                    <item name="components" xsi:type="array">
                        <item name="checkout" xsi:type="array">
                            <item name="children" xsi:type="array">
                                <item name="steps" xsi:type="array">
                                    <item name="children" xsi:type="array">
                                        <item name="shipping-step" xsi:type="array">
                                            <item name="children" xsi:type="array">
                                                <item name="shippingAddress" xsi:type="array">
                                                    <item name="children" xsi:type="array">
                                                        <item name="shippingAdditional" xsi:type="array">
                                                            <item name="component" xsi:type="string">uiComponent</item>
                                                            <item name="displayArea" xsi:type="string">shippingAdditional</item>
                                                            <item name="children" xsi:type="array">
                                                                <item name="vendor_carrier_form" xsi:type="array">
                                                                    <item name="component" xsi:type="string">Vendor_Module/js/view/checkout/shipping/form</item>
                                                                </item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                        </item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

Şimdi içinde bir dosya oluşturun Vendor/Module/view/frontend/web/js/view/checkout/shipping/form.js bir nakavt şablonu oluşturun. İçeriği şuna benzer

define([
    'jquery',
    'ko',
    'uiComponent',
    'Magento_Checkout/js/model/quote',
    'Magento_Checkout/js/model/shipping-service',
    'Vendor_Module/js/view/checkout/shipping/office-service',
    'mage/translate',
], function ($, ko, Component, quote, shippingService, officeService, t) {
    'use strict';

    return Component.extend({
        defaults: {
            template: 'Vendor_Module/checkout/shipping/form'
        },

        initialize: function (config) {
            this.offices = ko.observableArray();
            this.selectedOffice = ko.observable();
            this._super();
        },

        initObservable: function () {
            this._super();

            this.showOfficeSelection = ko.computed(function() {
                return this.ofices().length != 0
            }, this);

            this.selectedMethod = ko.computed(function() {
                var method = quote.shippingMethod();
                var selectedMethod = method != null ? method.carrier_code + '_' + method.method_code : null;
                return selectedMethod;
            }, this);

            quote.shippingMethod.subscribe(function(method) {
                var selectedMethod = method != null ? method.carrier_code + '_' + method.method_code : null;
                if (selectedMethod == 'carrier_method') {
                    this.reloadOffices();
                }
            }, this);

            this.selectedOffice.subscribe(function(office) {
                if (quote.shippingAddress().extensionAttributes == undefined) {
                    quote.shippingAddress().extensionAttributes = {};
                }
                quote.shippingAddress().extensionAttributes.carrier_office = office;
            });


            return this;
        },

        setOfficeList: function(list) {
            this.offices(list);
        },

        reloadOffices: function() {
            officeService.getOfficeList(quote.shippingAddress(), this);
            var defaultOffice = this.offices()[0];
            if (defaultOffice) {
                this.selectedOffice(defaultOffice);
            }
        },

        getOffice: function() {
            var office;
            if (this.selectedOffice()) {
                for (var i in this.offices()) {
                    var m = this.offices()[i];
                    if (m.name == this.selectedOffice()) {
                        office = m;
                    }
                }
            }
            else {
                office = this.offices()[0];
            }

            return office;
        },

        initSelector: function() {
            var startOffice = this.getOffice();
        }
    });
});

Bu dosya, yerleştirilmesi gereken nakavt şablonunu kullanıyor Vendor/Module/view/frontend/web/template/checkout/shipping/form.html

<div id="carrier-office-list-wrapper" data-bind="visible: selectedMethod() == 'carrier_method'">
    <p data-bind="visible: !showOfficeSelection(), i18n: 'Please provide postcode to see nearest offices'"></p>
    <div data-bind="visible: showOfficeSelection()">
        <p>
            <span data-bind="i18n: 'Select pickup office.'"></span>
        </p>
        <select id="carrier-office-list" data-bind="options: offices(),
                                            value: selectedOffice,
                                            optionsValue: 'name',
                                            optionsText: function(item){return item.location + ' (' + item.name +')';}">
        </select>
    </div>
</div>

Artık yöntemimiz (koduyla tanımlanır) gönderim yöntemleri tablosunda seçildiğinde görünecek bir seçim alanımız var. Bazı seçeneklerle doldurma zamanı. Değerler adrese bağlı olduğundan, en iyi yol, kullanılabilir seçenekler sağlayacak dinlenme uç noktası oluşturmaktır. İçindeVendor/Module/etc/webapi.xml

<?xml version="1.0"?>

<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">

    <!-- Managing Office List on Checkout page -->
    <route url="/V1/module/get-office-list/:postcode/:city" method="GET">
        <service class="Vendor\Module\Api\OfficeManagementInterface" method="fetchOffices"/>
        <resources>
            <resource ref="anonymous" />
        </resources>
    </route>
</routes>

Şimdi arayüzü tanımlayın Vendor/Module/Api/OfficeManagementInterface.php olarak

namespace Vendor\Module\Api;

interface OfficeManagementInterface
{

    /**
     * Find offices for the customer
     *
     * @param string $postcode
     * @param string $city
     * @return \Vendor\Module\Api\Data\OfficeInterface[]
     */
    public function fetchOffices($postcode, $city);
}

Office verileri için arabirimi tanımlayın Vendor\Module\Api\Data\OfficeInterface.php . Bu arayüz, webapi modülü tarafından çıkış verilerini filtrelemek için kullanılacaktır, bu nedenle yanıta ne eklemeniz gerektiğini tanımlamanız gerekir.

namespace Vendor\Module\Api\Data;

/**
 * Office Interface
 */
interface OfficeInterface
{
    /**
     * @return string
     */
    public function getName();

    /**
     * @return string
     */
    public function getLocation();
}

Gerçek ders zamanı. İçindeki tüm arayüzler için tercihler oluşturmaya başlayınVendor/Module/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">
    <preference for="Vendor\Module\Api\OfficeManagementInterface" type="Vendor\Module\Model\OfficeManagement" />
    <preference for="Vendor\Module\Api\Data\OfficeInterface" type="Vendor\Module\Model\Office" />
</config>

Şimdi oluştur Vendor\Module\Model\OfficeManagement.php aslında veri alma mantığını yapacak bir sınıf .

namespace Vednor\Module\Model;

use Vednor\Module\Api\OfficeManagementInterface;
use Vednor\Module\Api\Data\OfficeInterfaceFactory;

class OfficeManagement implements OfficeManagementInterface
{
    protected $officeFactory;

    /**
     * OfficeManagement constructor.
     * @param OfficeInterfaceFactory $officeInterfaceFactory
     */
    public function __construct(OfficeInterfaceFactory $officeInterfaceFactory)
    {
        $this->officeFactory = $officeInterfaceFactory;
    }

    /**
     * Get offices for the given postcode and city
     *
     * @param string $postcode
     * @param string $limit
     * @return \Vendor\Module\Api\Data\OfficeInterface[]
     */
    public function fetchOffices($postcode, $city)
    {
        $result = [];
        for($i = 0, $i < 4;$i++) {
            $office = $this->officeFactory->create();
            $office->setName("Office {$i}");
            $office->setLocation("Address {$i}");
            $result[] = $office;
        }

        return $result;
    }
}

Ve son OfficeInterfaceolarakVendor/Module/Model/Office.php

namespace Vendor\Module\Model;

use Magento\Framework\DataObject;
use Vendor\Module\Api\Data\OfficeInterface;

class Office extends DataObject implements OfficeInterface
{
    /**
     * @return string
     */
    public function getName()
    {
        return (string)$this->_getData('name');
    }

    /**
     * @return string
     */
    public function getLocation()
    {
        return (string)$this->_getData('location');
    }
}

Bu, seçim alanını göstermeli ve adres değiştirildiğinde güncellemelidir. Ancak, ön uç manipülasyonu için bir öğe daha eksik. Bitiş noktasını çağıracak bir fonksiyon yaratmamız gerekiyor. Buna çağrı zaten dahil edilmiştir Vendor/Module/view/frontend/web/js/view/checkout/shipping/form.jsve aşağıdaki kodla Vendor_Module/js/view/checkout/shipping/office-servicegitmesi gereken bir sınıftır Vendor/Module/view/frontend/web/js/view/checkout/shipping/office-service.js:

define(
    [
        'Vendor_Module/js/view/checkout/shipping/model/resource-url-manager',
        'Magento_Checkout/js/model/quote',
        'Magento_Customer/js/model/customer',
        'mage/storage',
        'Magento_Checkout/js/model/shipping-service',
        'Vendor_Module/js/view/checkout/shipping/model/office-registry',
        'Magento_Checkout/js/model/error-processor'
    ],
    function (resourceUrlManager, quote, customer, storage, shippingService, officeRegistry, errorProcessor) {
        'use strict';

        return {
            /**
             * Get nearest machine list for specified address
             * @param {Object} address
             */
            getOfficeList: function (address, form) {
                shippingService.isLoading(true);
                var cacheKey = address.getCacheKey(),
                    cache = officeRegistry.get(cacheKey),
                    serviceUrl = resourceUrlManager.getUrlForOfficeList(quote);

                if (cache) {
                    form.setOfficeList(cache);
                    shippingService.isLoading(false);
                } else {
                    storage.get(
                        serviceUrl, false
                    ).done(
                        function (result) {
                            officeRegistry.set(cacheKey, result);
                            form.setOfficeList(result);
                        }
                    ).fail(
                        function (response) {
                            errorProcessor.process(response);
                        }
                    ).always(
                        function () {
                            shippingService.isLoading(false);
                        }
                    );
                }
            }
        };
    }
);

2 js dosyası daha kullanır. Vendor_Module/js/view/checkout/shipping/model/resource-url-manageruç noktaya bir url oluşturur ve oldukça basittir

define(
    [
        'Magento_Customer/js/model/customer',
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/url-builder',
        'mageUtils'
    ],
    function(customer, quote, urlBuilder, utils) {
        "use strict";
        return {
            getUrlForOfficeList: function(quote, limit) {
                var params = {postcode: quote.shippingAddress().postcode, city: quote.shippingAddress().city};
                var urls = {
                    'default': '/module/get-office-list/:postcode/:city'
                };
                return this.getUrl(urls, params);
            },

            /** Get url for service */
            getUrl: function(urls, urlParams) {
                var url;

                if (utils.isEmpty(urls)) {
                    return 'Provided service call does not exist.';
                }

                if (!utils.isEmpty(urls['default'])) {
                    url = urls['default'];
                } else {
                    url = urls[this.getCheckoutMethod()];
                }
                return urlBuilder.createUrl(url, urlParams);
            },

            getCheckoutMethod: function() {
                return customer.isLoggedIn() ? 'customer' : 'guest';
            }
        };
    }
);

Vendor_Module/js/view/checkout/shipping/model/office-registrysonucu yerel depolamada tutmanın bir yoludur. Kodu:

define(
    [],
    function() {
        "use strict";
        var cache = [];
        return {
            get: function(addressKey) {
                if (cache[addressKey]) {
                    return cache[addressKey];
                }
                return false;
            },
            set: function(addressKey, data) {
                cache[addressKey] = data;
            }
        };
    }
);

Tamam, bu yüzden hepimiz ön uç üzerinde çalışmalıyız. Ama şimdi çözülmesi gereken bir sorun daha var. Ödeme bu form hakkında hiçbir şey bilmediğinden, seçim sonucunu arka uca göndermez. Bunu yapmak için extension_attributesözelliği kullanmamız gerekiyor . Bu, magento2'de, bazı ek verilerin geri kalan çağrılarda olması beklendiğini sisteme bildirmenin bir yoludur. Bu olmadan magento bu verileri filtreleyecek ve asla koda ulaşmayacaktı.

İlk önce Vendor/Module/etc/extension_attributes.xmltanımlayın:

<?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\AddressInterface">
        <attribute code="carrier_office" type="string"/>
    </extension_attributes>
</config>

Bu değer, önceden isteğe sokulur form.jstarafından this.selectedOffice.subscribe()tanımı. Yani yukarıdaki yapılandırma sadece girişte geçecektir. Kodda getirmek için bir eklenti oluşturunVendor/Module/etc/di.xml

<type name="Magento\Quote\Model\Quote\Address">
    <plugin name="inpost-address" type="Vendor\Module\Quote\AddressPlugin" sortOrder="1" disabled="false"/>
</type>

Bu sınıfın içinde

namespace Vendor\Module\Plugin\Quote;

use Magento\Quote\Model\Quote\Address;
use Vendor\Module\Model\Carrier;

class AddressPlugin
{
    /**
     * Hook into setShippingMethod.
     * As this is magic function processed by __call method we need to hook around __call
     * to get the name of the called method. after__call does not provide this information.
     *
     * @param Address $subject
     * @param callable $proceed
     * @param string $method
     * @param mixed $vars
     * @return Address
     */
    public function around__call($subject, $proceed, $method, $vars)
    {
        $result = $proceed($method, $vars);
        if ($method == 'setShippingMethod'
            && $vars[0] == Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE
            && $subject->getExtensionAttributes()
            && $subject->getExtensionAttributes()->getCarrierOffice()
        ) {
            $subject->setCarrierOffice($subject->getExtensionAttributes()->getCarrierOffice());
        }
        elseif (
            $method == 'setShippingMethod'
            && $vars[0] != Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE
        ) {
            //reset office when changing shipping method
            $subject->getCarrierOffice(null);
        }
        return $result;
    }
}

Tabii değeri nereye kurtaracağınız tamamen gereksinimlerinize bağlıdır. Yukarıdaki kod ek sütun oluşturmaya gerektirecektir carrier_officeiçinde quote_addressve sales_address(tablo ve bir olay Vendor/Module/etc/events.xml)

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_model_service_quote_submit_before">
        <observer name="copy_carrier_office" instance="Vendor\Module\Observer\Model\Order" />
    </event>
</config>

Bu, teklif adresine kaydedilen verileri satış adresine kopyalar.

Lehçe taşıyıcı InPost için modülüm için yazdım, bu yüzden kodu kırabilecek bazı isimleri değiştirdim, ancak umarım bu size ihtiyacınız olanı verecektir.

[DÜZENLE]

@Sangan tarafından sorulan taşıyıcı modeli

namespace Vendor\Module\Model;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Phrase;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Carrier\AbstractCarrier;
use Magento\Shipping\Model\Carrier\CarrierInterface;
use Magento\Shipping\Model\Simplexml\ElementFactory;

class Carrier extends AbstractCarrier implements CarrierInterface
{
    const CARRIER_CODE = 'mycarier';

    const METHOD_CODE = 'mymethod';

    /** @var string */
    protected $_code = self::CARRIER_CODE;

    /** @var bool */
    protected $_isFixed = true;

    /**
     * Prepare stores to show on frontend
     *
     * @param RateRequest $request
     * @return \Magento\Framework\DataObject|bool|null
     */
    public function collectRates(RateRequest $request)
    {
        if (!$this->getConfigData('active')) {
            return false;
        }

        /** @var \Magento\Shipping\Model\Rate\Result $result */
        $result = $this->_rateFactory->create();

        /** @var \Magento\Quote\Model\Quote\Address\RateResult\Method $method */
        $method = $this->_rateMethodFactory->create();
        $method->setCarrier($this->_code);
        $method->setCarrierTitle($this->getConfigData('title'));

        $price = $this->getFinalPriceWithHandlingFee(0);
        $method->setMethod(self::METHOD_CODE);
        $method->setMethodTitle(new Phrase('MyMethod'));
        $method->setPrice($price);
        $method->setCost($price);
        $result->append($method);;

        return $result;
    }


    /**
     * @return array
     */
    public function getAllowedMethods()
    {
        $methods = [
            'mymethod' => new Phrase('MyMethod')
        ];
        return $methods;
    }
}

Genişletilmiş cevabınız için teşekkür ederim, yönteminizi kullanarak sorunumu çözmeye çalışacağım ve bu gün sonuçla cevap vereceğim.
Siarhey Uchukhlebau

@Zefiryn Özel bir gönderim yöntemi oluşturdum, altında müşterinin gönderim hesap numaralarına sahip bir açılır liste görüntülenecek (özel bir müşteri özelliği oluşturuldu), bu yüzden bu açılır listeyi görüntülemek zorunda kalırsam kodunuzun yüzde kaçı yararlı olur? Sağladığınız koddan ne almalıyım?
Shireen N

@shireen yaklaşık% 70 diyebilirim. Makineleri getirdiği bölümü hesap numaralarına değiştirmeniz gerekir. Yani api tanımı slighlty farklı ve js bir parçası olacak
Zefiryn

ben bu modülü denedim ... ama onun kadar herhangi module.if çalışma paylaşabilir lütfen herhangi bir değişiklik göstermeyen
Sangan

başarılı modül ekledikten sonra .. kasada ajax sürekli yükleniyor .. konsol hatası aşağıdaki gibi gösteren: requir.js: 166 Yakalanma Hatası: Komut dosyası hatası: Vendor_Module / js / view / checkout / shipping / model / office-register. requirjs.org/docs/errors.html#scripterror
sangan

2

Daha önce verilenleri deforme etmeden genişletmek için yeni bir cevap ekliyorum.

Bu, QuoteAddressPluginiçine bağlanan yoldur :

1. Magento\Checkout\Api\ShippingInformationManagementInterface::saveAddressInformation()
2. Magento\Quote\Model\QuoteRepository::save() 
3. Magento\Quote\Model\QuoteRepository\SaveHandler::save() 
4. Magento\Quote\Model\QuoteRepository\SaveHandler::processShippingAssignment() 
5. Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentPersister::save()
6. Magento\Quote\Model\Quote\ShippingAssignment\ShippingAssignmentProcessor::save()
7. Magento\Quote\Model\Quote\ShippingAssignment\ShippingProcessor::save()
8. Magento\Quote\Model\ShippingMethodManagement::apply() 

Son yöntem, Magento\Quote\Model\Quote\Address::setShippingMethod()aslında kullandığım çağrı Magento\Quote\Model\Quote\Address::__call()olan çağrı oldu . Şu anda eklenti için daha iyi bir yer buldum, Magento\Quote\Model\ShippingAssignment::setShipping()yöntem. Eklenti kısmı şu şekilde yeniden yazılabilir:

<type name="Magento\Quote\Model\ShippingAssignment">
    <plugin name="carrier-office-plugin" type="Vendor\Module\Plugin\Quote\ShippingAssignmentPlugin" sortOrder="1" disabled="false"/>
</type>

ve eklentinin kendisi:

namespace Vednor\Module\Plugin\Quote;

use Magento\Quote\Api\Data\AddressInterface;
use Magento\Quote\Api\Data\ShippingInterface;
use Magento\Quote\Model\ShippingAssignment;
use Vendor\Module\Model\Carrier;

/**
 * ShippingAssignmentPlugin
 */
class ShippingAssignmentPlugin
{
    /**
     * Hook into setShipping.
     *
     * @param ShippingAssignment $subject
     * @param ShippingInterface $value
     * @return Address
     */
    public function beforeSetShipping($subject, ShippingInterface $value)
    {
        $method = $value->getMethod();
        /** @var AddressInterface $address */
        $address = $value->getAddress();
        if ($method === Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE
            && $address->getExtensionAttributes()
            && $address->getExtensionAttributes()->getCarrierOffice()
        ) {
            $address->setCarrierOffice($address->getExtensionAttributes()->getCarrierOffice());
        }
        elseif ($method !== Carrier::CARRIER_CODE.'_'.Carrier::METHOD_CODE) {
            //reset inpost machine when changing shipping method
            $address->setCarrierOffice(null);
        }
        return [$value];
    }
}

1

@Zefiryn, sorunla karşılaştım: quote.shippingAddress().extensionAttributes.carrier_office = office;

Ne zaman bir konuk olarak ilk kez (yeni özel pencere) check-in (ama aynı kayıtlı kullanıcı ile oluşur) öznitelik ofisi ilk "sonraki" sonra veritabanına kaydedilmez. Konsolda olmasına rağmen aşağıdakiler için doğru çıktıyı görüyorum:console.log(quote.shippingAddress().extensionAttributes.carrier_office);

İlk ödeme sayfasına dönüp tekrar ofis seçtiğimde kaydedilir. Bu davranışın nedeni ne olabilir?

Kullanmaya çalıştım: address.trigger_reload = new Date().getTime(); rateRegistry.set(address.getKey(), null); rateRegistry.set(address.getCacheKey(), null); quote.shippingAddress(address);

ama başarı olmadan ...


0

@Zefiryn, Yukarıdaki eklentinizin nasıl çalıştığını birkaç kelimeyle açıklayabilir misiniz? Biraz kafam karıştı, çünkü bildiğim gibi, belirli bir nesne için mevcut olmayan bir yöntemi çalıştırdığımızda __call yöntemi yürütülüyor. Bu doğru gibi görünüyor çünkü app / code / Magento / Quote / Model / Quote / Address.php Ben böyle bir yöntem görmüyorum - sadece yorum:

/** * Sales Quote address model ... * @method Address setShippingMethod(string $value)

  1. Metot uygulaması olmadığında neden ele geçirme yöntemini kullanıyorsunuz?
  2. Sonra görüyorum $subject->setInpostMachineve $subject->getCarrierOffice(null);Adress Class'ta setInpostMachine () ve getCarrierOffice () yöntemi olmadığı için yukarıdaki eklentinin yönteminin tekrar çalıştırılacağı anlamına mı geliyor? Bana bir döngü gibi geliyor.
  3. Magento nerede çalışır setShippingMethod()? Bu yöntem normal olarak nasıl kullanılır? Magento kodunda herhangi bir benzer kesişme bulamıyorum.

Tamam, bu yüzden cevabı test için yazdığım bir modüle dayanarak hazırladım, inpost_machine alanını kullandı, bu yüzden bu sadece bu yerde doğru bir şekilde carrier_office olarak değiştirilmedi. İkincisi, bu modülü geliştirdiğimde setShippingMethod, AddressInterfacenesne üzerinde çağrı dışında gönderilen uzantı özniteliklerine sahip hem seçilen taşıyıcıyı hem de adresi alabileceğim bir yer bulamadım ve böyle bir yöntem olmadığından, setShippingMethodveya başka bir sihirli alan deniyordu. Şu anda daha iyi bir yer buldum ve yeni cevapta göndereceğim.
Zefiryn
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.