Для любого интернет-магазина важна правильная перелинковка товара. Не только с точки зрения SEO, но и с точки зрения юзабилити. Важно, чтобы покупатель имел возможность перемещаться по товарам не покидая карточки товара.
Сегодня я покажу как в JoomShopping в карточке товара сделать навигацию по следующему/предыдущему товару. Вот как это выглядит:
Для тогочтобы обновления JoomShopping не затронули наше решение - все изменения будем делать в шаблоне карточки товара.
Открываем шаблон карточки товара /components/com_jshopping/templates/default/product/product_default.php
и после
<?php include(dirname(__FILE__)."/load.js.php");?>
пишем
<?php $product_id = JRequest::getInt('product_id');
$product_nav = &JTable::getInstance('product', 'jshop');
$product_nav->load($product_id);
$category_id = $product_nav->getCategory();
$products = &$this->getModel("products"); //Определяем сортировку и направление сортировки пользователя
$mainframe =& JFactory::getApplication();
$jshopConfig = &JSFactory::getConfig();
$order = $mainframe->getUserStateFromRequest( 'jshoping.list.front.productorder', 'order', $jshopConfig->product_sorting, 'int');
$orderby = $mainframe->getUserStateFromRequest( 'jshoping.list.front.productorderby', 'orderby', $jshopConfig->product_sorting_direction, 'int');
$orderbyq = getQuerySortDirection($order, $orderby);
$field_order = $jshopConfig->sorting_products_field_select[$order];
$order_query = "";
if (!$field_order) return $order_query;
$order_original = $field_order;
$multyCurrency = count(JSFactory::getAllCurrency());
if ($multyCurrency>1 && $field_order=="prod.product_price"){
if (strpos($adv_from,"jshopping_currencies")===false){
$adv_from .= " LEFT JOIN `#__jshopping_currencies` AS cr USING (currency_id) ";
}
if ($jshopConfig->product_list_show_min_price){
$field_order = "prod.min_price/cr.currency_value";
}else{
$field_order = "prod.product_price/cr.currency_value";
}
}
if ($field_order=="prod.product_price" && $jshopConfig->product_list_show_min_price){
$field_order = "prod.min_price";
}
$order_query = " ORDER BY ".$field_order;
if ($orderbyq){
$order_query .= " ".$orderbyq;
}
//Собственно сам запрос
$db =& JFactory::getDBO();
$query = "SELECT *, `prod`.`name_ru-RU` as name FROM `#__jshopping_products` AS prod
INNER JOIN `#__jshopping_products_to_categories` AS pr_cat ON `pr_cat`.`product_id` = `prod`.`product_id`
LEFT JOIN `#__jshopping_categories` AS cat ON `pr_cat`.`category_id` = `cat`.`category_id`
WHERE `prod`.`product_quantity`> 0 AND `prod`.`product_publish` = 1 AND `pr_cat`.`category_id` = ".$category_id." ".$order_query;
$db->setQuery($query);
$rows = $db->loadObjectList();
$total = Count($rows);
addLinkToProducts($rows, 0, 1);
$Next = false;
$Prev = false;
foreach($rows as $Key=>$row){
If ($row->product_id == $product_id){
if($rows[$Key + 1]->product_link) $Next='<a style="font-size: 10px;text-decoration: none;" href="'.$rows[$Key + 1]->product_link.'" title="'.$rows[$Key + 1]->name.'">'.$rows[$Key + 1]->name.' ></a>';
if($rows[$Key - 1]->product_link) $Prev='<a style="font-size: 10px;text-decoration: none;" href="'.$rows[$Key - 1]->product_link.'" title="'.$rows[$Key - 1]->name.'">< '.$rows[$Key - 1]->name.'</a>';
Break;
}
}
?>
Далее, там где мы хотим вывести сылки (например после <div class="jshop productfull">) пишем
<div style="width:100%;border-bottom: 1px solid #ECECEC;height: 30px;margin-bottom: 10px;"> <span style="width:50%;float:left;text-align:center;block:inline;text-transform: uppercase;"> <?php if($Prev) echo $Prev;?> </span> <span style="width:50%;float:left;text-align:center;text-transform: uppercase;"> <?php if($Next) echo $Next;?> </span> </div>
Готово.
P.P.S Если у Вас один товар принадлежит нескольким категориям и Вы хотите чтобы предыдущий/следующий брались из текущей категории - нужно во втором блоке кода в 4 строке вместо $category_id = $product->getCategory(); написать $category_id = JRequest::getInt('category_id');
P.P.P.S Спасибо форумчанину AndreyUA - было исправлено $product на $product_nav
P.P.P.P.S В результате расследования было обнаружено, что проблемы возникают в магазинах, в которых не забивают остатки товара - то есть количество равно 0. Для таких магазинов необходимо из запроса выкинуть "`prod`.`product_quantity`> 0 AND " после WHERE
UPDATE Для получения данных разработан плагин. Остается только вывести информацию в нужной части карточки. Плагин распространяется бесплатно.
