Introduction
Imagine similar situation as I described in the previous article Magento 2: How to Change Category Attribute Value Programmatically
But now we need to change product attribute setting.
And, as in previuos example, we can do it via admin panel.
Buuut… would be better…
Solution
To use Data Patch.
<?php
declare(strict_types=1);
namespace Vendor\ModuleName\Setup\Patch\Data;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Catalog\Model\Product;
class UpdateColorAttribute implements DataPatchInterface
{
/** @var ModuleDataSetupInterface */
private ModuleDataSetupInterface $moduleDataSetup;
/**
* @var EavSetupFactory
*/
private EavSetupFactory $eavSetupFactory;
/**
* Constructor
*
* @param ModuleDataSetupInterface $moduleDataSetup
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(
ModuleDataSetupInterface $moduleDataSetup,
EavSetupFactory $eavSetupFactory
)
{
$this->moduleDataSetup = $moduleDataSetup;
$this->eavSetupFactory = $eavSetupFactory;
}
/**
* {@inheritdoc}
*/
public function apply()
{
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $this->moduleDataSetup]);
$eavSetup->updateAttribute(Product::ENTITY, 'color', ['used_in_product_listing' => 1]);
}
/**
* {@inheritdoc}
*/
public static function getDependencies()
{
return [];
}
/**
* {@inheritdoc}
*/
public function getAliases()
{
return [];
}
}
Explanation
We use updateAttribute method of the EavSetup model to update color product attribute.
$eavSetup->updateAttribute(Product::ENTITY, 'color', ['used_in_product_listing' => 1]);
First parameter - is the Entity Type. In our case it’s the 'catalog_product'. You can use that string. But better to use like this:
\Magento\Catalog\Model\Product::ENTITY
Second parameter - is the Attribute Code. It’s 'color' in our case.
Third parameter - is the array of modified settings. We are modifying only the used_in_product_listing setting in this example.