包括两个部分:
- Customer 账户中的 Last Name
- Customer Address 中的 Last Name
这两个字段在数据库中是有字段来控制它是否必填和显隐的。
eav_attribute
中的 is_required
控制是否必填
customer_eav_attribute
中的 is_visible
控制显隐
通过下面的代码即可将 Last Name 设置成非必填项并隐藏。
<?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
.field-name-lastname {
display: none;
}
另外用户后台创建 Customer Address 会报错 lastname is a required field.
这是因为 Magento\Customer\Model\Address\AbstractAddress::validate
中需要验证 lastname
我们可以通过 plugin 来 unset 掉这个错误。
<?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>
<?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;
}
}
}
大功告成。