Magento 2: Ödeme Yöntemi Seçimi için Olay Gözlemcisi


13

Ön uç ödeme sayfasındaki kullanılabilir ödeme yöntemi listesinden herhangi bir ödeme yöntemi seçildiğinde bir gözlemci çağırmam gereken özel bir uzantı üzerinde çalışıyorum.

Biri bana bunun için hangi olay gözlemcisini kullanmam gerektiğini söyleyebilir mi? Özel bir işlevi çağırmalı ve araba ara toplamına ücret eklemeliyim.

resim açıklamasını buraya girin

Yanıtlar:


10

Ne yazık ki, gözlemciler sadece php işlevleri içinde yararlıdır. Bu, bir olayın tetiklenmesi için başlangıçta dispatch()yerel veya özel bir olay dağıtıcısı tarafından gönderilmesi gerektiği anlamına gelir . Bu özel durumda, yapılan işlem bir ödeme yöntemi düğmesinin tıklanmasıdır. Bu tıklama herhangi bir php kodu yürütülmesini tetiklemez, yalnızca Javascript kodu yürütülür.

Magento 2'deki ödeme işlemi çoğunlukla Knockout JS etrafında oluşturulduğundan, çoğu eylem sunucu tarafında php yerine Javascript kullanılarak ön uçta gerçekleşir.

Nakavt JS çok esnektir ve olayları bağlamak ve değişkenleri gözlemlemek mümkündür. Diğer yandan, dik bir öğrenme eğrisi gerektirebilir.

Projenize bakmak için iyi bir açı, bir gözlemci yerine bir denetleyici kullanmak olacaktır:

1. Bir modül oluşturarak başlayalım ...

2. Tetiklendiğinde mantığınızı yapan bir denetleyici oluşturun

Denetleyici yapısı: http://www.example.com/route/controller_folder/action

2.1 Denetleyici Actionsınıfını oluşturun :

Uygulamanın / kod / NameSpace / Modül / Kontrolör / Test / action.php

namespace NameSpace\Module\Controller\Test;

class Action extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        $request = $this->getRequest();
        //EXECUTE YOUR LOGIC HERE
    }
}

2.2 Denetleyicileriniz için bir rota kaydetme

Uygulamanın / kod / NameSpace / Modül / etc / adminhtml / routes.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
  <router id="standard">
     <route id="route" frontName="route">
        <module name="NameSpace_Module" />
    </route>
  </router>
</config>

2.3 Bu ödeme kasada kullanılacağı için rotanızı güvenli URL listesine ekleyin [EDIT]

Uygulamanın / kod / NameSpace / 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\Framework\Url\SecurityInfo">
        <arguments>
            <argument name="secureUrlList" xsi:type="array">
                <item name="route" xsi:type="string">/route/</item>
            </argument>
        </arguments>
    </type>
</config>

3. Aşağıdaki mizanpaj dosyasını kullanarak ödeme sayfasına bir javascript dosyası ekleyin:

Uygulamanın / kod / NameSpace / Modül / görünüm / kullanıcı arayüzü / düzeni / checkout_index_index.xml

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <head>
       <link src="NameSpace_Module::js/payment-method-trigger.js"/>
    </head>
</page>

4. Bu komut dosyasında, bir ödeme yöntemi sekmesine her tıklandığında bir ajax posta isteği göndermek için bir işlev ekleyebilirsiniz.


En İyi Yöntem - Nakavt: Gözlenebilirliğe abone olma

Çekirdek dosyayı genişletmeden / geçersiz kılmadan veya orijinal tıklama işlevini etkilemeden tıklama olayını tetiklemenin en iyi yolu, bir nakavtın Nakavt yardımı ile abone olmasını içerir.

Yöntem 2 - JS sınıfını genişletme [EDIT]

İlk JS sınıfını genişletmenin bir yolu da olmalıdır

define([
    'NameSpace_Module/path/to/original/file', //JS FILE TO EXTEND
], function (originalFile) { //PASS AS A PARAMETER
    'use strict';

    return originalFile.extend({ //EXTEND
        //FUNCTIONS ADDED HERE WILL OVERRIDE FUNCTIONS
        //FROM ORIGINAL CLASS IF ALREADY EXISTS
        someFunction: {
            someLogic();
        },


    });
});

Yöntem 3 - select-payment-method.js geçersiz kılma

Knockout JS ile oynamak bazen hassas olabilir ve bu cevabın amacı için, ödeme yöntemini selectPaymentMethod işlevi tarafından tetiklenen alıntıya kaydetmekten sorumlu işlevi basitçe geçersiz kılacağız. % 100 Knockout JS kullanmaya kıyasla en şık çözüm olmayabilir, ancak gelecekteki bir Magento güncellemesi orijinal işlevi değiştirerek müdahale etmediği sürece herhangi bir işlevi etkilemeden amaçlandığı gibi çalışmalıdır.

Daha iyi anlamak için selectPaymentMethodbu dosyanın 139. satırındaki işlevi bulabilirsiniz :

Magento_Checkout / js / görünüm / ödeme / Default.js

1. Şimdi fonksiyon geçersiz kılma beyan etmek zorunda:

Uygulama / kod / NameSpace'in / modülü / görünüşüdür / ön / requirejs-config.js

var config = {
    map: {
        '*': {
            'Magento_Checkout/js/action/select-payment-method':
                'NameSpace_Module/js/action/payment/select-payment-method'
        }
    }
};

2. Son olarak, ajax çağrı yapmak için küçük bir ek ile ödeme yöntemini seçmek için sorumlu işlevi yeniden kullanın!

Uygulamanın / kod / NameSpace / Modül / görünüm / kullanıcı arayüzü / web / js / eylem / ödeme / seçmek ödeme-method.js

define(
    [
    'jquery',
    'uiComponent',
    'ko',
    'Magento_Checkout/js/model/quote',
    ], function ($, uiComponent, ko, quote) {
        'use strict';

        function () {
            $.ajax({
                showLoader: true,
                url: 'http://www.example.com/route/controller_folder/action',
                data: { action : 1, param : 2},
                type: "POST",
                dataType: 'json'
            }).done(function (data) {
                alert('Request Sent');
            });
        };

        return function (paymentMethod) {
            quote.paymentMethod(paymentMethod);
        }
});

Bir müşteri bir ödeme yöntemi sekmesini her tıkladığında, Javascript yönteminiz denetleyicinize, mantığınızla birlikte php kodunu çalıştıracak bir gönderi ajax isteği gönderir.

Bu, birkaç farklı Magento 2 yönüne dokunur. Sorunuza hızlı ve kolay bir çözüm sunmak istesem de, Magento 2'nin oluşturulma şekli budur. Şimdi, mantığın büyük bir kısmı müşteri tarafında ve hatta daha fazlası, ödeme sistemine yaklaşırken uygulanır.

Ödeme sistemiyle uğraşırken her zaman dikkatli olmayı unutmayın, ödeme sayfasındaki bir hata bir mağazaya çok kötü zarar verebilir.

NOT: Yukarıdaki tüm kodlar test edilmemiştir


Gerçekten iyi bilgi
Pandurang

5

gerektirir

'Magento_Checkout/js/model/quote'

ve gözlemle

quote.paymentMethod.subscribe(function(){console.log('yay')}, null, 'change');

orada gözlemlenmesi gereken çok şey var

var billingAddress = ko.observable(null);
var shippingAddress = ko.observable(null);
var shippingMethod = ko.observable(null);
var paymentMethod = ko.observable(null);
var totals = ko.observable(totalsData);
var collectedTotals = ko.observable({})

1
Teşekkür ederim! Harika çalışıyor! Ayrıca, bir fonksiyon içindeki ödeme yöntemini kontrol etmek istiyorsanız, ilk argümanı kullanabilirsiniz , örneğin: quote.paymentMethod.subscribe(function(method){console.log(method);}, null, 'change');
Siarhey Uchukhlebau

0

Bunlar 2 Buna göre deneyebilirsiniz

app/code/Magento/Payment/Model/Method/Adapter.php 
    payment_method_is_active
    $this->eventManager->dispatch(
        'payment_method_is_active',
        [
    'result' => $checkResult,
    'method_instance' => $this,
    'quote' => $quote
        ]);

Or 
    app/code/Magento/Payment/Model/Method/Adapter.php 
    payment_method_assign_data_
    $this->eventManager->dispatch(
        'payment_method_assign_data_' . $this->getCode(),
        [
    'method' => $this,
    'data' => $data
        ]);
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.