Magento 2 kasası - gönderim adresi ve gönderim yöntemi arasına özel bir alan ekleyin


21

Gönderim adresi ve gönderim yöntemi bölümleri arasında özel bir alan eklemeye çalışıyorum . Ve bu alanın değerleri hem saklanabilir istiyorum quoteve sales_ordersonuçta tablolar. Bu, "sipariş yorumu" alanı eklemeye benzer bir şeydir, ancak bu alanın gönderim adresi bölümünden hemen sonra ve gönderim yöntemi bölümünden önce görünmesi gerekir.

Magento dev , kasaya nasıl özel bir alan ve özel bir form ekleneceği konusunda rehberlik ettim ve bir dereceye kadar bir çözüm uyguladım.

Şimdiye kadar ne yaptım:

  1. checkout_index_index.xmlDüzen güncellendi, uiComponent"shippingAddress" öğesinin altına yeni (kapsayıcı) eklendi .
  2. İstediğim elemanı (alanı) kabın içine ekledim.
  3. Özel modülümdeki /js/view/shipping.jsve öğelerini geçersiz kıl shipping.phtml.
  4. Yukarıda belirtilen kapsayıcıyı shipping.phtml, ödeme gönderim adresi ile gönderim yöntemi arasında (yeni bir statik form eklemeye benzer bir şey) çağırdı

Şimdi istediğim alan tam olarak istediğim yerde sayfadaki kasada işleniyor. Ancak aşağıdaki sorunlarla karşılaştım.

  1. Yukarıda eklediğim özel alanın değerine nasıl erişilir? Bir shippingAddress uzantısı özniteliği değerini kaydetmeye çalışıyorum. setShippingInformationActionİçine aşağıdakileri yapmaya çalışan bir mixin ekledim

    shippingAddress['extension_attributes']['custom_field'] = shippingAddress.customAttributes['custom_field'];

Ancak öğe içinde olmadığı için yukarıdaki kod aslında başarısız oluyor shipping-address-fieldset. Değeri windoweleman aracılığıyla elde edebilirim . Ancak buna Magento üzerinden erişmenin bir yolu var mı?

  1. Bu öğenin değerini yerel önbellek depolama alanına ( Magento_Checkout/js/checkout-data) kaydetmenin bir yolu var, böylece sayfa yenilendikten sonra bile değer devam edecek mi?


Lütfen aşağıdaki bağlantıya bakın, size yardımcı olacağını umuyorum magento.stackexchange.com/questions/187847/…
Pradeep Kumar

Yanıtlar:


1

Sorunuza dayanarak, uzantı özelliklerinizin önceden ayarlanmış olduğu varsayımındayım. Benzer bir değişiklik yaptım ve umarım cevabım yardımcı olur.

Özel modülünüzde, varsayılan gönderim işlemcisini / varsayılanı genişletmek için bir requirjs-config dosyası oluşturun

Ad / CustomModule / görünüşüdür / ön / requirejs-config.js
var config = {
    "harita": {
        "*": {
            'Magento_Checkout / js / model / shipping-save-işlemci / varsayılan': 'Namespace_CustomModule / js / model / shipping-save-işlemci / varsayılan'
        }
    }
};

Eklenti niteliğinizi yüke ekleyin.

/ * global tanımla, uyar * *
tanımlamak(
    [
        'Jquery',
        'Ko',
        'Magento_Checkout / js / model / quote',
        'Magento_Checkout / js / model / kaynak-url-manager'
        'Mage / depolama',
        'Magento_Checkout / js / model / ödeme hizmeti',
        'Magento_Checkout / js / modeli / ödeme / yönteme dönüştürücü',
        'Magento_Checkout / js / modeli / hata işlemcisinin,
        'Magento_Checkout / js / modeli / tam ekran yükleyici',
        'Magento_Checkout / js / aksiyon / select-fatura adresi'
    ],
    işlevi (
        $,
        ko,
        alıntı,
        resourceUrlManager,
        depolama,
        paymentService,
        methodConverter,
        errorProcessor,
        fullScreenLoader,
        selectBillingAddressAction
    ) {
        'katı kullanın';

        dönüş {
            saveShippingInformation: function () {
                var yük;

                if (! quote.billingAddress ()) {
                    selectBillingAddressAction (quote.shippingAddress ());
                }
                // Gönderim adresinize uzantı özelliklerini ekleme
                yük = {
                    adres bilgisi: {
                        shipping_address: quote.shippingAdresi (),
                        billing_address: quote.billingAddress (),
                        shipping_method_code: quote.shippingMethod (). yöntem_kodu,
                        shipping_carrier_code: quote.shippingMethod (). taşıyıcı_kodu,
                        extension_attributes: {
                            custom_field: $ ('# custom_field'). val (), 
                        }
                    }
                };

                fullScreenLoader.startLoader ();

                depoyu iade et. posta (
                    resourceUrlManager.getUrlForSetShippingInformation (alıntı),
                    JSON.stringify (payload)
                ) .Done (
                    işlev (yanıt) {
                        quote.setTotals (response.totals);
                        paymentService.setPaymentMethods (methodConverter (response.payment_methods));
                        fullScreenLoader.stopLoader ();
                    }
                ).başarısız(
                    işlev (yanıt) {
                        errorProcessor.process (yanıt);
                        fullScreenLoader.stopLoader ();
                    }
                );
            }
        };
    }
);

Öznitelik bir eklenti ile Alıntı için Kaydet (burada bir gözlemci kullanabilirsiniz emin değilim emin değilim).

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\Checkout\Model\ShippingInformationManagement">
        <plugin name="Namespace_CustomModule_save_delivery_date_in_quote" type="Namespace\CustomModule\Plugin\Checkout\SaveAddressInformation" />
    </type>

</config>

SaveAddressInformation.php

sınıf SaveAddressInformation
{
    korumalı $ quoteRepository;
    kamu işlevi __construct (
        \ Magento \ Quote \ Model \ QuoteRepository $ quoteRepository
    ) {
        $ this-> quoteRepository = $ quoteRepository;
    }
    / **
     * @param \ Magento \ Checkout \ Model \ ShippingInformationManagement $ konu
     * @param $ cartId
     * @param \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface $ addressInformation
     * /
    kamu fonksiyonu önceSaveAddressInformation (
        \ Magento \ Checkout \ Model \ ShippingInformationManagement $ konu,
        $ CartId,
        \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface $ addressInformation
    ) {
        $ extensionAttributes = $ addressInformation-> getExtensionAttributes ();
        $ customField = $ extensionAttributes-> getCustomField ();
        $ quote = $ this-> quoteRepository-> getActive ($ cartId);
        $ Quote-> setCustomField ($ customField);

    }
}

Özniteliği bir Observer events.xml ile siparişinize kaydedin

<?xml version="1.0" encoding="UTF-8"?>
<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="unique_observer_name" instance="Namespace\CustomModule\Observer\SaveCustomFieldToOrder"/>
    </event>
</config>

SaveCustomFieldToOrder.php

sınıf SaveCustomFieldToOrder ObserverInterface uygular
{
    / **
     * @var \ Magento \ Framework \ ObjectManagerInterface
     * /
    korumalı $ _objectManager;

    / **
     * @param \ Magento \ Framework \ ObjectManagerInterface $ objectmanager
     * /
    public function __construct (\ Magento \ Framework \ ObjectManagerInterface $ objectmanager)
    {
        $ this -> _ objectManager = $ objectmanager;
    }

    ortak işlev yürütme (EventObserver $ observer)
    {
        $ order = $ observer-> getOrder ();
        $ quoteRepository = $ this -> _ objectManager-> create ('Magento \ Quote \ Model \ QuoteRepository');
        / ** @var \ Magento \ Quote \ Model \ Quote $ quote * /
        $ quote = $ quoteRepository-> get ($ order-> getQuoteId ());
        $ order-> setCustomField ($ quote-> getCustomField ());

        $ $ döndür;
    }
}


Temel yöntemleri geçersiz kılmak çok şanslı değil. Başka bir modül sizinkini geçersiz kılarsa ne olur? magento.stackexchange.com/questions/135969/…
vaso123

iyi bir nokta, alternatif yöntemin farkında değildi. işaret ettiğiniz için teşekkürler.
NathanielR

@ vaso123 Görünüşe göre bir şeyin farkında değilim çünkü burada Nathaniel bir eklenti ve bir olay-gözlemci yarattı, böylece hangi çekirdek fonksiyon burada geçersiz kılındı. Biraz daha açıklayabilir misiniz, gerçekten yardımcı olur ... Teşekkürler
Sarvagya

@ Sarvagya Js gerektirirken kullanmayın map *, bunun yerine mixin kullanın.
vaso123

@ vaso123 Sanırım Magento_Checkout / js / model / shipping-save-işlemci / default ': -save-işlemci / varsayılan. } Bunu yazdığımdan bu yana bir süre geçti, bu yüzden Sarvagya yanılıyorsam lütfen beni düzeltin.
NathanielR

0

Bu \Magento\Checkout\Block\Checkout\LayoutProcessor::processyöntem için bir eklenti oluşturun .

Bu yolda di.xml dosyasına bir giriş yapın

app/code/CompanyName/Module/etc/frontend/di.xml

Bu Dizin üzerinde eklenti sınıfı oluşturun.

app/code/CompanyName\Module\Model\Plugin\Checkout

2 => Bu Dizin üzerinde eklenti sınıfı oluşturun. app/code/CompanyName\Module\Model\Plugin\Checkout

    $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
    ['shippingAddress']['children']['shipping-address-fieldset']['children']['custom_field'] = [
        'component' => 'Magento_Ui/js/form/element/abstract',
        'config' => [
            'customScope' => 'shippingAddress.custom_attributes',
            'template' => 'ui/form/field',
            'elementTmpl' => 'ui/form/element/input',
            'options' => [],
            'id' => 'custom-field'
        ],
        'dataScope' => 'shippingAddress.custom_attributes.custom_field',
        'label' => 'Custom Field',
        'provider' => 'checkoutProvider',
        'visible' => true,
        'validation' => [],
        'sortOrder' => 250,
        'id' => 'custom-field'
    ];


    return $jsLayout;
}

}

Bu yapıldıktan sonra, ödeme sayfasını kontrol edin.

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.