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).')';

    }

}

?>