Magento 2 - İndirim, Ödeme Yöntemine bağlı olarak çalışmıyor


13

Magento 2 Yönetici> Pazarlama> Promosyonlar> Sepet Fiyat Kurallarına gidiyorum ve yeni bir Kural oluşturuyorum: Banka Havalesi Ödeme:

Sekme Kuralı Bilgisi:

  • Kural Adı: Banka Havalesi Ödemesi
  • Durum: Aktif
  • Web siteleri: Ana Web Sitesi
  • Müşteri Grupları: tümünü seç
  • Kupon: Kupon Yok
  • Müşteri Başına Kullanım: 0
  • Gönderen: boş
  • Alıcı: boş
  • Öncelik: 0
  • RSS Feed'de herkese açık: Hayır

Koşullar sekmesi:

  • Bu koşulların TÜMÜ DOĞRU ise:
    • Ödeme Yöntemi Banka Havalesi Ödemesidir

İşlemler Sekmesi:

  • Uygula: ürün fiyatı indiriminin yüzdesi
  • İndirim Tutarı: 2
  • Maksimum Adet İndirimi Uygulanır: 0
  • İndirim Adımı (X Satın Al): 0
  • Nakliye Tutarına Başvurun: Hayır
  • Sonraki kuralları atın: Hayır
  • Ücretsiz Kargo: hayır
  • Kuralı yalnızca aşağıdaki koşullarla eşleşen alışveriş sepetlerine uygulayın (tüm öğeler için boş bırakın): hiçbir şey

Sonra Banka Havalesi Ödeme yöntemini etkinleştiriyorum, ödeme sayfasına gidin, Banka Havalesi Ödemesi'ni tıklayın, ancak Sipariş Özeti'nde İndirim Yüzde Fiyatı görünmüyor.

resim açıklamasını buraya girin

Lütfen bana bir tavsiye verin. Magento 2'de ödeme yönteminde nasıl indirim yapabilirsiniz? Magento 1 için iyi işliyor.

Çok teşekkürler


Kuralınızı buraya gönderebilir misiniz?
Khoa TruongDinh

Kuralımı gönderdim. Beni kontrol edebilir misin lütfen?
Nguyễn Hồng Quang

Kuralın etkinleştirme tarihini eklemeye çalışın mı?
Khoa TruongDinh

Kuralın başlangıç ​​tarihini eklemeye çalışıyorum, ancak Banka Havalesi Ödeme seçeneğini tıkladığınızda Sipariş Özeti'nde hiçbir şey olmuyor
Nguyễn Hồng Quang

1
Teşekkürler. Sorunu buraya gönderdim: github.com/magento/magento2/issues/5937
Nguyễn Hồng Quang

Yanıtlar:


12

Magento 2, birini seçtiğinizde teklif vermek için ödeme yöntemini kaydetmediğinden bu kural işe yaramaz. Ayrıca bir ödeme yöntemi seçerken toplamları yeniden yüklemez. Ve ne yazık ki, sorunu çözmek için özel bir modül yazmanız gerekiyor.

Yeni modülün oluşturulması için sadece 4 dosya gerekiyor:

  1. Uygulamanın / kod / Namespace / modulename / etc / kullanıcı arayüzü / routes.xml

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
        <router id="standard">
            <route id="namespace_modulename" frontName="namespace_modulename">
                <module name="Namespace_ModuleName"/>
            </route>
        </router>
    </config>

    Bu, modülümüz için yeni bir denetleyici tanımlayacaktır.

  2. Uygulamanın / kod / Namespace / modulename / Kontrolör / Ödeme / ApplyPaymentMethod.php

    <?php
    
    namespace Namespace\ModuleName\Controller\Checkout;
    
    class ApplyPaymentMethod extends \Magento\Framework\App\Action\Action
    {
        /**
         * @var \Magento\Framework\Controller\Result\ForwardFactory
         */
        protected $resultForwardFactory;
    
        /**
         * @var \Magento\Framework\View\LayoutFactory
         */
        protected $layoutFactory;
    
        /**
         * @var \Magento\Checkout\Model\Cart
         */
        protected $cart;
    
        /**
         * @param \Magento\Framework\App\Action\Context $context
         * @param \Magento\Framework\View\LayoutFactory $layoutFactory
         * @param \Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory
         */
        public function __construct(
            \Magento\Framework\App\Action\Context $context,
            \Magento\Framework\Controller\Result\ForwardFactory $resultForwardFactory,
            \Magento\Framework\View\LayoutFactory $layoutFactory,
            \Magento\Checkout\Model\Cart $cart
        ) {
            $this->resultForwardFactory = $resultForwardFactory;
            $this->layoutFactory = $layoutFactory;
            $this->cart = $cart;
    
            parent::__construct($context);
        }
    
        /**
         * @return \Magento\Framework\Controller\ResultInterface
         */
        public function execute()
        {
            $pMethod = $this->getRequest()->getParam('payment_method');
    
            $quote = $this->cart->getQuote();
    
            $quote->getPayment()->setMethod($pMethod['method']);
    
            $quote->setTotalsCollectedFlag(false);
            $quote->collectTotals();
            $quote->save();
        }
    }

    Bu dosya teklif için seçilen ödeme yöntemini kaydetmek için denetleyici eylemi oluşturur

  3. Uygulama / kod / Ad / modül ismi / görünüşüdür / ön / requirejs-config.js

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

    Bu dosya geçersiz kılmak için izin verir Magento_Checkout/js/action/select-payment-methoddosyayı

  4. Uygulamanın / kod / Ad / modulename / görünüm / kullanıcı arayüzü / web / js / eylem / seçmek ödeme-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('/namespace_modulename/checkout/applyPaymentMethod', {
                    data: {payment_method: paymentMethod},
                    complete: function () {
                        getTotalsAction([]);
                        fullScreenLoader.stopLoader();
                    }
                });
    
            }
        }
    );

    Ödeme yöntemini kaydetmek ve alışveriş sepeti toplamlarını yeniden yüklemek için ajax isteği gönderir.

Kodun PS bölümleri Magento 2 için Ödeme Ücreti uzantısından alınmıştır .


1
Çok teşekkürler MagestyApps, talimatlarınızı takip etmek için yeni bir Modül oluşturdum. Ancak, sonunda bu sorunu aldım jquery.js 192.168.41.59/phoenix_checkout/checkout/applyPaymentMethod 404 (Bulunamadı). Bu hatayı daha önce aldın mı?
Nguyễn Hồng Quang

1
Gerçekten iyi çalışıyor. Teşekkürler MagestyApps çok. Bu çözüm mükemmel.
Nguyễn Hồng Quang

İşe yarıyor, zamanımı kurtardın. Teşekkür ederim :)
Sameer Bhayani

Harika şeyler, teşekkürler. Ödeme yöntemleri için Cart fiyat kuralı btw ( github.com/magento/magento2/commit/… ) üzerinden kaldırıldı . "" Payment_method '=> __ (' Ödeme Yöntemi ') "satırını ekledim, şimdi ödeme yöntemleri için alışveriş sepeti kuralları oluşturabilirim.
DaFunkyAlex

Bu çok yardımcı oldu. Teşekkürler. +1 :)
Shoaib Munir

3

Magento 2.2'de MagestyApps'ın çalışmasına cevap alamadım. Bazı ek dosyalar eklemem gerekiyordu. Çünkü:

  • Ödeme Yöntemi için Alışveriş Sepeti Fiyat Kuralı (DaFunkyAlex tarafından belirtildiği gibi) yöneticiden kaldırıldı ;
  • Magento 2.2'de teklifte indirim uygulanmadı, çünkü yöntem \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod::generateFilterText(aslında geri düşüyor \Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address::generateFilterText), verilerin payment_methodteklif adreslerinde ayarlanmasını bekliyordu ;
  • MagestyApps'tan kontrol cihazını değiştirmek bile payment_methodteklif adresleri üzerine veri ayarlamak için cevap verir, teklif bir sipariş olduğunda işe yaramaz, çünkü devam etmez payment_method;

Aşağıdaki modül benim için çalıştı (MagestyApps cevabı sayesinde, bunun üstüne dayanıyordu):

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 / ön / 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>

Kontrolör / Ödeme / 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();
    }
}

Model / Kural / Durum / FilterTextGenerator / Adresi / 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;
    }
}

Eklenti / 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;
    }
}

görünüşüdür / ön / requirejs-config.js

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

görünümü / kullanıcı arayüzü / web / js / aksiyon / seçmek ödeme-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();
                }
            });

        }
    }
);

Derlemeye çalışırken bu olsun: Fatal error: Class 'Magento\AdvancedSalesRule\Model\Rule\Condition\Address\PaymentMethod' not found in Vendor/SalesRulesPaymentMethod/Model/Rule/Condition/FilterTextGenerator/Address/PaymentMethod.php on line 7. Magento 2.2.2'de AdvancedSalesRule Modeli olmadığını görebildiğim için AdvancedSalesRule'u SalesRule olarak değiştirmeye çalıştım
Alexandros

magento 2.1.9 için AdvancedSalesRule parçalarını atlamalı mıyız?
Doni Wibowo

Hatayı alırken derleme: Önemli hata: 7. satırda Vendor / SalesRulesPaymentMethod / Model / Kuralı / Durum / FilterTextGenerator / Adresi / PaymentMethod.php bulunmayan Class 'Magento \ AdvancedSalesRule \ Modeli \ Kural \ Durumu \ Adres \ PAYMENTMETHOD'
Magecode

AdvancedSalesRule, Magento 2.1.5
Magecode

2

Aynı kuralı kontrol ettik ve işe yaramadığını gördük. Aynı koşulları kullanarak, seçilen seçilen yöntem hakkında hiçbir bilgi gönderilmez ve sipariş verilinceye ve kural çalışmayabilir.

resim açıklamasını buraya girin

Adresin validasyona kadar hiçbir ödeme yöntemi yoktur ve hiçbir ödeme gönderilmediğinden ( $model->getQuote()->getPayment()->getMethod()iadeler null) ödeme yönteminden ödeme yöntemini almaz .

resim açıklamasını buraya girin

Sanırım bu Magento böceği. Bir ödeme yöntemi seçtiğinizde, bilgilerin önceden gönderilmesi gerekir.


2
MagestyApps'ın yanıtı kabul edildi. Teşekkürler.
Nguyồn Hồng Quang

1

Özel modül ile çözüm çalışıyor.

Sadece Magento yeni başlayanlar için bu modülü eklemek ve etkinleştirmek için bu dosyaları eklemeniz gerektiğini bilmek yararlı bilgi olacağını düşündüm:

(farklı bir modülden kopyalayın ve modül adınıza ve ad alanınıza göre dosyaları değiştirin)

app/code/Namespace/ModuleName/composer.js
app/code/Namespace/ModuleName/registration.php
app/code/Namespace/ModuleName/etc/module.xml

o zaman koşabilirsin bin/magento setup:upgrade


0

i dosyaları oluşturdu ve Ad alanları ve modül adı yerine ama dosyalarımı yürütmek düşünüyorum.

Belki dosyalarımda bir hata ??

registration.php

<?php

use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Jacor_Checkoutpayment',
__DIR__
);

composer.json

{
"name": "jacor/checkoutpayment",
"autoload": {
    "psr-4": {
        "Jacor\\Checkoutpayment\\": ""
    },
    "files": [
        "registration.php"
    ]
}

}

module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Jacor_Checkoutpayment" setup_version="1.0.0" />
</config>

0

aslında, magento çekirdek dosyalarının geçersiz kılınması iyi bir fikir değildir. Geçersiz kılmak yerine Magento_Checkout/js/action/select-payment-methodbunun için bir karışım oluşturun. Ve yeni bir denetleyici oluşturmadan daraltabilirsiniz. Aşağıya bakın (@magestyapps cevabına ek olarak)

  1. Uygulama / kod / Ad / modül ismi / görünüşüdür / ön / requirejs-config.js

        var config = {
            config: {
                mixins: {
                    'Magento_Checkout/js/action/select-payment-method': {
                        'Namespace_ModuleName/js/checkout/action/select-payment-method-mixin': true
                    },
                }
            }
        };
  2. Uygulamanın / kod / Namespace / modulename / görünüm / kullanıcı arayüzü / js / ödeme / aksiyon / seçmek ödeme-yöntem-mixin.js

        define([
        'jquery',
        'mage/utils/wrapper',
        'mage/storage',
        'Magento_Checkout/js/action/get-totals',
        'Magento_Checkout/js/model/full-screen-loader',
        'Magento_Checkout/js/model/quote',
        'Magento_Checkout/js/model/url-builder',
        'Magento_Customer/js/model/customer',
    ], function ($, wrapper, storage, getTotalsAction, fullScreenLoader, quote, urlBuilder, customer) {
        'use strict';
        return function (selectPaymentMethod) {
            return wrapper.wrap(selectPaymentMethod, function (originalAction, paymentMethod) {
                var serviceUrl, payload;
    
                originalAction(paymentMethod);
    
                payload = {
                    method: paymentMethod
                };
                if (customer.isLoggedIn()) {
                    serviceUrl = urlBuilder.createUrl('/carts/mine/selected-payment-method', {});
                } else {
                    serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/selected-payment-method', {
                        cartId: quote.getQuoteId()
                    });
                }
                fullScreenLoader.startLoader();
                storage.put(
                    serviceUrl,
                    JSON.stringify(payload)
                ).success(function () {
                    getTotalsAction([]);
                    fullScreenLoader.stopLoader();
                });
            });
        };
    });

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.