6

I need idea on how to create a script for adding bulk attribute sets and attributes in magento2?

This is the script i have tried:

AttributeSetupscript.php

<?php
 require __DIR__ . '/app/bootstrap.php';
 $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
 /** @var \Magento\Framework\App\Http $app */
 $app = $bootstrap->createApplication('AttributeSet');
 $bootstrap->run($app);

AttributeSet.php

<?php
use \Magento\Framework\App\Bootstrap;
//include('../app/bootstrap.php');
use Magento\Catalog\Api\CategoryRepositoryInterface;
class AttributeSet extends \Magento\Framework\App\Http implements \Magento\Framework\AppInterface
{
protected $_moduleDataSetup;
protected $_eavSetupFactory;

public function __construct(      //not sure if i can include construct here
    ObjectManagerInterface $objectManager,
    ModuleDataSetupInterface $moduleDataSetup,
    EavSetupFactory $eavSetupFactory,
) {

    $this->_objectManager = $objectManager;
    $this->_moduleDataSetup = $moduleDataSetup;
    $this->_eavSetupFactory = $eavSetupFactory;
}

public function launch()
{
    $eavSetup = $this->_eavSetupFactory->create([
                'setup' => $this->_moduleDataSetup
    ]);

    $defaultId = $eavSetup->getDefaultAttributeSetId(self::ENTITY_TYPE);

    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    //$entityTypeId  = $objectManager->create('\Magento\Catalog\Model\Product');
    $entityTypeId = $objectManager->create('Magento\Eav\Model\Config')
                                    ->getEntityType(\Magento\Catalog\Api\Data\ProductAttributeInterface::ENTITY_TYPE_CODE)
                                    ->getEntityTypeId();    // to get entity_type_id by entity_type_code

    $model = $objectManager->create('Magento\Eav\Api\Data\AttributeSetInterface')
                                    ->setId(null)
                                    ->setEntityTypeId(4)
                                    ->setAttributeSetName($name);

            $objectManager->create('Magento\Eav\Api\AttributeSetManagementInterface')
                            ->create(self::ENTITY_TYPE, $model, $defaultId)
                            ->save();
}


public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
{
    return false;
}

}

I get Call to a member function sendResponse() on null in \Magento\Framework\App\Bootstrap.php on line 25

1) Is what i tried i construct() in scripts.

2) Or should i run InstallData Schmeas procedure.

7
  • Just share some logic what u thought then we move on. Question Title not good at all
    – Jackson
    Oct 6 '16 at 6:21
  • I have updated the question and my code @Ankit
    – Sushivam
    Oct 6 '16 at 6:45
  • That looks like a question @Sachin. Thanks
    – Jackson
    Oct 6 '16 at 6:46
  • What am i supposed to post? i have updated the script what i tried
    – Sushivam
    Oct 6 '16 at 6:50
  • What u have posted is correct now
    – Jackson
    Oct 6 '16 at 6:51
1
  • Create a module
  • Create a setup script

Adapt this code to your context. It creates an attribute set and then assign an attribute to this attribute set. Use dependency injection.

use Magento\Eav\Model\Entity\TypeFactory;
use Magento\Eav\Model\Entity\Attribute\SetFactory;
use Magento\Eav\Model\AttributeSetManagement;
use Magento\Eav\Model\AttributeManagement;

public function createAttributeSets() {
    $entityTypeCode = 'catalog_product';
    $entityType     = $this->eavTypeFactory->create()->loadByCode($entityTypeCode);
    $defaultSetId   = $entityType->getDefaultAttributeSetId();

    $attributeSet = $this->attributeSetFactory->create();
    $data = [
        'attribute_set_name'    => 'attribute_set_name',
        'entity_type_id'        => $entityType->getId(),
        'sort_order'            => 200,
    ];
    $attributeSet->setData($data);

    $this->attributeSetManagement->create($entityTypeCode, $attributeSet, $defaultSetId);

    $this->attributeManagement->assign(
        'catalog_product',
        $attributeSet->getId(),
        $attributeSet->getDefaultGroupId(),
        'attribute_code',
        $attributeSet->getCollection()->count() * 10
    );
}

If you want a bulk import, adapt your code. (edited from comment request)

public function createAttributeSets() {
    $entityTypeCode = 'catalog_product';
    $entityType     = $this->eavTypeFactory->create()->loadByCode($entityTypeCode);
    $defaultSetId   = $entityType->getDefaultAttributeSetId();

    $datas = [
        [
            'attribute_set_name'    => 'attribute_set_name',
            'entity_type_id'        => $entityType->getId(),
            'sort_order'            => 200,
        ],
        [
            'attribute_set_name'    => 'attribute_set_name_2',
            'entity_type_id'        => $entityType->getId(),
            'sort_order'            => 300,
        ]
    ];

    foreach ($datas as $data) {
        $attributeSet = $this->attributeSetFactory->create();

        $attributeSet->setData($data);

        $this->attributeSetManagement->create($entityTypeCode, $attributeSet, $defaultSetId);

        $this->attributeManagement->assign(
            'catalog_product',
            $attributeSet->getId(),
            $attributeSet->getDefaultGroupId(),
            'attribute_code',
            $attributeSet->getCollection()->count() * 10
        );
    }
}
6
  • Can we add multiple attribute sets here: $data = [ 'attribute_set_name' => 'Attribute set1', 'entity_type_id' => $entityType->getId(), 'sort_order' => 200, ];
    – Sushivam
    Mar 8 '17 at 7:24
  • You cannot with native Magento. But you can create your custom attributeSetManagement based on this method : \Magento\Eav\Model\AttributeSetManagement::create Or create a custom function which handle this by call create multiple times. Mar 8 '17 at 7:29
  • Just add a foreach ... answer edited. Mar 8 '17 at 7:38
  • where is $attributeManagement, it says undefined
    – Sushivam
    Mar 8 '17 at 9:44
  • You need to inject the class Magento\Eav\Model\AttributeManagement from the constructor. I let you check Magento documentation about Dependancy Injection (DI devdocs.magento.com/guides/v2.1/extension-dev-guide/…) or open a new question because it is not the main topic. Mar 8 '17 at 10:16
0

Following is the script to create an attribute set programmatically in Magento 2.


?php

namespace Company\Mymodule\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Catalog\Setup\CategorySetupFactory;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;

class InstallData implements InstallDataInterface
{
 private $attributeSetFactory;
 private $attributeSet;
 private $categorySetupFactory;

 public function __construct(AttributeSetFactory $attributeSetFactory, CategorySetupFactory $categorySetupFactory )
 {
 $this->attributeSetFactory = $attributeSetFactory;
 $this->categorySetupFactory = $categorySetupFactory;
 }

 public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
 {
 $setup->startSetup();
 $categorySetup = $this->categorySetupFactory->create(['setup' => $setup]);

 $attributeSet = $this->attributeSetFactory->create();
 $entityTypeId = $categorySetup->getEntityTypeId(\Magento\Catalog\Model\Product::ENTITY);
 $attributeSetId = $categorySetup->getDefaultAttributeSetId($entityTypeId);
 $data = [
 'attribute_set_name' => 'My_Custom_Attribute_Set',
 'entity_type_id' => $entityTypeId,
 'sort_order' => 50,
 ];
 $attributeSet->setData($data);
 $attributeSet->validate();
 $attributeSet->save();
 $attributeSet->initFromSkeleton($attributeSetId);
 $attributeSet->save();

 $setup->endSetup();
 }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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