Помощь Не правильно ставит точку, разделитель в цене товара. Помогите...

droid1008

Создатель
Регистрация
10 Дек 2015
Сообщения
38
Реакции
1
Симпла 2.3.7. Шаблон -
multipurpose

При добавлении товара в корзину, первую цену выводит правильно, а при оформлении ставит разделитель не там где нужно. Всю голову уже сломал. Не могу понять, где ошибка. Помогите, кто разбирается.
Приложил скриншот. На нем все понятно.
На всякий случай код файла cart.tpl


<h2>Выберите способ доставки:</h2>

<ul>
{foreach $deliveries as $delivery}
<li {if $delivery_id==$delivery->id}class="current"{elseif $delivery@first}class="current"{/if}>
<input type="radio" name="delivery_id" value="{$delivery->id}" {if $delivery_id==$delivery->id}checked{elseif $delivery@first}checked{/if} id="deliveries_{$delivery->id}">

<label for="deliveries_{$delivery->id}">
{$delivery->name}
{if $cart->total_price < $delivery->free_from && $delivery->price>0}
<span><em>{$delivery->price|convert}</em>&nbsp;{$currency->sign}</span>
{elseif $cart->total_price >= $delivery->free_from}
<span><em>бесплатно</em></span>
{/if}
</label>

<div class="description" style="display: none;">
{$delivery->description}
</div>
</li>
{/foreach}
</ul>
</li>
{/if}

<li class="total">
<label>Итого:</label>
<span><em>{$cart->total_price|convert}</em>&nbsp;{$currency->sign}</span>
</li>
</ul>

<div class="sep"></div>

<ul class="address_form">
<li>
 

Вложения

  • Безымянный.png
    Безымянный.png
    40,4 KB · Просмотры: 9
Смотреть надо не cart.tpl, а compiled/имя темы/814cdfкучасимволов074acd861c3b4.file.cart.tpl.php
Если там все норм, то смотреть js-код, который может форматировать вывод по своему
Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Не понятно. Вот кусок кода из .file.cart.tpl.php. Тут вроде все нормально.:
<li class="total">
<label>Итого:</label>
<span><em><?php echo $_smarty_tpl->smarty->registered_plugins[Smarty::pLUGIN_MODIFIER]['convert'][0][0]->convert($_smarty_tpl->tpl_vars['cart']->value->total_price);?>
</em>&nbsp;<?php echo $_smarty_tpl->tpl_vars['currency']->value->sign;?>
</span>
</li>

Куда хоть смотреть нужно? какая функция отвечает за вывод разделителя цены?
 
Может в классе api/Money.php функция convert модифицирована?
 
Симпла 2.3.7. Шаблон -
multipurpose

При добавлении товара в корзину, первую цену выводит правильно, а при оформлении ставит разделитель не там где нужно. Всю голову уже сломал. Не могу понять, где ошибка. Помогите, кто разбирается.
Приложил скриншот. На нем все понятно.
На всякий случай код файла cart.tpl


<h2>Выберите способ доставки:</h2>

<ul>
{foreach $deliveries as $delivery}
<li {if $delivery_id==$delivery->id}class="current"{elseif $delivery@first}class="current"{/if}>
<input type="radio" name="delivery_id" value="{$delivery->id}" {if $delivery_id==$delivery->id}checked{elseif $delivery@first}checked{/if} id="deliveries_{$delivery->id}">

<label for="deliveries_{$delivery->id}">
{$delivery->name}
{if $cart->total_price < $delivery->free_from && $delivery->price>0}
<span><em>{$delivery->price|convert}</em>&nbsp;{$currency->sign}</span>
{elseif $cart->total_price >= $delivery->free_from}
<span><em>бесплатно</em></span>
{/if}
</label>

<div class="description" style="display: none;">
{$delivery->description}
</div>
</li>
{/foreach}
</ul>
</li>
{/if}

<li class="total">
<label>Итого:</label>
<span><em>{$cart->total_price|convert}</em>&nbsp;{$currency->sign}</span>
</li>
</ul>

<div class="sep"></div>

<ul class="address_form">
<li>

$total_price формирует цену складывая все, что у тебя есть в заказе
$cart->total_price += $item->variant->price*$item->amount;

Если у тебя $total_price показывает 160.00, значит столько там наскладывалось. для отладки я использую такую хрень. В шаблоне вставляешь вот такой код:

{if $smarty.session.admin}
{$cart|@debug_print_var}
{/if}


Вставь это в корзину и при залогиненном админе у тебя на странице корзины будет print_r всего объекта $cart, посмотришь свои цены там.

Тут вариантов не много:
1. Кривая цена появляется на этапе $item->variant->price (посмотри правильные ли цены в базе через phpmyadmin в таблице s_variants, а там ищи свой товар по полю id или по артикулу)
2. Кривая цена становится при $total_price|convert (посмотри какая цена без |convert)


Запиливаю сейчас этот же шаблон. Проблема именно в шаблоне. Если найду проблему - напишу.

Кривую цену делает какой-то js, который при смене варианта доставки забивает новую цену. В этом скрипте математика барахлит, надо править скрипт.


Вот этот скрипт
design/multipurpose_complete/js/accounting.min.js

Код:
/*!
* accounting.js v0.3.2, copyright 2011 Joss Crowcroft, MIT license, http://josscrowcroft.github.com/accounting.js
*/
(function(p, z) {
  function q(a) {
  return !!("" === a || a && a.charCodeAt && a.substr)
  }

  function m(a) {
  return u ? u(a) : "[object Array]" === v.call(a)
  }

  function r(a) {
  return "[object Object]" === v.call(a)
  }

  function s(a, b) {
  var d, a = a || {},
  b = b || {};
  for (d in b) b.hasOwnProperty(d) && null == a[d] && (a[d] = b[d]);
  return a
  }

  function j(a, b, d) {
  var c = [],
  e, h;
  if (!a) return c;
  if (w && a.map === w) return a.map(b, d);
  for (e = 0, h = a.length; e < h; e++) c[e] = b.call(d, a[e], e, a);
  return c
  }

  function n(a, b) {
  a = Math.round(Math.abs(a));
  return isNaN(a) ? b : a
  }

  function x(a) {
  var b = c.settings.currency.format;
  "function" === typeof a && (a = a());
  return q(a) && a.match("%v") ? {
  pos: a,
  neg: a.replace("-", "").replace("%v", "-%v"),
  zero: a
  } : !a || !a.pos || !a.pos.match("%v") ? !q(b) ? b : c.settings.currency.format = {
  pos: b,
  neg: b.replace("%v", "-%v"),
  zero: b
  } : a
  }
  var c = {
  version: "0.3.2",
  settings: {
  currency: {
  symbol: "$",
  format: "%s%v",
  decimal: ".",
  thousand: ",",
  precision: 2,
  grouping: 3
  },
  number: {
  precision: 0,
  grouping: 3,
  thousand: ",",
  decimal: "."
  }
  }
  },
  w = Array.prototype.map,
  u = Array.isArray,
  v = Object.prototype.toString,
  o = c.unformat = c.parse = function(a, b) {
  if (m(a)) return j(a, function(a) {
  return o(a, b)
  });
  a = a || 0;
  if ("number" === typeof a) return a;
  var b = b || ".",
  c = RegExp("[^0-9-" + b + "]", ["g"]),
  c = parseFloat(("" + a).replace(/\((.*)\)/, "-$1").replace(c, "").replace(b, "."));
  return !isNaN(c) ? c : 0
  },
  y = c.toFixed = function(a, b) {
  var b = n(b, c.settings.number.precision),
  d = Math.pow(10, b);
  return (Math.round(c.unformat(a) * d) / d).toFixed(b)
  },
  t = c.formatNumber = function(a, b, d, i) {
  if (m(a)) return j(a, function(a) {
  return t(a, b, d, i)
  });
  var a = o(a),
  e = s(r(b) ? b : {
  precision: b,
  thousand: d,
  decimal: i
  }, c.settings.number),
  h = n(e.precision),
  f = 0 > a ? "-" : "",
  g = parseInt(y(Math.abs(a || 0), h), 10) + "",
  l = 3 < g.length ? g.length % 3 : 0;
  return f + (l ? g.substr(0, l) + e.thousand : "") + g.substr(l).replace(/(\d{3})(?=\d)/g, "$1" + e.thousand) + (h ? e.decimal + y(Math.abs(a), h).split(".")[1] : "")
  },
  A = c.formatMoney = function(a, b, d, i, e, h) {
  if (m(a)) return j(a, function(a) {
  return A(a, b, d, i, e, h)
  });
  var a = o(a),
  f = s(r(b) ? b : {
  symbol: b,
  precision: d,
  thousand: i,
  decimal: e,
  format: h
  }, c.settings.currency),
  g = x(f.format);
  return (0 < a ? g.pos : 0 > a ? g.neg : g.zero).replace("%s", f.symbol).replace("%v", t(Math.abs(a), n(f.precision), f.thousand, f.decimal))
  };
  c.formatColumn = function(a, b, d, i, e, h) {
  if (!a) return [];
  var f = s(r(b) ? b : {
  symbol: b,
  precision: d,
  thousand: i,
  decimal: e,
  format: h
  }, c.settings.currency),
  g = x(f.format),
  l = g.pos.indexOf("%s") < g.pos.indexOf("%v") ? !0 : !1,
  k = 0,
  a = j(a, function(a) {
  if (m(a)) return c.formatColumn(a, f);
  a = o(a);
  a = (0 < a ? g.pos : 0 > a ? g.neg : g.zero).replace("%s", f.symbol).replace("%v", t(Math.abs(a), n(f.precision), f.thousand, f.decimal));
  if (a.length > k) k = a.length;
  return a
  });
  return j(a, function(a) {
  return q(a) && a.length < k ? l ? a.replace(f.symbol, f.symbol + Array(k - a.length + 1).join(" ")) : Array(k - a.length + 1).join(" ") + a : a
  })
  };
  if ("undefined" !== typeof exports) {
  if ("undefined" !== typeof module && module.exports) exports = module.exports = c;
  exports.accounting = c
  } else "function" === typeof define && define.amd ? define([], function() {
  return c
  }) : (c.noConflict = function(a) {
  return function() {
  p.accounting = a;
  c.noConflict = z;
  return c
  }
  }(p.accounting), p.accounting = c)
})(this);
Вот где проблема. Функция changeTotal() криво парсит цены.

Код:
      function changeTotal(){
         var deliveryPrice = $('.delivery').find('input:checked').next('label').find('em').text().replace(/ /g,'');
         if (deliveryPrice == 'бесплатно') {
           $(".total span").html('<em>' + accounting.formatMoney(totalPrice, "", 0, " ", ",") + '</em>' + '&nbsp;{$currency->sign}');
         }else{
           var totalPlusDelivery = parseInt(totalPrice) + parseInt(deliveryPrice);
           $(".total span").html('<em>' + accounting.formatMoney(totalPlusDelivery, "", 0, " ", ",") + '</em>' + '&nbsp;{$currency->sign}');
         };
 
Последнее редактирование:
Автор шаблона сделал это в стиле сходить по нужде в темноте, вычисляя точные координаты угла наложением показаний GPS и ГЛОНАСС.
Код:
{* Шаблон корзины *}
{$currency|printa}
{$meta_title = "Корзина" scope=parent}
{if $cart->purchases}
<form id="form_cart" method="post" name="cart">
   <div class="cart_left">
 
     <h2 class="cart_caption">В корзине {$cart->total_products} {$cart->total_products|plural:'товар':'товаров':'товара'}</h2>
   
     <ul>
       {foreach from=$cart->purchases item=purchase}
       <li>
         {* Изображение товара *}
         <div class="image">
           {$image = $purchase->product->images|first}
           <a href="products/{$purchase->product->url}">{if $image}<img src="{$image->filename|resize:80:80}" alt="{$product->name|escape}" />{else}<img src="design/{$settings->theme}/images/no_image.png" alt="{$product->name|escape}" />{/if}</a>
         </div>
       
         {* Название товара *}
         <div class="name">
           <a href="products/{$purchase->product->url}">{$purchase->product->name|escape}</a>
           {$purchase->variant->name|escape}     
         </div>
         {* Цена *}
         <div class="price">
           <span class="price">{($purchase->variant->price*$purchase->amount)|convert}&nbsp;{$currency->sign}</span>
         
         
             <select name="amounts[{$purchase->variant->id}]" onchange="document.cart.submit();">
               {section name=amounts start=1 loop=$purchase->variant->stock+1 step=1}
               <option value="{$smarty.section.amounts.index}" {if $purchase->amount==$smarty.section.amounts.index}selected{/if}>{$smarty.section.amounts.index} {$settings->units}</option>
               {/section}
             </select>
           <a class="cart_delete" href="cart/remove/{$purchase->variant->id}" title="Удалить из корзины" alt="Удалить из корзины"></a>
         </div>
       </li>
       {/foreach}
     </ul>
   </div><!--left-->
   <div class="cart_right">
     <h2 class="cart_caption">Оформление заказа</h2>
     <ul>
       {if $user->discount}
       <li>
         <label>Cкидка постоянного покупателя:</label>
         <span>{$user->discount}&nbsp;%</span>
       </li>
       {/if}
     
       {if $coupon_request}
       <li class="coupon">
         <label>Код купона или подарочного ваучера{if $cart->coupon_discount>0}<span>&minus;{$cart->coupon_discount|convert}&nbsp;{$currency->sign}</span>{/if}</label>
         <input type="text" name="coupon_code" value="{$cart->coupon->code|escape}" class="coupon_code">
         <input type="button" name="apply_coupon" class="gray_button"  value="Применить купон" onclick="document.cart.submit();">
         {if $coupon_error}
         <div class="message_error">
           {if $coupon_error == 'invalid'}Купон недействителен{/if}
         </div>
         {/if}
         {if $cart->coupon->min_order_price>0}
         <div class="message_error">
         (купон {$cart->coupon->code|escape} действует для заказов от {$cart->coupon->min_order_price|convert} {$currency->sign})
         </div>
         {/if}
       </li>
       {/if}   
       {* Доставка *}
       {if $deliveries}
       <li class="delivery">
         <h2>Выберите способ доставки:</h2>
         <ul>
           {foreach $deliveries as $delivery}
           <li {if $delivery_id==$delivery->id}class="current"{elseif $delivery@first}class="current"{/if}>
             <input type="radio" name="delivery_id" value="{$delivery->id}" {if $delivery_id==$delivery->id}checked{elseif $delivery@first}checked{/if} id="deliveries_{$delivery->id}">
             <label for="deliveries_{$delivery->id}">
             {$delivery->name}
             {if $cart->total_price < $delivery->free_from && $delivery->price>0}
               <span><em>{$delivery->price|convert}</em>&nbsp;{$currency->sign}</span>
             {elseif $cart->total_price >= $delivery->free_from}
               <span><em>бесплатно</em></span>
             {/if}
             </label>
             <div class="description" style="display: none;">
             {$delivery->description}
             </div>
           </li>
           {/foreach}
         </ul>
       </li>
       {/if}
     
       <li class="total">
         <label>Итого:</label>
         <span><em>{$cart->total_price|convert}</em>&nbsp;{$currency->sign}</span>
       </li>
     </ul> 
   
     <div class="sep"></div>
   
     <ul class="address_form">
       <li>
     
         <h2>Адрес получателя</h2>
       
         {if $error}
         <div class="message_error">
           {if $error == 'empty_name'}Введите имя{/if}
           {if $error == 'empty_email'}Введите email{/if}
           {if $error == 'captcha'}Число введено неверно{/if}
         </div>
         <script>
           $(function (){
             $('html, body').animate({
               scrollTop: $(".address_form").offset().top
             }, 1000);
           });
         </script>
         {/if}
       
         <ul>
           <li>
             <label class="required">Имя, фамилия</label>
             <input name="name" type="text" value="{$name|escape}" data-format=".+" data-notice="Введите имя"/>
           </li>
         
           <li>
             <label class="required">Email</label>
             <input name="email" type="text" value="{$email|escape}" data-format="email" data-notice="Введите email" />
           </li>
         
           <li>
             <label>Телефон</label>
             <input name="phone" type="text" value="{$phone|escape}" />
           </li>
         
           <li>
             <label>Адрес доставки</label>
             <input name="address" type="text" value="{$address|escape}"/>
           </li>
         
           <li>
             <label>Комментарий к&nbsp;заказу</label>
             <textarea name="comment" id="order_comment">{$comment|escape}</textarea>
           </li>
         
           <li>
             <div class="captcha required"><img src="captcha/image.php?{math equation='rand(10,10000)'}" alt='captcha'/></div>
             <input class="input_captcha" id="comment_captcha" type="text" name="captcha_code" value="" data-format="\d\d\d\d" data-notice="Введите капчу"/>
           </li>
         </ul>
       </li>
   
       <li class="confirm_order">
         <input type="submit" name="checkout" class="orange_button" value="Оформить заказ">
       </li>
     </ul>
   </div>
</form>
<script>
$(function() {
   $('#form_cart').validate({
     rules: {
       name: {
         required: true,
       },
       email: {
         required: true,
         email: true
       },
       captcha_code: {
         required: true,
         digits: true,
       }
     },
     messages: {
       name: {
         required: "Введите ваше имя",
       },
       email: "Введите email",
       captcha_code: "Введите число",
     },
     ignore: ".skip"
   
   });
 
   {if $deliveries}
     {if $currency->code != 'RUR'}
       var totalPrice = $(".total em").text(); 
       function changeTotal(){
         var deliveryPrice = $('.delivery').find('input:checked').next('label').find('em').text();
       
         if (deliveryPrice == 'бесплатно') {
           $(".total span").html('<em>' + accounting.formatMoney(totalPrice, "", 2, " ", ",") + '</em>' + '&nbsp;{$currency->sign}');
         }else{
           var totalPlusDelivery = parseInt(totalPrice) + parseInt(deliveryPrice);
           $(".total span").html('<em>' + accounting.formatMoney(totalPlusDelivery, "", 2, " ", ",") + '</em>' + '&nbsp;{$currency->sign}');
         };
       };
     {else}
       var totalPrice = $(".total em").text(); 
       function changeTotal(){
         var deliveryPrice = $('.delivery').find('input:checked').next('label').find('em').text();
         if (deliveryPrice == 'бесплатно') {
           $(".total span").html('<em>' + accounting.formatMoney(totalPrice, "", 0, " ", ",") + '</em>' + '&nbsp;{$currency->sign}');
         }else{
           var totalPlusDelivery = parseInt(totalPrice) + parseInt(deliveryPrice);
           $(".total span").html('<em>' + accounting.formatMoney(totalPlusDelivery, "", 0, " ", ",") + '</em>' + '&nbsp;{$currency->sign}');
         };
       };
     {/if}
     function changeClass(){
       $('.delivery').find('li').removeAttr('class');
       $(this).parent().addClass('current');
       changeTotal();
     };
     $('input[type=radio]').change(changeClass);
     $(document).ready(changeTotal)
   
   {/if}
 
   $("div.price select").chosen({
     disable_search: true,
     width: '80px'
   })
 
   {if $coupon_request}
 
     $("input[name='coupon_code']").keypress(function(event){
       if(event.keyCode == 13){
         $("input[type=text]").addClass("skip");
         document.cart.submit();
       }
     });
 
   {/if}
});
</script>
{else}
<div class="post_block">
   <h1>В корзине нет товаров</h1>
</div>
{/if}

Сначала у него берет значение цены товара, потом его регуляркой, дальше значение доставки и его регуляркой, потом все это через accounting.js. Вишенка - прилепить отдельно указатель валюты. accounting.js предназначен именно для этого, чтобы выводить цифровые значение в формате валют. Здесь же этот accounting только для того, чтобы расставить пробелы между тысячами и запятую перед копейками.
 
У тебя это на хостинге выложено уже? чтобы в firebug посмотреть что там происходит с разделителем?
 
У тебя это на хостинге выложено уже? чтобы в firebug посмотреть что там происходит с разделителем?

я этот шаблон только начал прикручивать, на хостинге нету. Там и без дебагера видно, что автор был под винтом. функция берет значение и делает preg_replace, как он там наз. в js
 
я этот шаблон только начал прикручивать, на хостинге нету. Там и без дебагера видно, что автор был под винтом. функция берет значение и делает preg_replace, как он там наз. в js
str.replace называется))) под винтом еще и на node.js можно начать писать))
 
Назад
Сверху