1

无法为默认主题的自定义主题添加此修改它的工作我尝试手动应用这些更改但没有运气任何人请帮助我


用于修改的 XML:实时价格更新 1.0 live_price_update OpenCart FACTORY http://www.ocfactory.net
]]> ]]>

          <operation>
            <search><![CDATA[<span style="text-decoration: line-through;"><?php echo $price; ?></span>]]></search>
            <add position="replace"><![CDATA[<span id="price_old" style="text-decoration: line-through;"><?php echo $price; ?></span>]]></add>
          </operation>

          <operation>
            <search><![CDATA[<?php echo $special; ?>]]></search>
            <add position="replace"><![CDATA[<span id="price_special"><?php echo $special; ?></span>]]></add>
          </operation>

          <operation>
            <search><![CDATA[<?php echo $tax; ?>]]></search>
            <add position="replace"><![CDATA[<span id="price_tax"><?php echo $tax; ?></span>]]></add>
          </operation>

          <operation>
            <search><![CDATA[<?php echo $footer; ?>]]></search>
            <add position="before"><![CDATA[<script type="text/javascript" src="index.php?route=product/livepriceupdate/js&product_id=<?php echo $product_id; ?>"></script>]]></add>
          </operation>
        </file>

目录/控制器/产品/livepriceupdate.php

<?php 

// Name:        Live Price Update with Options
// Version:     1.0
// Author:      OpenCart FACTORY
// Website:     www.ocfactory.net

class ControllerProductLivepriceupdate extends Controller {
    /* ====================================================================================

    SETTINGS

    Below you can find five variables that relate to DOM the structure of the template product/product.tpl. 
    The default values correspond to a default OpenCart theme. 
    If you use customized theme, these containers might have other class or id. In this case you need to clarify their value.

    ==================================================================================== */

    public $options_container           = '#product';           // in default them it is            ".product-info"
    public $old_price_container         = '#price_old';             // in default them it is            ".price-old"
    public $tax_price_container         = '#price_tax';             // in default them it is            ".price-tax'"
    public $special_price_container     = '#price_special';         // by default this module sets      "#price_container"
    public $use_cache                   = true;                     // set FALSE to disable caching (TRUE - enable)
    public $calculate_quantity          = true;                     // calculate price with quantity

    private $error = array();

    public function index() {

        $json = array();
        $update_cache = false;
        $options_makeup = 0;

        if (isset($this->request->post['product_id'])) {
            $product_id = (int)$this->request->post['product_id'];
        } else {
            $product_id = 0;
        }

        if ($this->calculate_quantity && isset($this->request->post['quantity'])) {
            $quantity = (int)$this->request->post['quantity'];
        } else {
            $quantity = 1;
        }

        $this->language->load('product/product');
        $this->load->model('catalog/product');

        // Cache name
        if (isset($this->request->post['option']) && is_array($this->request->post['option'])) {
            $options_hash = serialize($this->request->post['option']);
        } else {
            $options_hash = '';
        }

        $cache_key = 'live_price_update'. md5($product_id . $quantity. $options_hash . $this->currency->getCode() . $this->session->data['language']);

        if (!$this->use_cache || (!$json = $this->cache->get($cache_key))) {

            $product_info = $this->model_catalog_product->getProduct($product_id);

            // Prepare data
            if ($product_info) {

                $update_cache = true;

                if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
                    //$data['price'] = $this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax'));
                    $data['price'] = $product_info['price'];
                } else {
                    $data['price'] = false;
                }

                if ((float)$product_info['special']) {
                    //$data['special'] = $this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax'));
                    $data['special'] = $product_info['special'];
                } else {
                    $data['special'] = false;
                }

                // If some options are selected
                if (isset($this->request->post['option']) && $this->request->post['option']) {
                    foreach ($this->model_catalog_product->getProductOptions($product_id) as $option) {
                        foreach ($option['product_option_value'] as $option_value) {
                            //If options checkbox
                            if(isset($this->request->post['option'][$option['product_option_id']]) && is_array($this->request->post['option'][$option['product_option_id']])) {
                                array_filter($this->request->post['option'][$option['product_option_id']]);
                                foreach($this->request->post['option'][$option['product_option_id']] as $checked_option) {
                                    if ($checked_option == $option_value['product_option_value_id']) {
                                        if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
                                            if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
                                                //$price = $this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax'));
                                                $price = $option_value['price'];
                                            } else {
                                                $price = false;
                                            }
                                            if ($price) {
                                                if ($option_value['price_prefix'] === '+') {
                                                    $options_makeup = $options_makeup + (float)$price;
                                                } else {
                                                    $options_makeup = $options_makeup - (float)$price;
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            //If options not checkbox
                            if (isset($this->request->post['option'][$option['product_option_id']]) && $this->request->post['option'][$option['product_option_id']] == $option_value['product_option_value_id']) {
                                if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
                                    if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
                                        //$price = $this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax'));
                                        $price = $option_value['price'];
                                    } else {
                                        $price = false;
                                    }
                                    if ($price) {
                                        if ($option_value['price_prefix'] === '+') {
                                            $options_makeup = $options_makeup + (float)$price;
                                        } else {
                                            $options_makeup = $options_makeup - (float)$price;
                                        }
                                    }
                                }
                            }
                        }
                        unset($price);
                    }
                }

                if ($data['price']) {
                    $json['new_price']['price'] = $this->currency->format($this->tax->calculate(($data['price'] + $options_makeup), $product_info['tax_class_id'], $this->config->get('config_tax')) * $quantity);
                } else {
                    $json['new_price']['price'] = false;
                }

                if ($data['special']) {
                    $json['new_price']['special'] = $this->currency->format($this->tax->calculate(($data['special'] + $options_makeup), $product_info['tax_class_id'], $this->config->get('config_tax')) * $quantity);
                } else {
                    $json['new_price']['special'] = false;
                }

                if ($this->config->get('config_tax')) {
                    $json['new_price']['tax'] = $this->currency->format(((float)$product_info['special'] ? ($product_info['special'] + $options_makeup) : ($product_info['price'] + $options_makeup)) * $quantity );
                } else {
                    $json['new_price']['tax'] = false;
                }

                $json['success'] = true;

            } else {
                $json['success'] = false;
            }

        }

        if ($update_cache && $this->use_cache) {
            $this->cache->set($cache_key, $json);
        }

        echo json_encode($json);
        exit;
    }

    function js() {

        header('Content-Type: application/javascript');

        $js = <<<HTML

            var price_with_options_ajax_call = function() {
                $.ajax({
                    type: 'POST',
                    url: 'index.php?route=product/livepriceupdate/index',
                    data: $('{$this->options_container} input[type=\'text\'], {$this->options_container} input[type=\'hidden\'], {$this->   options_container} input[type=\'radio\']:checked, {$this->options_container} input[type=\'checkbox\']:checked, {$this->options_container} select, {$this->options_container} textarea'),
                    dataType: 'json',
                        beforeSend: function() {
                            // you can add smth useful here
                        },
                        complete: function() {
                            // you can add smth useful here
                        },
                        success: function(json) {
                        if (json.success) {
                            animation_on_change_price_with_options('{$this->special_price_container}', json.new_price.special);
                            animation_on_change_price_with_options('{$this->tax_price_container}', json.new_price.tax);
                            animation_on_change_price_with_options('{$this->old_price_container}', json.new_price.price);
                        }
                    },
                    error: function(error) {
                        //console.log(error);
                    }
                });
            }

            var animation_on_change_price_with_options = function(selector_class_or_id, new_html_content) {
                $(selector_class_or_id).fadeOut(150, function() {
                    $(this).html(new_html_content).fadeIn(50);
                });
            }

            if ( jQuery.isFunction(jQuery.fn.on) ) 
            {
                $('{$this->options_container} input[type=\'text\'], {$this->options_container} input[type=\'hidden\'], {$this->options_container} input[type=\'radio\'], {$this->options_container} input[type=\'checkbox\'], {$this->options_container} select, {$this->options_container} textarea, {$this->options_container} input[name=\'quantity\']').on('change', function() {
                    price_with_options_ajax_call();
                });
            } 
            else 
            {
                $('{$this->options_container} input[type=\'text\'], {$this->options_container} input[type=\'hidden\'], {$this->options_container} input[type=\'radio\'], {$this->options_container} input[type=\'checkbox\'], {$this->options_container} select, {$this->options_container} textarea, {$this->options_container} input[name=\'quantity\']').on('change', function() {
                    price_with_options_ajax_call();
                });
            }   

HTML;

        echo $js;
        exit;
    }
}
4

0 回答 0