고객 주소 수정 양식에 고객 맞춤 속성을 추가하는 방법은 무엇입니까?


19

고객 맞춤 속성을 customer_address유형 으로 추가 했으며 관리자 및 onepagecheckout 및 배송 및 청구 지 주소에서 올바르게 실행됩니다.

모듈 기반 디렉토리에 my_namespace/my_module/etc/module.xmlregistration.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();
    }
}

이제 magento_customer / view / frontend / templates / address / edit.phtml 파일과 관련된 고객 addedit주소 양식 에 속성 필드를 추가해야합니다.

필드를 추가했지만 해당 속성의 값을 가져오고 저장할 수 없습니다.


어떤 마 젠토 버전?
Sohel Rana

마 젠토 CE 2.1.0
Ale

안녕하세요 Ale, 사용자 정의 고객 주소 속성에 대한 작업 코드를 공유 할 수 있습니까? 또한 동일한 기능을 추가해야합니다.
Rahul

답변:


9

사용자 정의 고객 속성은 백엔드에서와 같이 프론트 엔드에만 '표시'되지 않습니다. 프론트 엔드에 표시되는 코드는 사용자 정의 phtml 파일에 있습니다.

Magento EE에는이 기능이 내장되어 있습니다. 그 돈을 쓸 필요는 없습니다. 계속해서 사용자 정의 속성을 추가하려고하면 다소 복잡합니다.

우선 , 모듈 에서이 모든 작업을 수행 해야합니다. 그렇지 않으면 제대로 작동하지 않으며 나중에 디버그 / 업그레이드하기가 어렵습니다.

다음을 수행해야합니다.

  • 속성을 작성하십시오 (관리자에 표시되면이를 수행함).
  • referenceContainer form.additional.info에 대한 프론트 엔드 레이아웃 재정의
  • 추가 속성을 표시하기 위해 템플릿 phtml 파일 추가
  • 블록 PHP 파일을 추가하여 새 속성을로드하고 HTML을 만듭니다.
  • 프로세스를 자동화하고 하드 코딩 대신 다중을로드하여 생성 한 프로세스의 이름 만로드하는 방법을 배우는 것과 같은 다른 것들도 있습니다.

Block 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을로드하고 올바른 페이지로 가져 오는 마법의 소스입니다.

이것은 정직하게 정답은 아니며, 더 많은 것이 있지만 기본 아이디어를 얻습니다.


답을 완성 해 주시겠습니까? 블록 및 템플릿 파일에 입력 한 내용은 무엇입니까?
chirag

setEntityModelClass 액션이 자동으로 속성을 저장하거나 속성 저장을위한 코드를 작성해야합니까?
siddhesh

2

제공된 코드가 충분하지 않지만 약간의 조언이 있기 때문에 질문에 대답 할 수 없습니다. 이 자습서를 확인 했습니까 ? 고객 attirbute 자습서 추가 ?

Magento 2.1부터 변경 사항이 있으며 메소드-> save () 는 더 이상 사용되지 않습니다. 대신 리포지토리 사용을 시작해야합니다. 예를 들어 고객 EAV의 경우 사용해야합니다

마 젠토 \ Eav \ 모델 \ AttributeRepository

귀하의 경우, 스크립트의 두 번째 부분은

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.