Magento 2: спостерігач за подіями для вибору способу оплати


13

Я працюю над спеціальним розширенням, де мені потрібно зателефонувати спостерігачеві, коли будь-який спосіб оплати вибрано зі списку доступних способів оплати на сторінці замовлення замовлення.

Хтось може сказати мені, якого спостерігача за подіями я повинен використовувати для цього? Мені потрібно зателефонувати на спеціальну функцію та додати плату до підсумкової кошика.

введіть тут опис зображення

Відповіді:


10

На жаль, спостерігачі корисні лише в межах функцій php. Це означає, що для початку події її потрібно спочатку відправити dispatch()або нашим диспетчером подій. У цьому конкретному випадку вжиті дії - це натискання кнопки способу оплати. Цей клік не викликає жодного виконання php-коду, виконується лише Javascript-код.

Оскільки процес оформлення замовлення в Magento 2 здебільшого побудований навколо Knockout JS, більшість дій відбувається на фронталі, використовуючи Javascript замість сервера на стороні php.

Knockout JS дуже гнучкий і в ньому можна зв’язувати події та спостерігати за змінними. З іншого боку, це може вимагати крутої кривої навчання.

Хорошим підходом до вашого проекту було б використання контролера замість спостерігача:

1. Почнемо зі створення модуля ...

2. Створіть контролер, який виконує вашу логіку при спрацьовуванні

Структура контролера: http://www.example.com/route/controller_folder/action

2.1 Створіть Actionклас контролера :

app / code / NameSpace / Модуль / Контролер / Тест / 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 / Модуль / тощо / 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-адрес [EDIT]

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. Додайте файл JavaScript на сторінку оформлення замовлення, використовуючи такий файл макета:

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. У цьому скрипті ви можете просто додати функцію для надсилання запиту на повідомлення в ajax щоразу, коли клацніть вкладку способу оплати.


Найкращий метод - нокаут: підписка на спостережуване

Найкращий спосіб запустити подію натискання без розширення / переосмислення основного файлу або впливу на оригінальну функцію клацання передбачає передплату спостережуваного за допомогою Knockout.

Спосіб 2 - Розширення класу JS [EDIT]

Також повинен бути спосіб розширити початковий клас 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% Knockout JS, але воно повинно працювати за призначенням, не впливаючи на будь-яку функціональність, якщо майбутнє оновлення Magento не завадить змінити оригінальну функцію.

Щоб краще зрозуміти, ви можете знайти функцію selectPaymentMethodв рядку 139 цього файлу:

Magento_Checkout / js / view / Payment / default.js

1. Тепер ми повинні оголосити, що наша функція перевизначає:

app / code / NameSpace / Module / view / frontend / Requjs-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 надсилатиме на ваш контролер запит ajax post, який виконуватиме 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
        ]);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.