Magento的2中,后台可以透过UI conponent产生的布局跟电网,栏位也有多种选择,像是文本,文本区域,选择等等,但是日期时间栏位显示的时候仅有日期选择器的部分,没有时间,导致实务应用上的不便。这也是Magento的问题之一,今天我们就来看看怎么解决吧!
1.新增属性
通常会写在InstallData.php内,今天我们就不特别说明新增的部分但是在新增的时候,需要给予input_renderer选项,里面填写自定义的Class。
$eavSetup->addAttribute( MagentoCatalogModelProduct::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个人是习惯放置于Ui DataProvider Product Form Modifier这个数据夹内,当然你也可以放置在自己喜欢的名字空间,而另外要注意的是,FIELD_CODE常数内的代码就是属性代码,一定要跟刚刚设定的一样。
<?php
namespace VendorExtensionUiDataProviderProductFormModifier;
use MagentoCatalogUiDataProviderProductFormModifierAbstractModifier;
use MagentoFrameworkStdlibArrayManager;
/**
* Class Datetime
* @package VendorExtensionUiDataProviderProductFormModifier
*/
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.使用修饰符重新定义栏位
有了栏位资料之后,需要使用改性剂来取代原本的设定,首先要建立等/ adminhtml / 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"> <virtualType name="MagentoCatalogUiDataProviderProductFormModifierPool"> <arguments> <argument name="modifiers" xsi:type="array"> <item name="datetime_example" xsi:type="array"> <item name="class" xsi:type="string">VendorExtensionUiDataProviderProductFormModifierDatetime</item> <item name="sortOrder" xsi:type="number">100</item> </item> </argument> </arguments> </virtualType> </config>
4.更改前的Datatime picker
	
5.更改后的Datatime选取器
	
适用版本
- Magento 2.1,2.2
