Skip to content
This repository has been archived by the owner on Sep 9, 2020. It is now read-only.

Класс для вывода данных

John edited this page Feb 20, 2017 · 2 revisions

Bitrix echo <pre>

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().
  • Следить, чтобы после работы этот код где-то не остался.

Как следствие, это достаточно рискованный и морально устаревшний подход. Можно обернуть код в функцию - это более читабельно и более безопасно.

Используем функцию pp.php

/**
 * @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']
]); 

Уже лучше, но использовать функцию тоже достаточно устаревший подход, к тому же неудобен вызов функции, если необходимо передать сразу несколько параметров, то это долго и она себя не опрадывает, поэтому можно написать класс.

Используем класс BxEcho.php

Что нам даёт класс?

  • Гибкость. Можно настроить все входные параметры один раз при объявлении класса.
  • Наглядность. Методы класса удобнее читаются.
  • Повторное использование. Можно использовать несколько экземпляров класса
<?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 протокол).

any.php

<?php global $USER; if ($USER->isAdmin()){echo "<pre>"; print_r($arResult); echo "</pre>";die()}

BxEcho.php

<?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;
    }
}

init.php

<?php 
  global $USER;
  if (!is_object($USER)){
    $USER = new \CUser();
  }
  if ($USER->isAdmin()){echo "<pre>"; print_r($arResult); echo "</pre>";die()}

pp.php

<?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();
}

Ссылки по теме

Bitrix

Bxapi.ru

PHP

Clone this wiki locally