Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
CakePHP: Code/Helpers/PHPToFirebug ...

Вывод из PHP в Firebug. Helper для CakePHP

Автор Владимир Лучанинов


Как вы делаете отладку? В запутанных случаях я использую Zend Debugger, а в простых случаях пишу pr($variable).


Прочитав Ярослава, я вдруг осознал насколько удобно было бы не мусорить окно браузера, а красиво выводить отладочные сообщения в Firebug. Особенно приятно туда выводить сложные объекты и большие массивы так как Firebug позволяет удобно такие вещи просматривать.


Но реализация от Ярослава мне не подходит.
Там много всяких полезностей, но мне они не нужны :). Схожие функции выполняет будет когда-то выполнять дополнительная панель к Firebug – FirePHP. Но это совсем уже монстр, к тому же пока очень бета. Может, когда его доработают, то я себе установлю.


А пока мне просто нужно писать во View <?=$jsDebug->console($strangeVariable)?>, где переменная может быть как целым числом, так и сложным массивом или объектом. Это перекрывает 90% потребностей. Бонусом является возможность добавления стандартных иконок Firebug (warn, info, error) и иногда устанавливать переменную javascipt, чтобы потом javascriptом её и обрабатывать. А для тех, у кого нет Firebug, можно использовать метод alert.


Как обычно начинаем с теста, который покажет как использовать этот helper.

<?
loadHelper
('JsDebug');

class 
JsDebugTest extends UnitTestCase {
    var 
$helper null;

    function 
setUp() {
        
$this->helper = new JsDebugHelper();
    }

    function 
testConsole() {
        
$result $this->helper->console('');
        
$this->assertEqual('<script type="text/javascript">console.log(eval(""))</script>'$result);

        
$result $this->helper->console('1');
        
$this->assertEqual('<script type="text/javascript">console.log(eval("1"))</script>'$result);

        
$result $this->helper->console(array(1,2,3));
        
$this->assertEqual('<script type="text/javascript">console.log(eval([1,2,3]))</script>'$result);

        
$result $this->helper->console(array('one'=>'test','two'=>array(1,2,3),3));
        
$this->assertEqual('<script type="text/javascript">console.log(eval({"one":"test","two":[1,2,3],"0":3}))</script>'$result);
    }

    function 
testConsoleTypes() {
        
$result $this->helper->console('1''info');
        
$this->assertEqual('<script type="text/javascript">console.info(eval("1"))</script>'$result);

        
$result $this->helper->info('1');
        
$this->assertEqual('<script type="text/javascript">console.info(eval("1"))</script>'$result);

        
$result $this->helper->warn('1');
        
$this->assertEqual('<script type="text/javascript">console.warn(eval("1"))</script>'$result);

        
$result $this->helper->error('1');
        
$this->assertEqual('<script type="text/javascript">console.error(eval("1"))</script>'$result);
    }

    function 
testSet() {
        
$result $this->helper->set('''test');
        
$this->assertEqual('<script type="text/javascript">var test = eval("")</script>'$result);

        
$result $this->helper->set('1''test');
        
$this->assertEqual('<script type="text/javascript">var test = eval("1")</script>'$result);

        
$result $this->helper->set(array(1,2,3), 'test');
        
$this->assertEqual('<script type="text/javascript">var test = eval([1,2,3])</script>'$result);

        
$result $this->helper->set(array('one'=>'test','two'=>array(1,2,3),3), 'test');
        
$this->assertEqual('<script type="text/javascript">var test = eval({"one":"test","two":[1,2,3],"0":3})</script>'$result);
    }

    function 
testAlert() {
        
$result $this->helper->alert('');
        
$this->assertEqual('<script type="text/javascript">alert(\'\')</script>'$result);

        
$result $this->helper->alert('1');
        
$this->assertEqual('<script type="text/javascript">alert(\'1\')</script>'$result);

        
$result $this->helper->alert(array(1,2,3));
        
$this->assertEqual('<script type="text/javascript">alert(\'Array\n(\n    [0] => 1\n    [1] => 2\n    [2] => 3\n)\n\')</script>'$result);

        
$result $this->helper->alert(array('one'=>'test','two'=>array(1,2,3),3));
        
$this->assertEqual('<script type="text/javascript">alert(\'Array\n(\n    [one] => test\n    [two] => Array\n        (\n            [0] => 1\n            [1] => 2\n            [2] => 3\n        )\n\n    [0] => 3\n)\n\')</script>'$result);
    }

    function 
tearDown() {
        unset(
$this->helper);
    }
}
?>


А вот и сам helper

<?
/**
 * JsDebug helper
 *
 * Sends php variables to Firebugs console.log or just sets javascript variable
 * Console method requires Firebug at client browser. You can download it at http://www.getfirebug.com
 *
 * @author Vladimir Luchaninov
 * @version 1.0 (16 Oct 2007)
 */

class JsDebugHelper extends Helper {

    var 
$varPrefix 'JsDebug_';
    var 
$varCounter 1;

    
/**
     * Makes Firebug console.log of $value
     *
     * @param variant $value
     * @param string $type
     *     You may specify icon near the debug message. Possible values: info, warn, error
     * @return string
     */
    
function console($value$type=null) {
        if (empty(
$type) || !in_array($type, array('info''warn''error'))) {
            
$type 'log';
        }

        return 
$this->output($this->_wrapScript('console.'.$type.'('.$this->_wrapEval($value).')'));
    }

    function 
info($value) {
        return 
$this->console($value'info');
    }

    function 
warn($value) {
        return 
$this->console($value'warn');
    }

    function 
error($value) {
        return 
$this->console($value'error');
    }

    
/**
     * Alerts variable dump
     *
     * @param variant $value
     * @return string
     */
    
function alert($value) {
        
ob_start();
        
print_r($value);
        
$value ob_get_clean();

        return 
$this->output($this->_wrapScript('alert(\''.$this->_escapeString($value).'\')'));
    }

    
/**
     * Sets javascript variable
     *
     * @param variant $value
     * @param string $name
     *     If empty then name will be generated as JsDebug_1, JsDebug_2, ...
     * @return string
     */
    
function set($value$name=null) {
        if (empty(
$name)) {
            
$name $this->varPrefix $this->varCounter++;
        }

        return 
$this->output($this->_wrapScript('var '.$name.' = '.$this->_wrapEval($value)));
    }

    
/**
     * Very similar to Javascript Helper escapeString
     * But this version also includes replacement of </script>
     *
     * @param string $string
     * @return string
     */
    
function _escapeString($string) {
        
$escape = array(
            
"\r\n" => '\n',
            
"\r" => '\n',
            
"\n" => '\n',
            
'"' => '\"',
            
"'" => "\\'",
            
'</script>' => '<\/script>'
        
);
        return 
r(array_keys($escape), array_values($escape), $string);
    }

    function 
_wrapScript($s) {
        return 
'<script type="text/javascript">'.$s.'</script>';
    }

    function 
_wrapEval($value) {
        return 
'eval('.json_encode($value).')';
    }

}
?>


 
Комментарии
Добавить комментарий:

Файлов нет. [Показать файлы/форму]