• 04-09-2015, 09:00:29
    #1
    Merhaba, opencart altyapısı ile kullandığım bir modülde şöyle bir problemim var. Checkbox ile işaretli parçaların fiyatlarını toplayıp fiyata yazıyor ancak sıkıntı fiyatı sayfa açıldığında yazmıyor ve 0 gösteriyor. Parçalardan her hangi birine tıklanıp chek-uncheck yapılınca çalışıyor.

    Ürünün fiyatını 0 olarak giriyorum. Parçalara fiyat ekleyip tüm parçaların fiyatlarını toplamasını istiyorum.

    Yani bu durumda olması gereken: eklenen parça fiyatlarını toplayıp fiyat olarak göstermek ama parça fiyatı yoksa fiyata yazılanı göstermek.

    Olması gereken ürün sayfası açılınca işaretli parçaların toplamını fiyata yazması.
    Şuradan bakabilirsiniz: ÜRÜNE GİT

    Modülün kaynak kodları (free modüldür)
    Alıntı
    <modification>
    <id>product - options live update</id>
    <version>1.0</version>
    <vqmver>2.3.0</vqmver>
    <author>vlcekmi3</author>
    <!-- CONTROLLER -->
    <file name="catalog/controller/product/product.php">
    <operation>
    <search position="before"><![CDATA[public function index() {]]></search>
    <add><![CDATA[
    private function getOptionPrice($product_id = 0, $options = array()) {
    $option_price = 0;

    $product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");

    if ($product_query->num_rows) {
    foreach ($options as $product_option_id => $option_value) {
    $option_query = $this->db->query("SELECT po.product_option_id, po.option_id, od.name, o.type FROM " . DB_PREFIX . "product_option po LEFT JOIN `" . DB_PREFIX . "option` o ON (po.option_id = o.option_id) LEFT JOIN " . DB_PREFIX . "option_description od ON (o.option_id = od.option_id) WHERE po.product_option_id = '" . (int)$product_option_id . "' AND po.product_id = '" . (int)$product_id . "' AND od.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    if ($option_query->num_rows) {
    if ($option_query->row['type'] == 'select' || $option_query->row['type'] == 'radio' || $option_query->row['type'] == 'image') {
    $option_value_query = $this->db->query("SELECT pov.option_value_id, ovd.name, pov.quantity, pov.subtract, pov.price, pov.price_prefix, pov.points, pov.points_prefix, pov.weight, pov.weight_prefix FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_option_value_id = '" . (int)$option_value . "' AND pov.product_option_id = '" . (int)$product_option_id . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    if ($option_value_query->num_rows) {
    if ($option_value_query->row['price_prefix'] == '+') {
    $option_price += $option_value_query->row['price'];
    } elseif ($option_value_query->row['price_prefix'] == '-') {
    $option_price -= $option_value_query->row['price'];
    }
    }
    } elseif ($option_query->row['type'] == 'checkbox' && is_array($option_value)) {
    foreach ($option_value as $product_option_value_id) {
    $option_value_query = $this->db->query("SELECT pov.option_value_id, ovd.name, pov.quantity, pov.subtract, pov.price, pov.price_prefix, pov.points, pov.points_prefix, pov.weight, pov.weight_prefix FROM " . DB_PREFIX . "product_option_value pov LEFT JOIN " . DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN " . DB_PREFIX . "option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_option_value_id = '" . (int)$product_option_value_id . "' AND pov.product_option_id = '" . (int)$product_option_id . "' AND ovd.language_id = '" . (int)$this->config->get('config_language_id') . "'");

    if ($option_value_query->num_rows) {
    if ($option_value_query->row['price_prefix'] == '+') {
    $option_price += $option_value_query->row['price'];
    } elseif ($option_value_query->row['price_prefix'] == '-') {
    $option_price -= $option_value_query->row['price'];
    }
    }
    }
    }
    }
    }
    }
    return $option_price;
    }

    public function updatePrice() {
    $json = array();

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

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

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

    if ($product_info) {
    if (isset($this->request->post['option'])) {
    $option = array_filter($this->request->post['option']);
    } else {
    $option = array();
    }

    $option_price = $this->getOptionPrice($product_id, $option);

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

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

    if ($this->config->get('config_tax')) {
    $json['tax'] = $this->language->get('text_tax').' '.$this->currency->format((float)$product_info['special'] ? $product_info['special'] + $option_price : $product_info['price'] + $option_price);
    } else {
    $json['tax'] = false;
    }

    $this->response->setOutput(json_encode($json));
    } else {
    return FALSE;
    }
    }
    ]]></add>
    </operation>
    </file>
    <!-- VIEW -->
    <file name="catalog/view/theme/*/template/product/product.tpl">
    <operation>
    <search position="replace"><![CDATA[<?php echo $price; ?>]]></search>
    <add><![CDATA[<span class="updated-price"><?php echo $price; ?></span>]]></add>
    </operation>
    <operation>
    <search position="before"><![CDATA[<?php echo $footer; ?>]]></search>
    <add><![CDATA[<script type="text/javascript"><!--
    $('.option').change(function() {
    $.ajax({
    url: 'index.php?route=product/product/updatePrice',
    type: 'post',
    data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'),
    dataType: 'json',
    success: function(json) {
    //$('.success, .warning, .attention, information, .error').remove();
    if (json['price']) {
    $('.product-info .updated-price').text(json['price']);
    }

    if (json['special']) {
    $('.product-info .price-new').text(json['special']);
    $('.product-info .price-old').text(json['price']);
    }

    if (json['tax']) {
    $('.price-tax').text(json['tax']);
    }
    }
    });
    });
    //--></script>
    ]]></add>
    </operation>
    </file>
    </modification>
  • 04-09-2015, 12:57:11
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    $('.option').change(function() {} bu fonksiyonda işlemi sayfa onload olduğunda da yaparsan sorununun çözülmüş olması gerekir. sadece change'de yaptığında sadece birdeğişiklik yaptığında update ediyor.