Як додати спеціальний атрибут клієнта у форму редагування адреси клієнта?


19

Я додав спеціальний атрибут клієнта як customer_addressтип, і він працює правильно в адміністраторі та в одній сторінці перевірки, а також у адресу доставки та виставлення рахунків.

Я створив: my_namespace/my_module/etc/module.xmlі registration.php composer.jsonфайли в базовому каталозі модуля.

my_namepace / 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?
— Sohel Rana

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.