更优雅的方法是使用与保存配置时启用平面模式的代码相同的代码。可以在下面找到Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode
:
public function processValue()
{
if ((bool)$this->getValue() != (bool)$this->getOldValue()) {
if ((bool)$this->getValue()) {
$this->indexerState->loadByIndexer(\Magento\Catalog\Model\Indexer\Product\Flat\Processor::INDEXER_ID);
$this->indexerState->setStatus(\Magento\Framework\Indexer\StateInterface::STATUS_INVALID);
$this->indexerState->save();
} else {
$this->_productFlatIndexerProcessor->getIndexer()->setScheduled(false);
}
}
}
所以我很确定你可以做这样的事情:
$this->_productFlatIndexerProcessor->getIndexer()->setScheduled(false);
$this->_productFlatIndexerProcessor
的实例在哪里\Magento\Catalog\Model\Indexer\Product\Flat\Processor
?
可能的选择
但是,该方法不会保存配置,因此当系统检查是否通过配置启用了flat时,它仍然返回true。
可能的替代方案(待测试)是在isFlatEnabled
方法上使用插件Magento\Catalog\Model\Indexer\Product\Flat\State
(该方法实际上是在Magento\Catalog\Model\Indexer\AbstractFlatState
类中定义的)。
根据您要实现的目标,您可以设置一个after插件来强制该方法在某些情况下返回false。