Magento 2 bagaimana cara menyimpan bidang kustom ditambahkan dalam bentuk grup pelanggan?

9

Saya telah menambahkan beberapa bidang khusus ke bentuk grup pelanggan dengan menggunakan upgradeSchema.php.

Setelah itu saya menemukan bahwa bidang asli seperti kode grup pelanggan dan id pajak disimpan dengan menggunakan metode penyetel di API yang disediakan. Ini benar-benar berbeda dari Magento 1.X yang hanya menggunakan setXXX () untuk menyimpan.

Ricky.C
sumber
Saya sudah mencoba menggunakan \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType); program_type sesuai dengan kolom tabel 'program_type' untuk menyimpan ke dalam basis data, tetapi gagal.
Ricky.C
Haruskah saya menulis API khusus dengan pengambil dan penyetel untuk menyimpan bidang?
Ricky.C

Jawaban:

23

Mekanisme atribut ekstensi harus digunakan dalam kasus ini. Ini memungkinkan perluasan API inti oleh modul pihak ke-3. Langkah umum untuk mengaktifkan atribut ekstensi baru:

  1. Nyatakan atribut ekstensi seperti yang dijelaskan dalam dokumen resmi . Setelah membersihkan vardan menjalankan <project_root>/bin/magento setup:di:compile, setter dan pengambil yang sesuai untuk atribut baru ini akan muncul di \Magento\Customer\Api\Data\GroupExtensionInterface(antarmuka ini dihasilkan secara otomatis)
  2. Tulis plugins untuk \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(dan metode layanan lain yang diperlukan) untuk menyimpan / memuat atribut baru. Sebagai pengembang ekstensi, hanya Anda yang tahu di mana atribut ini harus disimpan, mungkin tabel apa saja. Lihat \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSavesebagai contoh
  3. Jika Anda perlu membuat atribut ini terlihat dalam koleksi (untuk membuatnya dapat dicari / difilter), nyatakan joinsimpul. Jika tidak maka lewati saja ini
  4. Akses atribut khusus Anda sebagai:, di $customerGroup->getExtensionAttributes()->getMyAttribute()mana customerGroupmengimplementasikan \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()bisa digunakan juga

Di bawah ini adalah contoh konfigurasi yang harus dimasukkan VendorName/ModuleName/etc/extension_attributes.xml

<?xml version="1.0"?>
<config>
    <extension_attributes for="Magento\Customer\Api\Data\GroupInterface">
        <!--Data interface can be used as a type of attribute, see example in CatalogInventory module-->
        <attribute code="name_of_attribute" type="string">
            <resources>
                <resource ref="VendorName_ModuleName::someAclNode"/>
            </resources>
            <!--Join is optional, only if you need to have added attribute visible in groups list-->
            <join reference_table="table_where_attribute_is_stored" reference_field="group_id_field_in_that_table" join_on_field="group_id">
                <field>name_of_added_attribute_field_in_that_table</field>
            </join>
        </attribute>
    </extension_attributes>
</config>
Alex Paliarush
sumber
Saya mencoba menambahkan extension_attributes.xml, tetapi tidak ada antarmuka baru yang dihasilkan. ps Saya telah menghapus folder pembuatan dan menjalankan beberapa operasi .....
Ricky.C
Extension_attribute.xml saya: <? Xml version = "1.0"?> <config> <extension_attributes untuk = "Magento \ Pelanggan \ Api \ Data \ GroupInterface"> <kode atribut = "group_domain" type = "string" /> </ extension_attributes> </config>
Ricky.C
File harus dinamakan extension_attributes.xml (jamak). Cobalah untuk memanggil generasi semua entitas yang di-autogenerasi menggunakan CLI.
Alex Paliarush
maaf untuk kesalahan ketik pada komentar di atas, file yang saya miliki sebenarnya adalah extension_attributes.xml
Ricky.C
Saya sudah mencari di Google tetapi tidak menemukan apa pun. Bisakah Anda memberi tahu saya perintah mana yang harus digunakan? Saya pendatang baru yang tidak akrab dengan cli. Terima kasih.
Ricky.C
2

Jangan lupa bahwa modul membutuhkan register.phpfile di dalamnya, dan Anda harus menggunakannya bin/magento module:enable VendorName_ModuleNamesebelum itu akan muncul!

GuruBob
sumber