在本文中,我们将了解什么是客户属性以及如何在MaGeto 2中以编程方式添加它们。因此,我们将继续进行以下几点:

1.什么是客户属性

2.为什么要以编程方式添加它们

3.创建客户属性的步骤

1.什么是客户属性

在Magento中,用于注册、登录和填写客户地址的字段基本上是客户属性。它们进一步分为客户属性和客户地址属性,注册/登录中使用的属性是客户属性,地址信息中使用的属性是客户地址属性。以下是客户属性的一些示例:

a.客户属性
- 名字,姓氏,出生日期等
b.客户地址属性
- 邮编,城市,街道,国家,地区/州等

2.为什么要以编程方式添加它们

默认情况下,Magento没有提供在CE中添加客户属性的功能,有时我们的项目要求必须在注册表单或地址表单中添加一些额外的字段(客户属性)。为此,我们需要以编程方式或通过第三方模块添加它们。

3.创建客户属性的步骤

让我们看看如何在Magento2中以编程方式逐步创建客户属性:

第1步:创建安装文件InstallData.php

首先,我们将创建InstallData.php文件:

File:Magease/Customerattr/Setup/InstallData.php

<?php
namespace Magease\Customerattr\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;
}

}

在这个类中,我们定义了用于与Magento 2属性交互的EAV设置模型。

第2步:定义install()方法

之后,我们必须定义install()方法并创建eav设置模型:

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$eavSetup->addAttribute(
\Magento\Customer\Model\Customer::ENTITY,
'gst_number',
[
'type' => 'varchar',
'label' => 'GST Number',
'input' => 'text',
'required' => false,
'visible' => true,
'user_defined' => true,
'position' => 100,
'system' => 0,
]
);
}

第3步:创建自定义属性

最后,我们需要设置使用属性的表单。在这个步骤中,我们需要定义eavConfig对象,它允许我们回调属性并为其设置数据,创建客户属性的完整代码是:

现在我们的最终InstallData.php如下所示: 

<?php
namespace Magease\Customerattr\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;

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,
'gst_number',
[
'type' => 'varchar',
'label' => 'GST Number',
'input' => 'text',
'required' => false,
'visible' => true,
'user_defined' => true,
'position' => 999,
'system' => 0,
]
);
$attribute = $this->eavConfig->getAttribute(Customer::ENTITY, 'gst_number');

// used_in_forms are of these types you can use forms key according to your need ['adminhtml_checkout','adminhtml_customer','adminhtml_customer_address','customer_account_edit','customer_address_edit','customer_register_address', 'customer_account_create']

$attribute->setData(
'used_in_forms',
['adminhtml_customer', 'customer_account_create']
);
$attribute->save();
}
}

注意我们在这里使用InstallData脚本(但不是InstallSchema或UpgradeSchema),因为我们不会更改与schema(数据库/表结构)相关的任何内容。运行脚本时,通过创建新条目来创建属性eav_attribute(因为Magento使用EAV ORM)。

第4步:显示注册表单中的客户属性

为了在注册页面上显示这个客户属性,我们需要做以下事情:

我们将使用Magease/Customerattr/view/frontend/layout/customer_account_create.xml将我们的phtml文件添加到'form.additional.info'中

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="form.additional.info">
<block class="Magento\Framework\View\Element\Template" name="gst_number" template="Customerattr::extra_field.phtml"/>
</referenceContainer>
</body>
</page>

解释:我们没有覆盖整个vendor/magento/module-customer/view/frontend/templates/form/register.phtml文件。相反,我们使用form.additional.info作为参考并向其添加新块,使用此代码getChildHtml('form_additional_info')在register.phtml中调用'form.additional.info'

因此通过上面的xml,我们可以简单地添加新的属性字段,其中包含编辑核心的register.phtml或者不覆盖它和getChildHtml('form_additional_info')自动读取'form.additional.info'子块的内容。

现在,在extra_field.phtml文件中,我们将编写代码来显示附加的文本框:

<fieldset class="fieldset create account" data-hasrequired="<?php /* @escapeNotVerified */echo __('* Required Fields') ?>">
<legend class="legend"><span><?php /* @escapeNotVerified */echo __('Additional Information') ?></span></legend><br>
<div class="field gst_number required">
<label class="label" for="email"><span><?= $block->escapeHtml(__('GST Number')) ?></span></label>
<div class="control">
<input type="text" name="gst_number" id="gst_number" title="<?php /* @escapeNotVerified */echo __('My Attribute') ?>" class="input-text" data-validate="{required:true}" autocomplete="off">
</div>
</div>
</fieldset>

在执行上述所有步骤之后,属性将显示在客户注册页面上。

现在,当用户创建帐户以及GST编号时,它将存储到数据库中的customer_entity_varchar表中该表包含以下字段:

value_id它只是表的自增主键

attribute_id我们在eav_attribute表格中看到的属性的id 

entity_id它将包含客户id

value它包含注册时填充的属性的值

现在输入的值也可以在管理面板中看到。导航至Customers -> All Customers,然后单击编辑以获取新创建的客户。在此处,您可以在帐户信息标签中找到此属性的字段以及创建帐户时输入的值。

这就是以编程方式添加客户属性的全部内容。