Magento2 如何在 minicart 顯示折扣
“折扣” 一直是電商行銷很重要的一環,但在 Magento 原生 minicart 中並沒有顯示消費者當下獲得折扣的資訊,消費者無法即時得到應有的回饋,必須進入購物車後才能得知折扣信息,本篇文章將展示如何在 minicart 添加折扣區域,使消費者在購物中也能即能獲取當下已符合折扣規則的金額。
- 下圖為購物車頁面 Summary 區塊所顯示的折扣資訊
- 當已經符合此購物規則時,原生 minicart 並不會顯示相關的折扣金額
- 經過本篇章修改後,消費者可以很清楚知道當下已符合的折扣金額
從這篇文章你會知道:
- 讓消費者在 minicart 也能獲得已符合之折扣金額
Step 1: 建立新的模組結構 AstralWeb_minicartDiscount
app/code/AstralWeb/minicartDiscount/etc/module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd"> <module name="AstralWeb_minicartDiscount" setup_version="1.0.0" /> </config>
app/code/AstralWeb/minicartDiscount/registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'AstralWeb_minicartDiscount', __DIR__ );
當有了基本的模組結構後,我們繼續處理把 “Discount” 添加到迷你購物車的實際文件。
Step 2: 將新的 minicart 區塊添加到 xml 中佈局並創建模板文件
app/code/AstralWeb/minicartDiscount/view/frontend/layout/checkout_cart_sidebar_item_renderers.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="minicart"> <arguments> <argument name="jsLayout" xsi:type="array"> <item name="components" xsi:type="array"> <item name="minicart_content" xsi:type="array"> <item name="children" xsi:type="array"> <item name="discount.container" xsi:type="array"> <item name="component" xsi:type="string">uiComponent</item> <item name="config" xsi:type="array"> <item name="displayArea" xsi:type="string">subtotalContainer</item> </item> <item name="children" xsi:type="array"> <item name="subtotal" xsi:type="array"> <item name="component" xsi:type="string">Magento_Checkout/js/view/checkout/minicart/subtotal/totals</item> <item name="config" xsi:type="array"> <item name="template" xsi:type="string">AstralWeb_minicartDiscount/minicart/discount</item> </item> <item name="children" xsi:type="array"> <item name="subtotal.totals" xsi:type="array"> <item name="component" xsi:type="string">Magento_Checkout/js/view/checkout/minicart/subtotal/totals</item> <item name="config" xsi:type="array"> <item name="template" xsi:type="string">AstralWeb_minicartDiscount/minicart/discount/inner</item> </item> </item> </item> </item> </item> </item> </item> </item> </item> </argument> </arguments> </referenceBlock> </body> </page>
Xml 告訴 Magento 在 minicart 中添加 “Discount” 作為子項,並在既有的模板文件設置。 接下來我們將添加模板文件。
app/code/AstralWeb/minicartDiscount/view/frontend/web/template/minicart/discount.html
<!-- ko if: (cart().discount_amount_no_html < 0) --> <div class="subtotal"> <span class="label"> <!-- ko i18n: 'Discount' --><!-- /ko --> </span> <!-- ko foreach: elems --> <!-- ko template: getTemplate() --><!-- /ko --> <!-- /ko --> </div> <!-- /ko -->
app/code/AstralWeb/minicartDiscount/view/frontend/web/template/minicart/discount/inner.html
<div class="amount price-container"> <span class="price-wrapper" data-bind="html: cart().discount_amount"></span></div>
Step 3: 提供要在前端獲取折扣的值
現在剩下要做的唯一一件事就是將 “Discount” 的值提供給
class \Magento\Checkout\CustomerData\Cart ,它將由前端的 minicart 獲取。 為此,我們將使用插件。
app/code/AstralWeb/minicartDiscount/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\Checkout\CustomerData\Cart"> <plugin name="cartPrivateDataDiscount" type="AstralWeb/minicartDiscount\Plugin\Checkout\CustomerData\Cart"/> </type> </config>
app/code/AstralWeb/minicartDiscount/Plugin/Checkout/CustomerData/Cart.php
<?php namespace Myvendor\Mymodule\Plugin\Checkout\CustomerData; class Cart { protected $checkoutSession; protected $checkoutHelper; protected $quote; public function __construct( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Checkout\Helper\Data $checkoutHelper ) { $this->checkoutSession = $checkoutSession; $this->checkoutHelper = $checkoutHelper; } /** * Get active quote * * @return \Magento\Quote\Model\Quote */ protected function getQuote() { if (null === $this->quote) { $this->quote = $this->checkoutSession->getQuote(); } return $this->quote; } protected function getDiscountAmount() { $discountAmount = 0; foreach($this->getQuote()->getAllVisibleItems() as $item){ $discountAmount += ($item->getDiscountAmount() ? $item->getDiscountAmount() : 0); } return $discountAmount; } public function afterGetSectionData(\Magento\Checkout\CustomerData\Cart $subject, $result) { $result['discount_amount_no_html'] = -$this->getDiscountAmount(); $result['discount_amount'] = $this->checkoutHelper->formatPrice(-$this->getDiscountAmount()); return $result; } }
模組建置完成後,消費者即可在進購物車之前就事先得知折扣金額,對行銷來說不為失一個簡單又能快速呈現的功能。接下來我們還會持續介紹各種簡易又好用的方法給大家!
以上就是歐斯瑞本次 如何簡單測試Magento 2 在minicart顯示折扣 的分享
我要留言