system

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

Рекомендуемые сообщения

system    0

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

Есть модуль автообновление цены (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

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
system    0

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

Изменено пользователем system

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
system    0

Извиняюсь. Не прочитал, что требуется модификация таблиц базы данных. Счас попробую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу