Работа с несколькими валютами...

Css_Ufa

Мой дом здесь!
Регистрация
25 Ноя 2008
Сообщения
543
Реакции
326
Хм, наверно, у нас разные версии.
У меня корзина отображает цену товара в одной валюте (в той, которая выбирается пользователем).
Отображалась бы и в двух - лишь бы правильно...

Кстати, курс-то стоит в админке, как понимаю:
1 у.е. = 1 долл
и
1 у.е. = 20 рублей,
так ведь?

Экспериментировала - получается, что так.
За выходные модуль, в котором происходит вычисление и вывод цены в опрееленной валюте, так и не нашла. Соответственно, где его править и куда вставлять "if-else", даже прикинуть не могу. Сижу, продолжаю поиск по форуму.
Попутно думаю, не проще ли ввести в колонке свойств товара (основных) какое-нибудь поле, в котором из админки можно "включать" и "выключать" (квадратная хрень с галочкой. Или радиокнопка) альтернативный механизм расчёта цены.

А механизм, как я понимаю, будет такой (по крайней мере, если мы считаем, что у нас ДОЛЛАР=1

Цена В Гривнях = Значение / курс гривни * курс гривни = собственно, Значение (сокращаем)

Цена В Долларах = Значение / Курс гривни * Курс доллара

(Курс Гривни у нас, собственно, представляет собой текущий курс доллара Если бакс стоит 9,0 гривни, мы ж для гривни в админке и запишем 9,0 - долларо-то = 1)

В общем случае формула будет:
Значение В Выбранной валюте = Значение в у.е. /курс гривни в админке * курс этой другой валюты.

Правильно мыслишь, если уж где-то исправлять, то конечно в product_detailed.tpl.html
Продумано то все до мелочей... Думал, думал... и мне подсказал "Злобный Бабко" немного...
Вот так... теперь остается сесть и переделать немного...
 

EurekaVII

Создатель
Регистрация
1 Янв 2009
Сообщения
17
Реакции
0
Я на своем магазине долго экспериментировал с валютой и в конечном этоге пришол к выводу что стоит основной валютой делать доллар и по его курсу чтоб менялась стоимость товара в региональной валюте.

гораздо проще и удобнее
 

Oxanita

Постоялец
Регистрация
27 Янв 2009
Сообщения
56
Реакции
4
ну, что я могу сказать... Вам несказанно повезло, что не приходится сталкиваться с исключениями.
Мне вчера под занавес пришел еще один гвоздь в крышку: прайс-лист в ЕВРО. Называется "Здравствуй, Третья валюта!" - это при том, что в двух еще не разобралась.

А теперь что еще я нашла. И считаю, что менять надо там, только у меня пока не получается, потому что наверно не везде всё корректно обозначила.

Значит, есть такой файл core_functions/functions.php

И в нем в нескольких местах такая штука:



По всей видимости, здесь и сидит общий алгоритм отображения цены в валютных единицах. И его здесь нужно менять.

Я сделала так:
1) добавила в таблице ss_products еще два поля:
multiplier = "множитель" - индивидуальный для каждого продукта коэффициент, на который будет умножаться его цена "в универсальных единицах"
divizor = "делитель" - соответственно, на это значение цена будет ДЕЛИТЬСЯ.
(В принципе, можно их объединить в один, но в связи с появлением третьей валюты мне просто ТАК УДОБНЕЕ - видеть каждый коэффициент отдельно и иметь возможность его менять отдельно. А не пересчитывать отношение курсов вручную)

Мысль была такая: модифицировать вычисление цены


Например, если у меня цена фиксирована в долларах, значения будут
multiplier=1
divizor=1

если цена фиксирована в гривнях, значения будут
multiplier=1
divizor=8.1 (например. В смысле, УСТАНОВЛЕННЫЙ для данного продукта курс доллара к гривне. Может и отличаться от установленного в модуле валют, мало ли какие ситуации возникают)

если цена фиксирована в евро, будет, например
multiplier=11.5 (или другой УСТАНОВЛЕННЫЙ для данного продукта курс евро к гривне)
divizor=8.1 (установленный курс гривни к доллару).

Данная доработка позволила БЫ вводить цену для любого продукта в любой категории в любой валюте, к тому же регулировать отображаемую цену вне зависимости от "системного" курса (того, что устанавливается в админке в разделе валют). Но...

После изменения формулы вычислялка вообще перестает работать. На введение в формулу "делителя" вообще начинаются матюки насчет деления на нуль, хотя я по умолчанию этот параметр установила =1 и ПРОВЕРИЛА, он действтельно нигде нулю не равен.
При попытке оставить один "множитель" все цены обнуляются. Попыталась подставить ЦИФРЫ - работает так, как и предполагалось!!!
Тип переменной для divizor и multiplier установлен аналогично ценам и курсу валют (float).
Дошла до изменения в product_finctions в той же директории (функции GetProduct и далее - надо ж определить, наверно, "забираемое" из БД значение?) - ноль эффекта.

Дальше искать не знаю где. А теперь это уже обидно: при почти решенной задаче...

Осталась, правда, еще одна ПОДзадача: закидывание упомянутых значений через админку, желательно через быструю форму (для всей категории сразу). Но об этом уже отдельный разговор. Если я устраню главную ошибку, то коэффициентики я готова закинуть и через ПХПмайадмин, хотя через админку шопскрипта удобнее и логичнее.
 

Oxanita

Постоялец
Регистрация
27 Янв 2009
Сообщения
56
Реакции
4
Попробовала сегодня сделать все то же самое еще раз, завела сразу поля в админке (там, где вывод сразу всей категории) и обнаружила нерадостную вещь: значений из двух добавленных полей система не видит вообще. То есть выводит пустые поля там, где должна быть (и ЕСТЬ! По ПХПмайадмин видно) единичка в формате float.
Почитала кой-какие рекомендации, выяснила, что скорее всего надо "глобализировать" новые переменные. Но пока не нарыла, где именно и как именнго это сделать, чтобы они стали "видны".
 

N_E_M_E_C

Создатель
Регистрация
26 Июн 2009
Сообщения
22
Реакции
0
так и не нашел вразумительного решения вывода всех валют в Спец предложения и Описание!

если не сложно дайте решение!
 

serjkiev

Создатель
Регистрация
15 Май 2009
Сообщения
29
Реакции
0
легче просто там где выводится ваша валюта, рядом добавить
{$currencies[Х][3]}
где Х номер по порядку валюты прописанной в админке

результат будет 2 валюты в цене, правильно понял? Подскажите пожалуйста в каком файле нужно это прописать?

B на счет номера валюты по порядку наверное имелось ввиду порядок в базе данных а не в админке?
 

Extraterestrial

Писатель
Регистрация
20 Ноя 2009
Сообщения
3
Реакции
0
Я на своем магазине долго экспериментировал с валютой и в конечном этоге пришол к выводу что стоит основной валютой делать доллар и по его курсу чтоб менялась стоимость товара в региональной валюте.
гораздо проще и удобнее

Не совсем согласен, ибо, при условии что есть 2 прайса, один рублевый, другой долларовый, выходит то, что нужно либо рубли в доллары пересчитывать, либо наоборот, тоесть все равно приходиться делать основной валюту одну, а другую просто под нее подгонять курсами. Проблемы еще добавляет постоянно разный курс, который при смене, начинает менять цены на рубли и на доллары. Поэтому приходится ждать доработок авторов. Единственное решение на мой взгляд, это возможность присваивать каждой категории свою валюту, или сделать возможным это для каждого товара отдельно.
 

Oxanita

Постоялец
Регистрация
27 Янв 2009
Сообщения
56
Реакции
4
"Иногда они возвращаются".
Итак, вернулась и я к этой задаче. Опять же - на уровне "показать правильную цену на витрине", корзина все так же не нужна.

Конкретный пример: у меня 2 валюты в таблице, ГРИВНЯ по айдишнику раньше ДОЛЛАРА. И есть несколько категорий товара, которые имеют постоянную цену в гривнях.

Я делаю вот так:



(если у Вас есть НЕЧТО в евро, то в знаменателе можно $currencies[0][3] изменять на кросс-курс, только ж не перепутайте, что на что делите ( если кросс 1,4 - там нужно ставить (1/1,4) или просто перемещать 1,4 в числитель. И так можно задать хоть для каждой категории товара свой перерасчет цены)

Но только я получаю в целом не устраивающий по внешнему виду результат, например, для какой-то фигни стоимостью 80 грн:

Цена: USD 9.81595092025 (80 грн.)
То есть гривня без копеек меня устраивает, а баксы с таким "хвостом" - разумеется, нет.

Правки в product_brief.tpl.html

round() там не работает, как, впрочем, и остальные ПХП-шные методы округления хоть куда-нибудь (вверх, вниз, до целых и пр.). Как прямо в шаблоне "прикрутить" к этим значениям функцию _formatPrice, чтобы ФОРМАТНУТЬ цену до нормального вида?
(если вставляешь кусок кода ПХП, то он "не видит" эту переменную, которую ему надо обрабатывать - {$product_info.Price*$currencies[1][3]/$currencies[0][3]}
Ругается про деление на ноль или вообще игнорирует, если исхитриться убрать знаменатель в принципе (заменять на ЧИСЛО).
Как передать это значение {$product_info.Price*$currencies[1][3]/$currencies[0][3]} для обработки функцией _formatPrice или для округления средстваи ПХП, не знает ли кто?


(Добавляю результат сегодняшних исследований... блин, в трех шаблонах разные форматы "оформления" категории, аж интересно стало)
Для корректного отображения нужно внести соответствующие правки не только в product_brief.tpl.html, но и в product_detailed, comparison_products и... ну да, в корзине, которая не нужна, а также в прайсе и СПЕЦПРЕДЛОЖЕНИЯХ на главной.
Пока реализованы только "особые выводы цены" в подробном описании товара и в сравнении.
Например, кусок кода для product_detailed:

Здесь почему-то номер категории надо задавать через $categoryID == 130
(в предыдущем примере было, допустим, $product_info.categoryID eq 99 . ХЗ, почему так. По-другому "не видит" условия.)

{$smarty.const.CURRENCY_ASKFORRATE} - это в локали (языковом файле) дополнительно вводим примечание типа "уточните текущий курс у продавца" или как вам надо. Отображается под ценой мелким шрифтом. Можно в локаль и не выносить, писать прямо в шаблоне... но мне ТАК больше нравится и кажется более корректным.
Такое примечание - временная мера (пока не удалось настроить пересчет в ЛЮБУЮ выбранную валюту, чтобы отображало 2 знака после запятой). Но может кому-то пригодиться, если курс вашей валюты часто скачет и сильно влияет на цену.

Как вы уже догадались, вывод сделан и для цен в гривне, и для цен в евро. И при ЛЮБОМ выборе валюты посетителем цены на "спецтовары" (которые фиксированы не в основной валюте, обычно равной доллару) будут отображаться ТОЛЬКО в "своей" валюте. Это существенный минус.

Курс евро $currencies[2][3] берется путем добавления в админке еще одной валюты. [2] - это ее "порядковый номер" - гривна 0, доллар 1, евро 2.
Фишка: вы можете задать индивидуальный курс и евро, и гривни, и вообще чего угодно для КАЖДОЙ ГРУППЫ ТОВАРОВ.
Главное - не перепутайте, что где (например, в админке помечайте - ЕВРО (рога), ЕВРО (копыта), белорусские рубли (картофель) :) )

"Скрыть" эти внутренние курсы от посетителя можно с помощью приема, который на этом сайте или на дружественном ему уже упоминали



$currencies.CID eq 5 - а вот здесь уже указываете не порядок, а айдишник валюты. Смотрите по таблице. Так что использовать можно много курсов, а выбирать посетителю разрешить только 2 валюты. Или три. Сколько ВАМ надо.


Теперь чуть поправим сравниловку:



Здесь номер категории отображается как $products.categoryID - опять не знаю, почему так, определено простым перебором форматов.

Пока не удалось реализовать нормальный вывод "специальных цен" для главной страницы-спецпредложений. И главная катастрофа - ПРАЙС. :(
Что наводит на мысль, что все же надо найти способ втянуть все эти условия в functions.php в функцию show_price.

Кстати, если избавиться от необходимости ДЕЛЕНИЯ на какой-то курс, а ставить множитель для пересчета (например, вместо того чтобы делить на курс 1.4 - умножать на 0.71428...) - мы получим число со столькими знаками после запятой, сколько их в множителе. Т.е. 10*0.71428=7.14280, 10*0.71=7.10 и пр. Но! Если оставить только 2 цифры в множителе (после запятой), то получается очень значительная погрешность. Она не всех может устроить.
В общем, решение нуждается в дальнейшем усовершенствовании. И оставляет желать другого решения.
 

Oxanita

Постоялец
Регистрация
27 Янв 2009
Сообщения
56
Реакции
4
По ходу, нашла способ выводить нужное количество знаков при этом пересчете цены.
К последнему примеру (где цена фиксирована в еврах)




($currencies[1][3] - курс бакса в системе,
$currencies[2][3] - курс евро В СИСТЕМЕ - если у вас бакс=1, то курс евро будет =1/кросс-курс, что-то порядка 0.69 - но лучше брать хотя бы 4 цифры после запятой, а то погрешности большие)

Короче, вывод цены, например, вот так:
USD 232.56 / 1888.43 грн. / EUR 160.4
стал реальностью.
Но это все фигня: в корзину-то товар добавляется в выбранной валюте, и там никакие условия в зависимости от категории товара "не пришьешь", т.к. categoryID там нигде и не вызывается.
И в прайс-лист пока тоже в особой валюте не выведешь.
Кроме того, если какой-то товар из "особенных" вдруг оказался в разделе "рекомендуемого товара" с чем-либо еще, то он тоже будет отображаться в "неправильной" валюте! Покупатели шарахаются. :(
Короче, надо копать в functions.php, и ХЗ, как именно...
 
Сверху