Question

I'm trying to add a few custom customer attributes, I've created a simple module to install the attributes but my InstallData.php file keeps failing.

Here's my code:

<?php
 namespace CustomModules\CustomerNewsletters\Setup;

 use Magento\Eav\Setup\EavSetup;
 use Magento\Eav\Setup\EavSetupFactory;
 use Magento\Framework\Setup\InstallDataInterface;
 use Magento\Framework\Setup\ModuleContextInterface;
 use Magento\Framework\Setup\ModuleDataSetupInterface;

 class InstallData implements InstallDataInterface {
   private $eavSetupFactory;

 public function __construct(EavSetupFactory $eavSetupFactory) {
    $this->eavSetupFactory = $eavSetupFactory;
}

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) {
    $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
    $eavSetup->addAttribute(
        \Magento\Customer\Model\Customer::ENTITY,
        'new_products_newsletters',
        [
            'type'         => 'int',
            'label'        => 'New Products Newsletter',
            'input'        => 'boolean',
            'required'     => false,
            'visible'      => true,
            'user_defined' => true,
            'position'     => 999,
            'system'       => 0,
        ],
        'exclusive_offers_newsletters',
        [
            'type'         => 'int',
            'label'        => 'Exclusive Offers Newsletter',
            'input'        => 'boolean',
            'required'     => false,
            'visible'      => true,
            'user_defined' => true,
            'position'     => 999,
            'system'       => 0,
        ],
        'discounts_sales_newsletters',
        [
            'type'         => 'int',
            'label'        => 'Discounts and Sales Newsletter',
            'input'        => 'boolean',
            'required'     => false,
            'visible'      => true,
            'user_defined' => true,
            'position'     => 999,
            'system'       => 0,
        ]
    );
    $newProductsNewsletter = $this->eavConfig->getAttribute(Customer::ENTITY, 'new_products_newsletters');
    $exclusiveOffersNewsletter = $this->eavConfig->getAttribute(Customer::ENTITY, 'exclusive_offers_newsletters');
    $discountSalesNewsletter = $this->eavConfig->getAttribute(Customer::ENTITY, 'discounts_sales_newsletters');

    // more used_in_forms ['adminhtml_checkout','adminhtml_customer','adminhtml_customer_address','customer_account_edit','customer_address_edit','customer_register_address']
    $newProductsNewsletter->setData(
        'used_in_forms',
        ['adminhtml_customer']

    );
    $exclusiveOffersNewsletter->setData(
        'used_in_forms',
        ['adminhtml_customer']

    );
    $discountSalesNewsletter->setData(
        'used_in_forms',
        ['adminhtml_customer']

    );
    $newProductsNewsletter->save();
    $exclusiveOffersNewsletter->save();
    $discountSalesNewsletter->save();

    $this->removeAttribute('customer', 'new_products_newsletter');
    $this->removeAttribute('customer', 'exclusive_offers_newsletter');
    $this->removeAttribute('customer', 'discounts_and_sales_newsletter');
}

}

The error I get when running php bin/magento setup:upgrade:

Installing data... Notice: Undefined property: CustomModules\CustomerNewsletters\Setup\InstallData::$eavConfig in C:\xampp\htdocs\hooplaHooray\app\code\CustomModules\CustomerNewsletters\Setup\InstallData.php on line 55

Was it helpful?

Solution

On line 55 (and following) you call $this->eavConfig, but that property does not exist in your class.

You need to edit your constructor:

private $eavConfig;

public function __construct(
    EavSetupFactory $eavSetupFactory,
    Config $eavConfig
) {
    $this->eavSetupFactory = $eavSetupFactory;
    $this->eavConfig = $eavConfig;
}

And add the following use-statement:

use Magento\Eav\Model\Config;

OTHER TIPS

Please try Below code...

class InstallData implements InstallDataInterface {

private $customerSetupFactory;

/**
 * Constructor
 *
 * @param \Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory
 */
public function __construct(
    CustomerSetupFactory $customerSetupFactory
) {
    $this->customerSetupFactory = $customerSetupFactory;
}

/**
 * {@inheritdoc}
 */
public function install(
    ModuleDataSetupInterface $setup,
    ModuleContextInterface $context
) {
    $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

    $customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, 'new_products_newsletters', [
        'type' => 'int',
        'label' => 'New Products Newsletter',
        'input' => 'boolean',
        'source' => '',
        'required' => false,
        'visible' => true,
        'position' => 333,
        'system' => false,
        'backend' => ''
    ]);

    $attribute = $customerSetup->getEavConfig()->getAttribute('customer', 'new_products_newsletters')
    ->addData(['used_in_forms' => [
            'adminhtml_customer',
            'adminhtml_checkout',
            'customer_account_create',
            'customer_account_edit'
        ]
    ]);
    $attribute->save();

    $customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, 'exclusive_offers_newsletters', [
        'type' => 'int',
        'label' => 'Exclusive Offers Newsletter',
        'input' => 'boolean',
        'source' => '',
        'required' => false,
        'visible' => true,
        'position' => 333,
        'system' => false,
        'backend' => ''
    ]);

    $attribute = $customerSetup->getEavConfig()->getAttribute('customer', 'exclusive_offers_newsletters')
    ->addData(['used_in_forms' => [
            'adminhtml_customer',
            'adminhtml_checkout',
            'customer_account_create',
            'customer_account_edit'
        ]
    ]);
    $attribute->save();

    $customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, 'discounts_sales_newsletters', [
        'type' => 'varchar',
        'label' => 'Discounts and Sales Newsletter',
        'input' => 'text',
        'source' => '',
        'required' => true,
        'visible' => true,
        'position' => 333,
        'system' => false,
        'backend' => ''
    ]);

    $attribute = $customerSetup->getEavConfig()->getAttribute('customer', 'discounts_sales_newsletters')
    ->addData(['used_in_forms' => [
            'adminhtml_customer',
            'adminhtml_checkout',
            'customer_account_create',
            'customer_account_edit'
        ]
    ]);
    $attribute->save();
}
}

Replace below code there were missing some dependency i have added on it .

like as

use Magento\Eav\Model\Config; use Magento\Customer\Model\Customer;

Also use $eavSetup->removeAttribute in the place of $this->removeAttribute

<?php
 namespace CustomModules\CustomerNewsletters\Setup;
 use Magento\Eav\Setup\EavSetup;
 use Magento\Eav\Setup\EavSetupFactory;
 use Magento\Framework\Setup\InstallDataInterface;
 use Magento\Framework\Setup\ModuleContextInterface;
 use Magento\Framework\Setup\ModuleDataSetupInterface;
 use Magento\Eav\Model\Config;
 use Magento\Customer\Model\Customer;
 class InstallData implements InstallDataInterface {
   private $eavSetupFactory;
   private $eavConfig;
 public function __construct(EavSetupFactory $eavSetupFactory ,  Config  $eavConfig) {
    $this->eavSetupFactory = $eavSetupFactory;
    $this->eavConfig = $eavConfig;
}

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) {
    $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
    $eavSetup->addAttribute(
        \Magento\Customer\Model\Customer::ENTITY,
        'new_products_newsletters',
        [
            'type'         => 'int',
            'label'        => 'New Products Newsletter',
            'input'        => 'boolean',
            'required'     => false,
            'visible'      => true,
            'user_defined' => true,
            'position'     => 999,
            'system'       => 0,
        ],
        'exclusive_offers_newsletters',
        [
            'type'         => 'int',
            'label'        => 'Exclusive Offers Newsletter',
            'input'        => 'boolean',
            'required'     => false,
            'visible'      => true,
            'user_defined' => true,
            'position'     => 999,
            'system'       => 0,
        ],
        'discounts_sales_newsletters',
        [
            'type'         => 'int',
            'label'        => 'Discounts and Sales Newsletter',
            'input'        => 'boolean',
            'required'     => false,
            'visible'      => true,
            'user_defined' => true,
            'position'     => 999,
            'system'       => 0,
        ]
    );
    $newProductsNewsletter = $this->eavConfig->getAttribute(Customer::ENTITY, 'new_products_newsletters');
    $exclusiveOffersNewsletter = $this->eavConfig->getAttribute(Customer::ENTITY, 'exclusive_offers_newsletters');
    $discountSalesNewsletter = $this->eavConfig->getAttribute(Customer::ENTITY, 'discounts_sales_newsletters');

    // more used_in_forms ['adminhtml_checkout','adminhtml_customer','adminhtml_customer_address','customer_account_edit','customer_address_edit','customer_register_address']
    $newProductsNewsletter->setData(
        'used_in_forms',
        ['adminhtml_customer']

    );
    $exclusiveOffersNewsletter->setData(
        'used_in_forms',
        ['adminhtml_customer']

    );
    $discountSalesNewsletter->setData(
        'used_in_forms',
        ['adminhtml_customer']

    );
    $newProductsNewsletter->save();
    $exclusiveOffersNewsletter->save();
    $discountSalesNewsletter->save();

    $eavSetup->removeAttribute('customer', 'new_products_newsletter');
    $eavSetup->removeAttribute('customer', 'exclusive_offers_newsletter');
    $eavSetup->removeAttribute('customer', 'discounts_and_sales_newsletter');
}
}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top