Небольшая модификация поисковой выдачи Virtuemart. Сортируем выдачу по категориям и выводим названия категории.
Необходимо изменить запросы. При наличии keyword - добавить сортировку по category_id. Открываем /administrator/components/com_virtuemart/html/shop_browse_queries.php s в самом начале в переменную $fieldnames добавляем наименование категории, например после
`#__{vm}_category`.`category_id`,
добавляем
`#__{vm}_category`.`category_name`,
Далее, после
switch( $orderby ) { case 'product_list': $orderbyField = '`#__{vm}_product_category_xref`.`product_list`'; break; case 'product_name': $orderbyField = '`#__{vm}_product`.`product_name`'; break; case 'product_price': $orderbyField = '`#__{vm}_product_price`.`product_price`'; break; case 'product_sku': $orderbyField = '`#__{vm}_product`.`product_sku`'; break; case 'product_cdate': $orderbyField = '`#__{vm}_product`.`cdate`'; break; default: $orderbyField = '`#__{vm}_product`.`product_name`'; break; }
добавляем
if (!empty($keyword)) $orderbyField = '`#__{vm}_category`.`category_id`, '.$orderbyField ;
Закрываем, сохраняем. Запрос изменили, товары уже сортируются по категориям. Осталось сделать вывод наименования категории. Открываем /administrator/components/com_virtuemart/html/shop.browse.php и находим, например,
$products[$i]['product_url'] = $db_browse->f("product_url");
после этого добавляем
if (!empty($keyword)) { $products[$i]['category_id'] = $db_browse->f("category_id"); $products[$i]['category_name'] = shopMakeHtmlSafe( $db_browse->f("category_name") ); }
Закрываем, сохраняем. Данные подготовили. Теперь нужно понять какой шаблон разметки мы используем. Это проще всего сделать открыв /components/com_virtuemart/themes/default/theme.config.php
В переменной productListStyle мы и увидим какой шаблон разметки используется. У меня это browse/includes/browse_notables.tpl.php Полный путь - /components/com_virtuemart/themes/default/templates/browse/includes/browse_notables.tpl.php Открываем этот файл и перед выводом товара
echo $this->fetch( 'browse/'.$templatefile .'.php' );
добавляем проверку на изменение категории и вывод названия категории.
if ($category_id_current!=$product['category_id']) echo '<h1>'.$product['category_name'].'</h1>';
Ещё нам нужно учесть, что выдача поиска может быть многостраничной, и для правильной работы нам необходимо передавать значение текущей категории $category_id_current между страницами. Проще всего это сделать через сессию $_SESSION. Перед
echo $browsepage_footer;
добавляем
$_SESSION['category_id_current'] =$category_id_current;
Теперь нужно в начале инициализировать нашу переменную $category_id_current. Перед
foreach( $products as $product ) {
пишем
$category_id_current=vmGet( $_SESSION , 'category_id_current', 0 );
Все готово.