-
Notifications
You must be signed in to change notification settings - Fork 93
Класс для вывода данных
global $USER; if ($USER->isAdmin()){echo "<pre>"; print_r($arResult); echo "</pre>";die()}
Чтобы было удобнее использовать код рекомендую сделать LiveTemplate в вашей IDE. У меня сделан на строку bxeco
.
Этот код, наиболее подходящий для того, чтобы быстро что-то посмотреть, его не рекомендуется исопользовать на production сервере или по крайнеймере делать это как можно более аккуратнее в виду следующих особенностей:
- Не использовать в файле
init.php
(Если в этом файле будут ошибки, то нерабочий будет весь проект). Так как в этом файле ещё не создаётся объект$USER
, для этого объект нужно создать:
<?php
global $USER;
if (!is_object($USER)){
$USER = new \CUser();
}
if ($USER->isAdmin()){echo "<pre>"; print_r($arResult); echo "</pre>";die()}
- Не использовать в кэшируемых областях, иначе вывод так и останется в области, пока не сбросить кэш.
- Не использовать в кэшируемых областях (шаблонах стандартных компонентов bitrix) с неустановленной галочкой "Учитывать права доступа" в опциях хранения кэша.
- Не использовать в любых кэшируемых областях, если по мимо вас на проекте ведут рабработку, или есть пользователи-администраторы работающие с сайтом.
- Аккуратно использовать с функцией die().
- Следить, чтобы после работы этот код где-то не остался.
Как следствие, это достаточно рискованный и морально устаревшний подход. Можно обернуть код в функцию - это более читабельно и более безопасно.
/**
* @param $variable
* @param array $params
*
* From pretty print. You can change userId and userGroup on default values
*/
function pp($variable, array $params = []){
//...
}
Использование:
/*вывод переменной $arResult для администратора*/
pp($arResult);
/*вывод переменной $arResult для админоа и прерывает выполнение текущего скрипта*/
pp($arResult, ['die' => true]);
/*вывод переменной $arResult для пользователя с ID = 1*/
pp($arResult, ['userId' => 1]);
/*вывод переменной $arResult для пользователя, состоящего в группе пользователей с ID = 2*/
pp($arResult, ['userGroup' => 2]);
/*вывод переменной $arResult для администратора в файл
$_SERVER['DOCUMENT_ROOT'] . '/../bx_log.log' */
pp($arResult, ['tofile' => true]);
/*вывод переменной $arResult для администратора в файл
$_SERVER['DOCUMENT_ROOT'] . '/example_log.log' */
pp($arResult, [
'toFile' => true,
'file' => ['src' => 'example_log.log']
]);
Уже лучше, но использовать функцию тоже достаточно устаревший подход, к тому же неудобен вызов функции, если необходимо передать сразу несколько параметров, то это долго и она себя не опрадывает, поэтому можно написать класс.
Что нам даёт класс?
- Гибкость. Можно настроить все входные параметры один раз при объявлении класса.
- Наглядность. Методы класса удобнее читаются.
- Повторное использование. Можно использовать несколько экземпляров класса
<?php
/**
* Class BxEcho
*/
class BxEcho{
//...
}
Использование:
<?php
/*Вывод переменной $arResult на экран для администратора*/
$bxeco = new BxEcho($arResult);
$bxeco->show()
/*Вывод переменной $arResult на экран для администратора*/
$bxeco = new BxEcho();
$bxeco->show($arResult)
/*Вывод переменной $arResult на экран, в консоль,
в файл ($_SERVER['DOCUMENT_ROOT'] . '/../bx_log.log')
для администратора*/
$bxeco = new BxEcho($arResult, ['file' => '../bx_log.log']);
$bxeco->show()->toFile()->toConsole();
/*Вывод переменной $arResult на экран для пользователя с Id = 1*/
$bxeco = new BxEcho($arResult, ['userId' => 1]);
$bxeco->show()
/*Если задать все необходимые условия в классе то можно использовать короткую запись*/
$bxeco = new BxEcho($arResult);$bxeco->show()-stop();
/*или*/
(new BxEcho($arResult))->show();
Нарушение объектно-ориентированного подхода, а именно: класс перегружен избыточными методами проверки. Для того, чтобы избежать данного недостатка, необходимо разделить обязанности класса и создать из него 2 класса. Один класс отвечающий за условие срабатывания, второй класс - за вывод.
- Метод
Debug::dumpToFile()
можно заменить на методDebug::writeToFile()
из ядра d7. В данном случае внутри метода используетсяprint_r
вместоvar_export
.
use \Bitrix\Main\Diag\Debug;
// print_r
Debug::writeToFile($variable, null, $file);
// var_export
Debug::dumpToFile($variable, null, $file);
В этом случае имя файла можно не задавать, по умолчанию путь к файлу такой: $_SERVER["DOCUMENT_ROOT"] . "/" . $file
, что может являться уязвимостью, так как файл лога доступен из корневой папки (соответственно может быть доступен через http
протокол).
<?php global $USER; if ($USER->isAdmin()){echo "<pre>"; print_r($arResult); echo "</pre>";die()}
<?php
use \Bitrix\Main\Diag\Debug;
use \Bitrix\Main\Application;
/**
* Class BxEcho
*/
class BxEcho{
/**
* @var
*/
protected $user;
/**
* @var
*/
protected $docRoot;
/**
* @var array
*/
protected $params = [
'fileAppend' => true,
'file' => "../bx_log.log"
];
/**
* @var array
*/
protected $variables = [];
/**
* BxEcho constructor.
* @param null $variable
* @param array $params
*/
public function __construct($variable = null, array $params = []){
$this->_setUser();
if (isset($variable))
$this->addVariable($variable);
if (isset($params) && is_array($params))
$this->setParams($params);
$this->docRoot = Application::getDocumentRoot();
return $this;
}
/**
* @param array $params
* @return $this
*/
public function setParams(array $params){
if (!is_array($params))
return $this;
foreach($params as $key => $val){
$this->params[$key] = $val;
}
return $this;
}
/**
* @param $variable
* @return $this
*/
public function addVariable($variable){
$this->variables[] = $variable;
return $this;
}
/**
* @return bool
*/
public function check(){
if (!$this->params['userGroup'] && !$this->params['userId'] && !$this->user->isAdmin())
return false;
if ($this->params['userId'] && $this->user->GetId() != $this->params['userId'])
return false;
if ($this->params['userGroup'] && !\CSite::InGroup([$this->params['userGroup']]))
return false;
return true;
}
/**
* @param null $variable
* @return $this
*/
public function show($variable = null){
if (!$this->check()) return $this;
if (isset($variable))
$show = $variable;
else
$show = $this->variables;
echo "<pre>"; print_r($show); echo "</pre>";
return $this;
}
/**
* @param null $variable
* @return $this
*/
public function toFile($variable = null){
if (!$this->check()) return $this;
if (isset($variable))
$toFile = $variable;
else
$toFile = $this->variables;
if (!$this->params['fileAppend'] && file_exists($this->docRoot . '/' . $this->params['file']))
unlink($this->docRoot . '/' . $this->params['file'])
Debug::dumpToFile($toFile, null, $this->params['file']);
return $this;
}
/**
* @param null $variable
* @return $this
*/
public function toConsole($variable = null){
if (!$this->check()) return $this;
if (isset($variable))
$show = $variable;
else
$show = $this->variables;
$jsObj = json_encode($show);
echo '<script>console.log(' . $jsObj . ');</script>';
return $this;
}
/**
*
*/
public function stop(){
if (!$this->check()) return $this;
die();
}
/**
*
*/
protected function _setUser(){
global $USER;
if (!is_object($USER)){
$USER = new \CUser();
}
$this->user = $USER;
}
}
<?php
global $USER;
if (!is_object($USER)){
$USER = new \CUser();
}
if ($USER->isAdmin()){echo "<pre>"; print_r($arResult); echo "</pre>";die()}
<?php
use \Bitrix\Main\Diag\Debug;
/**
* @param $variable
* @param array $params
*
* From pretty print. You can change userId and userGroup on default values
*/
function pp($variable, array $params = []){
if (!isset($variable))
return;
global $USER;
if (!is_object($USER))
$USER = new \CUser();
$defParams = [
'toFile' => false,
'file' => [
'path' => '../bx_log.log',
'fileAppend' => true
]
];
$params = $params + $defParams;
if (!$params['userGroup'] && !$params['userId'] && !$USER->isAdmin())
return;
if ($params['userId'] && $USER->GetId() != $params['userId'])
return;
if ($params['userGroup'] && !\CSite::InGroup([$params['userGroup']]))
return;
if ($params['toFile'] && $params['file']['path']){
$docRoot = \Bitrix\Main\Application::getDocumentRoot();
if (!$params['file']['fileAppend'] && file_exists($docRoot . '/' . $params['file']['path']))
unlink($docRoot . '/' . $params['file']['path'])
Debug::dumpToFile($variable, null, $params['file']['path']);
} else {
echo "<pre>"; print_r($variable); echo "</pre>";
}
if ($params['die'])
die();
}