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

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

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

CarComp
источник
не могли бы вы завершить свой ответ? что вы ввели в блок и файл шаблона?
Чираг
Действие setEntityModelClass может автоматически сохранить наш атрибут или нам также нужно написать код для сохранения атрибута?
Сиддеш
2

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

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

Magento \ Eav \ Model \ AttributeRepository

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

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
pietr
источник