{ Hello Magento 2 }

解决 Magento 2 应用问题,更注重深度挖掘。(ง •̀_•́)ง

0%

Magento 2 移除 Last Name

包括两个部分:

  • Customer 账户中的 Last Name
  • Customer Address 中的 Last Name

这两个字段在数据库中是有字段来控制它是否必填和显隐的。 eav_attribute 中的 is_required 控制是否必填 customer_eav_attribute 中的 is_visible 控制显隐 通过下面的代码即可将 Last Name 设置成非必填项并隐藏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
namespace Vendor\ModuleName\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
protected $eavSetupFactory;

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

public function install(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
//update lastname to be not required and invisible
$eavSetup->updateAttribute('customer', 'lastname', 'is_required', 0);
$eavSetup->updateAttribute('customer', 'lastname', 'is_visible', 0);
$eavSetup->updateAttribute('customer_address', 'lastname', 'is_required', 0);
$eavSetup->updateAttribute('customer_address', 'lastname', 'is_visible', 0);
}
}

经过测试,所有通过 UI Component 加载的控件都可以正常工作了。比如管理后台,checkout 中。 还有用户注册页,用户后台账户页,可以通过 css 方式隐藏 Last Name

1
2
3
.field-name-lastname {
display: none;
}

另外用户后台创建 Customer Address 会报错 lastname is a required field. 这是因为 Magento\Customer\Model\Address\AbstractAddress::validate 中需要验证 lastname 我们可以通过 plugin 来 unset 掉这个错误。

1
2
3
4
5
6
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Customer\Model\Address\AbstractAddress">
<plugin name="removelastname" type="Vendor\ModuleName\Plugin\Address\AbstractAddress" sortOrder="1" />
</type>
</config>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
namespace Vendor\ModuleName\Plugin\Address;

class AbstractAddress {
public function afterValidate(\Magento\Customer\Model\Address\AbstractAddress $subject, $result)
{
$obj = __('%fieldName is a required field.', ['fieldName' => 'lastname']);

if (is_array($result)) {

foreach ($result as $key => $value)
{
if ($obj == $value) {
unset($result[$key]);
}
}

if (empty($result)) {
return true;
} else {
return $result;
}

} else {
return true;
}
}
}

大功告成。