Question

I have an existing module with code like this:

$attribute = $customerUpgrade->getEavConfig()->getAttribute(Customer::ENTITY, 'my_custom_attribute')
    ->addData([
        'attribute_set_id' => $attributeSetId,
        'attribute_group_id' => $attributeGroupId,
        'used_in_forms' => [],
    ]);

$attribute->save();

Because $attribute is an instance of AbstractModel, the save() function is deprecated. The recommendation from what I can tell is to use ResourceModel instead, but getAttribute() returns an AbstractModel type, and I can't find an easy way to use ResourceModel here.

What would be the correct (non-deprecated) way to add data to the custom attribute in this case?

Was it helpful?

Solution

Check following way, where I use resource save method:


<?php
namespace SR\MagentoCommunity\Setup;

use \Magento\Framework\Setup\UpgradeDataInterface;
use \Magento\Framework\Setup\ModuleContextInterface;
use \Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Customer\Model\Customer;
use Magento\Customer\Setup\CustomerSetup;
use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Eav\Model\Config as EavConfig;
use Magento\Eav\Setup\EavSetup;
use Magento\Customer\Model\ResourceModel\Attribute as CustomerAttributeResourceModel;

class UpgradeData implements UpgradeDataInterface
{
    /**
     * Customer setup factory
     *
     * @var \Magento\Customer\Setup\CustomerSetupFactory
     */
    private $customerSetupFactory;

    /**
     * @var EavConfig
     */
    private $eavConfig;

    /**
     * @var EavSetup
     */
    private $eavSetup;

    /**
     * @var CustomerAttributeResourceModel
     */
    private $customerAttributeResourceModel;

    /**
     * UpgradeData constructor.
     * 
     * @param CustomerSetupFactory $customerSetupFactory
     * @param EavConfig $eavConfig
     * @param EavSetup $eavSetup
     * @param CustomerAttributeResourceModel $customerAttributeResourceModel
     */
    public function __construct(
        CustomerSetupFactory $customerSetupFactory,
        EavConfig $eavConfig,
        EavSetup $eavSetup,
        CustomerAttributeResourceModel $customerAttributeResourceModel
    ) {
        $this->customerSetupFactory = $customerSetupFactory;
        $this->eavConfig = $eavConfig;
        $this->eavSetup = $eavSetup;
        $this->customerAttributeResourceModel = $customerAttributeResourceModel;
    }

    /**
     * Upgrade data for a module
     *
     * @param ModuleDataSetupInterface $setup
     * @param ModuleContextInterface $context
     * @return void
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        if (version_compare($context->getVersion(), '2.0.1', '<')) {
            $this->createMobileAttribute($setup);
        }
    }

    /**
     * @param ModuleDataSetupInterface $setup
     */
    public function createMobileAttribute($setup)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        // Add new customer attribute
        $customerSetup->addAttribute(
            Customer::ENTITY,
            'mobile',
            [

                'label'                 => 'Mobile',
                'input'                 => 'text',
                'required'              => false,
                'sort_order'            => 1000,
                'position'              => 1000,
                'visible'               => true,
                'system'                => false,
                'is_used_in_grid'       => false,
                'is_visible_in_grid'    => false,
                'is_filterable_in_grid' => false,
                'is_searchable_in_grid' => false,
                'default'               => '0',
                'user_defined' => true,
            ]
        );

        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'mobile');
        $attribute->setData('used_in_forms', ['adminhtml_customer', 'customer_account_create', 'customer_account_edit']);
        $this->customerAttributeResourceModel->save($attribute);

        $setup->endSetup();
    }
}

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top