Pergunta

Nota:A pergunta estava se referindo a e o código para a instalação de scripts não é o mesmo, em Magento 2.x.

Eu estou jogando com o Magento 2 e eu estou preso na adição de atributo para a entidade cliente.Eu tenho atributo corretamente instalado usando dados do instalador, mas eu não posso fazê-lo apresentado em formulários.

Meu data-install-2.0.0.php script de instalação de procura da seguinte forma:

/* @var $this \Magento\Customer\Model\Resource\Setup */
$installer = $this;

$installer->startSetup();

// Add nickname attribute
$installer->addAttribute(
    'customer',
    'nickname',
    [
        'type' => 'varchar',
        'label' => 'Nickname',
        'input' => 'text',
        'required' => true,
        'sort_order' => 75,
        'visible' => true,
        'system' => true,
        'unique' => true,
        'position' => 75,
    ]
);


$nicknameAttribute = $installer->getEavConfig()->getAttribute('customer', 'nickname');
$nicknameAttribute->setData(
    'used_in_forms',
    ['customer_account_create', 'customer_account_edit', 'checkout_register', 'adminhtml_customer']
);
$nicknameAttribute->save();

$installer->endSetup();

Essa parte funciona bem, após a execução setup/index.php update meu atributo é visível em tabelas de banco de dados (eav_attribute, customer_eav_attribute, customer_form_attribute).No entanto, ele não é visível em formulários.

Eu adicionei o seguinte em etc/fieldset.xml na minha módulo personalizado:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="customer_account">
            <field name="nickname">
                <aspect name="create" />
                <aspect name="update" />
                <aspect name="name" />
            </field>
        </fieldset>
    </scope>
</config>

Parece que ele não faz nada.

Em seguida, seguir em data_source/customer.xml:

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../../app/code/Magento/Ui/etc/data_source.xsd">
    <dataSource
            name="account" label="Account Information"
            dataSet="Magento\Customer\Model\Resource\Customer\Collection">
        <fields entityType="customer">
            <field name="nickname" source="eav" dataType="text"/>
        </fields>
    </dataSource>
</config>

Isso realmente faz algo, ele quebras de back-end do cliente formulário com exceção de:

More than one node matching the query: /config/dataSource[@name='account']/fields/field

Eu acho que a adição destes dois arquivos xml a partir do núcleo de módulo em módulo personalizado deve ser feito de alguma outra maneira.

No final eu fiz uma coisa mais apenas para testes.Eu removido etc/fieldset.xml e data_source/customer.xml a partir de meu módulo e acrescentou que o conteúdo em Magento_Customer módulo de núcleo.Isto resultou em ter o meu campo exibido no back-end (hooray!), mas o verão ainda não funciona, e lança uma mensagem de erro:

"Nickname" is a required value.

Então minhas perguntas são:

  1. O que é uma forma válida para alterar etc/fieldset.xml e data_source/customer.xml no módulo personalizado?

  2. O que mais deveria ser feito para ter o atributo personalizado a ser guardado?

  3. Como posso fazer isso para o frontend formulário de inscrição?Adicionar o campo em form/register.phtml não faz a mágica.

Foi útil?

Solução

Nota:Esta resposta estava se referindo a e o código para a instalação de scripts não é o mesmo, em Magento 2.x.

Finalmente posso fornecer a resposta para a minha pergunta.Adicionar o atributo de cliente e tê-lo apresentado no back-end formulário não necessita de mudar nada em arquivos XML.Isso poderia ser alcançado fazendo o seguinte na instalação/atualização do script:

    $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

    $customerSetup->addAttribute(
        \Magento\Customer\Model\Customer::ENTITY,
        'nickname',
        [
            'label'            => 'Nickname',
            'required'         => 0,
            'system'           => 0,
            'position'         => 100
        ]
    );

    $customerSetup->getEavConfig()->getAttribute('customer', 'nickname')
        ->setData('used_in_forms', ['adminhtml_customer'])
        ->save();

system propriedade definida como 0 é crucial, em outro caso o valor do atributo não será salvo.

Ele funciona bem na actual desenvolver ramo.

Outras dicas

Criação de Atributo de Cliente através de InstallData

    /** @var CustomerSetup $customerSetup */
    $customerSetup = $this->customerSetupFactory->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, 'work_profile', [
        'type' => 'varchar',
        'label' => 'Work Profile',
        'input' => 'text',
        'class' => '',
        'source' => '',                            
        'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_GLOBAL,
                                /*Scope of your attribute */
        'required' => false,
        'visible' => true,
        'user_defined' => true,
        'position' =>999,
        'system' => 0,
    ]);

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

    $attribute->save();

Você pode usar outros used_in_forms valores ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top