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

Альтернативный метод отображения ярлычков "Новинка" на товаре

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

дата новинка

 Все мы, читатели и писатели джумлафорума, прекрасно знаем как делается вывод ярлычков "Новинка", "Хит", "Акция" и им  подобных на товаре. Обычно в таблице jos_vm_product делается дополнительное поле - например product_new. Далее, мы выводим его в админку в свойства товара. При заполнении товара оператор либо ставит, либо не ставит эту галочку и на основании этой информации - мы либо выводим, либо не выводим ярлычок. Это очень хорошо работает, когда владелец интернет магазина хочет показать как новику конкретный товар. Но вот заказчик попоросил меня сделать более красивое решение и показывать действительно новинки. Техническое задание было следующим:

В админке virtuemart в настройке задаем количество дней для товара который будет новинкой. Например, если мы задали 10 дней, то весь товар, созданный за 10 дней, должен вывестись с ярлычком "Новика".

Реализуем.

Сначала добавим новую опцию конфигурации в \administrator\components\com_virtuemart\virtuemart.cfg.php

Например, находим 






	define('VM_TABLEPREFIX', 'vm');

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






	define('VM_NEW', '');

Закрываем, сохраняем. Идем в \administrator\components\com_virtuemart\html\admin.show_cfg.php

и после






	<tr>

	<td class="labelcell">

	<label for="conf_USE_AS_CATALOGUE"><?php echo $VM_LANG->_('PHPSHOP_ADMIN_CFG_USE_ONLY_AS_CATALOGUE') ?></label>

	

	</td>

	<td>

	<input type="checkbox" id="conf_USE_AS_CATALOGUE" name="conf_USE_AS_CATALOGUE" class="inputbox" <?php if (USE_AS_CATALOGUE == 1) echo "checked=\"checked\""; ?> value="1" />

	</td>

	<td><?php echo $VM_LANG->_('PHPSHOP_ADMIN_CFG_USE_ONLY_AS_CATALOGUE_EXPLAIN') ?>

	</td>

	</tr>

добавляем






	<tr>

	<td class="labelcell"><label for="conf_VM_NEW">Сколько дней товар считается новым</label></td>

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

	<td></td>

	</tr>

Не забываем сохранить файл в кодировке UTF-8 без ВОМ так как мы использовали кирилицу.

Дальше добавляем сохраненеие нашей новой опции конфигурации в файле

\administrator\components\com_virtuemart\classes\ps_config.php

находим 






	$my_config_array = array(

в районе 71 строки и после него добавляем






	"VM_NEW" => "conf_VM_NEW",

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

Все, в админку мы опцию вывели. Можем проверить как она работает - сохраняет введенные значения. Поставим, например, 30 дней.

Далее займемся выводом на фронтенд. Сначала выведем в список товара.

Открываем \administrator\components\com_virtuemart\html\shop.browse.php и создаем новую заглушку $product_new

Если дата создания товара попадает в последние тридцать дней - $product_new равна 1, если нет - 0. и дальше уже в Вашем browse*.php выводим какой угодно ярлык.

Находим 






	$products[$i]['mdate'] = $VM_LANG->convert( vmFormatDate($db_browse->f("mdate"), $VM_LANG->_('DATE_FORMAT_LC') ));

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






 
	if ($db_browse->f("cdate")>=(time()-(VM_NEW*86400))) $products[$i]['product_new'] = 1; else $products[$i]['product_new']=0;

Любая дата в базе хранится ввиде timestamp (это так называемое POSIX-время - количество секунд прошедшее с 00:00:00 UTC 1 января, 1970 года.). Поэтому мы переводим наши 10 дней в секунды - умножаем на 86400 (количество секунд в дне). Функция time() возвращает текущее время в формате timestamp. Дальше, надеюсь, все понятно.

Теперь переходим к карточке товара. Открываем \administrator\components\com_virtuemart\html\shop.product_details.php и находим 






	$tpl->set( "recent_products", $recent_products); 

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






 
	if ($db_product->f("cdate")>=(time()-(VM_NEW*86400))) $tpl->set( "product_new", 1 ); else $tpl->set( "product_new", 0);

Все, заглушка готова. Оформляем верстку по своему вкусу в flypage.tpl.php.

 

Например






<?php 
	if ($product_new ==1) { ?>
	<span class="action"></span>
	<?php } ?>

а в css пишем






.action {

    background: url("../images/grad-top.png");

    display: block;

    height: 37px;

    left: 5px;

    position: absolute;

    top: 9px;

    width: 49px;

}

Наслаждаемся результатом... 

 

P.S. У многих читателей вызвал затруднение вывод заглушки на страницу категории. Она просто немного по другому формируется. Находим, например,  $products[$i]['product_details'] = $product_details;  и после добавляем 


	if ($db_product->f("cdate")>=(time()-(VM_NEW*86400)))

	$products[$i]['product_new']= 1;

	else

	$products[$i]['product_new']= 0 ;
Back to top