마 젠토 2 : 결제 수단 선택을위한 이벤트 옵저버


13

프런트 엔드 결제 페이지의 사용 가능한 결제 방법 목록에서 결제 방법을 선택할 때 옵저버에게 전화해야하는 사용자 지정 확장 프로그램을 만들고 있습니다.

누구든지 이것을 위해 어떤 이벤트 관찰자를 사용해야하는지 말해 줄 수 있습니까? 사용자 정의 함수를 호출하고 장바구니 소계에 수수료를 추가해야합니다.

여기에 이미지 설명을 입력하십시오

답변:


10

불행히도 옵저버는 PHP 함수 내에서만 유용합니다. 이는 이벤트가 트리거 되려면 처음 dispatch()에 기본 또는 사용자 정의 이벤트 디스패처에 의해 전달되어야 함을 의미합니다 . 이 특정한 경우에 수행되는 조치는 지불 방법 단추를 통한 클릭입니다. 이 클릭은 PHP 코드 실행을 유발하지 않으며 Javascript 코드 만 실행됩니다.

Magento 2의 결제 프로세스는 대부분 Knockout JS를 중심으로 구축되므로 대부분의 작업은 서버 측 PHP 대신 Javascript를 사용하여 프론트 엔드에서 발생합니다.

녹아웃 JS는 매우 유연하며 이벤트를 바인딩하고 변수를 관찰 할 수 있습니다. 반면에 가파른 학습 곡선이 필요할 수 있습니다.

프로젝트를 살펴 보는 좋은 각도는 관찰자 대신 컨트롤러를 사용하는 것입니다.

1. 모듈 만들기부터 시작해 봅시다 ...

2. 트리거 될 때 로직을 수행하는 컨트롤러를 만듭니다.

컨트롤러 구조 : http://www.example.com/route/controller_folder/action

2.1 컨트롤러 Action클래스를 만듭니다 :

app / code / NameSpace / Module / Controller / 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 컨트롤러 경로 등록

app / code / NameSpace / Module / 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 결제시 사용되므로 보안 URL 목록에 경로를 추가하십시오 [편집]

app / code / NameSpace / 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">
    <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. 다음 레이아웃 파일을 사용하여 결제 페이지에 자바 스크립트 파일을 추가하십시오.

app / code / NameSpace / Module / view / frontend / layout / 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.이 스크립트에서 결제 방법 탭을 클릭 할 때마다 단순히 아약스 게시 요청을 보내는 기능을 추가 할 수 있습니다.


최선의 방법-녹아웃 : 관찰 가능 구독

코어 파일을 확장 / 재정의하거나 원래 클릭 기능에 영향을주지 않고 클릭 이벤트를 트리거하는 가장 좋은 방법은 Knockout의 도움으로 옵저버 블을 구독하는 것입니다.

방법 2-JS 클래스 확장 [편집]

초기 JS 클래스를 확장 할 수있는 방법도 있어야합니다

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


    });
});

방법 3-select-payment-method.js 재정의

Knockout JS를 사용하는 것은 때때로 섬세 할 수 있으며이 답변의 목적을 위해 selectPaymentMethod 함수에 의해 트리거되는 견적에서 지불 방법을 등록하는 기능을 무시합니다. 100 % 녹아웃 JS를 사용하는 것에 비해 가장 우아한 솔루션은 아니지만 향후 Magento 업데이트가 원래 기능을 수정하여 방해하지 않는 한 기능에 영향을 미치지 않으면 서 의도 한대로 작동해야합니다.

더 잘 이해하려면 selectPaymentMethod이 파일의 139 행 에서 함수 를 찾을 수 있습니다 .

Magento_Checkout / js / view / payment / default.js

1. 이제 함수 오버라이드를 선언해야합니다 :

app / code / NameSpace / Module / view / frontend / requirejs-config.js

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

2. 마지막으로, 우리는 ajax 호출을 만들기 위해 약간의 추가로 지불 방법 선택을 담당하는 기능을 재사용합니다!

app / code / NameSpace / Module / view / frontend / web / js / action / payment / select-payment-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);
        }
});

고객이 결제 수단 탭을 클릭 할 때마다 Javascript 메소드는 컨트롤러에 포스트 아약스 요청을 보내 로직으로 PHP 코드를 실행합니다.

이것은 여러 가지 다른 Magento 2 측면에 영향을줍니다. 귀하의 질문에 빠르고 쉬운 솔루션을 제공하고 싶지만 Magento 2가 구축 된 방식입니다. 이제 논리의 많은 부분이 클라이언트 측에서 구현되며 체크 아웃 시스템에 접근 할 때 훨씬 더 많이 수행됩니다.

결제 시스템을 다룰 때 항상주의해야합니다. 결제 페이지의 버그로 인해 상점이 매우 심하게 손상 될 수 있습니다.

참고 : 위의 모든 코드는 테스트되지 않았습니다


정말 좋은 정보
Pandurang

5

요구하다

'Magento_Checkout/js/model/quote'

관찰하다

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

거기에 관찰해야 할 것이 많기 때문에

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
감사합니다! 잘 작동합니다! 또한 함수 내부의 결제 방법을 확인하려면 다음 과 같은 첫 번째 인수를 사용할 수 있습니다 . quote.paymentMethod.subscribe(function(method){console.log(method);}, null, 'change');
Siarhey Uchukhlebau

0

이 2 당신은 그에 따라 시도 할 수 있습니다

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
        ]);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.