顧客住所編集フォームに顧客のカスタム属性を追加する方法は?


19

顧客のカスタム属性をcustomer_addressタイプとして追加し、管理者、onepagecheckout、および配送先住所と請求先住所で正しく実行されます。

作成しました: my_namespace/my_module/etc/module.xmlおよびregistration.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住所のフォームに追加する必要があります

フィールドを追加しましたが、その属性の値を取得して保存することはできません。


どのmagentoバージョンですか?
ソヘルラナ

magento CE 2.1.0
エール

こんにちは、カスタムの顧客住所属性の作業コードを共有してください。同じ機能を追加する必要もあります。
ラーフル

回答:


9

カスタムの顧客属性は、バックエンドのようにフロントエンドに「表示」されることはありません。フロントエンドでそれらを表示するコードは、カスタムphtmlファイルにあります。

Magento EEにはこの機能が組み込まれています。そのお金を使う必要があることを提案しているわけではありません。先に進み、カスタム属性を追加しようとする場合、それはやや複雑です。

まず第一に、モジュールでこのすべてを行う必要あります。そうしないと、正しく機能しなくなり、後でデバッグ/アップグレードするのが難しくなります。

次のことを行う必要があります。

  • 属性を作成します(adminに表示される場合はこれを実行しました)
  • 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アクションは自動的に属性を保存できますか、属性を保存するためのコードを記述する必要がありますか?
siddhesh

2

十分なコードが提供されていないため、質問には答えられませんが、少しアドバイスがあります。このチュートリアルを確認しましたか?カスタマー属性の追加チュートリアル

Magento 2.1以降、変更があり、メソッド-> save()は推奨されません。代わりにリポジトリの使用を開始する必要があります。たとえば、顧客EAVの場合は、使用する必要があります

Magento \ Eav \ Model \ AttributeRepository

あなたの場合、スクリプトの2番目の部分を次のように変更する必要があります。

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.