如何在客户地址编辑表单中添加客户自定义属性?


19

我添加了一个客户自定义属性作为customer_address类型,它可以在admin,onepagecheckout以及送货和帐单地址中正常运行。

我在模块基本目录中创建了: my_namespace/my_module/etc/module.xmlregistration.php composer.json文件。

my_namespace / my_module / Setup / InstallData.php

namespace Namespace\Module\Setup;

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

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    /**
     * Customer setup factory
     *
     * @var CustomerSetupFactory
     */
    private $customerSetupFactory;

    /**
     * Init
     *
     * @param CustomerSetupFactory $customerSetupFactory
     */
    public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory)
    {
        $this->customerSetupFactory = $customerSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $setup->startSetup();

        // insert attribute
        $customerSetup->addAttribute('customer_address', 'attr_code',  [
            'label' => 'My attribute',
            'type' => 'varchar',
            'input' => 'text',
            'position' => 45,
            'visible' => true,
            'required' => false,
            'system' => 0
        ]);

        $MyAttribute = $customerSetup->getEavConfig()->getAttribute('customer_address', 'attr_code');
        $MyAttribute->setData(
            'used_in_forms',
            ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']
        );
        $MyAttribute->save();

        $setup->endSetup();
    }
}

现在,我需要在与文件magento_customer / view / frontend / templates / address / edit.phtml相关的客户addedit地址表单中添加属性字段

我添加了该字段,但无法获取和保存该属性的值。


哪个magento版本?
Sohel Rana

magento CE 2.1.0
Ale

嗨,您好,能否请您分享自定义客户地址属性的工作代码。我还需要添加相同的功能。
拉胡尔

Answers:


9

自定义客户属性永远不会像在后端那样仅出现在前端。在前端显示它们的代码位于自定义phtml文件中。

Magento EE内置了此功能。我不建议您需要花这笔钱,我只是说它有钱。如果您想继续尝试添加自定义属性,则有些复杂。

首先,您必须在一个模块中完成所有这些操作,否则它将无法正常工作,并且以后将很难调试/升级。

您必须执行以下操作:

  • 创建属性(如果它显示在admin中,则说明您已经完成此操作)
  • 覆盖referenceContainer form.additional.info的前端布局
  • 添加模板phtml文件以显示其他属性
  • 添加一个块PHP文件以加载新属性并创建HTML
  • 其他事情,例如学习如何自动执行该过程并加载多个变量,而不是对其进行硬编码以仅加载您创建的变量的名称。

您可以在Block PHP中加载自定义属性。然后customer_account_create.xml像这样添加布局:

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <update handle="customer_form_template_handle"/>
    <body>
        <referenceContainer name="form.additional.info">
            <block class="Company\Customformattributes\Block\FormCustomer" template="Company_Customformattributes::customattributes.phtml" name="customer_form_user_attributes" cacheable="false">
                <action method="setFormCode">
                    <argument name="code" xsi:type="string">customer_account_edit</argument>
                </action>
                <action method="setEntityModelClass">
                    <argument name="code" xsi:type="string">Magento\Customer\Model\Customer</argument>
                </action>
            </block>
        </referenceContainer>
    </body>
</page>

这是使您的块PHP加载,phtml加载并进入正确页面的魔力。

老实说,这并不是一个完整的答案,它还有很多其他的内容,但是您已经有了基本的想法。


能请您回答一下吗?您在块和模板文件中输入了什么?
chirag

setEntityModelClass动作可以自动保存我们的属性,还是我们需要编写代码来保存属性?
siddhesh

2

由于没有提供足够的代码,所以无法回答您的问题,但是请您提供一些建议。您是否检查了本教程“ 添加客户服装教程”

自从Magento 2.1以来,发生了变化,并且不建议使用-> save()方法。您应该改为使用存储库。例如,对于客户EAV,您应该使用

Magento \ Eav \ Model \ AttributeRepository

根据您的情况,脚本的第二部分应更改为

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.