Как вы делаете отладку? В запутанных случаях я использую 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).')'; }
}
?>