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