Обновление индекса каталога категории 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())
)
);
}
}
Я чувствую, что мог бы быть лучший способ достигнуть этого, который менее агрессивен, но это работает. Просто будьте внимательны с этим кодом, когда вы обновляете его, так как, вероятно, вам придется позаботиться о нем.