[Magento 2] Thay thế Date calendar bằng Datetime calendar tại Cart Price Rules

Nội dung

Trong bài viết này mình sẽ hướng dẫn cách thay thế Date calendar sang Datetime calendar trong Cart Price Rules.

Nội dung bài viết sẽ bao gồm những mục:

  • Tạo module cơ bản (SHD_SalesRule)
  • Tuỳ chỉnh giao diện adminhtml (SHD_SalesRule/view/adminhtml/sales_order_form.xml)
  • Chỉnh sửa lại tính năng validate (tạo plugin)
  • Chỉnh sửa cột from_date và to_date trong bảng salesrule (db_schema.xml)
  • Chỉnh sửa variable trong constructor (sử dụng type inject vào di.xml)
  • Chạy setup:upgrade và kiểm tra kết quả
Thay thế Date calendar bằng Datetime calendar tại Cart Price Rules
Thay thế Date calendar bằng Datetime calendar tại Cart Price Rules

1. Tạo module cơ bản để thay thế Date calendar

Tạo extension SalesRule trong vendor SHD của thư mục app/code như chi tiết dưới đây:

app/code/SHD/SalesRule/etc/module.xml

PHP
<?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="SHD_SalesRule" setup_version="1.0.0">
        <sequence>
            <module name="Magento_SalesRule"/>
        </sequence>     
    </module>
</config>

app/code/SHD/SalesRule/registration.php

PHP
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'SHD_SalesRule',
    __DIR__
);

2. Tuỳ chỉnh giao diện adminhtml (Magento 2)

Tạo 2 file theo đường dẫn chi tiết dưới đây:

app/code/SHD/SalesRule/view/adminhtml/layout/sales_rule_promo_quote_edit.xml

PHP
<?xml version="1.0"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <uiComponent name="sales_rule_form"/>
        </referenceContainer>
    </body>
</page>

app/code/SHD/SalesRule/view/adminhtml/ui_component/sales_rule_form.xml

PHP
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="rule_information" sortOrder="10">
        <field name="from_date" formElement="date">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">sales_rule</item>
                </item>
            </argument>
            <settings>
                <validation>
                    <rule name="validate-date" xsi:type="boolean">false</rule>
                    <rule name="validate-entry" xsi:type="boolean">false</rule>
                </validation>
                <dataType>text</dataType>
                <label translate="true">From</label>
                <visible>true</visible>
                <dataScope>from_date</dataScope>
            </settings>
            <formElements>
                <date>
                    <settings>
                        <outputDateFormat>YY-MM-DD HH:mm a</outputDateFormat>
                        <options>
                            <option name="dateFormat" xsi:type="string">MMM d, y</option>
                            <option name="showsTime" xsi:type="boolean">true</option>
                            <option name="maxDate" xsi:type="string">+0y</option>
                        </options>
                    </settings>
                </date>
            </formElements>            
        </field>
        <field name="to_date" formElement="date">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">sales_rule</item>
                </item>
            </argument>
            <settings>
                <validation>
                    <rule name="validate-date" xsi:type="boolean">false</rule>                    
                </validation>
                <dataType>text</dataType>
                <label translate="true">To</label>
                <visible>true</visible>
                <dataScope>to_date</dataScope>
            </settings>
            <formElements>
                <date>
                    <settings>
                        <outputDateFormat>YY-MM-DD HH:mm a</outputDateFormat>
                        <options>
                            <option name="dateFormat" xsi:type="string">MMM d, y</option>
                            <option name="showsTime" xsi:type="boolean">true</option>
                            <option name="maxDate" xsi:type="string">+0y</option>
                        </options>
                    </settings>
                </date>
            </formElements>              
        </field>
    </fieldset>  
</form>

Đoạn code trên nhằm mục đích viết lại cài đặt của field from_date và to_date

3. Chỉnh sửa lại tính năng validate

Viết lại Component Date bằng cách khởi tạo plugin:

app/core/SHD/SalesRule/Plugin/Ui/Component/Date.php

PHP
<?php
namespace SHD\SalesRule\Plugin\Ui\Component;
use Magento\Ui\Component\Form\Element\DataType\Date as MDate;

class Date
{
    public function afterPrepare(MDate $subject, $result)
    {
        $config = $subject->getData('config');
        $name = $subject->getData('name');
        if (in_array($name, ['from_date', 'to_date']) && isset($config['validation']['validate-date']) && !$config['validation']['validate-date']) {
            unset($config['validation']['validate-date']);
            $subject->setData('config', $config);
        }
       
        return $subject;
    }
}

Vì bạn sẽ gặp trường hợp thay đổi validate-date của field vẫn hiện mặc dù bạn đã thiết lập rule validate-date=false.

Đây sẽ là cách để các bạn có thể loại bỏ validate-date ra khỏi field from_date và to_date

Thêm đoạn code này vào di.xml:

app/core/SHD/SalesRule/etc/di.xml

PHP
<?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\Ui\Component\Form\Element\DataType\Date">
      <plugin name="SHD_SalesRule_Ui_Component_Date"       type="SHD\SalesRule\Plugin\Ui\Component\Date" />
  </type>
</config>

4. Chỉnh sửa cột from_date và to_date trong bảng salesrule

Từ Magento 2.4 trở lên bạn không cần phải tạo Schema trong thư mục Setup nữa mà thay vào đó bạn sẽ tạo db_schema.xml trong thư mục etc nhé:
Xem chi tiết dưới đây

app/core/SHD/SalesRule/etc/db_schema.xml

PHP
<?xml version="1.0"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="salesrule" resource="default" engine="innodb" comment="Salesrule">
        <column xsi:type="datetime" name="from_date" comment="From"/>
        <column xsi:type="datetime" name="to_date" comment="To"/>
    </table>
</schema>

Đoạn code trên nhằm mục đích thiết lập lại kiểu dữ liệu của cột trong from_dateto_date của bảng salesrule từ date sang datetime nhé.

5. Chỉnh sửa variable trong constructor

Sau khi đã hoàn tất cài đặt thì bạn sẽ gặp trường hợp giá trị của 2 field sẽ bị sai khi bạn lưu lại và giải pháp cho các bạn đó là sử dụng type để thay đổi tham số truyền vào cho constructor nhé.

Chi tiết code:

app/core/SHD/SalesRule/etc/di.xml

PHP
<?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\SalesRule\Controller\Adminhtml\Promo\Quote\Save">
        <arguments>
            <argument name="dateFilter" xsi:type="object">Magento\Framework\Stdlib\DateTime\Filter\DateTime</argument>
        </arguments>
    </type>
</config>

6. Chạy setup:upgrade và kiểm tra kết quả (Magento 2)

Bước cuối cùng là chạy lại command để kiểm tra kết quả và sẽ được deploy theo 2 mode:

  • Developer (Bạn chỉ cần chạy setup:upgrade là đủ):
    • php bin/magento setup:upgrade -> cập nhật cài đặt mới cho module
  • Production
    • php bin/magento setup:upgrade -> cập nhật cài đặt mới cho module
    • php bin/magento setup:di:compile
    • php bin/magento setup:static-content:deploy -f
    • php bin/magento cache:flush
    • rm -rf var/*

Kết quả:

Kết quả thay đổi date trong magento 2
Kết quả thay đổi date trong magento 2

Trích nguồn: https://www.youtube.com/watch?v=6iQmN_pawfI

Kết bài

Cảm ơn các bạn đã dành thời gian xem hết bài viết này. Có gì góp ý hay thắc mắc vui lòng comment dưới bài viết mình sẽ hỗ trợ và trả lời câu hỏi của anh em.

Bài viết liên quan

SQL trong Data Analysis: Procedure và Function – 2 công cụ không thể thiếu

Xin chào các bạn đã quay trở lại chuỗi bài SQL trong Data Analysis...

Tự học Data Analyst: Tổng hợp chuỗi bài SQL 101 trong Data Analysis

Trong bài viết này, chúng ta sẽ tổng hợp các bài viết thành một...

SQL trong Data Analysis: Hiểu rõ và ứng dụng đệ quy (Recursive trong PostgreSQL)

Trong thế giới của cơ sở dữ liệu quan hệ, các truy vấn đệ...

[Phân Tích Dữ Liệu Với Python] Tập 1: Làm Quen Với Pandas

Trong thời đại tiến bộ của khoa học dữ liệu, khả năng phân tích...
spot_img