Решений сортировки по производителю в категории Virtuemart, в настоящий момент, в рунете масса, но все они ориентированы на построение по принципу выпадающего списка select. Например так:
Я считаю, что это не является полноценной сортировкой. Клиент может захотеть просмотреть все товары сразу двух производителей, а при подобной реализации этого сделать не удастся. Поэтому было решено делать сортировку на основе чекбоксов.
Обращаю внимание, что в данной статье речь идёт о сортировке по производителям в категории, а не вообще по всему магазину.
Когда передо мной встаёт какая-либо задача по доработке, я первым делом сканирую интернет на предмет присутствия оной. Глупо писать всё с нуля, если кто-то уже делал подобное. В процессе поиска решения для данной модификации я вышел на 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 |
Вы можете отблагодарить автора:
WMR - R166832041362
WMZ - Z314865156270
QIWI - 9638061071
Яндекс деньги - 41001228750313
Комментарии
У меня вопрос: с sh404sef тестировали? У меня с ним выдает ошибку.
Для li в CSS задан width: 30%; Соответственно, в стоку помещаются три производителя.
Меняя width, вы можете увеличивать/уменьшать количество производителей в строке.
К примеру, если сделать width:20%, то в троке будет 5 производителей.
Еще подскажите пожалуйста где увеличить количество производителей в строке больше трех. Не могу найти.
Спасибо за быстрый ответ.
Не забывайте, что решения, предлагаемые мной на данном сайте были использованы под конкретные нужды, на сайтах заказчиков.
В частности, при разработке данной мофификации - не проверялась работа со стандартным модулем, так как он не использовался на сайте и был не нужен.
Все нормально получилось. Только почему то из стандартного модуля производителей не ищет
Такая ошибка
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
Прокоментируйте пожалуйста