Magento 2: Erstellen Sie Kundenattribute programmgesteuert ohne Installationsskript

7

So erstellen Sie Kundenattribute magento 2, damit es beim Ausführen eines Skripts ohne Installationsskript funktioniert: -

    /**
     * @var   \Magento\Eav\Setup\EavSetupFactory
     */
    protected $eavEavSetupFactory;

    public function __construct(
        ...
        \Magento\Eav\Setup\EavSetupFactory $eavEavSetupFactory,
        ...     
    )
    {
        ...
        $this->eavEavSetupFactory = $eavEavSetupFactory;
        ...
    }

    public function createOrUpdateCustomerUDA($value, $input, $type)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->eavEavSetupFactory->create(['setup' => $setup]);

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

        $customerSetup->addAttribute(Customer::ENTITY, $value, [
            'type' => $type,
            'label' => $value,
            'input' => $input,
            'required' => false,
            'visible' => true,
            'user_defined' => true,
            'sort_order' => 1000,
            'position' => 1000,
            'system' => 0,
        ]);
        //add attribute to attribute set
        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, $value)
        ->addData([
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms' => ['adminhtml_customer'],
        ]);

    $attribute->save();
    }

Ich verwende diese Funktion in meinem benutzerdefinierten Modul, um Kundenattribute zu erstellen, aber es gibt mir den folgenden Fehler. Bitte leiten Sie mich, wie ich $setupdiese Funktion übergebe, damit sie einwandfrei funktioniert: -

Parse error: syntax error, unexpected '$setup' (T_VARIABLE), expecting ',' or ')' in Customer.php on line 540
Purushotam Sharma
quelle
1
Ich denke, es ist nicht nötig, ['setup' => $ setup] an die Fabrik zu übergeben. Entfernen Sie es einfach und alles sollte in Ordnung sein.
Andrey Konosov
Nach dem Entfernen von ['setup' => $ setup] wird der folgende Fehler Uncaught TypeError: Argument 1 passed to Magento\Setup\Module\DataSetup::__construct()
angezeigt
Magento\Framework\Setup\ModuleDataSetupInterfaceKönnen Sie versuchen, dies in Konstrukt zu laden und seine Referenz als Argument für Setup-Argument zu übergeben
Pankaj Pareek
@Pankaj nach dem Setzen der Konstruktabhängigkeit erhalten Fehler: - Nicht gefangener TypError: Argument 1 an Magento \ Setup \ Module \ DataSetup :: __ construct () übergeben
Purushotam Sharma

Antworten:

3

Versuchen Sie folgenden Code:

  1. app / code / [VendorName] / [ModuleName] /registration.php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    '[VendorName]_[ModuleName]',
    __DIR__
);
  1. app / code / [VendorName] / [ModuleName] /etc/module.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="[VendorName]_[ModuleName]" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>
  1. app / code / [VendorName] / [ModuleName] /Setup/InstallData.php
namespace [VendorName]\[ModuleName]\Setup;

use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Customer\Model\Customer;
use Magento\Eav\Model\Entity\Attribute\Set as AttributeSet;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
    protected $customerSetupFactory;

    private $attributeSetFactory;

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

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

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

        $customerSetup->addAttribute(Customer::ENTITY, 'custom_username', [
            'type' => 'varchar',
            'label' => 'Custom Field',
            'input' => 'text',
            'user_defined' => false,
            'required' => false,
            'visible' => true,
            'sort_order' => 1000,
            'position' => 1000,
            'system' => 0,
        ]);

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

        $attribute->save();
    }
}
Pratik Oza
quelle
Ich finde das bereits, aber dies verwendet das Installationsskript. Aber ich möchte ohne Installationsskript verwenden
Purushotam Sharma
3

Nach einer langen Zeit und dem Debuggen und dem Lesen der Blogging-Site / des Blogs fand ich die Lösung, um Attribute in Magento programmgesteuert zu erstellen und in diesen benutzerdefinierten Attributen Wert zu sparen.

Hier ist mein vollständiger Code, der in meinem benutzerdefinierten Modul funktioniert: -

<?php
namespace Company\Mymodule\Helper;

use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;

class Customer extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * @var \Magento\Eav\Setup\EavSetupFactory
     */
    protected $eavEavSetupFactory;
    protected $eavConfig;
    protected $attributeSetFactory;

    public function __construct(
        ...
        \Magento\Eav\Setup\EavSetupFactory $eavEavSetupFactory,
        \Magento\Eav\Model\Config $eavConfig,       
        AttributeSetFactory $attributeSetFactory
        ...
    )
    {
        ...
        $this->eavEavSetupFactory = $eavEavSetupFactory;
        $this->attributeSetFactory = $attributeSetFactory;
        $this->eavConfig = $eavConfig;
        ...
    }   

    protected function createOrUpdateCustomerUDA($value, $input, $type)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->eavEavSetupFactory->create();

        $customerEntity = $customerSetup->getEntityTypeId('customer');
        $attributeSetId = $customerSetup->getDefaultAttributeSetId($customerEntity);

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);
        $attributeCode = $this->getAttributeCode($value);

        $customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, $attributeCode, [
            'type' => $type,
            'label' => $value,
            'input' => $input,
            'required' => false,
            'visible' => true,
            'user_defined' => true,
            'sort_order' => 90,
            'position' => 999,
            'system' => 0,
        ]);

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

        $attribute->save();

        unset($customerSetup);      
    }

    protected function getAttributeCode($str)
    {
        return "pre_" . strtolower(str_replace(" ", "", $str));    
    } 
}

Bitte verwenden Sie den obigen Code und lassen Sie mich wissen, wenn ein Problem auftritt. Viel Spaß beim Codieren :)

Purushotam Sharma
quelle
Hallo @ Purushotam, können Sie bitte auch den Code zum Erstellen des Produktattributs angeben?
Jafar Pinjar