Как добавить пользовательский атрибут клиента в форму редактирования адреса клиента?


19

Я добавил пользовательский атрибут клиента как customer_addressтип, и он корректно работает в админке и в onepagecheckout, а также в адресе доставки и выставления счета.

Я создал: my_namespace/my_module/etc/module.xmlи registration.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();
    }
}

Теперь мне нужно добавить поле атрибута в форму клиента addи editадреса, которые связаны с файлом magento_customer / view / frontend / templates / address / edit.phtml

Я добавил поле, но не могу получить и сохранить значение этого атрибута.


какая версия magento?
Сохель Рана

Magento CE 2.1.0
Ale

Привет Але, пожалуйста, поделитесь своим рабочим кодом для пользовательского атрибута адреса клиента Мне также нужно добавить такую ​​же функциональность.
Рахул

Ответы:


9

Пользовательские атрибуты клиентов никогда не будут просто «появляться» во внешнем интерфейсе, как в бэкэнде. Код, отображающий их в веб-интерфейсе, находится в пользовательском файле phtml.

В Magento EE встроена эта функциональность. Я не предлагаю вам НУЖНО тратить эти деньги, я просто говорю, что они есть. Если вы хотите пойти дальше и попытаться добавить пользовательские атрибуты, это несколько сложно.

Прежде всего, вы должны сделать все это в модуле, иначе он просто не будет работать правильно, а потом будет сложно отлаживать / обновлять.

Вы должны сделать эти вещи:

  • Создайте атрибут (вы сделали это, если он появляется в админке)
  • переопределить макет внешнего интерфейса для referenceContainer form.additional.info
  • добавить шаблонный файл phtml, чтобы показать дополнительные атрибуты
  • добавить блочный PHP-файл для загрузки новых атрибутов и создания HTML
  • другие вещи, такие как научиться автоматизировать процесс и загружать кратные вместо жесткого кодирования, чтобы загрузить только имя созданного вами.

Вы можете загрузить свои пользовательские атрибуты в блоке 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 загружался и выводил его на нужную страницу.

Честно говоря, это не полный ответ, есть еще много чего, но вы поймете основную идею.


не могли бы вы завершить свой ответ? что вы ввели в блок и файл шаблона?
Чираг

Действие setEntityModelClass может автоматически сохранить наш атрибут или нам также нужно написать код для сохранения атрибута?
Сиддеш

2

Не могу ответить на ваш вопрос, потому что недостаточно кода, но есть небольшой совет. Вы проверяли этот учебник? Как добавить учебник для клиентов ?

Начиная с Magento 2.1 произошли изменения, и методы -> save () устарели. Вместо этого вы должны начать использовать репозитории. Например, для клиента EAV вы должны использовать

Magento \ Eav \ Model \ AttributeRepository

В вашем случае, вторая часть скрипта должна быть изменена на

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.