プロパティには、チェックアウト手順の変更中にクラスMagento \ Quote \ Api \ Data \ AddressInterfaceに対応するセッターがありません


18

1-customer_addressにeav属性を追加します

$attributesInfo = [
    'reference' => [
         'label' => 'Reference',
         'type' => 'varchar',
         'input' => 'text',
         'position' => 100,
         'visible' => true,
         'required' => false,
    ],
];

foreach ($attributesInfo as $attributeCode => $attributeParams) {
    $customerSetup->addAttribute('customer_address', $attributeCode, $attributeParams);
}

2-モジュールに拡張属性を追加しました

<extension_attributes for="Magento\Quote\Api\Data\AddressInterface">
    <attribute code="reference" type="string"/>
</extension_attributes>

requirejs-config.jsで、JavaScriptファイルをオーバーライドして参照フィールドを追加します

var config = {
"map": {
    "*": {
        "Magento_Checkout/js/model/shipping-save-processor/default" : "Agr_Checkout/js/shipping-save-processor-default-override",
        "Magento_Customer/js/model/customer/address" : "Agr_Checkout/js/model/customer/address",
        "Magento_Checkout/js/model/address-converter" : "Agr_Checkout/js/model/address-converter",
        "Magento_Checkout/js/model/new-customer-address" : "Agr_Checkout/js/model/new-customer-address"
    }
}

3-参照フィールドがアドレスで送信していることを確認します

ここに画像の説明を入力してください

4-配送情報を送信すると([次へ]をクリック)このエラーが表示されます:"プロパティ"参照 "には、クラス" Magento \ Quote \ Api \ Data \ AddressInterface "に対応するセッターがありません。

ここに画像の説明を入力してください

すでに以下を実行しています。-magentoキャッシュを消去してフラッシュします-setup:upgradeを実行します-setup:di:compileを実行します

私が間違っているのは何ですか?


以下の答えは機能しましたか?
スティービーG

address_idを使用してupdate de referenceのスクリプトを実行し、ハードSQL挿入によって解決しました。間違っていることはわかっていますが、少し急ぎました。後でテストし、フィードバックを提供します。
-allamgr

私はあなたが非難されることはないと思います...明らかに、あなたはエンタープライズでcustom_attributesを追加することができるだけであり、これまでのところ「簡単にカスタマイズ可能なチェックアウト」方法を発見していません。
LM_Fielding

更新はありますか?
Magento2デベロッパー

@allamgr私はまた、新しい顧客アドレス属性で同じ問題に直面しています、あなたはこの解決策を得ましたか?これについてのあなたの考えを教えてください。prnt.sc/iovkp2
ナガラジュK

回答:


1

eavのセットアップまたはアップグレードスクリプトで属性を設定すると最適に機能し、追加を要求するフォームに自動的に追加されます。

    class InstallData implements InstallDataInterface
    {
        private $_eavSetupFactory;
        private $_eavConfig;
        private $_attributeResource;
        protected $_logger;

        public function __construct(EavSetupFactory $eavSetupFactory, Config $eavConfig, Attribute $attributeResource, Monolog $logger)
        {
            $this->_eavSetupFactory = $eavSetupFactory;
            $this->_eavConfig = $eavConfig;
            $this->_attributeResource = $attributeResource;
            $this->_logger = $logger;
        }

        public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
        {
            $eavSetup = $this->_eavSetupFactory->create(['setup' => $setup]);
            $addressAttributes = [
        'attribute1' => [
            'type' => 'int',
            'label' => 'attribute1',
            'input' => 'text',
            'unique' => true,
            'required' => false,
            'visible' => true,
            'user_defined' => false,
            'position' => 100,
            'system' => false,
            'adminhtml_only' => 0
        ],
        'attribute2' => [
            'type' => 'int',
            'label' => 'attribute2',
            'input' => 'text',
            'required' => false,
            'visible' => true,
            'user_defined' => false,
            'position' => 110,
            'system' => false,
            'adminhtml_only' => 1
        ]
    ];

    $usedInFormsAddress = [
            'adminhtml_customer_address',
            'customer_address_edit',
            'customer_register_address'
        ];

    foreach ($addressAttributes as $code => $options) {
        $eavSetup->addAttribute(
            'customer_address',
            $code,
            $options
        );

        try {
            $attribute = $this->_eavConfig->getAttribute('customer_address', $code);
            $attribute->setData(
                'used_in_forms',
                $usedInFormsAddress
            );
            $this->_attributeResource->save($attribute);
        } catch (LocalizedException $exception) {
            $this->_logger->critical($exception->getMessage());
        } catch (Exception $exception) {
            $this->_logger->critical($exception->getMessage());
        }
    }

ここに画像の説明を入力してください

このコードはフォームに追加され、問題の保存や次のステップへの移行はありません

$usedInFormsAddress = [
            'adminhtml_customer_address',
            'customer_address_edit',
            'customer_register_address'
        ];

try {
            $attribute = $this->_eavConfig->getAttribute('customer_address', $code);
            $attribute->setData(
                'used_in_forms',
                $usedInFormsAddress
            );
            $this->_attributeResource->save($attribute);
        } catch (LocalizedException $exception) {
            $this->_logger->critical($exception->getMessage());
        } catch (Exception $exception) {
            $this->_logger->critical($exception->getMessage());
        }

0

カスタム属性で設定してみてください。

例:

...
 custom_attribute: [{"attribute_code": "reference", "value": "Your value"}]
...

これを機能させたことがありますか、それとも実験にすぎませんか?
LM_Fielding

私はそれを働いた
-Phoenix128_RiccardoT

コミュニティ版とは?あなたがその方法を実演できれば、私はそれを大いに感謝します。
LM_Fielding

1
これは、Magento2 Enterprise Editionでのカスタムデタッチフロントエンドチェックアウト手順に関するものでした。そのコードを検索する必要があります。古い作品です。
Phoenix128_RiccardoT

見つかったら教えてください
LM_Fielding

0

リクエストで属性をどのように渡しますか?あなたはそのようなブラウザコンソールを確認することができます

{
    ...
    extension_attributes: {
         reference: "value"
    }
}

あたりです。varフォルダーおよび生成されたフォルダーvar / cache var / page_cache var / view_proceedおよびgenerated /を削除できます 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.