четверг, 29 января 2015 г.

Автоматическое обновление цен по курсу НБРБ в MODX

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

Решение
Создаем в админке ресурс "Курс евро к белорусскому рублю" и, например, в longtitle этого ресурса будет записываться текущий курс. Это удобно тем, что кроме автоматической привязки к курсу, клиент может также при необходимости выставлять его и вручную.

Для товара создаем tv-параметр price, в котором будет хранится стоимость товара в евро.

Далее создаем сниппет price со следующим кодом:
<?php
$id=$document['id'];
$price = (isset($price)) ? $price : '';
$i=$modx->db->query("SELECT longtitle FROM `modx_site_content` WHERE  id = 35 ");
$row = $modx->db->getRow($i);
$document_tvs=$modx->getTemplateVarOutput(true, $id);
$templatevar_output=$document_tvs['price'];
$output = round(($price*$row['longtitle']),-2);
echo $output;
?>
Этот сниппет для каждого товара посчитает его стоимость в белорусских рублях, взяв из tv-параметра price стоимость в евро, умножив ее на курс евро из longtitle ресурса с id=35 (это ресурс, который мы создали ранее) и округлив до двух знаков.

Далее создаем сниппет kurs. Он будет парсить xml сайта нацбанка Беларуси и записывать в longtitle ресурса с id=35 курс евро к белорусскому рублю, умноженный на 2%, как требовалось в задании.
<?php
$kursi = @simplexml_load_file('http://www.nbrb.by/Services/XmlExRates.aspx');
if ($kursi != FALSE) { 
    foreach ($kursi->Currency as $Currency) {
    if ($Currency->NumCode == '978')
{
$euro=$Currency->Rate*1.02;
$query = "UPDATE `modx_site_content` set longtitle='$euro' where id = 35";
$res = mysql_query($query);
echo $euro;
    }
}
}
$modx->clearCache('full');
?>
Где 978 - код евро у нацбанка.

В контент ресурса с курсом евро (id=35) вписываем вызов этого сниппета:
[!kurs!]

Ставим на хостинге задание для планировщика Cron каждый день в 00:00 посещать ресурс, на котором вызывается сниппет kurs, т.е. ресурс с id=35. Таким образом, каждый день в 00:00 в базу данных в ячейку longtitle этого ресурса будет записываться свежий курс евро.








В чанках и шаблонах для отображении итоговой стоимости товара используем:
[!price? &price=`[*price*]`!]
либо
[!price? &price=`[+price+]`!]

Комментариев нет:

Отправить комментарий