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


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.