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