Объект, который должен определить, доступен ли плоский индекс (класс Magento\Catalog\Model\Indexer\Product\Flat\State
), является неизменным общим экземпляром. Но можно использовать наш собственный экземпляр, используя виртуальные типы.
Это мое 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>
Теперь у меня есть тип фабрики виртуальных коллекций продуктов, где в $isAvailable = false
конечном итоге используется мой собственный экземпляр State с :
disabledFlatStateProductCollectionFactory
|
+ disabledFlatStateProductCollection
|
+ disabledFlatState
А для классов, где мне нужна фабрика коллекций с отключенным плоским индексом, я указываю виртуальный тип disabledFlatStateProductCollectionFactory
для соответствующего параметра конструктора:
<arguments>
<argument name="collectionFactory" xsi:type="object">disabledFlatStateProductCollectionFactory</argument>
</arguments>
Когда коллекция продуктов загружена, тот факт, что она использует EAV или плоские таблицы, определяется этим результатом
\Magento\Catalog\Model\ResourceModel\Product\Collection::isEnabledFlat()
.Вы можете написать
around
илиafter
плагин, который возвращается,false
если вы находитесь в контексте определенного представления магазина.Или, что еще лучше, значения для плоского флага хранятся (кэшируются) в элементе
_flatEnabled
из того же класса.Вы можете написать то же самое
around
илиafter
плагин для метода\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
.Таким образом, ваш плагин выполняется только один раз. Это может быть полезно, если у вас есть тяжелая логика или если он используется в других местах.
Это выглядит более элегантно, чем изменение значения конфигурации на лету.
источник
\Magento\Catalog\Model\Indexer\Product\Flat\State::isAvailable()
?Более элегантный способ - использовать тот же код, что и код, который включает плоский режим при сохранении конфигурации. Его можно найти под
Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode
:Так что я уверен, что вы могли бы сделать что-то подобное:
Где
$this->_productFlatIndexerProcessor
это экземпляр\Magento\Catalog\Model\Indexer\Product\Flat\Processor
.Возможная альтернатива
Однако этот метод не сохраняет конфигурацию, поэтому, когда система проверяет, включена ли квартира через конфигурацию, она все равно возвращает значение true.
Возможной альтернативой (подлежащей проверке) будет использование плагина для
isFlatEnabled
метода fromMagento\Catalog\Model\Indexer\Product\Flat\State
(метод фактически определен вMagento\Catalog\Model\Indexer\AbstractFlatState
классе).В зависимости от того, чего вы хотите достичь, вы можете установить плагин after, чтобы этот метод возвращал false при определенных условиях.
источник
setScheduled(false)
индексатора не работает, потому что он отключает только запланированное индексирование и не влияет на коллекции. Но независимо от этого, он также сохраняет режим, который, безусловно, не то, что я хочу.