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.