Опять возвращаемся к этому вопросу - слишком много минусов было у предыдущего решения. Появились новые мысли.
В тот раз мы просто по нажатию на пункт меню выводили весь товар, отсортировав по полю 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) ? '' : '&keyword='.urlencode( $keyword );
после добавпяем
if (vmGet($_REQUEST, 'orderby', null )=='new' ) $search_string.="&orderby=".'new' ;
Все. Закрываем, сохраняем, проверяем.