Перейти к содержимому


Как правильно вычесть одну переменную из другой (язык СМАРТИ) ???


  • Вы не можете ответить в тему
Сообщений в теме: 14

#1 mx009

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 54 сообщений
Репутация: 0
Начинающий

Отправлено 15 December 2011 - 03:17 PM

Вычитаю из "новой цены" "старую цену" (блок спецпредложения) и получаю интересный результат. Старая цена 5 430р новая 4 950р . Вычитание ДАЕТ цифру 1 !!! вместо 480.

То есть вычитание происходит только по первой цифре. А вычитание из 900р 800р дает правильный результат 100.

Господа в чем дело подскажите ПЛИЗ.
  • 0

#2 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 15 December 2011 - 03:52 PM

Господа в чем дело подскажите ПЛИЗ.


в пробеле

я столкнулся с этой проблемой когда делал редактирование заказа в админ панели
при считывании с БД добавляется пробел 5 430р новая 4 950р . при этом все что после него отбрасывается
в итоге нужно подправить функцию вывода в смарти....

вот только я не помню где правил )
  • 0

#3 mx009

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 54 сообщений
Репутация: 0
Начинающий

Отправлено 15 December 2011 - 07:24 PM

в пробеле

я столкнулся с этой проблемой когда делал редактирование заказа в админ панели
при считывании с БД добавляется пробел 5 430р новая 4 950р . при этом все что после него отбрасывается
в итоге нужно подправить функцию вывода в смарти....

вот только я не помню где правил )


Я понял А как править функцию вывода в смарти. Куда лезть ручками... ?
  • 0

#4 Robby

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 15 December 2011 - 07:31 PM

mx009, попробуй использовать {$product_info.PriceWithOutUnit}

---------- Сообщение объединено ----------

это для обычных блоков краткого и подробного описаний, в спецпредложениях надо смотреть, там цена по другому выводиться
  • 0

#5 Robby

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 15 December 2011 - 10:06 PM

mx009, ничего путного для спецпредложений в голову не приходит. Там вывод цены формируется в переменной {$special_offers[i].Price}, которая содержит форматированною цену + название валюты. Можно попробовать использовать переменную {$special_offers[i].cena} - это цена товара в основной валюте (с коэффициентом 1). Еще как вариант сделать как-то так {$special_offers[i].Price|regex_replace:"/[\s\[а-я\]]/":""}, конструкция regex_replace:"/[\s\[а-я\]]/":"" удаляет все пробелы и символы от а до я. Документация по этой теме здесь
regex_replace | Smarty
дополнительная информация здесь
PHP: Метасимволы - Manual
можно было бы веделить цену, но похоже функция смарти regex_replace не поддерживает замену на подстроку из маски. Ну и как последний вариант без правки php кода магазина это исппользовать фильтры вывода
Фильтры вывода | Smarty
  • 0

#6 ruter

    Продвинутый пользователь

  • VIP
  • 334 сообщений
Репутация: 151
Мастер

Отправлено 18 December 2011 - 10:12 PM

Лучше всего правки сделать в файле обработчике на php, совершив действия над конкретными переменными без знака валюты, обвернув переменные функцией show_priceWithOutUnit(), а затем назначить переменную smarty на результат и вывести в шаблоне.
Тогда результаты не будут зависеть от выбранной валюты. А операции над строками в виде 5 430р и новая 4 950р могут дать правильный результат при знаке валюты справа, а слева уже нет это если использовать такой вариант {$var2-$var1}
  • 0

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 December 2011 - 10:30 PM

А regex_replace:"/\D/":"" не удалит ВСЕ символы кроме цифровых? Для распространенной ситуации цен без дробной части вполне себе выход, как мне кажется. А потом уже можно спокойно вычитать одно из другого.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 ruter

    Продвинутый пользователь

  • VIP
  • 334 сообщений
Репутация: 151
Мастер

Отправлено 19 December 2011 - 01:01 AM

А regex_replace:"/\D/":"" не удалит ВСЕ символы кроме цифровых? Для распространенной ситуации цен без дробной части вполне себе выход, как мне кажется. А потом уже можно спокойно вычитать одно из другого.

Решений может быть много. Нужно выбирать более простые и менее затратные.

Вычетание можно так сделать:


{assign var="per2" value=$cena2|regex_replace:"/\D/":""}
{assign var="per1" value=$cena1|regex_replace:"/\D/":""}
{$per2-$per1} затем завернуть с единицами валюты


или вот так:

{assign var="per2" value=$cena2|show_priceWithOutUnit}

{assign var="per1" value=$cena1|show_priceWithOutUnit}
{$per2-$per1}



Второй вариант проще и менее затратный использует функцию

Завернуть можно к примеру результат так:
{assign var="per3" value=`$per2-$per1`}
{$per3|show_price} - это выведет результат разницы в формате цены


Ну а самый простой как я раньше писал в файле php и вывод результата в шаблон

и если подумать. то возможны варианты
  • 0

#9 Robby

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 19 December 2011 - 09:51 AM

regex_replace:"/\D/":"" удалит и точку разделитель целой и дробной части и цена уже будет другая.
  • 0

#10 ruter

    Продвинутый пользователь

  • VIP
  • 334 сообщений
Репутация: 151
Мастер

Отправлено 19 December 2011 - 02:55 PM

regex_replace:"/\D/":"" удалит и точку разделитель целой и дробной части и цена уже будет другая.


Человек хотел для рублей без копеек, для него подойдет. Но я написал и второй вариант, с ним будет порядок с разрядностью. Все сделает специально предназначенная функция
  • 0

#11 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 December 2011 - 02:56 PM

regex_replace:"/\D/":"" удалит и точку разделитель целой и дробной части и цена уже будет другая.

Для распространенной ситуации цен без дробной части


  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#12 Robby

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 162 сообщений
Репутация: 75
Продвинутый

Отправлено 19 December 2011 - 05:07 PM

badisoft, да, не дочитал эту часть. Такое решение не очень хорошо в плане универсальности, сегодня цена без дробной части, завтра с дробной и здраствуй большое удивление. :)
  • 0

#13 Alex57

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 51 сообщений
Репутация: 31
Ассистент
  • ГородОрел

Отправлено 17 February 2012 - 06:35 PM

Мое решение

Как правильно вычесть одну переменную из другой (язык СМАРТИ) ???

Я тоже с такой проблемой сталкивался, нашел такое решение. все дело в функции _formatPrice, если изменить немного объявление для смарти, будет все ОК:
Например мне нужно значение order_amount в нормальном виде, вот ф-ция которая делает из 4000 -> 4 000:
$smarty_mail->assign( "order_amount", _formatPrice(roundf($order["currency_value"]*$order["order_amount"]),$order["currency_round"]));

Я делал так, оставлял эту же без изменений и просто создавал новую:
$smarty_mail->assign( "order_amount_for_me", roundf($order["currency_value"]*$order["order_amount"],$order["currency_round"]));

  • 0

#14 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 17 February 2012 - 07:02 PM

Я делал так, оставлял эту же без изменений и просто создавал новую:

$smarty_mail->assign( "order_amount_for_me", roundf($order["currency_value"]*$order["order_amount"],$order["currency_round"]));

Надо бы определиться - либо у Вас штатная PHP-функция round(), которая имеет два входных параметра - число и округление, либо roundf() из functions.php, которая имеет один входной параметр:

function roundf($float_value)
{
return round(100 * $float_value) / 100;
}

Это в 3.1.2, но в Вашей наверняка ведь так же :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#15 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 17 February 2012 - 09:04 PM

можно также использовать {math}

_http://www.smarty.net/docsv2/ru/language.function.math.tpl
  • 0
Изображение Изображение Изображение