Jak dodać niestandardowy atrybut klienta w formularzu edycji adresu klienta?


19

Dodałem niestandardowy atrybut klienta jako customer_addresstyp i działa on poprawnie w administratorze i w kasie onepagecheckout, a także w adresie wysyłki i fakturowania.

Utworzyłem: my_namespace/my_module/etc/module.xmli registration.php composer.jsonpliki w katalogu podstawowym modułu.

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();
    }
}

Teraz muszę dodać pole atrybutu w formularzu klienta addi editadresu, które są powiązane z plikiem magento_customer / view / frontend / templates / address / edit.phtml

Dodałem pole, ale nie mogę uzyskać i zapisać wartości tego atrybutu.


która wersja Magento?
— Sohel Rana,

magento CE 2.1.0
— Ale

Cześć Ale, czy możesz udostępnić działający kod niestandardowego atrybutu adresu klienta? Muszę również dodać tę samą funkcjonalność.
— Rahul

Odpowiedzi:


9

Niestandardowe atrybuty klienta nigdy nie będą „pojawiać się” na interfejsie, tak jak w interfejsie. Kod, który wyświetla je w interfejsie użytkownika, znajduje się w niestandardowym pliku phtml.

Magento EE ma tę wbudowaną funkcjonalność. Nie sugeruję, że POTRZEBUJESZ wydać te pieniądze, po prostu mówię, że mają. Jeśli chcesz iść dalej i spróbować dodać niestandardowe atrybuty, jest to nieco skomplikowane.

Po pierwsze, musisz to wszystko zrobić w module, bo inaczej to nie zadziała i trudno będzie później debugować / aktualizować.

Musisz zrobić te rzeczy:

  • Utwórz atrybut (zrobiłeś to, jeśli pokazuje się w adminie)
  • przesłonić układ interfejsu dla referencji form.additional.info
  • dodaj szablonowy plik phtml, aby pokazać dodatkowe atrybuty
  • dodaj blokowy plik PHP, aby załadować nowe atrybuty i utworzyć HTML
  • inne rzeczy, takie jak nauczenie się, jak zautomatyzować proces i ładować wielokrotności zamiast na stałe kodować, aby załadować tylko nazwę tego, który stworzyłeś.

Możesz załadować swoje niestandardowe atrybuty do Block PHP. Następnie dodaj swój układ do customer_account_create.xmlnastępującego:

<?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>

To jest magiczny sos, który pozwala załadować blok PHP, aby załadować plik phtml i umieścić go na właściwej stronie.

To nie jest pełna odpowiedź szczerze, jest o wiele więcej, ale masz podstawowy pomysł.


czy możesz uzupełnić swoją odpowiedź? co wpisałeś w pliku bloku i szablonu?
— chirag

Czy akcja setEntityModelClass może automatycznie zapisać nasz atrybut, czy musimy też napisać kod, aby zapisać atrybut?
— siddhesh

2

Nie mogę odpowiedzieć na twoje pytanie, ponieważ nie ma wystarczającej ilości kodu, ale masz kilka rad. Czy sprawdziłeś ten samouczek Dodawanie samouczka attirbute klienta ?

Od Magento 2.1 nastąpiła zmiana, a metody -> save () są przestarzałe. Zamiast tego powinieneś zacząć korzystać z repozytoriów. Na przykład dla klienta EAV należy użyć

Magento \ Eav \ Model \ AttributeRepository

W twoim przypadku drugą część skryptu należy zmienić na

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.