O objeto responsável por determinar se o índice simples está disponível (classe Magento\Catalog\Model\Indexer\Product\Flat\State
) é uma instância compartilhada imutável. Mas é possível usar nossa própria instância, usando tipos virtuais.
Este é o meu 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>
Agora, eu tenho um tipo de fábrica de coleção de produtos virtual, onde minha própria instância "State" $isAvailable = false
é usada eventualmente:
disabledFlatStateProductCollectionFactory
|
+ disabledFlatStateProductCollection
|
+ disabledFlatState
E para as classes em que preciso de uma fábrica de coleções com índice plano desabilitado, especifique o tipo virtual disabledFlatStateProductCollectionFactory
para o parâmetro do construtor correspondente:
<arguments>
<argument name="collectionFactory" xsi:type="object">disabledFlatStateProductCollectionFactory</argument>
</arguments>
Quando uma coleção de produtos é carregada, o fato de usar EAV ou tabelas simples é determinado por esse resultado
\Magento\Catalog\Model\ResourceModel\Product\Collection::isEnabledFlat()
.Você pode escrever um
around
ouafter
plugin, que retornaráfalse
se você estiver no contexto de uma determinada visualização da loja.Ou melhor ainda, os valores para sinalizador plano são armazenados (armazenados em cache) no membro
_flatEnabled
da mesma classe.Você pode escrever o mesmo
around
ouafter
plugin para o método\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
.Dessa forma, seu plugin é executado apenas uma vez. Pode ser útil se você tiver uma lógica pesada por trás ou se for usado em outros lugares.
Parece mais elegante do que alterar um valor de configuração rapidamente.
fonte
\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
?A maneira mais elegante seria usar o mesmo código que habilita o modo plano ao salvar a configuração. Pode ser encontrado em
Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode
:Então, eu tenho certeza que você poderia fazer algo assim:
Onde
$this->_productFlatIndexerProcessor
é uma instância de\Magento\Catalog\Model\Indexer\Product\Flat\Processor
.Alternativa possível
No entanto, esse método não salva a configuração, portanto, quando o sistema verifica se o flat está ativado por meio da configuração, ele ainda retorna verdadeiro.
Uma alternativa possível (a ser testada) seria usar um plugin no
isFlatEnabled
método deMagento\Catalog\Model\Indexer\Product\Flat\State
(o método é realmente definido naMagento\Catalog\Model\Indexer\AbstractFlatState
classe).Com base no que você deseja alcançar, você pode configurar um plug-in after para forçar esse método a retornar false sob certas condições.
fonte
setScheduled(false)
o indexador não funciona porque está apenas desativando a indexação agendada e não terá impacto nas coleções. Mas, independentemente disso, ele também salva o modo, que definitivamente não é o que eu quero.