Блог веб-программиста

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";
    }
}
Связано с категорией: Code Нет комментариев
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 нужен для того, чтобы если вдруг у нас не прогрузилась метрика(привет, РКН) - у нас ничего не сломалось.

Связано с категорией: Code Нет комментариев