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 Action
sı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 selectPaymentMethod
bu 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