Начинаю делиться откровениями по реализации одного большого и сложного проекта в области недвижимости. Первое, что я хотел бы рассказать - это наша реализация мультивалютного представления цен на объекты.[spoiler]
Итак, все объекты на сайте имеют цену. При этом цена объектов может быть в разной валюте, то есть один объект стоит миллион долларов США, а второй стоит миллион евро. На сайте можно отображать цену как есть. Но тут появляются две проблемы:
1. Сортировка и сравнение объектов по цене - мы с вами понимаем, что сортировать по значению нельзя, если разные валюты
2. Конвертация цен для пользователя - как кэшировать
Начнем с первой проблемы, она проще. Самым простым и очевидным решением мне показалось прикрутить просто дополнительное свойство к элементам с объектами недвижимости в инфоблоке, в котором бы хранилась долларовая цена, чтобы все объекты можно было сравнивать и сортировать по цене в одной валюте. Это поле пересчитывается при событии сохранения объекта, а также по CRON'у раз в сутки. Курсы валют берутся из стандартного модуля валют битрикса. Как вариант, можно было бы прикрутить на событие обновления курсов валют, но уже не стал с этим заморачиваться. Теперь при сортировке объектов в каталоге использовалась не цена объекта, а только долларовая цена. То есть каждый объект в каталоге теперь имеет две цены: своя в любой валюте и пересчитанная долларовая цена.
Вторая проблема оказалась интересней. Все объекты на сайте должны показываться как в валюте объекта, так и в валюте, которую выберет пользователь. Например, есть объект стоимостью в миллион евро, а пользователь хочет видеть все цены на сайте в долларах США. Надо конвертировать. Встает проблема - как быть с кэшированием? Учитывая, что цена попадает в кэшируемую часть шаблона компонента, получается, что нам придется создавать кэшей во столько раз больше, сколько валют будет использоваться на сайте. Ладно бы валют было всего 3, так ведь их 20, включая всякую экзотику, которую ради интереса может кто-то попробовать.
Решение проблемы нашлось не сразу, а родилось в тяжелых муках и напрягах извилин и мне показалось достаточно оптимальным. Итак, решено сделать следующее. Везде, где выводятся цены мы показываем цены исключительно как есть, но без форматирования. А для конвертации суммы мы будем использовать JS. Ну а дальше все несложно. Каждый вывод цены в html имеет вид:
JS парсит все тэги span класса price, разбиваем по пробелу на код валюты и значение. А потом span.price заменяем на отформатированное значение, используя переменные JS с коэффициентами конвертации валют. Мы использовали jquery, поэтому всё очень просто, для перебора всех тэгов:
Также была использована функция JS, аналогичная php-ной number_format(). В итоге для пользователя цена будет вида $1 350 700. Кэш не забит хламом, пользователь доволен, поисковики тоже цену нормально воспринимают.
------------------------
Далее постараюсь рассказать:
* Расположение, фильтрация и поиск объектов на карте
* Сортировка объектов по подробности описания
* Реализация простой подписки риэлтора на тарифный план в 2 клика
* Организация географии на сайте (каталог стран и городов)
* Средней сложности CRM для риэлторов, решаемые задачи (еще делается)
p.s. очень уж мне нравится заниматься проектом по недвижимости, посмотришь на объекты где-нибудь на другой стороне планеты и слюнями обтечешь весь. Появляется огромное желание творить и ваять. Вот к примеру, скромное жилище на Барбадосе за $5.5M

Итак, все объекты на сайте имеют цену. При этом цена объектов может быть в разной валюте, то есть один объект стоит миллион долларов США, а второй стоит миллион евро. На сайте можно отображать цену как есть. Но тут появляются две проблемы:
1. Сортировка и сравнение объектов по цене - мы с вами понимаем, что сортировать по значению нельзя, если разные валюты
2. Конвертация цен для пользователя - как кэшировать
Начнем с первой проблемы, она проще. Самым простым и очевидным решением мне показалось прикрутить просто дополнительное свойство к элементам с объектами недвижимости в инфоблоке, в котором бы хранилась долларовая цена, чтобы все объекты можно было сравнивать и сортировать по цене в одной валюте. Это поле пересчитывается при событии сохранения объекта, а также по CRON'у раз в сутки. Курсы валют берутся из стандартного модуля валют битрикса. Как вариант, можно было бы прикрутить на событие обновления курсов валют, но уже не стал с этим заморачиваться. Теперь при сортировке объектов в каталоге использовалась не цена объекта, а только долларовая цена. То есть каждый объект в каталоге теперь имеет две цены: своя в любой валюте и пересчитанная долларовая цена.
Вторая проблема оказалась интересней. Все объекты на сайте должны показываться как в валюте объекта, так и в валюте, которую выберет пользователь. Например, есть объект стоимостью в миллион евро, а пользователь хочет видеть все цены на сайте в долларах США. Надо конвертировать. Встает проблема - как быть с кэшированием? Учитывая, что цена попадает в кэшируемую часть шаблона компонента, получается, что нам придется создавать кэшей во столько раз больше, сколько валют будет использоваться на сайте. Ладно бы валют было всего 3, так ведь их 20, включая всякую экзотику, которую ради интереса может кто-то попробовать.
Решение проблемы нашлось не сразу, а родилось в тяжелых муках и напрягах извилин и мне показалось достаточно оптимальным. Итак, решено сделать следующее. Везде, где выводятся цены мы показываем цены исключительно как есть, но без форматирования. А для конвертации суммы мы будем использовать JS. Ну а дальше все несложно. Каждый вывод цены в html имеет вид:
<span class="price">EUR 1000000</span> |
JS парсит все тэги span класса price, разбиваем по пробелу на код валюты и значение. А потом span.price заменяем на отформатированное значение, используя переменные JS с коэффициентами конвертации валют. Мы использовали jquery, поэтому всё очень просто, для перебора всех тэгов:
$('.price').each(function(){...}); |
Также была использована функция JS, аналогичная php-ной number_format(). В итоге для пользователя цена будет вида $1 350 700. Кэш не забит хламом, пользователь доволен, поисковики тоже цену нормально воспринимают.
------------------------
Далее постараюсь рассказать:
* Расположение, фильтрация и поиск объектов на карте
* Сортировка объектов по подробности описания
* Реализация простой подписки риэлтора на тарифный план в 2 клика
* Организация географии на сайте (каталог стран и городов)
* Средней сложности CRM для риэлторов, решаемые задачи (еще делается)
p.s. очень уж мне нравится заниматься проектом по недвижимости, посмотришь на объекты где-нибудь на другой стороне планеты и слюнями обтечешь весь. Появляется огромное желание творить и ваять. Вот к примеру, скромное жилище на Барбадосе за $5.5M
