In this post you will learn about how to add colour picker, date picker, Image upload, Select and multi-select attribute in category add/edit form in Magento2.
Let's start by creating a custom module.
Find the Complete module on Github at Magelearn_CategoryAttribute
app/code/
Magelearn/CategoryAttribute<?php /** * Copyright © All rights reserved. * See COPYING.txt for license details. */ use Magento\Framework\Component\ComponentRegistrar; ComponentRegistrar::register( ComponentRegistrar::MODULE, 'Magelearn_CategoryAttribute', __DIR__ );Add composer.json file in it:
{ "name": "magelearn/module-CategoryAttribute", "description": "Magento2 add colorpicker and datepicker attribute in category add/edit admin form", "type": "magento2-module", "license": "OSL-3.0", "authors": [ { "email": "vijaymrami@gmail.com", "name": "vijay rami" } ], "minimum-stability": "dev", "require": {}, "autoload": { "files": [ "registration.php" ], "psr-4": { "Magelearn\\CategoryAttribute\\": "" } } }
<?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="Magelearn_CategoryAttribute" setup_version="1.0.0"> </module> </config>
Now we will Create InstallData script to add category colour picker and date time picker attribute.
<?php namespace Magelearn\CategoryAttribute\Setup; use Magento\Eav\Setup\EavSetup; use Magento\Eav\Setup\EavSetupFactory; use Magento\Eav\Model\Entity\Attribute\Backend\Datetime; use Magento\Eav\Model\Entity\Attribute\Frontend\Datetime as DatetimeFrontend; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; /** * @codeCoverageIgnore */ class InstallData implements InstallDataInterface { /** * EAV setup factory. * * @var EavSetupFactory */ private $_eavSetupFactory; /** * @var ModuleDataSetupInterface */ private $moduleDataSetup; /** * @var CategorySetupFactory */ private $categorySetupFactory; /** * Init. * * @param EavSetupFactory $eavSetupFactory * @param ModuleDataSetupInterface $moduleDataSetup * @param CategorySetupFactory $categorySetupFactory */ public function __construct( EavSetupFactory $eavSetupFactory, ModuleDataSetupInterface $moduleDataSetup, \Magento\Catalog\Setup\CategorySetupFactory $categorySetupFactory ) { $this->_eavSetupFactory = $eavSetupFactory; $this->moduleDataSetup = $moduleDataSetup; $this->categorySetupFactory = $categorySetupFactory; } /** * {@inheritdoc}visible * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function install( ModuleDataSetupInterface $setup, ModuleContextInterface $context ) { /** @var EavSetup $eavSetup */ $eavSetup = $this->_eavSetupFactory->create(['setup' => $setup]); $setup = $this->categorySetupFactory->create(['setup' => $setup]); $setup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'listing_product_box_flag_font_color', [ 'type' => 'text', 'label' => 'Listing Product Box Flag Font Color', 'input' => 'text', 'is_user_defined' => true, 'visible' => true, 'required' => false, 'sort_order' => 9, 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Cateory Attribute Management' ] ); $setup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'listing_product_box_flag_date', [ 'type' => 'datetime', 'backend' => Datetime::class, 'frontend' => DatetimeFrontend::class, 'label' => 'Listing Product Box Flag Date', 'input' => 'date', 'required' => false, 'global' => ScopedAttributeInterface::SCOPE_STORE, 'is_user_defined' => true, 'sort_order' => 10, 'visible' => true, 'group' => 'Cateory Attribute Management', ] ); $setup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'listing_menu_icon', [ 'type' => 'varchar', 'label' => 'Listing Menu Icon', 'input' => 'image', 'backend' => 'Magento\Catalog\Model\Category\Attribute\Backend\Image', 'visible' => true, 'required' => false, 'sort_order' => 11, 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Cateory Attribute Management' ] ); $setup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'category_menu_custom_filter', [ 'type' => 'text', 'label' => 'Category Filter/label', 'input' => 'multiselect', 'source' => 'Magelearn\CategoryAttribute\Model\Category\Attribute\Source\Filter', 'backend' => 'Magelearn\CategoryAttribute\Model\Category\Attribute\Backend\Filter', 'visible' => true, 'required' => false, 'sort_order' => 12, 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Cateory Attribute Management', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, 'is_filterable_in_grid' => true, 'visible_on_front' => true, 'used_in_product_listing' => true ] ); $setup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'menu_top_block', [ 'type' => 'text', 'label' => 'Top Block', 'input' => 'textarea', 'required' => false, 'sort_order' => 13, 'wysiwyg_enabled' => true, 'is_html_allowed_on_front' => true, 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Cateory Attribute Management' ] ); $setup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'category_menu_type', [ 'type' => 'text', 'label' => 'Menu type', 'input' => 'select', 'source' => 'Magelearn\CategoryAttribute\Model\Category\Attribute\Source\Menu', 'visible' => true, 'required' => false, 'sort_order' => 14, 'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE, 'group' => 'Cateory Attribute Management', 'is_used_in_grid' => true, 'is_visible_in_grid' => false, 'is_filterable_in_grid' => true, 'visible_on_front' => true, 'used_in_product_listing' => true ] ); } }
As per highlighted code above,
Add app/code/Magelearn/CategoryAttribute/Model/Category/Attribute/Source/Filter.php
<?php namespace Magelearn\CategoryAttribute\Model\Category\Attribute\Source; class Filter extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource { /** * {@inheritdoc} */ public function getAllOptions() { if ($this->_options === null) { $this->_options = [ ['label' => __('Label 1'), 'value' => 'Value 1'], ['label' => __('Label 2'), 'value' => 'Value 2'], ['label' => __('Label 3'), 'value' => 'Value 3'], ['label' => __('Label 4'), 'value' => 'Value 4'], ['label' => __('Label 5'), 'value' => 'Value 5'], ]; } return $this->_options; } }
Add app/code/Magelearn/CategoryAttribute/Model/Category/Attribute/Source/Menu.php
<?php namespace Magelearn\CategoryAttribute\Model\Category\Attribute\Source; class Menu extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource { /** * {@inheritdoc} */ public function getAllOptions() { if ($this->_options === null) { $this->_options = [ ['label' => __('Label 1 only'), 'value' => 'Value 1 only'], ['label' => __('Label 2 only'), 'value' => 'Value 2 only'] ]; } return $this->_options; } }
Add app/code/Magelearn/CategoryAttribute/Model/Category/Attribute/Backend/Filter.php
<?php namespace Magelearn\CategoryAttribute\Model\Category\Attribute\Backend; class Filter extends \Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend { /** * Core store config * * @var \Magento\Framework\App\Config\ScopeConfigInterface */ protected $_scopeConfig; /** * Construct * * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig */ public function __construct(\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig) { $this->_scopeConfig = $scopeConfig; } /** * Validate process * * @param \Magento\Framework\DataObject $object * @return bool * @throws \Magento\Framework\Exception\LocalizedException * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ /** * Before Attribute Save Process * * @param \Magento\Framework\DataObject $object * @return $this */ public function beforeSave($object) { $attributeCode = $this->getAttribute()->getName(); if ($attributeCode == 'category_menu_custom_filter') { $data = $object->getData($attributeCode); if (!is_array($data)) { $data = []; } $object->setData($attributeCode, implode(',', $data) ?: null); } if (!$object->hasData($attributeCode)) { $object->setData($attributeCode, null); } return $this; } /** * After Load Attribute Process * * @param \Magento\Framework\DataObject $object * @return $this */ public function afterLoad($object) { $attributeCode = $this->getAttribute()->getName(); if ($attributeCode == 'category_menu_custom_filter') { $data = $object->getData($attributeCode); if ($data) { if (!is_array($data)) { $object->setData($attributeCode, explode(',', $data)); } else { $object->setData($attributeCode, $data); } } } return $this; } }
Now to display this colour picker and date time picker attribute in Category edit form,
Add file at Magelearn/CategoryAttribute/view/adminhtml/ui_component/category_form.xml
<?xml version="1.0" encoding="UTF-8"?> <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <fieldset name="cateory_attribute_management_fieldset"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Cateory Attribute Management</item> <item name="collapsible" xsi:type="boolean">true</item> <item name="sortOrder" xsi:type="number">20</item> </item> </argument> <field name="listing_product_box_flag_font_color" sortOrder="40" formElement="colorPicker"> <settings> <label translate="true">Listing Product Box Flag Font Color</label> <componentType>colorPicker</componentType> <dataScope>listing_product_box_flag_font_color</dataScope> <dataType>text</dataType> <notice>Default white</notice> </settings> <formElements> <colorPicker> <settings> <colorPickerMode>full</colorPickerMode> <colorFormat>hex</colorFormat> </settings> </colorPicker> </formElements> </field> <field name="listing_product_box_flag_date"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Listing Product Box Flag Date From</item> <item name="additionalClasses" xsi:type="string">admin__field-date </item> <item name="sortOrder" xsi:type="number">50</item> <item name="dataType" xsi:type="string">string</item> <item name="formElement" xsi:type="string">date</item> <item name="options" xsi:type="array"> <item name="dateFormat" xsi:type="string">MM/dd/YYYY</item> <item name="timeFormat" xsi:type="string">HH:mm:ss</item> <item name="showsTime" xsi:type="boolean">true</item> </item> </item> </argument> </field> <field name="listing_menu_icon" sortOrder="150" formElement="imageUploader"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="source" xsi:type="string">category</item> </item> </argument> <settings> <elementTmpl>ui/form/element/uploader/image</elementTmpl> <dataType>string</dataType> <label translate="true">Mega Menu Icon</label> <visible>true</visible> <required>false</required> </settings> <formElements> <imageUploader> <settings> <required>false</required> <uploaderConfig> <param xsi:type="url" name="url" path="catalog/category_image/upload"/> </uploaderConfig> <previewTmpl>Magento_Catalog/image-preview</previewTmpl> <openDialogTitle>Media Gallery</openDialogTitle> <initialMediaGalleryOpenSubpath>catalog/category</initialMediaGalleryOpenSubpath> <allowedExtensions>jpg jpeg gif png</allowedExtensions> <maxFileSize>4194304</maxFileSize> </settings> </imageUploader> </formElements> </field> <field name="category_menu_custom_filter"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Magelearn\CategoryAttribute\Model\Category\Attribute\Source\Filter</item> <item name="config" xsi:type="array"> <item name="sortOrder" xsi:type="number">160</item> <item name="dataType" xsi:type="string">text</item> <item name="label" xsi:type="string" translate="true">Category Filter/label</item> <item name="formElement" xsi:type="string">multiselect</item> <item name="source" xsi:type="string">category_menu_custom_filter</item> <item name="dataScope" xsi:type="string">category_menu_custom_filter</item> </item> </argument> </field> <field name="menu_top_block" template="ui/form/field" sortOrder="170" formElement="wysiwyg"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="wysiwygConfigData" xsi:type="array"> <item name="height" xsi:type="string">100px</item> <item name="add_variables" xsi:type="boolean">false</item> <item name="add_widgets" xsi:type="boolean">false</item> <item name="add_images" xsi:type="boolean">true</item> <item name="add_directives" xsi:type="boolean">true</item> </item> <item name="source" xsi:type="string">category</item> </item> </argument> <settings> <label translate="true">Top Block</label> <dataScope>menu_top_block</dataScope> </settings> <formElements> <wysiwyg class="Magento\Catalog\Ui\Component\Category\Form\Element\Wysiwyg"> <settings> <rows>8</rows> <wysiwyg>true</wysiwyg> </settings> </wysiwyg> </formElements> </field> <field name="category_menu_type"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Magelearn\CategoryAttribute\Model\Category\Attribute\Source\Menu</item> <item name="config" xsi:type="array"> <item name="sortOrder" xsi:type="number">180</item> <item name="dataType" xsi:type="string">text</item> <item name="label" xsi:type="string" translate="true">Menu type</item> <item name="formElement" xsi:type="string">select</item> <item name="source" xsi:type="string">category_menu_type</item> <item name="dataScope" xsi:type="string">category_menu_type</item> </item> </argument> </field> </fieldset> </form>
To display this date time picker attribute properly we will add file at Magelearn/CategoryAttribute/etc/adminhtml/di.xml
<?xml version="1.0" encoding="UTF-8"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Catalog\Controller\Adminhtml\Category\Save"> <arguments> <argument name="dateFilter" xsi:type="object">Magento\Framework\Stdlib\DateTime\Filter\DateTime</argument> </arguments> </type> <type name="Magento\Catalog\Controller\Adminhtml\Category"> <arguments> <argument name="dateFilter" xsi:type="object">Magento\Framework\Stdlib\DateTime\Filter\DateTime</argument> </arguments> </type> </config>
Now those colour picker and date time picker attributes are now available in Category Add/edit form.
0 Comments On "Add colour picker date picker, Image upload, Select and multi-select attribute in category add/edit form Magento2"