Add Magento 2 Custom Discount
Here are the steps that you will follow in this How to add a custom discount in Magento 2?
- Register a total in the file xml
- Add discount to change the grand total in the model
- Add the total in the layout file
- View model knockout
Add a Custom Discount in Magento 2
- First, we will register a total in the file xml app/code/Magestore/Webpos/etc/sales.xml:
<section name="quote"> <group name="totals"> <item name="customer_discount" instance="Magestore\Webpos\Model\Total\Quote\Custom" sort_order="420"/> </group> </section> </config>
- And then, we will add the discount to change the grandtotal in the model app/code/Magestore/Webpos/Model/Total/Quote/Custom.php:
<?php namespace Magestore\Webpos\Model\Total\Quote; /** * Class Custom * @package Magestore\Webpos\Model\Total\Quote */ class Custom extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal { /** * @var \Magento\Framework\Pricing\PriceCurrencyInterface */ protected $_priceCurrency; /** * Custom constructor. * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency */ public function __construct( \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency ){ $this->_priceCurrency = $priceCurrency; } /** * @param \Magento\Quote\Model\Quote $quote * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment * @param \Magento\Quote\Model\Quote\Address\Total $total * @return $this|bool */ public function collect( \Magento\Quote\Model\Quote $quote, \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment, \Magento\Quote\Model\Quote\Address\Total $total ) { parent::collect($quote, $shippingAssignment, $total); $baseDiscount = 10; $discount = $this->_priceCurrency->convert($baseDiscount); $total->addTotalAmount('customdiscount', -$discount); $total->addBaseTotalAmount('customdiscount', -$baseDiscount); $total->setBaseGrandTotal($total->getBaseGrandTotal() - $baseDiscount); $quote->setCustomDiscount(-$discount); return $this; } }
- Now, you will see the Grand Total was changed. But there is no total discount information. Because the Magento use knockout js to show the total. We need to add the total to the layout file
app/code/Magestore/Webpos/view/frontend/layout/checkout_cart_index.xml:
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="checkout.cart.totals"> <arguments> <argument name="jsLayout" xsi:type="array"> <item name="components" xsi:type="array"> <item name="block-totals" xsi:type="array"> <item name="children" xsi:type="array"> <item name="custom_discount" xsi:type="array"> <item name="component" xsi:type="string">Magestore_Webpos/js/view/checkout/summary/customdiscount</item> <item name="sortOrder" xsi:type="string">20</item> <item name="config" xsi:type="array"> <item name="custom_discount" xsi:type="string" translate="true">Custom Discount</item> </item> </item> </item> </item> </item> </argument> </arguments> </referenceBlock> </body> </page>
- It will call view model knockout
app/code/Magestore/Webpos/view/frontend/web/js/view/checkout/summary/customdiscount
define( [ 'jquery', 'Magento_Checkout/js/view/summary/abstract-total' ], function ($,Component) { "use strict"; return Component.extend({ defaults: { template: 'Magestore_Webpos/checkout/summary/customdiscount' }, isDisplayedCustomdiscount : function(){ return true; }, getCustomDiscount : function(){ return '$10'; } }); } );
- And the total discount will be shown in the template knockout
app/code/Magestore/Webpos/view/frontend/web/template/checkout/summary/customdiscount.html:
<!-- ko if: isDisplayedCustomdiscount() --> <tr class="totals customdiscount excl"> <th class="mark" colspan="1" scope="row" data-bind="text: custom_discount"></th> <td class="amount"> <span class="price" data-bind="text: getCustomDiscount(), attr: {'data-th': custom_discount}"></span> </td> </tr> <!-- /ko -->
For more Magento tutorial, visit Webnexs Magento Knowledge Base.
Leave a Reply