Битрикс не дает вставить такое длинное сообщение на форум. Перенес код на pastebin
Задача: проводить калькуляция аффилиатов автоматически. Допустим, я хочу делать это каждый раз при изменении статуса доставки. В init.php делаю событие свое. А в нем пишу вот такую вещь:
Код
function calculateAffiliates($orderId, $payed){
if ($payed == "Y")
{
$arOrder = CSaleOrder::GetByID($orderId);
CSaleAffiliate::CalculateAffiliate($arOrder["AFFILIATE_ID"], false, false, false, false);
}
}
Кстати, я использую функцию в точности также, как она используется в modules/sale/admin/affiliate.php Там при выборе списка аффилиатов и выборе пункта меня производится калькуляция. Код точно такой же.
И почему-то меняется дата последней калькуляции, но не начисляется сумма. А если я делаю то же самое через админку, то все работает.
Решил поискать причину сам и поиски завели меня в файл bitrix/monules/sale/general/affiliate.php В нем в строке 487 выполняется вот такой код:
Этот код, как не сложно догадаться, выбирает все заказы у которых AFFILIATE_ID равен нужному нам. И возвращает, согласно документации, объект класса CDBResult, содержащий ассоциативные массивы с ключами.
Но дело в том, что при, казалось бы, одном и том же запросе результат работы совершенно разный. Внимание, сейчас будут простыни. Оденьте шапочку из фольги.
И теперь если мы используем метод Fetch для первого объекта, то результатом будет пустой массив и сумма не начисляется. А если мы используем тот же метод для второго объекта, то результат будет удовлетворительный.
Я так понимаю, таких событий нет. Мне нужно после регистрации аффилиата получить id зарегистрировавшегося пользователя. Как это сделать без модификации стандартных компонентов? Это возможно?
После регистрации в $arResult нет ничего мне нужного.
Да, но SITE_ID при этом равна ru Я просто так назвал пост потому, что из-за SITE_ID меняется url. В принципе, не это важно. А почему и как от этого избавиться.
Почему-то мне кажется, что использовать для этого два события и переменную это не самый правильный подход.Так я ведь и в onBefore не могу получить значение до изменения. Или могу?
Задача: при изменении инфоблока сделать что-либо если прошлое значение своства было равно А, а теперь стало равно Б.
В init.php я делаю обработчик на OnAfterIBlockElementUpdate (пробовал и Before) и легко могу получитьновые свойства инфоблока. Но мне нужно проверить, а каким было старое, до изменения?
Точней, мне было бы достаточно узнать, меняли ли это свойство при сохранении элемента.
Это условие выполняется при условии, что загружена картинка. У меня было свойство типа файл. Множественное. Возможно, вам стоит уменьшить глубина цикла и достаточно одного foreach. Если тип не множественное.
В общем, ищутся такие штуки просто. Теперь я это знаю. Включаем отображение ошибок и видим, что headers already sent. И имя файла. В моем случае это был prolog.before.php. Из-за него пол сайта не работало.
Буду умнее. Узнал очень много нового перечитав кучу мануалов в поисках проблем.
Все отлично работает. Теперь я добавляю в файл a.php строчки для работы с API битрикс:
Код
define("NO_KEEP_STATISTIC", true); //Не учитываем статистику
define("NOT_CHECK_PERMISSIONS", true); //Не учитываем права доступа
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Получаю данные из битрикса и снова формирую из массива json: json_encode($json);
Пробуем еще раз в файле b.php получить данные. И после json_decode ничего не возвращается. Если получать json_last_error, то получим JSON_ERROR_SYNTAX
Ок, может у нас формируется поврежденный json? Попробуем закодировать и раскодировать в том же файле a.php. Все работает.
Очевидно, что проблема в звене a.php -> b.php Ок, проверим BOM. В b.php пишем:
Код
$json = file_get_contents("http://site.ru/a.php");
$bom = chr(0xEF).chr(0xBB).chr(0xBF); //сигнатура BOM
echo substr_compare($bom, $json, 0, strlen($bom)) == 0; //выведет 1 если есть и 0 если нет
Разумеется, выводит 1.
Вывод: в моих файлах установлена правильная кодировка, у меня формируется правильный json, в файлах в папке php_interface (кроме пары файлов платежек, которые я исключил) кодировка UTF-8 без BOM. Внимание, вопрос: кто виноват и что делать?
В php_interface проверил все файлы. Там нет BOM. Он есть в парочке файлов платежных систем, которые находятся в папке sale_payment Могут ли они влиять?
Я пока для теста делаю json из простейшего массива, который генерирую сам.
Что конкретно не понятно, как сделать? Для смены шрифта нужно знать самые базовые вещи. 1. Находим шаблон компонента в битриксе. 2. Открываем файл template.php 3. Ищем строку <span class="titl_bottom">тут_какая_то_переменная</span> 4. Добавляем class="titl_bottom newfont" 5. Открываем /bitrix/templates/primershop_catalog/template_styles.css 6. И пишем там:
Создаю отдельный файл test.php Хочу в нем использовать некоторое API битрикса. Подключаю его:
Код
define("NO_KEEP_STATISTIC", true); //Не учитываем статистику
define("NOT_CHECK_PERMISSIONS", true); //Не учитываем права доступа
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
Получаю все нужны мне данные и вывожу их в json.
Код
echo json_encode($json);
Все отлично выводится, но проблема в том, что отображение json происходит в кодировке UTF-8 BOM и этот мерзкий управляющий знак не дает работать json_decode. У меня совершенно точно в моем файле кодировка UTF-8. Подозреваю, что откуда-то его ставит битрикс. Как и откуда?