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 = false
eventualmente 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 disabledFlatStateProductCollectionFactory
para 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
around
oafter
, que se devuelvefalse
si 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
_flatEnabled
de la misma clase.Puede escribir lo mismo
around
o elafter
complemento 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->_productFlatIndexerProcessor
está 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
isFlatEnabled
método deMagento\Catalog\Model\Indexer\Product\Flat\State
(el método está realmente definido en laMagento\Catalog\Model\Indexer\AbstractFlatState
clase).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.