Навигация между товарами не так часто используется в интернет-магазинах, но в некоторых случаях может быть полезна.
Virtuemart поддерживает навигацию из коробки, достаточно включить опцию Показать навигацию по товарам в Virtuemart > Настройки > Внешний вид.
Но не все так просто, как может показаться на первый взгляд.
Достаточно часто приходится сталкиваться с проблемой зацикливания товаров при навигации. Проблема может возникать как сразу, так и при изменении порядка сортировки товаров в категории. И, судя по оф. форуму, это не баг, а особенность, которой очень трудно избежать.
Ниже я хочу предложить решение, которое сработало у меня и, возможно, поможет вам.
Для этого нужно заменить стандартный код навигации в файле /components/com_virtuemart/views/productdetails/tmpl/default.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php // Product Navigation if (VmConfig::get('product_navigation', 1)) { ?> <div class="product-neighbours"> <?php if (!empty($this->product->neighbours ['previous'][0])) { $prev_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->neighbours ['previous'][0] ['virtuemart_product_id'] . '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE); echo JHtml::_('link', $prev_link, $this->product->neighbours ['previous'][0] ['product_name'], array('rel'=>'prev', 'class' => 'previous-page','data-dynamic-update' => '1')); } if (!empty($this->product->neighbours ['next'][0])) { $next_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->neighbours ['next'][0] ['virtuemart_product_id'] . '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE); echo JHtml::_('link', $next_link, $this->product->neighbours ['next'][0] ['product_name'], array('rel'=>'next','class' => 'next-page','data-dynamic-update' => '1')); } ?> <div class="clear"></div> </div> <?php } // Product Navigation END ?> |
на
1 2 3 4 5 |
<?php if (VmConfig::get('product_navigation', 1)) { echo $this->loadTemplate('neighbours'); } ?> |
и создать в папке /components/com_virtuemart/views/productdetails/tmpl/ файл default_neighbours.php со следующим содержимым
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<?php defined('_JEXEC') or die('Restricted access'); $productModel = VmModel::getModel ('product'); $orderingProduct = $productModel->getLastProductOrdering(); $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName('a.virtuemart_product_id')); $query->from($db->quoteName('#__virtuemart_product_categories', 'a')); $query->leftJoin( $db->quoteName('#__virtuemart_product_prices', 'b') . ' ON ' . $db->quoteName('a.virtuemart_product_id') . ' = ' . $db->quoteName('b.virtuemart_product_id') ); $query->leftJoin( $db->quoteName('#__virtuemart_products', 'c') . ' ON ' . $db->quoteName('a.virtuemart_product_id') . ' = ' . $db->quoteName('c.virtuemart_product_id') ); $query->select($db->quoteName('product_name')); $query->leftJoin( $db->quoteName('#__virtuemart_products_' . VmConfig::$vmlang, 'd') . ' ON ' . $db->quoteName('a.virtuemart_product_id') . ' = ' . $db->quoteName('d.virtuemart_product_id') ); $query->where($db->quoteName('a.virtuemart_category_id') . ' = ' . $this->product->virtuemart_category_id); switch ($orderingProduct) { case 'product_price': $query->order($db->quoteName('b.product_price') . ' ASC'); case '`p`.product_sku': $query->order($db->quoteName('c.product_sku') . ' ASC'); case '`p`.product_in_stock': $query->order($db->quoteName('c.product_in_stock') . ' DESC'); case 'product_name': $query->order($db->quoteName('d.product_name') . ' ASC'); default: $query->order($db->quoteName('b.product_price') . ' ASC'); } $db->setQuery($query); $resultProducts = $db->loadAssocList(); $productNeighbours = []; foreach ($resultProducts as $key => $product) { if ($product['virtuemart_product_id'] == $this->product->virtuemart_product_id) { $productNeighbours['next'] = (isset($resultProducts[$key + 1])) ? $resultProducts[$key + 1] : null; $productNeighbours['prev'] = (isset($resultProducts[$key - 1])) ? $resultProducts[$key - 1] : null; } } ?> <div class="product-neighbours"> <?php if (!empty($productNeighbours['prev']['virtuemart_product_id'])) { $prev_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $productNeighbours['prev']['virtuemart_product_id']. '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE); ?> <a href="<?php echo $prev_link; ?>" class="previous-page" data-dynamic-update="1"><?php echo $productNeighbours['prev']['product_name']; ?></a> <?php } ?> <?php if (!empty($productNeighbours['next']['virtuemart_product_id'])) { $next_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $productNeighbours['next']['virtuemart_product_id']. '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE); ?> <a href="<?php echo $next_link; ?>" class="previous-page" data-dynamic-update="1"><?php echo $productNeighbours['next']['product_name']; ?></a> <?php } ?> <div class="clearfix"></div> </div> |
Код можно модифицировать для показа не только названия, но и миниатюры товары. Для этого замените весь код внутри блока
1 2 3 |
<div class="product-neighbours"> ... </div> |
на
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<div class="product-neighbours"> <?php if (!empty($productNeighbours['prev']['virtuemart_product_id'])) { $prev_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $productNeighbours['prev']['virtuemart_product_id']. '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE); $prevProduct = $productModel->getProductSingle($productNeighbours['prev']['virtuemart_product_id']); $productModel->addImages($prevProduct); ?> <a href="<?php echo $prev_link; ?>" class="previous-page" data-dynamic-update="1"><?php echo $prevProduct->images[0]->displayMediaThumb('', false); ?> <?php echo $productNeighbours['prev']['product_name']; ?></a> <?php } ?> <?php if (!empty($productNeighbours['next']['virtuemart_product_id'])) { $next_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $productNeighbours['next']['virtuemart_product_id']. '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE); $nextProduct = $productModel->getProductSingle($productNeighbours['next']['virtuemart_product_id']); $productModel->addImages($nextProduct); ?> <a href="<?php echo $next_link; ?>" class="previous-page" data-dynamic-update="1"><?php echo $productNeighbours['next']['product_name']; ?> <?php echo $nextProduct->images[0]->displayMediaThumb('', false); ?></a> <?php } ?> <div class="clearfix"></div> </div> |
В итоге должно получиться что-то вроде этого.
Кроме картинки можно выводить и любую другую информацию по соседним товарам. Если есть такая задача, то пишите в комментариях, постараюсь помочь.
12 комментариев
OutLaw123
Код работает, но у меня на шаблоне Likeshop другая проблема, если включить навигацию по товарам , то вылазит ошибка '1054 - Unknown column 'l.product_name' in 'field list' '
Как я понял из темы https://virtuemart.su/forums/topic/krivo-rabotaet-navigaciya-po-tovaram-predydushhijsleduyushhij-v-kartochke-tovara/page/2/
это связано с тем , что я изменил стандартную сортировку категории.
т.е. стандартная навигация работает только если сортировка выставлена "по названию товара"
Можно как-то это обойти?
admin
Не совсем понял какие правки у Вас внесены, уточните, что именно было изменено?
OutLaw123
Virtuemart ->Настройки ->Настройки Сортировки
У меня выставлена Порядок сортировки по умолчанию: "Порядок"
навигация работает только если выставить Порядок сортировки по умолчанию: "Название товара"
Иначе вылазит ошибка
admin
Вы пробовали вносить правки из статьи?
Если не помогает, то нужно смотреть на сайте, не удалось повторить ту же ошибку на тестовом домене.
Пришлите доступ к админке, ftp на admin@virtuemart.su, будем разбираться.
JediG
Хочу скрыть навигацию товара в карточке товара на мобильной версии сайта. Вроде была у вас статья тематическая, но не могу найти. Направление движения в принципе понятно, но если есть готовое описание то я бы сказал СПАСИБО!
admin
В файл стилей добавьте
OutLaw123
Проблема решилась!
Но есть нюанс, как сделать чтобы выводились ссылки на товары, которые в наличии, а не на любые. Как сделать проверку на наличие товара на складе и выводить только с положительным остатком?
admin
Уточните вопрос, какие именно ссылки имеются ввиду?
OutLaw123
Основные ссылки на товары - вперед/назад
Выводятся товары, которых нет в наличии
admin
Попробуйте в Virtuemart > Настройки > Внешний вид в области Действие при поступлении товара на склад активировать опцию Не показывать. После этого товары, которых нет в наличии, не будут показываться на сайте и из постраничной навигации также должны пропасть.
OutLaw123
У меня стоит "Не показывать товар, если дочерние товары отсутствуют на складе." потому что много дочерок.
В каталоге "не в наличии" скрыто, а вот при этой постраничной навигации в товаре она все подряд выводит.
admin
Если Вы используете код из статьи, то попробуйте после
добавить