解決 Magento 2 後台無法顯示 Datetime 欄位
Magento 2 中,後台可以透過 ui conponent 產生 layout 跟 grid,欄位也有多種選擇,像是 Text、Textarea、Select 等等,但是 Datetime 欄位顯示的時候僅有日期選擇器的部分,沒有時間,導致實務應用上的不便。這也是 Magento 的 Issue 之一,今天我們就來看看怎麼解決吧!
1. 新增 Attribute
通常會寫在 InstallData.php 內,今天我們就不特別說明新增的部分 但是在新增的時候,需要 給予 input_renderer 選項,裡面填寫自定義的 Class。
$eavSetup->addAttribute( \Magento\Catalog\Model\Product::ENTITY, 'datetime_example', 'label' => 'datetime example', 'type' => 'datetime', 'input' => 'date', 'input_renderer' => Datetime::class, 'class' => 'validate-date', 'backend' => Startdate::class, 'required' => false, 'global' => ScopedAttributeInterface::SCOPE_GLOBAL, 'visible' => true, 'searchable' => false, 'filterable' => false, 'filterable_in_search' => false, 'visible_in_advanced_search' => false, 'comparable' => false, 'visible_on_front' => false, 'used_in_product_listing' => false, 'unique' => false );
2. 自定義 class
這邊的 class 個人是習慣放置於 Ui\DataProvider\Product\Form\Modifier 這個資料夾內,當然你也可以放置於自己喜歡的 namespace,而另外要注意的是,FIELD_CODE 常數內的 code 就是 Attribute Code,一定要跟剛剛設定的一樣。
<?php namespace Vendor\Extension\Ui\DataProvider\Product\Form\Modifier; use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AbstractModifier; use Magento\Framework\Stdlib\ArrayManager; /** * Class Datetime * @package Vendor\Extension\Ui\DataProvider\Product\Form\Modifier */ class Datetime extends AbstractModifier { const FIELD_CODE = 'datetime_example'; /** * @param ArrayManager $arrayManager */ public function __construct( ArrayManager $arrayManager ) { $this->arrayManager = $arrayManager; } /** * {@inheritdoc} */ public function modifyMeta(array $meta) { $meta = $this->enableTime($meta); return $meta; } /** * {@inheritdoc} */ public function modifyData(array $data) { return $data; } /** * @param array $meta * @return array */ protected function enableTime(array $meta) { $elementPath = $this->arrayManager->findPath(self::FIELD_CODE, $meta, null, 'children'); $containerPath = $this->arrayManager->findPath(static::CONTAINER_PREFIX . self::FIELD_CODE, $meta, null, 'children'); if (!$elementPath) return $meta; $meta = $this->arrayManager->merge( $containerPath, $meta, [ 'children' => [ self::FIELD_CODE => [ 'arguments' => [ 'data' => [ 'config' => [ 'default' => '', 'options' => [ 'dateFormat' > 'Y-m-d', 'timeFormat' => 'HH:mm:ss', 'showsTime' => true ] ], ], ], ] ] ] ); return $meta; } }
3. 使用 modifiers 重新定義欄位
有了欄位資料之後,需要使用 modifiers 來取代原本的設定,首先要建立 etc/adminhtml/di.xml 並且貼上以下程式,這邊除了要在 class 欄位指定剛剛新增的 class 之外,還必須在 item 的 name 裡面寫入 Attribute Code ,如此一來才能完成定義。
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool"> <arguments> <argument name="modifiers" xsi:type="array"> <item name="datetime_example" xsi:type="array"> <item name="class" xsi:type="string">Vendor\Extension\Ui\DataProvider\Product\Form\Modifier\Datetime</item> <item name="sortOrder" xsi:type="number">100</item> </item> </argument> </arguments> </virtualType> </config>
4. 更改前的 Datatime picker
5.更改後的 Datatime picker
適用版本
- Magento 2.1、2.2
參考連結: Magento Issue
若想了解更多,請關注我們對Magento的教學導覽,或是關注我們Facebook的粉絲專頁,收看我們不定時發布的消息進一步對電商有更深入的了解!
我要留言