- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
public static function PhpToJSObject($arData, $bWS = false, $bSkipTilda = false, $bExtType = false)
{
static $use_bx_encode = null;
if (!isset($use_bx_encode))
$use_bx_encode = function_exists('bx_js_encode');
if ($use_bx_encode)
return bx_js_encode($arData, $bWS, $bSkipTilda, $bExtType);
switch(gettype($arData))
{
case "string":
if(preg_match("#['\"\\n\\r<\\\\\x80]#", $arData))
return "'".CUtil::JSEscape($arData)."'";
else
return "'".$arData."'";
case "array":
$i = -1;
$j = -1;
foreach($arData as $j => $temp)
{
$i++;
if ($j !== $i)
break;
}
if($j === $i)
{
$res = '[';
$first = true;
foreach($arData as $key => $value)
{
if($first)
$first = false;
else
$res .= ',';
switch(gettype($value))
{
case "string":
if(preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
$res .= "'".CUtil::JSEscape($value)."'";
else
$res .= "'".$value."'";
break;
case "array":
$res .= CUtil::PhpToJSObject($value, $bWS, $bSkipTilda, $bExtType);
break;
case "boolean":
if($value === true)
$res .= 'true';
else
$res .= 'false';
break;
case "integer":
case "double":
if ($bExtType)
$res .= $value;
else
$res .= "'".$value."'";
break;
default:
if(preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
$res .= "'".CUtil::JSEscape($value)."'";
else
$res .= "'".$value."'";
break;
}
}
$res .= ']';
return $res;
}
$sWS = ','.($bWS ? "\n" : '');
$res = ($bWS ? "\n" : '').'{';
$first = true;
foreach($arData as $key => $value)
{
if ($bSkipTilda && substr($key, 0, 1) == '~')
continue;
if($first)
$first = false;
else
$res .= $sWS;
if(preg_match("#['\"\\n\\r<\\\\\x80]#", $key))
$res .= "'".CUtil::JSEscape($key)."':";
else
$res .= "'".$key."':";
switch(gettype($value))
{
case "string":
if(preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
$res .= "'".CUtil::JSEscape($value)."'";
else
$res .= "'".$value."'";
break;
case "array":
$res .= CUtil::PhpToJSObject($value, $bWS, $bSkipTilda, $bExtType);
В ядре битрикса в файле bitrix/modules/main/tools.php на 4613 строке, длинной в 141 строку (жаль здесь ограничение на 100 строк), есть замечательный метод который по сути почти повторяет json_encode().
Почти - это потому, что это говно генерит невалидный json (использует одинарные ковычки), да еще не учитывает типы (true превратится в строку 'true').
Битриксоиды этим подосрали даже не веб-студиям, они просто нагенерировали себе много дополнительной работы на долгое время вперед.
Желаю им держать эту планку, и никогда не расти.
roskomgovno 05.07.2018 17:53 # +1
Теперь пускай XmlToPHP напишут
Geffest 11.09.2018 23:28 # +1
Когда-то давно, когда еще только начинал знакомство с битриксом и PHP, решил использовать для решения реальной задачи их XML парсер (потому что не знал, какие вообще есть способы решить задачу). Все настроил, натравили скрипт на реальные данные. И оказалось, что работает очень долго, сервер падает и т.д. Тогда я чуть-чуть погуглил, заменил парсер на SimpleXML. И оказалось, что все работает прекрасно, быстро, никаких проблем больше не возникало. Вот в тот момент я понял, что из себя представляют все эти велосипеды от битрикса.
А вообще да, PhpToJSObject это тот еще велосипед. Они в своем ядре его используют обычно, чтобы присваивать js переменной и потом использовать. Вообще я так думаю, они написали все эти велосипеды, чтобы битрикс работал на любом окружении, с любыми настройками сервера и т.д. Возможно, свой отпечаток наложил тот факт, что раньше большую долю составляло использование битрикса на кодировке 1251, где есть нюансы использования стандартных функций.
А вообще. Это уже старое ядро. В новом ядре D7 ребята написали много новых велосипедов:
http://bxapi.ru/src/?module_id=main&name=Json%3A%3Aencode
http://bxapi.ru/src/?module_id=main&name=Json%3A%3Adecode
По сути, теперь просто обертка для php функций.
guest8 05.07.2018 22:22 # −999