0

ホームページに表示される専用モジュール(opencart 1.5.3.1)にカウントダウンタイマーを追加したいです。このように見えます http://opencart-themes.com/index.php?route=product/product&product_id=109

誰か私を助けてくれませんか?あなたのコードに基づいて数回試しました。これで私を助けてくれることに本当に感謝しています。

4

3 に答える 3

0

ありがとう、ここにコードがあります:

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;
    }
}
于 2012-08-01T12:40:19.243 に答える
0

まず、データベースから 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= カウントダウン出力の変更
于 2012-07-27T16:05:38.593 に答える