Проблема с плоскими данными категории: описание отсутствует в плоской таблице без ошибки индексирования


Я работаю над 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 пройдет здесь, чтобы дать свой совет.

Приветствия.

Author: Manoj Deswal, 2017-05-11

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);
}

См.: https://github.com/OpenMage/magento-mirror/blob/magento-1.8/app/code/core/Mage/Catalog/Model/Resource/Category/Flat.php#L839-L867

 2
Author: sv3n, 2017-05-17 09:09:46