- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/mail/internal/eventmessage.php
- Класс: BitrixMainMailInternalEventMessageTable
- Вызов: EventMessageTable::replaceTemplateToPhp
static function replaceTemplateToPhp($str, $fromTemplateToPhp=true)
{
preg_match_all("/#([0-9a-zA-Z_.]+?)#/", $str, $matchesFindPlaceHolders);
$matchesFindPlaceHoldersCount = count($matchesFindPlaceHolders[1]);
for($i=0; $i<$matchesFindPlaceHoldersCount; $i++)
if(mb_strlen($matchesFindPlaceHolders[1][$i]) > 200)
unset($matchesFindPlaceHolders[1][$i]);
if(empty($matchesFindPlaceHolders[1]))
return $str;
$ar = $matchesFindPlaceHolders[1];
$strResult = $str;
$arReplaceTagsOne = array();
if(!$fromTemplateToPhp)
{
foreach($ar as $k)
{
$replaceTo = '#'.$k.'#';
$replaceFrom = '$arParams["'.$k.'"]';
$replaceFromQuote = '$arParams[''.$k.'']';
$replaceFromPhp = '='.$replaceFrom.';?>';
$arReplaceTagsOne[$replaceFromPhp] = $replaceTo;
$arReplaceTagsOne[$replaceFrom] = $replaceTo;
$arReplaceTagsOne[$replaceFromQuote] = $replaceTo;
}
}
else
{
$replaceTemplateString = '';
foreach($ar as $k) $replaceTemplateString .= '|#'.$k.'#';
$arReplaceTags = array();
$bOpenPhpTag = false;
preg_match_all('/(|?>'.$replaceTemplateString.')/', $str, $matchesTag, PREG_OFFSET_CAPTURE);
foreach($matchesTag[0] as $tag)
{
$placeHolder = $tag[0];
$placeHolderPosition = $tag[1];
$ch1 = mb_substr($placeHolder, 0, 1);
$ch2 = mb_substr($placeHolder, 0, 2);
if($ch2 == "")
$bOpenPhpTag = true;
elseif($ch2 == "?>")
$bOpenPhpTag = false;
elseif($ch1 == "#")
{
$placeHolderClear = mb_substr($placeHolder, 1, mb_strlen($placeHolder) - 2);
$bOpenQuote = (mb_substr($str, $placeHolderPosition - 2, 2) == '"{');
$bCloseQuote = (mb_substr($str, $placeHolderPosition + mb_strlen($placeHolder), 2) == '}"');
if($bOpenPhpTag && $bOpenQuote && $bCloseQuote)
$replaceTo = '$arParams[''.$placeHolderClear.'']';
else
$replaceTo = '$arParams["'.$placeHolderClear.'"]';
if(!$bOpenPhpTag) $replaceTo = '=' . $replaceTo . ';?>';
$arReplaceTags[$tag[0]][] = $replaceTo;
}
}
foreach($arReplaceTags as $k => $v)
{
if(count($v)>1)
{
foreach($v as $replaceTo)
{
$resultReplace = preg_replace('/'.$k.'/', $replaceTo, $strResult, 1);
if($resultReplace !== null)
$strResult = $resultReplace;
}
}
else
{
$arReplaceTagsOne[$k] = $v[0];
}
}
}
if(!empty($arReplaceTagsOne))
$strResult = str_replace(array_keys($arReplaceTagsOne), array_values($arReplaceTagsOne), $strResult);
// php parser delete newline folowing the closing tag in string passed to eval
$strResult = str_replace(array("?>n", "?>rn"), array("?>nn", "?>rnrn"), $strResult);
return $strResult;
}