Проблема с плоскими данными категории: описание отсутствует в плоской таблице без ошибки индексирования
Я работаю над M1 CE 1.7.0.2.
Я включил Использовать категорию плоского каталога из серверной части (каталог/интерфейс/каталог_каталог_категории = 1).
Затем я переиндексирую php shell/indexer.php --reindexall
без какой-либо ошибки.
Когда я проверяю индексы в бэкэнде: все строки зеленые.
Когда я проверяю свои категории на интерфейсе: описание и изображение категории не отображаются.
Если я отключу категорию Плоского каталога, все вернется в норму снова.
Обычно исключение возникает во время reindex
из catalog_category_flat
, но здесь ничего.
Кто-нибудь сталкивался с этой проблемой? Как я могу отладить индексатор, чтобы убедиться, что он улавливает все параметры категории перед сохранением в catalog_category_flat_store_x таблица бд?
Заранее благодарю вас за вашу помощь!
После глубокого анализа я нашел код, ответственный за эту ситуацию.
Метод в cause отвечает за извлечение значения атрибутов, когда процесс индексирования сохраняет данные в плоскую таблицу:
mage_каталог_модель_ресурс_категория_флат::_getattributetypevalues().
protected function _getAttributeTypeValues($type, $entityIds, $sid)
{
$select = $this->_getWriteAdapter()->select()
->from(
array('def' => $this->getTable(array('catalog/category', $type))),
array('entity_id', 'attribute_id')
)
->joinLeft(
array('store' => $this->getTable(array('catalog/category', $type))),
'store.entity_id = def.entity_id AND store.attribute_id = def.attribute_id AND store.store_id = '.$sid,
array('value' => $this->_getWriteAdapter()->getCheckSql('store.value_id > 0',
$this->_getWriteAdapter()->quoteIdentifier('store.value'),
$this->_getWriteAdapter()->quoteIdentifier('def.value'))
)
)
->where('def.entity_id IN (?)', $entityIds)
->where('def.store_id = ?', Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID);
return $this->_getWriteAdapter()->fetchAll($select);
}
Проблема в строке 829:
Где ('def.store_id=?', Mage_Catalog_Model_Abstract::ИДЕНТИФИКАТОР ХРАНИЛИЩА ПО УМОЛЧАНИЮ);
Это $select
пример вывода, проанализированный во время моей отладки:
выбрать
def
.entity_id
,def
.attribute_id
, если (- магазине.value_id > 0,store
.value
,def
.value
) какvalue
ИЗcatalog_category_entity_text
КАКdef
ЛЕВОЕ СОЕДИНЕНИЕcatalog_category_entity_text
КАКstore
В хранилище.идентификатор сущности= def.entity_id И store.attribute_id = def.attribute_id И store.store_id = 43, ГДЕ (идентификатор сущности В ('1', '164')) И (идентификатор хранилища def.store_id =0)
Посмотрите в конец: идентификатор def.store_id = 0
Это условие исключает описание, сохраненное на уровне представления хранилища. Это означает, что описание категории индексируется только в том случае, если описание сохранено в области по умолчанию.
Мои категории получают нет значения описания в области по умолчанию, затем получите значение только на уровне представления хранилища.
Если я прокомментирую строку 829, а затем переиндексирую, это сработает как заклинание.
Затем я подумал, что, возможно, он был обновлен в более новой версии Magento CE. Я проверил 1.9.1, и этот метод не изменился.
Нормальна ли такая ситуация? Я думаю, что это не так.
Я надеюсь, что гуру Magento пройдет здесь, чтобы дать свой совет.
Приветствия.
1 answers
Затем я подумал, что, возможно, он был обновлен в более новой версии Magento CE. Я проверил 1.9.1, и этот метод не изменился.
Это (не), к счастью, неправильно. В Magento 1.8.0.0 метод изменился на:
/**
* Return attribute values for given entities and store of specific attribute type
*
* @param string $type
* @param array $entityIds
* @param integer $storeId
* @return array
*/
protected function _getAttributeTypeValues($type, $entityIds, $storeId)
{
$select = $this->_getWriteAdapter()->select()
->from(
array('def' => $this->getTable(array('catalog/category', $type))),
array('entity_id', 'attribute_id')
)
->joinLeft(
array('store' => $this->getTable(array('catalog/category', $type))),
'store.entity_id = def.entity_id AND store.attribute_id = def.attribute_id '
. 'AND store.store_id = ' . $storeId,
array('value' => $this->_getWriteAdapter()->getCheckSql(
'store.value_id > 0',
$this->_getWriteAdapter()->quoteIdentifier('store.value'),
$this->_getWriteAdapter()->quoteIdentifier('def.value')
))
)
->where('def.entity_id IN (?)', $entityIds)
->where('def.store_id IN (?)', array(Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID, $storeId));
return $this->_getWriteAdapter()->fetchAll($select);
}