На жаль, спостерігачі корисні лише в межах функцій 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. Зараз значна частина логіки реалізована на стороні клієнта, а ще більше, коли підходить до системи оформлення каси.
Не забудьте завжди бути обережними при роботі з системою оформлення замовлень, помилка на сторінці оформлення замовлення може дуже сильно зашкодити магазину.
ПРИМІТКА. Увесь код вище не перевірений