В одном из новых проектов появилась задача сделать ссылки на предыдущий с следующий товары в категории. Конечно, в сети гуляет несколько подобных решений, но все они не учитывают того факта что на магазине могут быть включены flat_tables. Такое пренебрежение ведет к ошибкам, возникающим из-за применения недопустимых механизмов доступа к части информации о категориях и продуктах.

Готовый код, позволяющий получать url`ы к ближайшим товарам, учитывающий flat_tables:

Инициализация:


app/etc/modules/Mygento_Prevnext.xml


    <config>
        <modules>
            <Mygento_Prevnext>
                <active>true</active>
                <codePool>local</codePool>
            </Mygento_Prevnext>
        </modules>
    </config>


app/etc/modules/Mygento_Prevnext.xml

Теперь Magento знает о нашем новом модуле. Создадим сам модуль, который будет расположен в директории


app/code/local/Mygento/Prevnext
Структура папок модуля:
magento/app/code/local/
	Mygento/
		Prevnext/
			 Block/
			 etc/
			 Helper/
			 Model/
			 sql/

Файл конфига модуля:


app/code/local/Mygento/Prevnext/etc/config.xml



<?xml version="1.0"?>
<config>
    <modules>
        <Mygento_Customer>
            <version>1.0</version>
        </Mygento_Customer>
    </modules>
    <global>       
        <helpers>
            <prevnext>
                <class>Mygento_Prevnext_Helper</class>
            </prevnext>
        </helpers>
    </global>
</config>

Файл хелпера:


app/code/local/Mage/Prevnext/Helper/Data.php



<?php

class Mygento_Prevnext_Helper_Data extends Mage_Core_Helper_Abstract {

    public function getPrevNext() {
        $_category = Mage::getSingleton('catalog/layer')->getCurrentCategory();
        $_currentCategoryId = $_category->getId();
        $_prodId = Mage::registry('current_product')->getId();
        $_category->load($_currentCategoryId);
        $_collection = $_category->getProductCollection()
                ->addAttributeToFilter('status', 1)
                ->addAttributeToFilter('visibility', 4);
        $new = array();
        //Foreach for category
        foreach ($_collection as $_collectionItem) {
            array_push($new, $_collectionItem->getId());
        }
        //Foreach for direct product url
        if ($new == NULL) {
            foreach (Mage::getModel('catalog/product')->getCollection() as $_collectionItem) {
                array_push($new, $_collectionItem->getId());
            }
        }
        $new = array_flip($new);
        $keys = array_flip(array_keys($new));
        $values = array_keys($new);
        //Prev product id
        if (($keys[$_prodId] - 1) < 0) {
            $x = count($new) - 1;
        } else {
            $x = $keys[$_prodId] - 1;
        }
        //Next product id
        if (($keys[$_prodId] + 1) > count($new) - 1) {
            $y = 0;
        } else {
            $y = $keys[$_prodId] + 1;
        }
        unset($new);
        // Get products Url
        $_Prevurl = Mage::getModel('catalog/product')->load($values[$x])->getProductUrl();
        $_Nexturl = Mage::getModel('catalog/product')->load($values[$y])->getProductUrl();
        $data = array($_Prevurl, $_Nexturl);
        return $data;
    }

}


Всё, модуль готов, теперь во view.phtml обратимся к нему:



<?php $urls = Mage::helper('prevnext')->getPrevNext(); ?>
<a class="prev-product" href="<?php echo $urls[0]; ?>"></a>
<a class="next-product" href="<?php echo $urls[1]; ?>"></a> 


Желающие могут скачать готовый модуль

А тут наши модули для Magento