БЛОГОДЖУМЛА - БЛОГ О ДЖУМЛА

Правильный вывод новых поступлений пунктом меню.

  • Категория: Virtuemart 1
  • Автор:
  • Просмотров: 7119
 

Опять возвращаемся к этому вопросу - слишком много минусов было у предыдущего решения. Появились новые мысли.

В тот раз мы просто по нажатию на пункт меню выводили весь товар, отсортировав по полю mdate (время изменения товара). А если товаров у нас 5 тысяч? Нехорошо как-то. 

Сейчас мы усложним механизм вывода - поставим ограничитель.

В админке в настройках добавим параметр "Новые поступления" в котором будем указывать количество дней. А дальше в shop_browse_queries.php будем ставить условие - mdate>Новые_поступления. Таким образом, к нам в выдачу попадут только новые (обновленные) товары за последние n дней. И сортировку покупатель сможет поставить какую хочет, и пагинация будет.

Приступим. Добавим в админку новый параметр. Открываем /administrator/components/com_virtuemart/virtuemart.cfg.php и, например, после




	define('PSHOP_IS_OFFLINE', '');

добавляем новый параметр




	define('SHOW_NEW', ''); 

Закрываем, сохраняем. Теперь сделаем обработку нового параметра. Разместим наш параметр в настройке на закладке "Сайт", например, после полей сортировки. Открываем /administrator/components/com_virtuemart/html/admin.show_cfg.php и находим




	<td><?php echo vmToolTip( $VM_LANG->_('VM_BROWSE_ORDERBY_FIELDS_LBL_TIP') ) ?></td>

	</tr>

и после добавляем




	<tr>

	 <td class="labelcell">Период новых поступлений (в днях)</td>

	<td>

	<input type="text" name="conf_SHOW_NEW" class="inputbox" value="<?php echo SHOW_NEW ?>"/></td>

	 <td></td>

	</tr>

Не забываем конвертировать в UTF-8 без ВОМ и сохраняем. Теперь пропишем сохранение параметра. Открываем /administrator/components/com_virtuemart/classes/ps_config.php и находим




	"PSHOP_IS_OFFLINE" => "conf_PSHOP_IS_OFFLINE",

после него добавляем




	"SHOW_NEW" => "conf_SHOW_NEW", 

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

Открываем наш /administrator/components/com_virtuemart/html/shop_browse_queries.php и перед




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

добавляем 




	if(vmGet($_REQUEST, 'orderby', null )=='new') $new=true;

	else $new=false; 

 

Теперь находим 




	$keywordArr = vmGetCleanArrayFromKeyword( $keyword );

и перед ним добавляем наше условие



 	if($new && SHOW_NEW>0) $where_clause[] = '`#__{vm}_product`.`mdate` > '.trim(time()-(SHOW_NEW*86400));

закрываем, сохраняем. 

Открываем /administrator/components/com_virtuemart/html/shop.browse.php и находим



	else {

	$mainframe->setPageTitle( $VM_LANG->_('PHPSHOP_BROWSE_LBL',false) );#

	$browsepage_lbl = $VM_LANG->_('PHPSHOP_BROWSE_LBL');

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

перед ним добавляем


 	elseif(vmGet($_REQUEST, 'orderby', null )=='new') {  $mainframe->setPageTitle( 'Новые поступления' );

	$browsepage_lbl = 'Новые поступления';

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

	

	$browsepage_header = $tpl->fetch( 'browse/includes/browse_header_all.tpl.php' );

	}

Не забываем конвертировать в UTF-8 без ВОМ и сохраняем.

Теперь добавляем пункт меню со ссылкой "/index.php?option=com_virtuemart&page=shop.browse&orderby=new". Ссылку мы сделали немного другую, чем в первой статье. Все.

 

P.S. И все-таки недостаток у этого способа тоже есть. Если Вы обновляете остатки и цены не руками, а с помощью какой-либо заливки - у Вас опять будет вываливать весь товар, так cdata у всех товаров одинакова и равна дате последней заливки. Но это скорее не недостаток метода, а не полноценная работа Вашей обновлялки. Так что прежде чем использовать этот метод советую посмотреть что у Вас творится в cdate и mdate.

P.P.S Если у Вас новинок боьше чем на одну страницу - возникает пробема с переходом по страницам. Решаем её.

Открываем /administrator/components/com_virtuemart/html/shop.browse.php и находим


	$search_string .= empty($keyword) ? '' : '&amp;keyword='.urlencode( $keyword );

после добавпяем

 	if (vmGet($_REQUEST, 'orderby', null )=='new' )  $search_string.="&amp;orderby=".'new' ;

Все. Закрываем, сохраняем, проверяем.


Back to top