БЛОГОДЖУМЛА - БЛОГ О ДЖУМЛА

Как сделать ссылки на следующий/предыдущий товар в карточке товара

  • Категория: Joomshopping
  • Автор:
  • Просмотров: 26075

Для любого интернет-магазина важна правильная перелинковка товара. Не только с точки зрения 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;">&nbsp;

	<?php if($Prev) echo $Prev;?>

	</span>

	<span style="width:50%;float:left;text-align:center;text-transform: uppercase;">

	<?php if($Next) echo $Next;?>

	&nbsp;</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 Для получения данных разработан плагин. Остается только вывести информацию в нужной части карточки. Плагин распространяется бесплатно.

 

Вложения:
Доступ по ссылке (/files/js_plg_prev_next_product.zip)js_plg_prev_next_product.zip
Back to top