Magento 2 移除 Last Name

包括两个部分:

  • 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;
        }
    }
}

大功告成。

发表评论

电子邮件地址不会被公开。 必填项已用*标注