Отключение вывода информации профайлера в экшене

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Отключение вывода информации профайлера в экшене

Сообщение Ryadnov »

Нужно чтоб в определенном экшене, который к примеру отдает файл, не выводилась информация профайлера.
die() не предлагать)
(когда-то проскакивало на форуме, но поиск ничего не дает)

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Отключение вывода информации профайлера в экшене

Сообщение slavcodev »

Yii::app()->end();
Жду Yii 3!

Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: Отключение вывода информации профайлера в экшене

Сообщение Ryadnov »

Спасибо, но это не верно.

в CApplication::end() вызывается событие onEndRequest
А там уже запусткается обработчик processLogs (CLogRouter::processLogs())
который управляет маршрутизацией сообщений (http://www.yiiframework.ru/doc/guide/ru/topics.logging), по правилам прописанным нами в конфиге

Код: Выделить всё

'log'=>array(
    'class'=>'CLogRouter',
    'routes'=>array(
    'file'=>array(
        'class'=>'CFileLogRoute',
        'levels'=>'trace, info, error, warning',
        'categories'=>'system.*',
    ),
    'profile' => array(
        'class' => 'CProfileLogRoute',
        //'levels' => 'profile',
    ),
    array(
        'class' => 'CWebLogRoute',
        'levels' => 'error, warning, trace, profile, info',
    ),
    ),
),
 
можно конечно удалить обработчик

Код: Выделить всё

Yii:app()->detachEventHandler('onEndRequest', array(Yii::app()->getComponent('log'), 'processLogs')); 
но хотелось бы, в конкретном экшене, оставить маршрут на CFileLogRoute, а остальные удалить

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Отключение вывода информации профайлера в экшене

Сообщение slavcodev »

А выключить профайлер не получается?
CProfileLogRoute::$enabled

или воспользоваться фильтром, чтоб проверить активный экшн
CProfileLogRoute::$filter
Жду Yii 3!

Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Отключение вывода информации профайлера в экшене

Сообщение BuCeFaL »

Код: Выделить всё

public function showProfile($param=false){
        for ($i=0;$i<Yii::app()->getComponent('log')->routes->getCount();$i++)
        if ('CProfileLogRoute'== get_class(Yii::app()->getComponent('log')->routes->remove($i)))
        Yii::app()->getComponent('log')->routes->remove($i)->enabled=$param;
    } 
обычно добавляю в компонент.

Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: Отключение вывода информации профайлера в экшене

Сообщение Ryadnov »

@mc-bear
не получилось

@BuCeFaL
Спасибо! А то до этого весь класс приходилось копировать, и вносить свои изменения...
только у роутов бывают названия, поэтому переписал с использованием foreach

получилось это

Код: Выделить всё

class LogRouter extends CLogRouter {

    public function disableProfile(){
        foreach (Yii::app()->getComponent('log')->routes as $route) {
            if(in_array(get_class($route), array('CProfileLogRoute', 'CWebLogRoute'))) {
                $route->enabled = false;
            }
        }
    }
} 
------------------------------------------------------------------------------------------------

и кто-бы объяснил, на кой чёрт есть функция CLogRouter::setRoutes? (внутри фреймворка она не используется)
а результат её действия - PHP Error, т.к. она в массив инициализированных компонентов добавляет массив настроек компонента

Я не правильно её готовлю или баг?

Аватара пользователя
pls-kick-me
Сообщения: 42
Зарегистрирован: 2011.02.05, 22:39
Откуда: Украина, Донецк

Re: Отключение вывода информации профайлера в экшене

Сообщение pls-kick-me »

BuCeFaL писал(а):

Код: Выделить всё

public function showProfile($param=false){
        for ($i=0;$i<Yii::app()->getComponent('log')->routes->getCount();$i++)
        if ('CProfileLogRoute'== get_class(Yii::app()->getComponent('log')->routes->remove($i)))
        Yii::app()->getComponent('log')->routes->remove($i)->enabled=$param;
    } 
Меня бы мой препод задавил бы за этот код :) , в том смысле что надо так:

Код: Выделить всё

  $count = Yii::app()->getComponent('log')->routes->getCount();
  for ($i=0; $i < $count; $i++)
 
Yes I'm Insistent

Аватара пользователя
KiTE
Сообщения: 112
Зарегистрирован: 2012.04.12, 14:47

Re: Отключение вывода информации профайлера в экшене

Сообщение KiTE »

Если цель отключать любой посторонний вывод на страницу, то можно так:

Код: Выделить всё

foreach( Yii::app()->log->routes as $route ){
    if( $route instanceof CWebLogRoute ){
        $route->enabled=false;
    }
} 
Этот код отключит экземпляры CWebLogRoute и экземпляры всех его потомков (например CProfileLogRoute).

Ответить