Подсмотрел на каких то магазинах таймер, который считает в обратном направлении до окончания акции или специальной цены. Порылся в дополнениях на оф.сайте, там такая приблуда 12$ стоит, вообщем грабеж. В пхп и ява - чайник со свистком, нагуглил простенький скриптик на яве, пару функций из учебника, убил вечер но прикрутил.
открываем: /catalog/model/catalog/product.php
строка ~ 27: вставляем в этот запрос выделенную конструкцию.
$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, p.weight AS weight, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount,
(SELECT date_end FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.date_end ASC LIMIT 1) AS date_end,
(SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
дальше ниже в строке примерно 36-40, в эту конструкцию:
if ($query->num_rows) {
return array(
'product_id' => $query->row['product_id'],
'name' => $query->row['name'],
'weight' => $query->row['weight'],
.... ......
вставляем:
'date_end' => $query->row['date_end'], //день окончания скидки
открываем: /catalog/controller/product/product.php
добавляем после, или где-нибудь рядышком:
$this->data['manufacturer'] = $product_info['manufacturer'];
код:
$this->data['date_end'] = $product_info['date_end']; //день окончания скидки.
(офтоп:) так же по аналогии я вывел себе вес на страницу товара, выделено серым.
открываем: /catalog/view/theme/ВАША_ТЕМА/template/product/product.tpl
в конец файла вставляем скрипт:
<script type="text/javascript">
<!--
newYearIn();
function newYearIn()
{
var now = new Date();
var newYear = new Date("<?php echo $date_elements[0]; ?>,<?php echo $date_elements[1]; ?>,<?php echo $date_elements[2]; ?>,00:00:00");
var totalRemains = (newYear.getTime()-now.getTime());
if (totalRemains>1)
{
var RemainsSec=(parseInt(totalRemains/1000));
var RemainsFullDays=(parseInt(RemainsSec/(24*60*60)));
if (RemainsFullDays==2 || RemainsFullDays==3 || RemainsFullDays==4 || RemainsFullDays==22 ||
RemainsFullDays==23 || RemainsFullDays==24 || RemainsFullDays==32 || RemainsFullDays==33 ||
RemainsFullDays==34) {
days=" дня "
} else if (
RemainsFullDays==1 ||
RemainsFullDays==21 ||
RemainsFullDays==31
) {
days=" день "
} else { days =" дней " }
var secInLastDay=RemainsSec-RemainsFullDays*24*3600;
var RemainsFullHours=(parseInt(secInLastDay/3600));
if (RemainsFullHours<10){RemainsFullHours="0"+RemainsFullHours};
var secInLastHour=secInLastDay-RemainsFullHours*3600;
var RemainsMinutes=(parseInt(secInLastHour/60));
if (RemainsMinutes<10){RemainsMinutes="0"+RemainsMinutes};
var lastSec=secInLastHour-RemainsMinutes*60;
if (lastSec<10){lastSec="0"+lastSec};
document.getElementById('newyear').innerHTML = "осталось: "+RemainsFullDays+days+RemainsFullHours+" ч "+RemainsMinutes+" м "+lastSec+" сек";
setTimeout("newYearIn()",10);
}
else {document.getElementById("newyear").innerHTML = "скидка окончена";}
}
//-->
</script>
скрипт можно поправить как угодно что бы по завершению нечего не происходило, в этом варианте будет писать "скидка окончена". Были ещё и миллисекунды, но мне показались излишне фанатичным.Можно спрятать наш таймер по завершению:меняем:
else {document.getElementById("newyear").innerHTML = "скидка окончена";}на: else {document.getElementById("newyear").style.display = "none";}
в в том же файле в начало куда нибудь:
<?php $date_elements = explode("-",$date_end); ?> - конечно, это можно засунуть и в /catalog/controller/product/product.php, но как то лень было..ну и сам вывод таймера в любое место по вкусу и оформляем как хотим:
<div id="newyear"></div>
Таймер отсчитывает время до окончании "скидки", можно по аналогии сделать и "акции" или "специального предл.".