Похожие товары или Related для VirtueMart+Joomla

Мы сделаем вывод похожих товаров, с указанием цены и скидки. К примеру название "iPhone 5s 64 GB" будет показывать еще "iPhone 5s 32 GB" и "iPhone 5s 16 GB" и уже только потом "iPad 32 GB", т.е. от большего соответствия к наименьшему, работающий пример вы можете увидеть на этом сайте, правда он реализован стандартно в DLE. В отличии от сопутствующих товаров, которые сделаны для покупки дополнительных аксессуаров, наш модуль будет предлагать в автоматическом режиме другие варианты товаров.


Несмотря на все возможности полнотекстовых индексов, стоит учитывать, что сами индексы занимают очень значительное место на диске, и изменения таблиц с ними будет выполняться значительно дольше.

Приступим к настройке и установке

1. Заходим в базу данных и открываем таблицу #_virtuemart_products_ru_ru и нажимаем Создать индекс для 1 столбца и вписываем:
  • Имя индекса: related
  • Выбор индекса: FULLTEXT
  • Столбец выбираем product_name
  • И жмём вперед!
В итоге у нас будет создан индекс с параметрами


2. Создаём файл default_related.php и помещаем его в \components\com_virtuemart\views\productdetails\tmpl или в свой шаблон
Не пугайтесь запроса в бд, его скорость была проверена на 3,000 товаров и вот результат Отображение строк 0 - 8 (9 всего, Запрос занял 0.0011 сек.)
<?php
/*
=====================================================
 Web barmen
-----------------------------------------------------
 http://webarmen.com/
-----------------------------------------------------
 © 2016 Copyright by barmen
=====================================================
 Данный код защищен авторскими правами
=====================================================
 Файл: default_related.php
-----------------------------------------------------
 Версия: 1.1
-----------------------------------------------------
 Назначение: Вывод похожих товаров
=====================================================
*/
defined('_JEXEC') or die;
$db = JFactory::getDBO();
$db->setQuery("SELECT p.virtuemart_product_id, p.product_name, p.slug, m.virtuemart_media_id, mall.file_url, pall.published, pr.product_price, mn.virtuemart_manufacturer_id, calm.virtuemart_calc_id, calcs.calc_value_mathop, calcs.calc_value, calcs.publish_down FROM #__virtuemart_products_ru_ru p LEFT JOIN #__virtuemart_product_medias m ON (p.virtuemart_product_id=m.virtuemart_product_id AND m.ordering='1') LEFT JOIN #__virtuemart_medias mall ON (mall.virtuemart_media_id=m.virtuemart_media_id) LEFT JOIN #__virtuemart_products pall ON (pall.virtuemart_product_id=p.virtuemart_product_id) LEFT JOIN #__virtuemart_product_prices pr ON (pr.virtuemart_product_id=p.virtuemart_product_id) LEFT JOIN #__virtuemart_product_manufacturers mn ON (mn.virtuemart_product_id=p.virtuemart_product_id) LEFT JOIN #__virtuemart_calc_manufacturers calm ON (calm.virtuemart_manufacturer_id=mn.virtuemart_manufacturer_id) LEFT JOIN #__virtuemart_calcs calcs ON (calcs.virtuemart_calc_id=calm.virtuemart_calc_id) WHERE MATCH (product_name) AGAINST ('".$this->product->product_name."') AND product_name!='".$this->product->product_name."' AND pall.published ='1' LIMIT 0,3");
$items = $db->loadObjectList();
if( $items ) { ?>
    <div class="product-related-products">
        <div class="product-fields-title-wrapper"><span class="product-fields-title"><strong>Похожие товары</strong></span>
            <span class="hasTooltip" title="Отображение похожих товаров"><img src="/media/system/images/tooltip.png" alt="Tooltip"></span>
        </div><?php foreach ($items as $item) {
if( !$item->file_url ) $item->file_url = "/components/com_virtuemart/assets/images/vmgeneral/noimage.gif";
$saleprice = $item->product_price*$item->calc_value/100;
$saleprice = $item->product_price-$saleprice; ?>
        <div class="product-field product-field-type-R">
            <div class="product-field-display">
                <a href="?option=com_virtuemart&view=productdetails&virtuemart_product_id=<?php echo $item->virtuemart_product_id;?>" title="<?php echo $item->product_name;?>" target="_blank"><img src="<?php echo $item->file_url;?>"> <?php echo $item->product_name;?></a>
                <div class="PricesalesPrice vm-display vm-price-value"><span class="vm-price-desc">Цена: </span><span class="PricesalesPrice"><?php echo number_format($item->product_price, 0, '', ' '); ?> руб <?php if( $item->calc_value AND date('Y-m-d').'00:00:00' < $item->publish_down ) { ?><span class="salerelaited"><?php echo number_format($saleprice, 0, '', ' '); ?> руб</span><?php } ?></span></div>
            </div>
        </div><?php } ?>
        <div class="clear"></div>
    </div>
<?php } ?>
или вы можете его скачать

3. Так как я еще не реализовал ЧПУ, рекомендую в robots.txt(в корне сайта) добавить
Disallow: /*option=com_virtuemart&view=productdetails&virtuemart_product_id=
Всё! Если вам понравился модуль, напиши в комментарии ваши идеи или просто пожелания, это будет мой стимул развивать модуль дальше и сделать его уже действительно, полноценным модулем.

Исправлен вывод цен по акции, товары у которых закончилась акция, больше не отображают цену по скидке
Внесены мелкие правки

Новость отредактировал: barmen - 17-10-2016, 16:40
Причина: версия 1.1 исправлен вывод цен по скидкам

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своей новости.

Комментариев 1

  1. Артём
    Артём 30 августа 2016 21:25
    👍🏼 спасибо, пригодилось