Довольно часто есть желание что-то быстро поправить в произвольном файле продукта через встроенный файловый менеджер. И досадно, когда секундное редактирование может окончиться сбоем в работе какой-то публичной страницы, а ещё хуже - ядра. [spoiler] В связи с этим сделал просто скрипт, который проверяет файл на корректность перед сохранением:
<?
AddEventHandler("main", "OnBeforeChangeFile", "OnBeforeChangeFileHandle");
function OnBeforeChangeFileHandle($abs_path, $strContent)
{
define("PATH_TO_PHP", "/usr/bin/php");
// Для веб окружения путь к PHP будет следующим
//define("PATH_TO_PHP", "C:\Program Files (x86)\Bitrix Environment\apache2\zendserver\bin\php.exe");
if (substr($abs_path, strlen($abs_path)-3, 3) == "php")
{
$tmpPath = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/cache/".substr(md5(time()), 0,3)."_".basename($abs_path);
if (file_exists($tmpPath ))
unlink ($tmpPath);
$f = fopen($tmpPath, "a+");
if ($f)
{
$tmpProlog = '<?php $_SERVER["DOCUMENT_ROOT"] = "'.$_SERVER["DOCUMENT_ROOT"].'"; ?>';
fwrite($f, $tmpProlog);
fwrite($f, $strContent);
fclose($f);
//syntax analyse
$parse_error = "";
$command1 = '"'.PATH_TO_PHP.'" -l "'.$tmpPath.'"';
ex ec($command1, $text1, $errNum1);
if (!($errNum1 === 0 && is_array($text1) && strpos($text1[0], "No syntax errors detected") === 0))
{
unlink ($tmpPath);
$GLOBALS['APPLICATION']->ThrowException($text1[1]);
return false;
}
$command2 = '"'.PATH_TO_PHP.'" -f "'.$tmpPath.'"';
$fatal_error = ex ec($command2, $text2, $errNum2);
if ($fatal_error !== "" && strpos($fatal_error, "on line") !== false)
{
unlink ($tmpPath);
$GLOBALS['APPLICATION']->ThrowException($fatal_error);
return false;
}
unlink ($tmpPath);
}
}
return true;
}
?>
осталось только указать путь к PHP:
define("PATH_TO_PHP", "/usr/bin/php");
Теперь при ошибке в коде получаем подобные сообщения: файл не сохранится, пока ошибка не будет исправлена.
Правильно я понимаю, что, например, при редактировании любого component.php нам никогда не удастся его сохранить? В нём не подключается пролог, однако, используемые классы (как минимум, CModule) получаются не объявленными
Изначально не предполагал, что будете править компоненты.В Вашем случае можно вторую команду не выполнять, ограничившись только синтаксической проверкой файла.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».