Warning: Creating default object from empty value in /home/p358670/www/old.didgo.ru/components/com_sh404sef/shInit.php on line 37
Сортировка товара по нескольким производителям - Virtuemart 1.1.x (используем чекбокс) | Доработка Virtuemart
 


ВНИМАНИЕ!!! ЭТО СТАРАЯ ВЕРСИЯ САЙТА.

ДЛЯ ПОЛУЧЕНИЯ АКТУАЛЬНОЙ ИНФОРМАЦИИ

ПЕРЕЙДИТЕ НА WWW.DIDGO.RU




Опубликовано в: Доработка Virtuemart
12 ноября 2011


Сортировка товара по нескольким производителям - Virtuemart 1.1.x (используем чекбокс)

Решений сортировки по производителю в категории Virtuemart, в настоящий момент, в рунете масса, но все они ориентированы на построение по принципу выпадающего списка select. Например так:

Пример стандартной сотрировки по производителям Virtuemart

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

Обращаю внимание, что в данной статье речь идёт о сортировке по производителям в категории, а не вообще по всему магазину.

Когда передо мной встаёт какая-либо задача по доработке, я первым делом сканирую интернет на предмет присутствия оной. Глупо писать всё с нуля, если кто-то уже делал подобное. В процессе поиска решения для данной модификации я вышел на http://joomlaforum.ru/, где было описано решение сортировки именно по способу с выпадающим списком. Тема с описанием - http://joomlaforum.ru/index.php/topic,63845.0.html. Именно данный способ лёг в основу моей доработки.

Работы проводились над Virtuemart 1.1.9, в предыдущих версиях всё аналогично, разве что могут отличаться номера строк кода, поэтому ищите код, который нужно менять, по содержимому.

 

Шаг 1.

Редактируем файл /administrator/components/com_virtuemart/html/shop.browse.php

Строку 129:

$db->query( "SELECT manufacturer_id, mf_name, mf_desc FROM #__{vm}_manufacturer WHERE manufacturer_id='$manufacturer_id'");

Меняем на:

$db->query( "SELECT manufacturer_id, mf_name FROM #__{vm}_manufacturer WHERE manufacturer_id='$manufacturer_id'");

 

Строки со 180 по 192:

if ( $num_rows > 1 && @$_REQUEST['output'] != "pdf") {
 if ( $num_rows > 5 ) { // simplified logic
 $search_string = $mm_action_url."index.php?option=com_virtuemart&category_id=$category_id&page=$modulename.browse";
 $search_string .= empty($manufacturer_id) ? '' : "&manufacturer_id=$manufacturer_id";
 $search_string .= empty($keyword) ? '' : '&keyword='.urlencode( $keyword );
 if (!empty($keyword1)) {
 $search_string.="&keyword1=".urlencode($keyword1);
 $search_string.="&search_category=".urlencode($search_category);
 $search_string.="&search_limiter=$search_limiter";
 if (!empty($keyword2)) {
 $search_string.="&keyword2=".urlencode($keyword2);
 $search_string.="&search_op=".urlencode($search_op);
 }
 }

Меняем на:

if ( $num_rows > 1 && @$_REQUEST['output'] != "pdf") {
 if ( $num_rows > $limit  || $num_rows > 5 ) {
 $search_string = $mm_action_url."index.php?option=com_virtuemart&page=$modulename.browse&category_id=$category_id&keyword=".urlencode( $keyword )."&Itemid=$Itemid";
 $search_string .= !empty($orderby)? "&orderby=".urlencode($orderby) : "";
 if (!empty($keyword1)) {
 $search_string.="&keyword1=".urlencode($keyword1);
 $search_string.="&search_category=$search_category";
 $search_string.="&search_limiter=$search_limiter";
 if (!empty($keyword2)) {
 $search_string.="&keyword2=".urlencode($keyword2);
 $search_string.="&search_op=$search_op";
 }
 }

 

Строку 194:

if (substr($key, 0,13) == "product_type_"){

Меняем на:

if (substr($key, 0,13) == "product_type_" || substr($key, 0,5) == "price"){

 

После 237 строки:

$tpl->set( 'orderby_form', $orderby_form );

Вставить:

$orderby_form = $tpl->fetch( 'browse/includes/browse_filterbymf.tpl.php' );
 $tpl->set( 'filterby_mf', $orderby_form );

 

А после 242 строки:

$tpl->set( 'orderby_form', '' );

Вставить:

$tpl->set( 'filterby_mf', '' );

 

Шаг 2.

Редактируем файл /administrator/components/com_virtuemart/html/shop_browse_queries.php

Строки 23-24:

$DescOrderBy = strtoupper($vm_mainframe->getUserStateFromRequest( "browse{$keyword}{$category_id}{$manufacturer_id}DescOrderBy", 'DescOrderBy', "ASC" ));
$DescOrderBy = $DescOrderBy == 'ASC' ? 'ASC' : 'DESC';

Меняем на:

$DescOrderBy = $vmInputFilter->safeSQL( $vm_mainframe->getUserStateFromRequest( "browse{$keyword}{$category_id}{$manufacturer_id}DescOrderBy", 'DescOrderBy', "ASC" ) );

 

Строки 67-74:

// Filter Products by Category
if( $category_id ) {
 if( !empty( $search_this_category ) && (!empty( $keyword ) || !empty( $manufacturer_id ) )) {
 $where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
 } elseif( empty( $keyword ) && empty( $manufacturer_id )) {
 $where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
 }
}

Меняем на:

// Filter Products by Category
if( $category_id ) {
 if( !empty( $search_this_category ) && (!empty( $keyword ) || !empty( $manufacturer_id ) )) {
 $where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
 //MODIFIED FOR FILTER MANUFACTURER 
 //} elseif( empty( $keyword ) && empty( $manufacturer_id )) {
 } elseif( empty( $keyword )) {
 //END MODIFIED FOR FILTER MANUFACTURER 
 $where_clause[] = "`#__{vm}_product_category_xref`.`category_id`=".$category_id;
 }
}

 

Строки 176-182:

// GET ALL PUBLISHED PRODUCTS FROM THAT MANUFACTURER
if (!empty($manufacturer_id)) {
 $table_names .= ',`#__{vm}_product_mf_xref`';    
 $where_clause[]  = "manufacturer_id='".$manufacturer_id."'";
 $where_clause[] = "`#__{vm}_product`.`product_id`=`#__{vm}_product_mf_xref`.`product_id` ";

}

Меняем на:

// GET ALL PUBLISHED PRODUCTS FROM THAT MANUFACTURER
$control = @$_REQUEST['manufacturer_id'][0];
if (!empty($control)) {
 $table_names .= ',`#__{vm}_product_mf_xref`';    
 $mass = @$_REQUEST['manufacturer_id'];
 $where  = "manufacturer_id IN (";
 foreach($mass as $ID) {
 if (!next($mass)) {
 $where .=  "'".$ID."'";
 }
 else {
 $where .=  "'".$ID."', ";
 }
 }
 $where .= ")";
 $where_clause[]  = $where;
 $where_clause[] = "`#__{vm}_product`.`product_id`=`#__{vm}_product_mf_xref`.`product_id` ";
}

 

Строку 319:

$where_clause[] = "`product_parent_id`=0 ";

Меняем на:

$where_clause[] = "((`product_parent_id`='0') OR (`product_parent_id`='')) ";

 

Шаг 3.

Редактируем файл /components/com_virtuemart/themes/default/templates/browse/includes/browse_orderbyform.tpl

После 18-19 строки:

<input class="button" type="submit" value="'.$VM_LANG->_('PHPSHOP_SUBMIT').'" />');
}

Добавляем:

echo $this->fetch( 'browse/includes/browse_filterbymf.tpl.php');

 

Строку 26:

<input type="hidden" name="manufacturer_id" value="<?php echo $manufacturer_id ?>" />

Меняем на:

<input type="hidden" name="limitstart" value="0" />

 

Строку 33:

echo '<input type="hidden" name="product_type_id" value="'.$product_type_id.'" />';

Нужно заккоментировать:

//echo '<input type="hidden" name="product_type_id" value="'.$product_type_id.'" />';

 

Шаг 4.

Скачиваем файл, прикреплённый к статье, распаковываем, и ложим его в папку /components/com_virtuemart/themes/default/templates/browse/includes/

После, нужно прописать стили, чтобы добиться того вида блока сортировки, который вам нужен. Если хотите сделать как на демо сайте, то добавьте в CSS файл шаблона код:

.sort_div {border:1px dashed #bebebe; margin: 0 0 20px; padding:10px; border-radius:10px;}
.sort_man {margin: 0 auto !important; padding: 0; width: 95%;}
.sort_man li {float: left; list-style: none outside none !important; margin: 5px 0; width: 33%;}
.sort_man li input {height: auto !important; margin-right: 5px;}

Всё, должно работать! Любые доработки и исправления приветствуются!

Обкатывалось на Joomla 1.24 + Virtuemart 1.1.9, Virtuemart 1.1.8. Работоспособность проверена в браузерах Mozilla 7.0.1, Opera 11.52, IE 7, IE 8, IE 9, Chrome 8.0

Вложения:
ФайлОписаниеРазмер файла
Скачать файл (browse_filterbymf.tpl.zip)browse_filterbymf.tpl.zipФайлы для добавления0.9 Kb
 

Вы можете отблагодарить автора:

WMR - R166832041362

WMZ - Z314865156270

QIWI - 9638061071

Яндекс деньги - 41001228750313


Комментарии 
 
#10 18.04.2013 14:01
Хак полезный, однако есть проблема. Если товаров более, чем на одну страницу, на следующей странице отбор не работает. VM1.1.9, Joomla 1.5.25, SEO выключал для проверки.
 
 
#9 04.12.2012 20:10
Большое спасибо, все работает.
У меня вопрос: с sh404sef тестировали? У меня с ним выдает ошибку.
 
 
#8 31.03.2012 20:03
Здравствуйте, если в категории один производитель можно убрать вывод его чекбокса?
 
 
#7 13.02.2012 16:51
Решил проблему с флаером проверкой переменной $mass - является ли она массивом. (is_array($mass ))
 
 
#6 13.02.2012 16:20
Здравствуйте. У меня хак тоже получился, все работает. Но на странице товара (флаер) тоже вылазит ошибка Warning: Invalid argument supplied for foreach(). Не подскажете, в чем может быть причина?
 
 
#5 19.12.2011 13:09
Там реализовано неупорядоченным списком ul li

Для li в CSS задан width: 30%; Соответственно, в стоку помещаются три производителя.

Меняя width, вы можете увеличивать/уменьшать количество производителей в строке.

К примеру, если сделать width:20%, то в троке будет 5 производителей.
 
 
#4 19.12.2011 12:58
[quote name="Алексей"][quote name="Дмитрий Краев"]Не знаю, не проверял.

Еще подскажите пожалуйста где увеличить количество производителей в строке больше трех. Не могу найти.
 
 
#3 19.12.2011 12:41
Цитирую Дмитрий Краев:
Не знаю, не проверял.

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

В частности, при разработке данной мофификации - не проверялась работа со стандартным модулем, так как он не использовался на сайте и был не нужен.


Спасибо за быстрый ответ.
 
 
#2 19.12.2011 12:04
Не знаю, не проверял.

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

В частности, при разработке данной мофификации - не проверялась работа со стандартным модулем, так как он не использовался на сайте и был не нужен.
 
 
#1 19.12.2011 11:49
Здравствуйте. Спасибо за пост. Очень полезный хак.
Все нормально получилось. Только почему то из стандартного модуля производителей не ищет
Такая ошибка
Warning: Invalid argument supplied for foreach() in Z:\home\localho st\www\mebel\ad ministrator\com ponents\com_vir tuemart\html\sh op_browse_queri es.php on line 185

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