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.

Ale
źródło
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ł.

CarComp
źródło
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);
pietr
źródło