Yandex Metrika
sanches.free 4 просмотра

Валидный JSON вместо строки из CUtil::PhpToJSObject в Битрикс

В чём несостыковка

Ядро 1С-Битрикс долго использует метод CUtil::PhpToJSObject как замену json_encode для встраивания PHP-массива во фронтовый код. По сути получается не JSON, а фрагмент JS-объекта: ключи часто без кавычек, строки оборачиваются одинарными кавычками и т. д. Такой литерал нормален для BX*-скриптов ядра, но ломает сценарии, где данные хотят один-в-один передать через JSON.parse().

Современный стандарт в D7

Для тех же задач во фреймворке D7 логичнее сразу вызывать Bitrix\Main\Web\Json::encode(): в режиме UTF-8 там используется штатный json_encode, результат соответствует спецификации JSON.

Подключение через bx_js_encode

Внутри CUtil::PhpToJSObject заложен хук на глобальную пользовательскую функцию с именем bx_js_encode. Если она объявлена, ядро отдаёт ей уже подготовленную структуру данных и параметры белого пробела, экранирования тильды и расширенных типов. Достаточно один раз подключить файл с реализацией (инициализация модуля, init.php и т. п.) до первого вызова PhpToJSObject.

function bx_js_encode($payloadStruct, $flagPrettyPrint, $flagSkipTilde, $flagExtTypes)
{
	return \Bitrix\Main\Web\Json::encode($payloadStruct);
}

Если не нужно тянуть класс из пространства имён ядра, достаточно вернуть json_encode($payloadStruct, JSON_UNESCAPED_UNICODE) для латиницы и кириллицы в ключах без экранирования Юникода.

После подключения обёртки всё содержимое, которое раньше уходило в «компактный JS», станет строкой формальной JSON там, где сработает этот кодовый путь. Учитывайте совместимость с устаревшим JS-теми местами ядра, которые читают объектный литерал без строгого JSON: при глобальной подмене стоит прогнать критические сценарии в административной части и публичных шаблонах.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии