В одном из новых проектов появилась задача сделать ссылки на предыдущий с следующий товары в категории. Конечно, в сети гуляет несколько подобных решений, но все они не учитывают того факта что на магазине могут быть включены 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>
Желающие могут скачать готовый модуль