Доброго времени суток.
Довольно часто есть желание что-то быстро поправить в произвольном файле продукта через встроенный файловый менеджер. И досадно, когда секундное редактирование может окончиться сбоем в работе какой-то публичной страницы, а ещё хуже - ядра.
[spoiler]
В связи с этим сделал просто скрипт, который проверяет файл на корректность перед сохранением:
осталось только указать путь к PHP:
Теперь при ошибке в коде получаем подобные сообщения:
файл не сохранится, пока ошибка не будет исправлена.
P.S. Только не сильно увлекайтесь правками ядра
P.S.S. Спасибо за идею
Спасибо за внимание.
Довольно часто есть желание что-то быстро поправить в произвольном файле продукта через встроенный файловый менеджер. И досадно, когда секундное редактирование может окончиться сбоем в работе какой-то публичной страницы, а ещё хуже - ядра.
[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;
}
?> |
define("PATH_TO_PHP", "/usr/bin/php"); |
Теперь при ошибке в коде получаем подобные сообщения:

файл не сохранится, пока ошибка не будет исправлена.
P.S. Только не сильно увлекайтесь правками ядра

P.S.S. Спасибо за идею
Спасибо за внимание.