Magento 2.2에서 MagestyApps 답변을 얻지 못했습니다. 추가 파일을 추가해야했습니다. 때문에:
- 결제 방법 에 대한 장바구니 가격 규칙이 관리자 에서 제거되었습니다 (DaFunkyAlex에서 지적한대로).
- Magento 2.2에서는 견적서에 할인이 적용되지 않았는데, 그 방법
\Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText
(실제로 는이 방법 \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText
으로 돌아옴) payment_method
은 견적서 주소에 데이터 가 설정 될 것으로 예상 했기 때문입니다 .
payment_method
견적 주소에 데이터 를 설정하기 위해 MagestyApps 응답에서 컨트롤러를 변경하더라도 견적이 지속되지 않기 때문에 견적이 주문되었을 때 작동하지 않았습니다 payment_method
.
다음 모듈이 나를 위해 일했습니다 (MagestyApps 답변 덕분에 그 위에 기반했습니다).
registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_SalesRulesPaymentMethod',
__DIR__
);
etc / module.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Vendor_SalesRulesPaymentMethod" setup_version="1.0.0">
<sequence>
<module name="Magento_AdvancedSalesRule"/>
<module name="Magento_Checkout"/>
<module name="Magento_SalesRules"/>
<module name="Magento_Quote"/>
</sequence>
</module>
</config>
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">
<preference for="Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod"
type="Vendor\SalesRulesPaymentMethod\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod"/>
<type name="Magento\SalesRule\Model\Rule\Condition\Address">
<plugin name="addPaymentMethodOptionBack" type="Vendor\SalesRulesPaymentMethod\Plugin\AddPaymentMethodOptionBack" />
</type>
</config>
etc / frontend / routes.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route id="salesrulespaymentmethod" frontName="salesrulespaymentmethod">
<module name="Vendor_SalesRulesPaymentMethod"/>
</route>
</router>
</config>
컨트롤러 / 체크 아웃 /ApplyPaymentMethod.php
<?php
namespace Vendor\SalesRulesPaymentMethod\Controller\Checkout;
use Magento\Checkout\Model\Cart;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\ForwardFactory;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\View\LayoutFactory;
use Magento\Quote\Model\Quote;
class ApplyPaymentMethod extends Action
{
/**
* @var ForwardFactory
*/
protected $resultForwardFactory;
/**
* @var LayoutFactory
*/
protected $layoutFactory;
/**
* @var Cart
*/
protected $cart;
/**
* @param Context $context
* @param LayoutFactory $layoutFactory
* @param ForwardFactory $resultForwardFactory
*/
public function __construct(
Context $context,
ForwardFactory $resultForwardFactory,
LayoutFactory $layoutFactory,
Cart $cart
) {
$this->resultForwardFactory = $resultForwardFactory;
$this->layoutFactory = $layoutFactory;
$this->cart = $cart;
parent::__construct($context);
}
/**
* @return ResponseInterface|ResultInterface|void
* @throws \Exception
*/
public function execute()
{
$pMethod = $this->getRequest()->getParam('payment_method');
/** @var Quote $quote */
$quote = $this->cart->getQuote();
$quote->getPayment()->setMethod($pMethod['method']);
$quote->setTotalsCollectedFlag(false);
$quote->collectTotals();
$quote->save();
}
}
모델 / 규칙 / 조건 / FilterTextGenerator / 주소 /PaymentMethod.php
<?php
namespace Vendor\SalesRulesPaymentMethod\Model\Rule\Condition\FilterTextGenerator\Address;
use Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod as BasePaymentMethod;
class PaymentMethod extends BasePaymentMethod
{
/**
* @param \Magento\Framework\DataObject $quoteAddress
* @return string[]
*/
public function generateFilterText(\Magento\Framework\DataObject $quoteAddress)
{
$filterText = [];
if ($quoteAddress instanceof \Magento\Quote\Model\Quote\Address) {
$value = $quoteAddress->getQuote()->getPayment()->getMethod();
if (is_scalar($value)) {
$filterText[] = $this->getFilterTextPrefix() . $this->attribute . ':' . $value;
}
}
return $filterText;
}
}
플러그인 /AddPaymentMethodOptionBack.php
<?php
namespace Vendor\SalesRulesPaymentMethod\Plugin;
use Magento\SalesRule\Model\Rule\Condition\Address;
class AddPaymentMethodOptionBack
{
/**
* @param Address $subject
* @param $result
* @return Address
*/
public function afterLoadAttributeOptions(Address $subject, $result)
{
$attributeOption = $subject->getAttributeOption();
$attributeOption['payment_method'] = __('Payment Method');
$subject->setAttributeOption($attributeOption);
return $subject;
}
}
view / frontend / requirejs-config.js
var config = {
map: {
'*': {
'Magento_Checkout/js/action/select-payment-method':
'Vendor_SalesRulesPaymentMethod/js/action/select-payment-method'
}
}
};
view / frontend / web / js / action / select-payment-method.js
define(
[
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/full-screen-loader',
'jquery',
'Magento_Checkout/js/action/get-totals',
],
function (quote, fullScreenLoader, jQuery, getTotalsAction) {
'use strict';
return function (paymentMethod) {
quote.paymentMethod(paymentMethod);
fullScreenLoader.startLoader();
jQuery.ajax('/salesrulespaymentmethod/checkout/applyPaymentMethod', {
data: {payment_method: paymentMethod},
complete: function () {
getTotalsAction([]);
fullScreenLoader.stopLoader();
}
});
}
}
);