El objeto responsable de determinar si el índice plano está disponible (clase Magento\Catalog\Model\Indexer\Product\Flat\State) es una instancia compartida inmutable. Pero es posible usar nuestra propia instancia, usando tipos virtuales.
Este es mi 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>
Ahora, tengo un tipo de fábrica de colección de productos virtual, donde $isAvailable = falseeventualmente se usa mi propia instancia de "Estado" :
disabledFlatStateProductCollectionFactory
|
+ disabledFlatStateProductCollection
|
+ disabledFlatState
Y para las clases donde necesito una fábrica de colecciones con índice plano deshabilitado, especifico el tipo virtual disabledFlatStateProductCollectionFactorypara el parámetro constructor correspondiente:
<arguments>
<argument name="collectionFactory" xsi:type="object">disabledFlatStateProductCollectionFactory</argument>
</arguments>
Cuando se carga una colección de productos, este resultado determina el hecho de que use EAV o tablas planas
\Magento\Catalog\Model\ResourceModel\Product\Collection::isEnabledFlat().Puede escribir un complemento
aroundoafter, que se devuelvefalsesi se encuentra en el contexto de una determinada vista de la tienda.O incluso mejor, los valores para el indicador plano se almacenan (en caché) en el miembro
_flatEnabledde la misma clase.Puede escribir lo mismo
aroundo elaftercomplemento para el método\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable().De esta manera, su complemento se ejecuta solo una vez. Podría ser útil si tiene una lógica pesada detrás o si se usa en otros lugares.
Esto se ve más elegante que cambiar un valor de configuración sobre la marcha.
fuente
\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()?La forma más elegante sería usar el mismo código que el código que habilita el modo plano al guardar la configuración. Se puede encontrar en
Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode:Así que estoy bastante seguro de que podrías hacer algo así:
¿Dónde
$this->_productFlatIndexerProcessorestá una instancia de\Magento\Catalog\Model\Indexer\Product\Flat\Processor.Alternativa posible
Sin embargo, ese método no guarda la configuración, por lo que cuando el sistema verifica si Flat está habilitado a través de la configuración, aún devuelve verdadero.
Una posible alternativa (para ser probado) sería usar un complemento en el
isFlatEnabledmétodo deMagento\Catalog\Model\Indexer\Product\Flat\State(el método está realmente definido en laMagento\Catalog\Model\Indexer\AbstractFlatStateclase).Según lo que desee lograr, puede configurar un complemento posterior para forzar que el método devuelva falso bajo ciertas condiciones.
fuente
setScheduled(false)al indexador no funciona porque solo deshabilita la indexación programada y no tendrá impacto en las colecciones. Pero independientemente, también guarda el modo, que definitivamente no es lo que quiero.