ホームページに表示される専用モジュール(opencart 1.5.3.1)にカウントダウンタイマーを追加したいです。このように見えます http://opencart-themes.com/index.php?route=product/product&product_id=109
誰か私を助けてくれませんか?あなたのコードに基づいて数回試しました。これで私を助けてくれることに本当に感謝しています。
ホームページに表示される専用モジュール(opencart 1.5.3.1)にカウントダウンタイマーを追加したいです。このように見えます http://opencart-themes.com/index.php?route=product/product&product_id=109
誰か私を助けてくれませんか?あなたのコードに基づいて数回試しました。これで私を助けてくれることに本当に感謝しています。
ありがとう、ここにコードがあります:
public function updateViewed($product_id) {
$this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = (viewed + 1) WHERE product_id = '" . (int)$product_id . "'");
}
public function getProduct($product_id) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, 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 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, p.sort_order 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') . "'");
if ($query->num_rows) {
$query->row['price'] = ($query->row['discount'] ? $query->row['discount'] : $query->row['price']);
$query->row['rating'] = (int)$query->row['rating'];
return $query->row;
} else {
return false;
}
}
まず、データベースから date_start と date_end を取得する必要があります。catalog/model/catalog/product.php を編集します。
変化する
public function getProduct($product_id) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, 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 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, p.sort_order 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') . "' ORDER BY p.sort_order, p.date_expires >= NOW(), p.date_expires <= NOW() DESC");
に
public function getProduct($product_id) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
$query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, 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 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 date_start 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 date_start, (SELECT date_end 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 date_ends, (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, p.sort_order 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') . "' ORDER BY p.sort_order, p.date_expires >= NOW(), p.date_expires <= NOW() DESC");
注:これに編集があり、それらを保持したい場合は、これら 2 つの値の部分のみを追加しました。
次に、値をビュー ファイルに送信する必要があります。これは、catalog/controller/module/special.php で行うことができます。
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'price' => $price,
'special' => $special,
'rating' => $rating,
'reviews' => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']),
);
への変更:
$this->data['products'][] = array(
'product_id' => $result['product_id'],
'thumb' => $image,
'name' => $result['name'],
'price' => $price,
'special' => $special,
'rating' => $rating,
'reviews' => sprintf($this->language->get('text_reviews'), (int)$result['reviews']),
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']),
'date_start' => $result['date_start'],
'date_end' => $result['date_end'],
);
catalog/view/theme/*your_theme*/template/module/special.tpl で、いくつかのことを行う必要があります。カウントダウン スクリプトを追加し、カウントダウン タイマーを追加して、値を取得する必要があります。
1) スクリプトを追加する- 少なくとも 1 つの特別なスクリプトがある場合にのみスクリプトを配置する if ステートメントもあります。これをあなたのtplの一番上に置きます
<?php if ($products) { ?>
<script type="text/javascript">
jQuery.fn.countdown = function (date, options, dateparse) {
options = jQuery.extend({
lang:{
years: [' year, ', ' years, '],
months: [' month, ', ' months, '],
days: [' day, ', ' days, '],
hours: [':', ':'],
minutes: [':', ':'],
seconds: ['', ''],
plurar: function(n) {
return (n == 1 ? 0 : 1);
}
},
prefix: "end: ",
finish: "End!",
redirect: '',
dateparse: "2050-01-01 00:00:00"
}, options);
var timestamp = Date.parse(options.dateparse);
var timeDifference = function(begin, end) {
if(end < begin){
return false;
}
var diff = {
seconds: [end.getSeconds() - begin.getSeconds(), 60],
minutes: [end.getMinutes() - begin.getMinutes(), 60],
hours: [end.getHours() - begin.getHours(), 24],
days: [end.getDate() - begin.getDate(), new Date(begin.getYear(), begin.getMonth(), 0).getDate()],
months: [end.getMonth() - begin.getMonth()-1, 12],
years: [end.getYear() - begin.getYear(), 0]
};
var result = new Array();
var flag = false;
for(i in diff){
if((i=='seconds' || i=='minutes') && diff[i][0]==0){
result.push('00' + options.lang[i][options.lang.plurar(diff[i][0])]);
}else{
if(flag){
diff[i][0]--;
flag = false;
}
if(diff[i][0] < 0){
flag = true;
diff[i][0] += diff[i][1];
}
if(!diff[i][0]) continue;
if(i=='days' && diff[i][0]<0){
diff['days'][0]=Math.abs(1+diff['days'][0]);
diff['months'][0]++;
}
if(i=='years' && diff[i][0]<0)
return '';
if((i=='seconds' || i=='minutes') && diff[i][0]<10)
diff[i][0] = '0' + diff[i][0];
if(diff[i][0]!=0)
result.push(diff[i][0] + '' + options.lang[i][options.lang.plurar(diff[i][0])]);
}
}
return result.reverse().join('');
};
var timeCurrent = function(date){
var hou = date.getHours().toString();
var min = date.getMinutes().toString();
var sec = date.getSeconds().toString();
hou = (hou<10)?0+hou:hou;
min = (min<10)?0+min:min;
sec = (sec<10)?0+sec:sec;
return hou+':'+min+':'+sec;
};
var elem = $(this);
var timeUpdate = function(){
dateJS = new Date();
timestamp = parseInt(timestamp) + 1000;
dateJS.setTime(timestamp);
/*if(elem.parents('.timedependent-form-content').find('#currentTime').length)
elem.parents('.timedependent-form-content').find('#currentTime').html(timeCurrent(dateJS));*/
var s = timeDifference(dateJS, date);
if(s.length){
elem.html(options.prefix + s);
}else{
clearInterval(timer);
elem.html(options.finish);
if(options.redirect != '')
window.location.href = options.redirect;
}
};
timeUpdate();
var timer = setInterval(timeUpdate, 1000);
};
</script>
<?php } ?>
変化する
<?php foreach ($products as $product) { ?>
に:
<?php $now = time();
$count = 0;
foreach ($products as $product) {
$count++; ?>
これを好きな場所に追加してください:
<?php $time_remaining = $result['date_end'];
$countdown = strtotime("$time_remaining"); ?>
<div class="timerbar">
<h2 id="product<?php echo $count; ?>"></h2>
</div><br/>
<script>
jQuery("#product<?php echo $count; ?>").countdown(new Date(<?php echo date('Y, m, d, H, i, s',$countdown); ?>), {
prefix:"",
finish:"Expired",
redirect:"",
dateparse:"<?php echo date('d F Y H:i:s',$now); ?>",
lang:{
years: [' year, ', ' years, '],
months: [' month, ', ' months, '],
days: [' day, ', ' days, '],
hours: [':', ':'],
minutes: [':', ':'],
seconds: ['', ''],
plurar: function(n) {
return (n == 1 ? 0 : 1);
}
}});
</script>
出力をカスタマイズするには:
finish
= 期限切れのテキストredirect
=有効期限が切れたときにリダイレクトする場合は、URLを入力しますlang
= カウントダウン出力の変更