0

I want to add a custom attribute to my customer. For now I have this : (on magento 2.2.4)

<?php
namespace My\Module\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{

private $customerSetupFactory;
private $attributeSetFactory;

public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory, \Magento\Eav\Model\Entity\Attribute\SetFactory $attributeSetFactory)
{
    $this->customerSetupFactory = $customerSetupFactory;
    $this->attributeSetFactory = $attributeSetFactory;
}

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
    $installer = $setup;
    $installer->startSetup();

    /** @var CustomerSetup $customerSetup */
    $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);
    $customerSetup->removeAttribute(\Magento\Customer\Model\Customer::ENTITY, "customer_bonus");

    $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
    $attributeSetId = $customerEntity->getDefaultAttributeSetId();
    $attributeSet = $this->attributeSetFactory->create();
    $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);


    $customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, 'customer_bonus', [
        'type' => 'varchar',
        'label' => 'Customer Bonus',
        'input' => 'text',
        'required' => false,
        'visible' => true,
        'user_defined' => true,
        'system' => false,
    ]);

    $attribute = $customerSetup->getEavConfig()->getAttribute(\Magento\Customer\Model\Customer::ENTITY, 'customer_bonus')
        ->addData([
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms'=>['adminhtml_customer']
        ]);

    $attribute->save();

    $installer->endSetup();
}

}

But there's nothing on my backend, I want have something like this result : Magento 2 - How to add a custom column in customer grid

And CustomerSetupFactory is not find in PHP Storm. I tried

php bin/magento setup:di:compile

but nothing change.

Edit : the class is found with setup:di:compile dans after if I do setup:upgrade it's not found anymore.

6
  • Factories are service classes that instantiate non-injectable classes, that is, models that represent a database entity. They create a layer of abstraction between the ObjectManager and business code. Commented May 25, 2018 at 15:39
  • they are an automatically generated class type. Commented May 25, 2018 at 15:39
  • Please try reindeing Commented May 25, 2018 at 15:39
  • php bin/magento indexer:reindex Commented May 25, 2018 at 15:39
  • Reidexer didn't change it, do you have another idea ?
    – Morgan
    Commented May 25, 2018 at 15:48

1 Answer 1

0
class UpgradeData implements UpgradeDataInterface
 {
  /**
   * {@inheritdoc}
   * @SuppressWarnings(PHPMD.NPathComplexity)
   * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  */
    protected $customerSetupFactory;
    private $attributeSetFactory;

public function __construct(
    \Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory,
    AttributeSetFactory $attributeSetFactory) {
    $this->customerSetupFactory = $customerSetupFactory;
    $this->attributeSetFactory = $attributeSetFactory;
}
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
    $setup->startSetup();
    /** @var CustomerSetup $customerSetup */

    if (version_compare($context->getVersion(), '1.0.1', '<')) {
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);
    $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
    $attributeSetId = $customerEntity->getDefaultAttributeSetId();
    $attributeSetId = $customerEntity->getDefaultAttributeSetId();
    /** @var $attributeSet AttributeSet */
    $attributeSet = $this->attributeSetFactory->create();
    $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

    $customerSetup->addAttribute(Customer::ENTITY, 'attributename', [
            'type'      => 'int',
            'backend'   => '',
            'label'     => 'Label',
            'input'     => 'text',
            'source'    => '',
            'visible'   => true,
            'required'  => false,
            'default'   => '',
            'frontend'  => '',
            'sort_order' => 1000,
            'position' => 1000,
            'unique'    => true,
            'system' => 0,
        ] );

    //add attribute to attribute set
    $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'sap_id')
    ->addData([
        'attribute_set_id' => $attributeSetId,
        'attribute_group_id' => $attributeGroupId,
        'used_in_forms' => ['adminhtml_customer'],
    ]);

    $attribute->save();
    $setup->endSetup();
   }     
 }
}

This may help you out

2
  • Where does this class is suppose to go ?
    – Morgan
    Commented May 28, 2018 at 7:28
  • The install data or update data of setup scripts is useful to add a new attribute to the ui forms. Commented May 28, 2018 at 10:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.