Страница 1 из 1

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

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

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

Добавлено: 2010.09.01, 22:44
slavcodev
Yii::app()->end();

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

Добавлено: 2010.09.02, 09:59
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, а остальные удалить

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

Добавлено: 2010.09.02, 10:38
slavcodev
А выключить профайлер не получается?
CProfileLogRoute::$enabled

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

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

Добавлено: 2010.09.06, 14:34
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;
    } 
обычно добавляю в компонент.

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

Добавлено: 2010.09.07, 11:55
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, т.к. она в массив инициализированных компонентов добавляет массив настроек компонента

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

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

Добавлено: 2011.10.16, 13:02
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++)
 

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

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

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

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