Русский блог ET

Magento: Ошибка в реализации модуля Ссылки на предыдущий/следующий товар

Недавно столкнулись с интересной ошибкой. Её особенность в том, что почти никогда не заметна разработчикам сайта и владельцам, но доставляет проблемы другим пользователям.

PHP Fatal error: Call to undefined method Mage_Catalog_Model_Resource_Category_Flat::getProductsPosition()

Результат работы функции хранится в переменной и обращение к проблемному коду происходит только для новых посетителей, у которых эта переменная пустая. Владельцы магазина включают хранение категорий в горизонтальной структуре после посещения сайта и не видят проблем после включения. Новые посетители страницу товара не видят.

После анализа кода, оказалось, что ошибка закралась во все публично доступные (просмотрели штук 5) реализации ссылок на предыдущий/следующий товар в просмотре товара.

Код не учитывает того, что в Magento есть возможность использовать не только обычную структуру категорий, но и горизонтальную структуру (Flat Category). И как оказалось у модели, используемой для работы с Flat категориями нет реализации метода getProductsPosition().

Ошибку вызывает подобная строка

Mage::registry('current_category')->getProductsPosition();

В зависимости от используемой структуры каталога метод вызывается у объектов разных типов и при Flat структуре сайт падает с фатальной ошибкой.

Пришлось написать костыль

if (Mage::getStoreConfig('catalog/frontend/flat_catalog_category')) {
    $currentCategory = Mage::registry('current_category');
    $notFlatCategoryResource = Mage::getResourceModel('catalog/category')->load($currentCategory, $currentCategory->getId());
    $positions = array_reverse(array_keys($notFlatCategoryResource->getProductsPosition($currentCategory)));
} else {
    $positions = array_reverse(array_keys(Mage::registry('current_category')->getProductsPosition($currentCategory)));
}

Проверялось на Magento 1.7.0.2

Comments are currently closed.