Порядок отображения товаров в VirtueMart 2.0.2

Пятница, 07 Сентябрь 2012

 

Разрабатывая интернет магазин на Joomla 2.5 с использованием Virtuemart 2.0.2, столкнулся с проблемой: в списке категории нельзя было задать порядок отображения товаров. К примеру нельзя было изменить порядок товаров как показано на скриншоте (список товаров в категории Virtuemart):

 

Порядок отображения товаров в VirtueMart 2.0.2

 

Решения данной проблемы с порядком товаров в Virtuemart 2.0.2 небыло, гугление ничего не дало. Вобщим пришлось делать хак, инструкция установки которого изложена ниже:

 

1) открываем файл /administrator/components/com_virtuemart/models/product.php

 

находим :

 

 
$product_data = $this->getTable('products');
 

 

вставляем ПЕРЕД ним:

 

 
if(!$data['virtuemart_product_id'])
  $GLOBALS['dymm_new_prod'] = 1;
 

 

Находим:

 

 
$product_table_Parent = $this->getTable($tableName);
 

 

вставляем ПОСЛЕ него:

 

 
if($tableName == 'product_categories'){
      //echo    $tableName;
      if(!@$GLOBALS['dymm_new_prod']){
 
        $old =  $product_table_Parent->getOldOrdering($data['virtuemart_product_id']);
      }
 
          $product_table_Parent->bindChecknStore($data);
 
          if(!@$GLOBALS['dymm_new_prod']){
        $product_table_Parent->setOldOrdering($old);
      }else{
                $product_table_Parent->setNewOrdering($data['virtuemart_product_id']);
      }
 
    }else
 

 

2) Открываем файл /administrator/components/com_virtuemart/tables/product_categories.php

 

находим последнюю закрывающую }, и ПЕРЕД ней вставляем:

 

 
  function getOldOrdering($product_id){
    $query = 'SELECT `'.$this->_pkey.'`,`'.$this->_skey.'`,`'.$this->_orderingKey.'` FROM `'.$this->_tbl.'`
      WHERE `'.$this->_pkey.'` = '.(int)$product_id;
    $this->_db->setQuery( $query );
    $res = $this->_db->loadAssocList();
      return $res;
 
  }
 
  function setOldOrdering($old){
 
    if(count($old)){
      foreach($old as $o){
 
        $query = 'UPDATE `'.$this->_tbl.'` '
          . ' SET `'.$this->_orderingKey.'` = '.$o[$this->_orderingKey]
          . ' WHERE `'.$this->_pkey.'` = ' . (int)$o[$this->_pkey].
          ' AND `'.$this->_skey.'`  = ' . (int)$o[$this->_skey]
          ;
          $this->_db->setQuery( $query );
 
 
            if (!$this->_db->query())
          {
            $err = $this->_db->getErrorMsg();
            JError::raiseError( 500, get_class( $this ).':: move '. $err );
          }
      }
    }
  }
 
  function setNewOrdering($product_id){
 
    $old = $this->getOldOrdering($product_id);
 
    if(count($old)){
      foreach($old as $o){
 
 
        $query = 'SELECT MAX('.$this->_orderingKey.') FROM `'.$this->_tbl.'`
          WHERE `'.$this->_skey.'`  = ' . (int)$o[$this->_skey];
        $this->_db->setQuery( $query );
        $max = $this->_db->loadResult();
 
        if(!$max)
          $max = 0;
        $max++;
 
        $query = 'UPDATE `'.$this->_tbl.'` '
          . ' SET `'.$this->_orderingKey.'` = '.$max
          . ' WHERE `'.$this->_pkey.'` = ' . (int)$o[$this->_pkey].
          ' AND `'.$this->_skey.'`  = ' . (int)$o[$this->_skey]
          ;
                $this->_db->setQuery( $query );
          if (!$this->_db->query())
        {
          $err = $this->_db->getErrorMsg();
          JError::raiseError( 500, get_class( $this ).':: move '. $err );
        }
      }
    }
  }
 
 
  function move($direction, $where='', $orderingkey=0) {
 
      if(empty($this->_skey) ) {
        vmError( 'No secondary keys defined in VmTableXarray '.$this->_tbl );
        return false;
      }
    $skeyId = JRequest::getInt($this->_skey, 0);
    // Initialize variables
    $db    = JFactory::getDBO();
    $cid  = JRequest::getVar( $this->_pkey , array(), 'post', 'array' );
    $order  = JRequest::getVar( 'order', array(), 'post', 'array' );
 
    $query = 'SELECT `id`,`'.$this->_pkey.'`,'.$this->_orderingKey.' FROM `'.$this->_tbl.'`
      WHERE `'.$this->_pkey.'` = '.(int)$cid[0].' AND `'.$this->_skey.'` = '.(int)$skeyId ;
    $this->_db->setQuery( $query );
    $res = $this->_db->loadAssocList();
 
    $res = $res[0];
    $id = $res['id'];
    $keys = array_keys($order);
    // TODO next 2 lines not used ????
    if ($direction >0)
      $idToSwap = $keys[array_search($id, $keys)+1];
    else
      $idToSwap = $keys[array_search($id, $keys)-1];
 
    $my_order = $res[$this->_orderingKey];
 
 
    if (isset( $cid[0] )) {
 
      $query = 'UPDATE `'.$this->_tbl.'` '
      . ' SET `'.$this->_orderingKey.'` = `'.$this->_orderingKey.'` + '. $direction
      . ' WHERE `'.$this->_pkey.'` = ' . (int)$cid[0].
      ' AND `'.$this->_skey.'`  = ' . (int)$skeyId
      ;
      $this->_db->setQuery( $query );
 
      if (!$this->_db->query())
      {
        $err = $this->_db->getErrorMsg();
        JError::raiseError( 500, get_class( $this ).':: move '. $err );
      }else{
        if($idToSwap){
                  $query = 'UPDATE `'.$this->_tbl.'` '
          . ' SET `'.$this->_orderingKey.'` = '. $my_order
          . ' WHERE `id` = ' . (int)$idToSwap.
          ' AND `'.$this->_skey.'`  = ' . (int)$skeyId
          ;
          $this->_db->setQuery( $query );
 
          if (!$this->_db->query())
          {
            $err = $this->_db->getErrorMsg();
            JError::raiseError( 500, get_class( $this ).':: move '. $err );
          }
        }
      }
    }
  }
 

 

3) В настройках виртумарта, Настройки заказа "Порядок сортировки по умолчанию" устанавливаем "Заказ"

 

4) Идем в админку Virtuemart=>Товары=>Выбираем нужную категорию (товарам которой нужно задать порядок), и как показано на скриншоте ниже: Настройка порядка отображения товаров в VirtueMart 2.0.2

После этого товары в магазине Virtuemart, будут расположены в категории в нужном порядке.

 

Вы также можете просто скачать файлы которые следует заменить, скачиваете архив, извлекаете и копируете с заменой папку "administrator" в корень вашего сайта с установленным Virtuemart 2.0.2 Обратите внимание что данный хак для порядка отображения товаров в категории Virtuemart, сделан под версию Virtuemart 2.0.2, под другие версии работа хака не гарантирована!

 

PS. Читайте последние записи RSS Подписка на RSS

Метки:

Комментарии 

 
anonim Вторник, 09 Октябрь 2012

Не получается на 2.0.10 что такое "Порядок сортировки по умолчанию" устанавливаем "Заказ" , прошу прощения получилось, спасибо огромное -только "Порядок сортировки по умолчанию" устанавливаем "Порядок"

 

 
 
anonim Понедельник, 12 Ноябрь 2012

Автор, а ты случайно не знаешь как сделать двойную сортировку - по цене и наличию к примеру.

 

 
 
anonim Понедельник, 19 Ноябрь 2012

Не получилось , дошла до пункта 3 , в настройках виртумарта, Настройки заказа "Порядок сортировки по умолчанию" устанавливаем "Заказ" - у меня нет такого. Версия VM 2.0.2

 

 
 
anonim Среда, 09 Январь 2013

На VM 2.0.6 работает! Спасибо большое!

 

 
 
anonim Воскресенье, 17 Март 2013

В пункте
2) Открываем файл /administrator/components/com_virtuemart/tables/product_categor ies.php
точно файл product_categor ies.php или может products.php ?

 

 
 
anonim Четверг, 23 Май 2013

Автор подскажите плиз
vm 2.0.2
"Порядок сортировки по умолчанию" устанавливаем "Заказ"
-- нет такого, и в комментах написано "Порядок" тоже нету

подскажите как быть?

 

 
 
anonim Четверг, 23 Май 2013

Автор подскажите откуда взять "Заказ"

выложил скриншот какие есть сортировки
все перепробывал ничего не работает
http://i48.fastpic.ru/big/2013/0523/3a/fb1ca0d44ad84656739fbc60ad02033a.png

только теперь правильно в админке сохраняются цифры последовательно сти, раньше не сохранялись

 

 
 
anonim Четверг, 05 Сентябрь 2013

Спасибо, все работает - очень полезный материал!

 

 
 
anonim Понедельник, 30 Сентябрь 2013

Господа, кто уже разобрался с 3-им пунктом? Где значение "Заказ" в поле "Порядок сортировки по умолчанию"?

 

 
 
anonim Четверг, 17 Октябрь 2013

Спасибо огромное, все получилось!!!!! !! По умолчанию задать поле сортировки "порядок" и все прекрасно работает

 

 
 
anonim Среда, 08 Январь 2014

Ни как не могу добиться поля "порядок" или "заказ" версия 2.0.2

 

 
 
anonim Вторник, 11 Ноябрь 2014

Тоже самое. Нет ни "заказа", ни "порядка" в опциях сортировки по умолчанию. Я расстроен шо писец ((

 

 
 
anonim Понедельник, 27 Апрель 2015

Порядок вывода товаров меняется в админке. Вот так:
http://www.webholism.com/blog/sara/virtuemart-2-how-to-display-your-products-in-the-order-you-want/

 

 
 
Den Воскресенье, 17 Январь 2016

По умолчанию задать поле сортировки "порядок" а в разделе товары выбрать в фильтре(сортиро вка) нужную категорию товаров. Тогда появятся галочки для задания порядка отображения.

 

 
 
Оксана Пятница, 30 Сентябрь 2016

Реально все работает! Спасибо! Только я не "Заказ" установила а "Порядок" .

 

 
 
cleverscript Воскресенье, 16 Октябрь 2016

Оксана, конечно будет работать, я на этом собаку съел))) Всегда пожалуйста, подписывайтесь на Rss !!!

 

 

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