Обновление индекса каталога категории Magento Enterprise 1.13+

Не вопрос больше информации.

Изучение данных происходит при обновлении категории строк плоских таблиц.

Ошибка воспроизведения шагов:

  • создать более 1 категории
  • установите для атрибута типа "Сортировка по списку товаров по умолчанию" значение, отличное от значения по умолчанию для одной из категорий, и сохраните его
  • полный переиндекс
  • установить указатель на руководство
  • переупорядочить категории и запустить предприятие переиндексировать все cronjob

проверьте в плоской таблице и убедитесь, что атрибут копируется во все категории, которые имеют позицию после категории, содержащей атрибут.

Обмен данными происходит потому, что загрузка категорий осуществляется без сброса предыдущих загруженных значений.

в файле: Предприятие \ Каталог \ Модель \ Индекс \ Действие \ Категория \ Квартира \Refresh.php

поиск функции _reindex (строка 828)

вы увидите, что модель загружается $category = Mage::getModel('catalog/category');

Исправление сбрасывает переменную $category в каждом цикле foreach ($categoriesIdsChunk as $categoryId) { до загрузки новой категории.

Простое исправление:

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 ответ

Решение

Итак, я собираюсь немного подробнее остановиться на этой теме, потому что это важно, но оригинальная тема / ответ немного неполна (по состоянию на 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_row а также enterprise_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())
            )
        );
    }
}

Я чувствую, что мог бы быть лучший способ достигнуть этого, который менее агрессивен, но это работает. Просто будьте внимательны с этим кодом, когда вы обновляете его, так как, вероятно, вам придется позаботиться о нем.

Другие вопросы по тегам