13Июн/180
Обновление курса валют в Битрикс
Для Битрикса есть популярное решение для обновление курса валют - https://marketplace.1c-bitrix.ru/solutions/asd.currencyrate/
Однако, решение не работает, если базовая валюта не рубли.
В моём случае, когда это фунты(GBP), решаю это вот таким куском гавнокода:
<?php
include __DIR__ . '/bitrix.php';
$contents = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp');
$neededCurrency = 'GBP';
// Глупая проверка на то, что нам вернули что-то нормальное
if (stripos($contents,$neededCurrency) > 0) {
$xml = simplexml_load_string($contents);
$date = $xml->attributes()->Date;
CModule::IncludeModule('currency');
$format = "DD.MM.YYYY";
// получим формат текущего сайта
$new_format = CSite::GetDateFormat("SHORT");
// переведем дату из одного формата в другой
$new_date = $DB->FormatDate($date, $format, $new_format);
// в результате получим дату в новом формате
echo "Date $date - $new_date\n";
$arFilter = [
"CURRENCY" => "RUB",
'DATE_RATE' => $new_date,
];
$by = "date";
$order = "desc";
$row = CCurrencyRates::GetList($by, $order, $arFilter)->Fetch();
if ($row === false) {
foreach ($xml->Valute as $valute) {
if (((string)$valute->CharCode) === $neededCurrency) {
$value = (float)str_replace(',', '.', ((string)$valute->Value) ?? 0);
if ($value > 0) {
$value = number_format(1 / $value * 1.05, 4, '.', '');
$arFields = [
"RATE" => $value,
"RATE_CNT" => 1,
"CURRENCY" => "RUB",
"DATE_RATE" => $new_date,
];
if (!CCurrencyRates::Add($arFields)) {
echo "Ошибка добавления курса $date - $value\n";
echo $APPLICATION->GetException() . "\n\n";
} else {
echo "Обновили курс $date - $value\n";
}
return;
}
}
}
} else {
echo "Курс на $date уже есть\n";
}
}
8Июн/180
Достигаем цели статистики просто в AjaxForm MODX
Чтобы засчитывались цели Яндекс.Метрики или Google Analytics в MODX при использовании FormIt и AjaxForm достаточно трёх простых шагов:
Шаг 1. Заводим цели как Javascript событие:
Шаг 2. В вёрстке каждой форме добавляем data-атрибут data-goal="название вашей цели", например
<form data-goal="zakaz">
Шаг 3. Добавляем простой обработчик:
$(document).on('af_complete', function(event, response) {
var form = response.form;
var goal = form.data('goal') || null;
if (goal) {
try {
window.yaCounter48925430.reachGoal(goal);
} catch (e) {}
}
});
try-catch нужен для того, чтобы если вдруг у нас не прогрузилась метрика(привет, РКН) - у нас ничего не сломалось.

