Today we discuss about the Magento 2 create category attribute using upgradeData using the script.
We are creating a select box category attribute using the below steps.
- Increase the module version from 1.0.0 to 1.0.1 in module.xml file
Path: app/code/Custom/CategoryAttribute/etc/module.xml
<?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="Custom_CategoryAttribute" setup_version="1.0.1"> <sequence> <module name="Magento_Catalog"/> </sequence> </module> </config>
- Create UpgradeData.php file in the setup folder.
Path: app/code/Custom/CategoryAttribute/Setup/UpgradeData.php
<?php /** * Copyright © 234556 All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Custom\CategoryAttribute\Setup; use Magento\Eav\Setup\EavSetup; use Magento\Eav\Setup\EavSetupFactory; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; use Magento\Framework\Setup\UpgradeDataInterface; use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface; class UpgradeData implements UpgradeDataInterface { private $eavSetupFactory; /** * Constructor * * @param \Magento\Eav\Setup\EavSetupFactory $eavSetupFactory */ public function __construct(EavSetupFactory $eavSetupFactory) { $this->eavSetupFactory = $eavSetupFactory; } /** * {@inheritdoc} */ public function upgrade( ModuleDataSetupInterface $setup, ModuleContextInterface $context ) { if (version_compare($context->getVersion(), "1.0.1", "<")) { $setup->getConnection()->startSetup(); /** @var EavSetup $eavSetup */ $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]); $eavSetup->addAttribute( \Magento\Catalog\Model\Category::ENTITY, 'blog_type', [ 'type' => 'int', 'label' => 'Select Blog Type', 'input' => 'select', 'sort_order' => 335, 'source' => 'Custom\CategoryAttribute\Model\Source\Blogtype', 'global' => ScopedAttributeInterface::SCOPE_STORE, 'visible' => true, 'required' => false, 'user_defined' => false, 'default' => null, 'group' => 'General Information', 'backend' => '' ] ); $setup->getConnection()->endSetup(); } } }
‘source’ => ‘Custom\CategoryAttribute\Model\Source\Blogtype’,
3. Create a Source file to return the option for the drop-down
Path: app/Custom/CategoryAttribute/Base/Model/Source/Blogtype.php
<?php namespace Custom\CategoryAttribute\Model\Source; use Magefan\Blog\Model\ResourceModel\Category\CollectionFactory; class Blogtype extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource { protected $_categoryFactory; /** * Construct * * @param CollectionFactory $categoryFactory */ public function __construct(CollectionFactory $categoryFactory) { $this->_categoryFactory = $categoryFactory; } /** * {@inheritdoc} */ public function getAllOptions() { $options = array(); $collection = $this->_categoryFactory->create(); $options[] = [ 'value' => '', 'label' => 'Select blog type' ]; foreach($collection as $block){ if($block->getData('is_active')){ $options[] = [ 'value' => $block->getData('category_id'), 'label' => $block->getData('title') ]; } } /* print_r($options); // print array Array ( [0] => Array ( [value] => [label] => Select blog type ) [1] => Array ( [value] => 1 [label] => Blog Category1 ) [2] => Array ( [value] => 2 [label] => Blog Category2 ) ) */ return $options; } }
Note: We are using the Magefan blog category collection
- Create category_form.xml file to displace attributes in the category.
Path: app/code/Custom/CategoryAttribute/view/adminhtml/ui_component/category_form.xml
<?xml version="1.0" ?> <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <fieldset name="content"> <field name="blog_type"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Custom\CategoryAttribute\Model\Source\Blogtype</item> <item name="config" xsi:type="array"> <item name="required" xsi:type="boolean">false</item> <item name="validation" xsi:type="array"> <item name="required-entry" xsi:type="boolean">false</item> </item> <item name="sortOrder" xsi:type="number">335</item> <item name="dataType" xsi:type="string">string</item> <item name="formElement" xsi:type="string">select</item> <item name="label" xsi:type="string" translate="true">Select Blog Type</item> </item> </argument> </field> </fieldset> </form>
Run commands:
php bin/magento setup:upgrade
php bin/magento setup:static-content:deploy -f
php bin/magento c:f
Get the attribute value in the file of the current category
<?php $catalogHelperData = $this->helper('Magento\Catalog\Helper\Data'); $categoryObject = $catalogHelperData->getCategory(); $blog_type = $categoryObject->getBlogType(); var_dump($blog_type); ?>
Like us on Facebook and Linkedin for more updates.
Create Category Custom Layout In Magento 2