У меня есть файл PHP со следующим содержимым:
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->IncludeComponent(
"hoo:account",
"hoo",
array(
"COMPONENT_TEMPLATE" => "hoo",
"ACCOUNT_URL" => "/account/",
"LOG_IN_URL" => "/log-in/",
"FIELDS_REQUIRED" => array(
0 => "FIRST_NAME",
1 => "LAST_NAME",
2 => "BIRTHDAY",
),
"FIELDS_VALIDATED" => array(
0 => "BIRTHDAY",
1 => "COMPANY_VAT_CODE",
),
"AGE_MIN" => "18",
"AGE_MAX" => "180",
"COMPANY_VAT_CODE_VALIDATION_SERVICE_CACHE_TTL" => "86400",
"COMPANY_VAT_CODE_VALIDATION_SERVICE_SERVICE_UNAVAILABLE_ERROR" => "Y",
...
), false);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>
Каким-то образом мне нужно проанализировать этот файл, чтобы получить ассоциативный массив с параметрами, чтобы использовать его где-то еще в моем коде. Пожалуйста, дайте мне несколько идей и примеров кода, как достичь этой цели.
Заранее спасибо!
@aynber это выглядит очевидным решением, но я хочу оставить его таким по какой-то причине. Точнее, если я помещу массив в отдельную переменную, редактирование свойств компонента через графический интерфейс CMS перестанет работать.
@ViacheslavRavdin, пожалуйста, объясните лучше свой последний комментарий
Для этого нет встроенного способа, если только код, который вы хотите извлечь, не соответствует последовательным правилам форматирования.
@Barman на самом деле так и есть, функция $APPLICATION->IncludeComponent имеет третий параметр, который я хочу извлечь...
Файл начинается с <? а не с <?php. Если это оплошность, исправьте свой код.
@lukas.j php.net/manual/en/ini.core.php#ini.short-open-tag
@ViacheslavRavdin Разве они не устарели с PHP 7.4 и не предназначены для полного удаления?
@lukas.j Честно говоря, я не знаю, но производитель моей CMS требует, чтобы для этой директивы было установлено значение 0.






Используя Tokenizer, я смог написать небольшой парсер для достижения своей цели:
<?
$tokens = token_get_all();
$componentName = "hoo:account";
$arParams = array();
foreach ($tokens as $tokenKey => $token) {
if (is_array($token)) {
if (_getTokenName($token) == "T_STRING" &&
_getToken($tokens, $tokenKey + 3) == $componentName
) {
$isComponent = true;
} elseif (_getTokenName($token) == "T_STRING" &&
_getToken($tokens, $tokenKey + 3) != $componentName
) {
$isComponent = false;
}
if ($isComponent) {
if (_getTokenName($token) == "T_DOUBLE_ARROW") {
if (_getTokenName($tokens[$tokenKey - 2]) == "T_CONSTANT_ENCAPSED_STRING") {
if (_getTokenName($tokens[$tokenKey + 2]) == "T_ARRAY") {
$key = _getToken($tokens, $tokenKey - 2);
} else {
$arParams[_getToken($tokens, $tokenKey - 2)] = _getToken($tokens, $tokenKey + 2);
}
} elseif (_getTokenName($tokens[$tokenKey - 2]) == "T_LNUMBER") {
$arParams[$key][] = _getToken($tokens, $tokenKey + 2);
}
}
}
}
}
function _getTokenName(array $token): string {
return token_name($token[0]);
}
function _getToken(array $tokens, int $key): int | string {
return trim($tokens[$key][1], "\"");
}
?>
У вас уже есть ассоциативный массив, который вы передаете в IncludeComponent. Просто извлеките его и сохраните где-нибудь еще, чтобы вы могли ссылаться на него там, где вам это нужно. Где хранить, решать вам.