Como posso adicionar um atributo de cliente em Magento 2?
-
12-12-2019 - |
Pergunta
Nota:A pergunta estava se referindo a magento2-dev-beta 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:
O que é uma forma válida para alterar
etc/fieldset.xml
edata_source/customer.xml
no módulo personalizado?O que mais deveria ser feito para ter o atributo personalizado a ser guardado?
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.
Solução
Nota:Esta resposta estava se referindo a magento2-dev-beta 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']