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

Хм, наверно, у нас разные версии.
У меня корзина отображает цену товара в одной валюте (в той, которая выбирается пользователем).
Отображалась бы и в двух - лишь бы правильно...

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

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

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

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

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

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

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

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

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

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

Значит, есть такой файл 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 и далее - надо ж определить, наверно, "забираемое" из БД значение?) - ноль эффекта.

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

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

если не сложно дайте решение!
 
легче просто там где выводится ваша валюта, рядом добавить
{$currencies[Х][3]}
где Х номер по порядку валюты прописанной в админке

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

B на счет номера валюты по порядку наверное имелось ввиду порядок в базе данных а не в админке?
 
Я на своем магазине долго экспериментировал с валютой и в конечном этоге пришол к выводу что стоит основной валютой делать доллар и по его курсу чтоб менялась стоимость товара в региональной валюте.
гораздо проще и удобнее

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

Конкретный пример: у меня 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 цифры в множителе (после запятой), то получается очень значительная погрешность. Она не всех может устроить.
В общем, решение нуждается в дальнейшем усовершенствовании. И оставляет желать другого решения.
 
По ходу, нашла способ выводить нужное количество знаков при этом пересчете цены.
К последнему примеру (где цена фиксирована в еврах)




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

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