Magento目录类平板索引刷新企业1.13+

时间:2014-05-23 11:26:26

标签: magento indexing refresh categories flat

不再是一个问题的问题。

数据韭菜发生在平面表行的类别刷新上。

Bug复制步骤:

  • 创建超过1个类别
  • 将“默认产品列表排序依据”等属性设置为其中一个类别的非默认值并保存
  • full reindex
  • 手动设置索引
  • 重新安排类别并运行企业reindex所有cronjob

检查平面表,看看该属性是否已复制到包含该属性的类别后面的位置的所有类别。

数据韭菜的发生是因为加载类别时没有重置先前加载的值。

在文件中: 企业\目录\型号\首页\行动\目录\平\ Refresh.php

搜索_reindex函数(第828行)

您将看到$category = Mage::getModel('catalog/category');

加载的模型

修补程序在加载新类别之前重置foreach ($categoriesIdsChunk as $categoryId) {的每个循环上的$ category变量。

简单修复:

foreach ($categoriesIdsChunk as $categoryId) {
    if (!isset($attributesData[$categoryId])) {
        continue;
    }
    //add this line to reset the category data.
    $category = Mage::getModel('catalog/category');

    if ($category->load($categoryId)->getId()) {
        $data[] = $this->_prepareValuesToInsert(
            array_merge(
                $category->getData(),
                $attributesData[$categoryId],
                array('store_id' => $store->getId())
            )
        );
    }
 }       

1 个答案:

答案 0 :(得分:1)

所以,我将在这个主题上详细说明,因为它很重要,但原始主题/答案有点不完整(从Enterprise 1.14.1开始)。

简单地重写a/c/c/E/Catalog/Model/Index/Action/Category/Flat/Refresh.php只是解决方案的一半。在类别的拖放重新排序期间,在观察者中调用以下代码来监视类别保存和移动事件......

public function processCategorySaveEvent(Varien_Event_Observer $observer)
{
    if ($this->_isLiveCategoryReindexEnabled()) {
        // ...
        $client->execute('enterprise_catalog/index_action_category_flat_refresh_row', $arguments);
    }
}

public function processCategoryMoveEvent(Varien_Event_Observer $observer)
{
    if ($this->_isLiveCategoryReindexEnabled()) {
        // ...
        $client->execute('enterprise_catalog/index_action_category_flat_refresh_changelog');
    }
};

不幸的是,enterprise_catalog/index_action_category_flat_refresh_rowenterprise_catalog/index_action_category_flat_refresh_changelog直接延伸a/c/c/E/Catalog/Model/Index/Action/Category/Flat/Refresh.php,因此也需要重写。

最后,最终修复看起来更像是......

a/c/local/Namespace/Modulename/etc/config.xml

<config>
    <global>
        <models>
            <modulename>
                <class>Namespace_Modulename_Model</class>
            </modulename>
            <!-- Enterprise_Catalog_Model_Index_Action_Category_Flat_Refresh_Row -->
            <!-- Enterprise_Catalog_Model_Index_Action_Category_Flat_Refresh_Changelog -->
            <!-- Enterprise_Catalog_Model_Index_Action_Category_Flat_Refresh -->
            <enterprise_catalog>
                <rewrite>
                    <index_action_category_flat_refresh_row>Namespace_Modulename_Model_Catalog_Index_Action_Category_Flat_Refresh_Row</index_action_category_flat_refresh_row>
                    <index_action_category_flat_refresh_changelog>Namespace_Modulename_Model_Catalog_Index_Action_Category_Flat_Refresh_Changelog</index_action_category_flat_refresh_changelog>
                    <index_action_category_flat_refresh>Namespace_Modulename_Model_Catalog_Index_Action_Category_Flat_Refresh</index_action_category_flat_refresh>
                </rewrite>
            </enterprise_catalog>
        </models>
    </global>
</config>

a/c/local/Namespace/Modulename/Model/Catalog/Index/Action/Category/Flat/Refresh/Row.php

class Namespace_Module_Model_Catalog_Index_Action_Category_Flat_Refresh_Row extends Namespace_Module_Model_Catalog_Index_Action_Category_Flat_Refresh
{
    protected $_keyColumnIdValue;

    public function __construct(array $args)
    {
        parent::__construct($args);
        if (isset($args['value'])) {
            $this->_keyColumnIdValue = $args['value'];
        }
    }

    public function execute()
    {
        if (!$this->_isFlatIndexerEnabled()) {
            return $this;
        }
        $this->_validate();
        $this->_reindex(array($this->_keyColumnIdValue));
        return $this;
    }
}

a/c/local/Namespace/Modulename/Model/Catalog/Index/Action/Category/Flat/Refresh/Changelog.php

class Namespace_Module_Model_Catalog_Index_Action_Category_Flat_Refresh_CHangelog extends Namespace_Module_Model_Catalog_Index_Action_Category_Flat_Refresh
{
    public function execute()
    {
        if (!$this->_isFlatIndexerEnabled()) {
            return $this;
        }
        $this->_validate();
        $changedIds = $this->_selectChangedIds();
        if (is_array($changedIds) && count($changedIds) > 0) {
            $idsBatches = array_chunk($changedIds, Mage::helper('enterprise_index')->getBatchSize());
            foreach ($idsBatches as $changedIds) {
                $this->_reindex($changedIds);
            }
            $this->_setChangelogValid();
        }
        return $this;
    }
}

a/c/local/Namespace/Modulename/Model/Catalog/Index/Action/Category/Flat/Refresh.php

foreach ($categoriesIdsChunk as $categoryId) {
    if (!isset($attributesData[$categoryId])) {
        continue;
    }

    // Flat Reindexing Fix
    // Flat Reindexing Fix
    $category = Mage::getModel('catalog/category');
    // Flat Reindexing Fix
    // Flat Reindexing Fix

    if ($category->load($categoryId)->getId()) {
        $data[] = $this->_prepareValuesToInsert(
            array_merge(
                $category->getData(),
                $attributesData[$categoryId],
                array('store_id' => $store->getId())
            )
        );
    }
}

我觉得可能有一种更好的方法来实现这一点,这种方法的侵入性较小,但确实有效。在更新时请注意这段代码,因为它可能需要处理。