Das Objekt, das dafür verantwortlich ist, festzustellen, ob ein flacher Index verfügbar ist (Klasse Magento\Catalog\Model\Indexer\Product\Flat\State
), ist eine unveränderliche gemeinsam genutzte Instanz. Es ist jedoch möglich, eine eigene Instanz mit virtuellen Typen zu verwenden.
Das ist mein 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>
Jetzt habe ich einen Factory-Typ für die virtuelle Produktsammlung, in dem schließlich meine eigene "State" -Instanz mit $isAvailable = false
verwendet wird:
disabledFlatStateProductCollectionFactory
|
+ disabledFlatStateProductCollection
|
+ disabledFlatState
Und für die Klassen, in denen ich eine Sammlungsfactory mit deaktiviertem Flat-Index benötige, gebe ich den virtuellen Typ disabledFlatStateProductCollectionFactory
für den entsprechenden Konstruktorparameter an:
<arguments>
<argument name="collectionFactory" xsi:type="object">disabledFlatStateProductCollectionFactory</argument>
</arguments>
Wenn eine Produktsammlung geladen wird, wird die Tatsache, dass EAV oder flache Tabellen verwendet werden, durch dieses Ergebnis bestimmt
\Magento\Catalog\Model\ResourceModel\Product\Collection::isEnabledFlat()
.Sie können ein
around
oder einafter
Plugin schreiben , das zurückgegeben wird,false
wenn Sie sich im Kontext einer bestimmten Geschäftsansicht befinden.Oder noch besser, die Werte für das flache Flag werden im Member
_flatEnabled
derselben Klasse gespeichert (zwischengespeichert) .Sie können dasselbe
around
oderafter
Plugin für die Methode schreiben\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
.Auf diese Weise wird Ihr Plugin nur einmal ausgeführt. Es kann hilfreich sein, wenn Sie eine starke Logik dahinter haben oder wenn es an anderen Orten verwendet wird.
Dies sieht eleganter aus, als wenn Sie einen Konfigurationswert im laufenden Betrieb ändern.
quelle
\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
?Der elegantere Weg wäre, denselben Code wie den Code zu verwenden, der den Flat-Modus beim Speichern der Konfiguration aktiviert. Es kann gefunden werden unter
Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode
:Ich bin mir ziemlich sicher, dass Sie so etwas tun können:
Wo
$this->_productFlatIndexerProcessor
ist eine Instanz von\Magento\Catalog\Model\Indexer\Product\Flat\Processor
.Mögliche Alternative
Diese Methode speichert die Konfiguration jedoch nicht. Wenn das System prüft, ob flat über die Konfiguration aktiviert ist, wird weiterhin true zurückgegeben.
Eine mögliche Alternative (zu testen) wäre die Verwendung eines Plugins für die
isFlatEnabled
Methode vonMagento\Catalog\Model\Indexer\Product\Flat\State
(die Methode ist tatsächlich in derMagento\Catalog\Model\Indexer\AbstractFlatState
Klasse definiert ).Basierend auf dem, was Sie erreichen möchten, können Sie ein After-Plugin einrichten, um zu erzwingen, dass diese Methode unter bestimmten Bedingungen false zurückgibt.
quelle
setScheduled(false)
des Indexers nicht funktioniert, da es nur die geplante Indizierung deaktiviert und keine Auswirkungen auf die Sammlungen hat. Aber unabhängig davon speichert es auch den Modus, was definitiv nicht das ist, was ich will.