VM 2.x Сортировка отсутствующих товаров в категории

Для более корректной сортировки отсутствующего товара правим функцию sortSearchListQuery в administrator/components/com_virtuemart/models/product.php
В самом начале:
Код:
...
$ff_select_price = '';
$ff_select_notinstock = ''; // Добавить эту строку
$where = array();
...
Далее в блоке switch ($this->filter_order) правим те сортировки, которыми пользуетесь. В моём случае это по цене и наименованию:
Код:
case 'product_price':
  $orderBy = ' ORDER BY orderme, `product_price` '; // В этой строке вставить orderme,
  $ff_select_price = ', IF(pp.override, pp.product_override_price, pp.product_price) as product_price ';
  $ff_select_notinstock = ', IF(p.product_in_stock > 0, 10, 1000) as orderme '; // Эту строку добавить
  $joinPrice = TRUE;
  break;
default;
  if (!empty($this->filter_order)) {
    $ff_select_notinstock = ', IF(p.product_in_stock > 0, 10, 1000) as orderme '; // Эту строку добавить
    $orderBy = ' ORDER BY orderme, ' . $this->filter_order . ' '; // В этой строке вставить orderme,
  }
  else {
    $this->filter_order_Dir = '';
  }
  break;
Далее ищем
$select = ' p.`virtuemart_product_id`'.$ff_select_price.' FROM `#__virtuemart_products` as p ';
и меняем на
$select = ' p.`virtuemart_product_id`'.$ff_select_price.$ff_select_notinstock.' FROM `#__virtuemart_products` as p ';

Теперь сортировка должна работать без учета кол-ва товара в наличии, а по факту его наличия. Сначала весь, которого больше нуля, потом остальной или у которого наличие не заполнено вовсе. И помните, что после обновления virtuemarta эти изменения пропадут, нужно будет делать заново.
 
Последнее редактирование:
Для более корректной сортировки отсутствующего товара правим функцию sortSearchListQuery в administrator/components/com_virtuemart/models/product.php
В самом начале:
Код:
...
$ff_select_price = '';
$ff_select_notinstock = ''; // Добавить эту строку
$where = array();
...
Далее в блоке switch ($this->filter_order) правим те сортировки, которыми пользуетесь. В моём случае это по цене и наименованию:
Код:
case 'product_price':
  $orderBy = ' ORDER BY orderme, `product_price` '; // В этой строке вставить orderme,
  $ff_select_price = ', IF(pp.override, pp.product_override_price, pp.product_price) as product_price ';
  $ff_select_notinstock = ', IF(p.product_in_stock > 0, 10, 1000) as orderme '; // Эту строку добавить
  $joinPrice = TRUE;
  break;
default;
  if (!empty($this->filter_order)) {
    $ff_select_notinstock = ', IF(p.product_in_stock > 0, 10, 1000) as orderme '; // Эту строку добавить
    $orderBy = ' ORDER BY orderme, ' . $this->filter_order . ' '; // В этой строке вставить orderme,
  }
  else {
    $this->filter_order_Dir = '';
  }
  break;
Далее ищем
$select = ' p.`virtuemart_product_id`'.$ff_select_price.' FROM `#__virtuemart_products` as p ';
и меняем на
$select = ' p.`virtuemart_product_id`'.$ff_select_price.$ff_select_notinstock.' FROM `#__virtuemart_products` as p ';

Теперь сортировка должна работать без учета кол-ва товара в наличии, а по факту его наличия. Сначала весь, которого больше нуля, потом остальной или у которого наличие не заполнено вовсе. И помните, что после обновления virtuemarta эти изменения пропадут, нужно будет делать заново.
Подскажи куда в функции sortSearchListQuery эти строки вставлять
Код:
$ff_select_price = '';
$ff_select_notinstock = ''; // Добавить эту строку
$where = array();
Так и не понял
 
Вставлять надо в начале, где идет описание переменных
Код:
//administrative variables to organize the joining of tables
$joinCategory = FALSE;
$joinCatLang = false;
$joinMf = FALSE;
$joinMfLang = false;
...
$ff_select_price = '';
$ff_select_notinstock = ''; // <--- Добавить эту строку
$where = array();
 
Вставлять надо в начале, где идет описание переменных
Код:
//administrative variables to organize the joining of tables
$joinCategory = FALSE;
$joinCatLang = false;
$joinMf = FALSE;
$joinMfLang = false;
...
$ff_select_price = '';
$ff_select_notinstock = ''; // <--- Добавить эту строку
$where = array();
На версии VM 2.0.22c не смог настроить, в категориях товар весь просто пропадает. Скажи на какой версии у тебя работает?
 
У меня VirtueMart 2.6.12
Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Подскажите пожалуйста. Пытаюсь сделать чтоб товар с нулевой ценой, вместо цены которого отображается надпись (позвонить для запроса цены) при сортировке по цене в категории товаров всегда был снизу списка.
Данный код не подошел..
$orderBy = ' ORDER BY `product_price`, `product_in_stock` '; или
$orderBy = ' ORDER BY `product_price`, p.`product_in_stock` ';

У меня в файле продукт сейчас такой код.
Код:
case 'product_price':
                    //$filters[] = 'p.`virtuemart_product_id` = p.`virtuemart_product_id`';
                    //$orderBy = ' ORDER BY `product_price` ';
                    //$orderBy = ' ORDER BY `ff_final_price`, `product_price` ';
                    $orderBy = ' ORDER BY `product_price` ';
                    $ff_select_price = ' , IF(pp.override, pp.product_override_price, pp.product_price)/(SELECT currency_exchange_rate from #__virtuemart_currencies WHERE virtuemart_currency_id=pp.product_currency) as product_price ';
                    $joinPrice = TRUE;
                    break;
 
Подскажите пожалуйста. Пытаюсь сделать чтоб товар с нулевой ценой, вместо цены которого отображается надпись (позвонить для запроса цены) при сортировке по цене в категории товаров всегда был снизу списка.
Данный код не подошел..
ну из того, что первое в голову приходит это в products.php шаблона в папке sublayouts после
foreach ( $products as $product ) {
написать условие
if ($product->prices[product_price])!=0) { (в конце, перед закрытием foreach обратную скобку } не забудьте поставить)

потом дублируете
foreach ( $products as $product ) {
но уже с условием if ($product->prices[product_price])==0) {
надеюсь понятно
п.с это для VM3
 
ну из того, что первое в голову приходит это в products.php шаблона в папке sublayouts после
foreach ( $products as $product ) {
написать условие
if ($product->prices[product_price])!=0) { (в конце, перед закрытием foreach обратную скобку } не забудьте поставить)
К сожалению у меня в шаблоне практически ничего нет, да и в файле который отвечает за сортировку нет такого кода. Есть еще какие нибудь варианты?
 
Последнее редактирование:
К сожалению у меня в шаблоне практически ничего нет, да и в файле который отвечает за сортировку нет такого кода. Есть еще какие нибудь варианты?
такого не может быть. У вас какая версия VM?
если нет файлов в templates, то ищите в components\com_virtuemart\sublayouts, но учтите что при обновлении это все движения будете делать повторно
 
такого не может быть. У вас какая версия VM?
если нет файлов в templates, то ищите в components\com_virtuemart\sublayouts, но учтите что при обновлении это все движения будете делать повторно

У меня 2й VirtueMart 2.6.6. Файл отвечающий за сортировку products.php, его путь: /administrator/components/com_virtuemart/models Но там нет таких строк.....

Файл во вложении.
 

Вложения

  • product.rar
    20,1 KB · Просмотры: 4
Последнее редактирование модератором:
Назад
Сверху