Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

автоматическое обновление цены товара


system

Recommended Posts

Здравствуйте.

Есть модуль автообновление цены (autocalc_price_option_v2.0.18.xml). Как известно, он доплюсовывает сумму до основной. Возможно ли сделать так, чтобы он не допюсовывал, а полностью заменял основную цену?

Вот код модуля:

<?xml version="1.0" encoding="UTF-8"?>
<modification>
  <id>Обновление цены при выборе опций (без AJAX)</id>
  <version>2.0.18</version>
  <vqmver>2.2.1</vqmver>
  <author>mpn2005</author>
  
  <file name="catalog/view/theme/*/template/product/product.tpl">
    <operation error="skip">                           
      <search position="replace"><![CDATA[<span class="price-old"><?php echo $price; ?></span>]]></search>
      <add><![CDATA[<span id="formated_price" class="price-old" price="<?php echo $price_value; ?>"><?php echo $price; /**/ ?></span>]]></add>
    </operation>        
    <operation error="skip">                           
      <search position="replace"><![CDATA[<?php echo $special; ?>]]></search>
      <add><![CDATA[<span id="formated_special" price="<?php echo $special_value; ?>"><?php echo $special; /**/ ?></span>]]></add>
    </operation>        
    <operation>
      <search position="replace"><![CDATA[<?php echo $price; ?>]]></search>
      <add><![CDATA[<span id="formated_price" price="<?php echo $price_value; ?>"><?php echo $price; ?></span>]]></add>
    </operation>
    
    <!-- Вывод цены без налога -->
    <operation error="skip">      
      <search position="replace"><![CDATA[<?php echo $tax; ?>]]></search>
      <add><![CDATA[<span id="formated_tax" price="<?php echo $tax_value; ?>"><?php echo $tax; ?></span>]]></add>
    </operation>        
    
    <operation>
      <search position="replace"><![CDATA[value=<?php echo $option_value['product_option_value_id]; ?>"]]></search>
      <add><![CDATA[value=<?php echo $option_value['product_option_value_id]; ?>"  points="<?php echo (isset($option_value['points_value']) ? $option_value['points_value'] : 0); ?>" price_prefix="<?php echo $option_value['price_prefix']; ?>" price="<?php echo $option_value['price_value']; ?>"]]></add>
    </operation>
    <operation error="skip">
      <search position="before"><![CDATA[<?php foreach ($option['option_value'] as $option_value) { ?>]]></search>
      <add><![CDATA[<?php $opt_checked="checked"; ?>]]></add>
    </operation>
    <operation error="skip">
      <search position="replace"><![CDATA[<input type=radio]]></search>
      <add><![CDATA[<input type="radio" <?php echo (isset($opt_checked) ? $opt_checked : ''); $opt_checked=""; ?>]]></add>
    </operation>
    <operation>
      <search position="replace"><![CDATA[<option value=""><?php echo $text_select; ?></option>]]></search>
      <add><![CDATA[  ]]></add>
      <!-- <add><![CDATA[<option value=""  price_prefix="+" price="0.0"><?php echo $text_select; ?></option>]]></add> -->
    </operation>
    
    <!-- points -->
    <operation error="skip">
      <search position="replace"><![CDATA[<?php echo $points; ?>]]></search>
      <add><![CDATA[<span id="formated_points" points="<?php echo $points; /**/ ?>"><?php echo $points; /**/ ?></span>]]></add>
    </operation>
    
    <!-- 2012-12-15 21:51: Для опции умножить свой вывод -->    
    <operation>
      <search position="replace"><![CDATA[(<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>)]]></search>
      <add>
        <![CDATA[
          <?php
          if ($option_value['price_prefix'] == '*') {
            if ($option_value['price_value'] != 1.0)
              printf("(%+d%%)", round(($option_value['price_value'] * 100) - 100) );
          } else {
            echo "(".$option_value['price_prefix'].$option_value['price'].")"; 
          }
          ?>
        ]]>
      </add>
    </operation>
    <operation>
      <search position="before"><![CDATA[<?php echo $footer; ?>]]></search>
      <add>
        <![CDATA[
<script type=text/javascript"><!--
 
function price_format(n)
    c = <?php echo (empty($currency['decimals]) ? "0" : $currency['decimals'] ); ?>;
    d = '<?php echo $currency['decimal_point']; ?>'; // decimal separator
    t = '<?php echo $currency['thousand_point']; ?>'; // thousands separator
    s_left = '<?php echo $currency['symbol_left']; ?>';
    s_right = '<?php echo $currency['symbol_right']; ?>';
      
    n = n * <?php echo $currency['value']; ?>;
 
    //sign = (n < 0) ? '-' : '';
 
    //extracting the absolute value of the integer part of the number and converting to string
    i = parseInt(n = Math.abs(n).toFixed©) + ''; 
 
    j = ((j = i.length) > 3) ? j % 3 : 0; 
    return s_left + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed©.slice(2) : '') + s_right; 
}
 
function calculate_tax(price)
{
    <?php // Process Tax Rates
      if (isset($tax_rates) && $tax) {
         foreach ($tax_rates as $tax_rate) {
           if ($tax_rate['type'] == 'F') {
             echo 'price += '.$tax_rate['rate'].';';
           } elseif ($tax_rate['type'] == 'P') {
             echo 'price += (price * '.$tax_rate['rate'].') / 100.0;';
           }
         }
      }
    ?>
    return price;
}
 
function process_discounts(price, quantity)
{
    <?php
      foreach ($dicounts_unf as $discount) {
        echo 'if ((quantity >= '.$discount['quantity'].') && ('.$discount['price'].' < price)) price = '.$discount['price'].';'."\n";
      }
    ?>
    return price;
}
 
 
animate_delay = 20;
 
main_price_final = calculate_tax(Number($('#formated_price').attr('price')));
main_price_start = calculate_tax(Number($('#formated_price').attr('price')));
main_step = 0;
main_timeout_id = 0;
 
function animateMainPrice_callback() {
    main_price_start += main_step;
    
    if ((main_step > 0) && (main_price_start > main_price_final)){
        main_price_start = main_price_final;
    } else if ((main_step < 0) && (main_price_start < main_price_final)) {
        main_price_start = main_price_final;
    } else if (main_step == 0) {
        main_price_start = main_price_final;
    }
    
    $('#formated_price').html( price_format(main_price_start) );
    
    if (main_price_start != main_price_final) {
        main_timeout_id = setTimeout(animateMainPrice_callback, animate_delay);
    }
}
 
function animateMainPrice(price) {
    main_price_start = main_price_final;
    main_price_final = price;
    main_step = (main_price_final - main_price_start) / 10;
    
    clearTimeout(main_timeout_id);
    main_timeout_id = setTimeout(animateMainPrice_callback, animate_delay);
}
 
 
<?php if ($special) { ?>
special_price_final = calculate_tax(Number($('#formated_special').attr('price')));
special_price_start = calculate_tax(Number($('#formated_special').attr('price')));
special_step = 0;
special_timeout_id = 0;
 
function animateSpecialPrice_callback() {
    special_price_start += special_step;
    
    if ((special_step > 0) && (special_price_start > special_price_final)){
        special_price_start = special_price_final;
    } else if ((special_step < 0) && (special_price_start < special_price_final)) {
        special_price_start = special_price_final;
    } else if (special_step == 0) {
        special_price_start = special_price_final;
    }
    
    $('#formated_special').html( price_format(special_price_start) );
    
    if (special_price_start != special_price_final) {
        special_timeout_id = setTimeout(animateSpecialPrice_callback, animate_delay);
    }
}
 
function animateSpecialPrice(price) {
    special_price_start = special_price_final;
    special_price_final = price;
    special_step = (special_price_final - special_price_start) / 10;
    
    clearTimeout(special_timeout_id);
    special_timeout_id = setTimeout(animateSpecialPrice_callback, animate_delay);
}
<?php } ?>
 
 
function recalculateprice()
{
    var main_price = Number($('#formated_price').attr('price'));
    var input_quantity = Number($('input[name=quantity]').attr('value'));
    var special = Number($('#formated_special').attr('price'));
    var tax = 0;
    
    if (isNaN(input_quantity)) input_quantity = 0;
    
    // Process Discounts.
    <?php if ($special) { ?>
        special = process_discounts(special, input_quantity);
    <?php } else { ?>
        main_price = process_discounts(main_price, input_quantity);
    <?php } ?>
    tax = process_discounts(tax, input_quantity);
    
    
   <?php if ($points) { ?>
     var points = Number($('#formated_points').attr('points'));
     $('.option input:checked').each(function() {
       points += Number($(this).attr('points'));
     });
     $('.option option:selected').each(function() {
       points += Number($(this).attr('points'));
     });
     $('#formated_points').html(points);
   <?php } ?>
    
    var option_price = 0;
    
    $('.option input:checked,option:selected').each(function() {
      if ($(this).attr('price_prefix') == '=') {
        option_price += Number($(this).attr('price'));
        main_price = 0;
        special = 0;
      }
    });
    
    $('.option input:checked,option:selected').each(function() {
      if ($(this).attr('price_prefix') == '+') {
        option_price += Number($(this).attr('price'));
      }
      if ($(this).attr('price_prefix') == '-') {
        option_price -= Number($(this).attr('price'));
      }
      if ($(this).attr('price_prefix') == 'u') {
        pcnt = 1.0 + (Number($(this).attr('price')) / 100.0);
        option_price *= pcnt;
        main_price *= pcnt;
        special *= pcnt;
      }
      if ($(this).attr('price_prefix') == '*') {
        option_price *= Number($(this).attr('price'));
        main_price *= Number($(this).attr('price'));
        special *= Number($(this).attr('price'));
      }
    });
    
    special += option_price;
    main_price += option_price;
 
    <?php if ($special) { ?>
      tax = special;
    <?php } else { ?>
      tax = main_price;
    <?php } ?>
    
    // Process TAX.
    main_price = calculate_tax(main_price);
    special = calculate_tax(special);
    
    // Раскомментировать, если нужен вывод цены с умножением на количество
    //main_price *= input_quantity;
    //special *= input_quantity;
    //tax *= input_quantity;
 
    // Display Main Price
    //$('#formated_price').html( price_format(main_price) );
    animateMainPrice(main_price);
      
    <?php if ($special) { ?>
      //$('#formated_special').html( price_format(special) );
      animateSpecialPrice(special);
    <?php } ?>
 
    <?php if ($tax) { ?>
      $('#formated_tax').html( price_format(tax) );
    <?php } ?>
}
 
$(document).ready(function() {
    $('.option input[type=checkbox]').bind('change', function() { recalculateprice(); });
    $('.option input[type=radio]').bind('change', function() { recalculateprice(); });
    $('.option select').bind('change', function() { recalculateprice(); });
    
    $quantity = $('input[name=quantity]');
    $quantity.data('val', $quantity.val());
    (function() {
        if ($quantity.val() != $quantity.data('val')){
            $quantity.data('val',$quantity.val());
            recalculateprice();
        }
        setTimeout(arguments.callee, 250);
    })();    
    
    recalculateprice();
});
 
//--></script>
        ]]>
      </add>
    </operation>
  </file>
 
  <file name="catalog/model/catalog/product.php">
    <operation>
      <search position="before"><![CDATA['weight'                  => $product_option_value['weight'],]]></search>
      <add>
        <![CDATA[
          'points'        => $product_option_value['points'],
          'points_prefix' => $product_option_value['points_prefix'],
        ]]>
     </add>
    </operation>
  </file>
  
  <file name="catalog/controller/product/product.php">
    <operation>
      <search position="before"><![CDATA[$this->data['options'] = array();]]></search>
      <add>
        <![CDATA[
          $this->data['price_value'] = $product_info['price'];
          $this->data['special_value'] = $product_info['special'];
          $this->data['tax_value'] = (float)$product_info['special'] ? $product_info['special'] : $product_info['price'];
          
          $var_currency = array();
          $var_currency['value'] = $this->currency->getValue();
          $var_currency['symbol_left'] = $this->currency->getSymbolLeft();
          $var_currency['symbol_right'] = $this->currency->getSymbolRight();
          $var_currency['decimals'] = $this->currency->getDecimalPlace();
          $var_currency['decimal_point'] = $this->language->get('decimal_point');
          $var_currency['thousand_point'] = $this->language->get('thousand_point');
          $this->data['currency'] = $var_currency;
          
          $this->data['dicounts_unf'] = $discounts;
 
          $this->data['tax_class_id'] = $product_info['tax_class_id'];
          $this->data['tax_rates'] = $this->tax->getRates(0, $product_info['tax_class_id']);
        ]]>
     </add>
    </operation>
    <operation>
      <search position="after"><![CDATA[$option_value_data[] = array(]]></search>
      <add>
        <![CDATA[
          'price_value'                   => $option_value['price'],
          'points_value'                  => intval($option_value['points_prefix'].$option_value['points']),
        ]]>
      </add>
    </operation>
  </file>
 
 
</modification>

Версия OCStore 1.5.5.1.2

Модуль в виде файла xml закидывается в vqmod/xml

Спасибо.

Надіслати
Поділитися на інших сайтах


Спасибо. Пробовал, но почему-то не работает корректно, цена не меняется совсем. Там информация, что модуль для версий 1.5.1.3, 1.5.3.1, 1.5.4. У меня 1.5.5.1.2. Может из-за этого и не работает толком. А так да, этот модуль затирает главную цену.

Змінено користувачем system
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.