Вывод из 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).')';
}
}
?>