Objek yang bertanggung jawab untuk menentukan apakah indeks datar tersedia (kelas Magento\Catalog\Model\Indexer\Product\Flat\State
) adalah instance bersama yang tidak dapat diubah. Tetapi dimungkinkan untuk menggunakan instance kita sendiri, menggunakan tipe virtual.
Ini milik saya di.xml
:
<virtualType name="disabledFlatStateProductCollectionFactory" type="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
<arguments>
<argument name="instanceName" xsi:type="string">disabledFlatStateProductCollection</argument>
</arguments>
</virtualType>
<virtualType name="disabledFlatStateProductCollection" type="Magento\Catalog\Model\ResourceModel\Product\Collection">
<arguments>
<argument name="catalogProductFlatState" xsi:type="object">disabledFlatState</argument>
</arguments>
</virtualType>
<virtualType name="disabledFlatState" type="Magento\Catalog\Model\Indexer\Product\Flat\State">
<arguments>
<argument name="isAvailable" xsi:type="boolean">false</argument>
</arguments>
</virtualType>
Sekarang, saya memiliki jenis pabrik pengumpulan produk virtual, di mana contoh "State" saya sendiri $isAvailable = false
digunakan akhirnya:
disabledFlatStateProductCollectionFactory
|
+ disabledFlatStateProductCollection
|
+ disabledFlatState
Dan untuk kelas di mana saya memerlukan pabrik pengumpulan dengan indeks datar dinonaktifkan, saya menentukan tipe virtual disabledFlatStateProductCollectionFactory
untuk parameter konstruktor yang sesuai:
<arguments>
<argument name="collectionFactory" xsi:type="object">disabledFlatStateProductCollectionFactory</argument>
</arguments>
Ketika koleksi produk dimuat, fakta bahwa ia menggunakan EAV atau tabel datar ditentukan oleh hasil ini
\Magento\Catalog\Model\ResourceModel\Product\Collection::isEnabledFlat()
.Anda dapat menulis
around
atauafter
plugin, yang mengembalikanfalse
jika Anda berada dalam konteks tampilan toko tertentu.Atau bahkan lebih baik, nilai untuk flag datar disimpan (di-cache) di anggota
_flatEnabled
dari kelas yang sama.Anda dapat menulis plugin yang sama
around
atauafter
untuk metode ini\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
.Dengan cara ini plugin Anda dieksekusi hanya sekali. Ini bisa membantu jika Anda memiliki logika yang berat di baliknya atau jika digunakan di tempat lain.
Ini terlihat lebih elegan yang mengubah nilai konfigurasi dengan cepat.
sumber
\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
?Cara yang lebih elegan adalah dengan menggunakan kode yang sama dengan kode yang memungkinkan mode flat saat menyimpan konfigurasi. Itu dapat ditemukan di bawah
Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode
:Jadi saya cukup yakin Anda bisa melakukan hal seperti itu:
Di mana
$this->_productFlatIndexerProcessor
adalah contoh dari\Magento\Catalog\Model\Indexer\Product\Flat\Processor
.Alternatif yang mungkin
Namun, metode itu tidak menyimpan konfigurasi sehingga ketika sistem memeriksa apakah flat diaktifkan melalui konfigurasi itu masih mengembalikan true.
Alternatif yang mungkin (untuk diuji) adalah menggunakan plugin pada
isFlatEnabled
metode dariMagento\Catalog\Model\Indexer\Product\Flat\State
(metode ini sebenarnya didefinisikan diMagento\Catalog\Model\Indexer\AbstractFlatState
kelas).Berdasarkan apa yang ingin Anda capai, Anda dapat menyiapkan plugin setelah untuk memaksa metode itu untuk mengembalikan false dalam kondisi tertentu.
sumber
setScheduled(false)
pengindeks tidak berfungsi karena hanya menonaktifkan pengindeksan terjadwal dan tidak akan berdampak pada koleksi. Tapi bagaimanapun, ini juga menyimpan mode, yang jelas bukan yang saya inginkan.