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


Все мы, читатели и писатели джумлафорума, прекрасно знаем как делается вывод ярлычков "Новинка", "Хит", "Акция" и им  подобных на товаре. Обычно в таблице 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 без ВОМ так как мы использовали кирилицу.

ПОЛЕЗНО  Joomla режет код яндекс.метрики

Дальше добавляем сохраненеие нашей новой опции конфигурации в файле \administrator\components\com_virtuemart\classes\ps_config.php находим

$my_config_array = array(

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

"VM_NEW" => "conf_VM_NEW",

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

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

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

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

Открываем \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. Дальше, надеюсь, все понятно.

ПОЛЕЗНО  Virtuemart: Вывод значения кастомного поля

Теперь переходим к карточке товара. Открываем \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 ;

источник