ФорумПрограммированиеJavaScript → Аналог var_export ?

Аналог var_export ?

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 7:50

    Подскажите как в JS красиво вывести произвольные данные (отладка) чтобы не тупо писала "object", а попыталась развернуть массив скажем. В PHP я пользую var_export или var_dump, а здесь как?
    Прошу jQuery + плагины не предлагать. Что-нибудь простое.

    Типа:

    document.write(mydump(data));

    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 7:59, спустя 8 минут 45 секунд

    artoodetoo, напиши mydump и выложи тут заодно :)

    я обычно делаю console.log - от файрбага консоль и там уже просматриваю "дерево" объекта
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 8:00, спустя 1 минуту 19 секунд

    phpdude, я то надеялся, что ты уже написал mydump() )))
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 8:02, спустя 1 минуту 48 секунд

    artoodetoo, люблю когда меня спрашивают прилюдно, мог в личку спросить ))))))))))) неа не написал, думал пару раз, да обошелся firebug консолью
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 9:43, спустя 1 час 40 минут 33 секунды


    function dump(varval, varname)
    {
    var text = '';
    var padding = '';

    if (typeof(dump.level) == 'undefined') dump.level = 0;
    dump.level++;
    for(var j = 1; j < dump.level; j++) padding += ' ';

    text = padding;
    if (typeof(varname) != 'undefined') {
    text += '"' + varname + '"' + ': ';
    }

    if (typeof(varval) == 'object') {
    text += '{\n';
    for (var key in varval) {
    var val = varval[key];
    text += dump(val, key);
    }
    text += padding + '},\n';
    } else {
    text += '"' + varval + '"' + ',\n';
    }

    dump.level–;
    return text;
    }
    ιιlllιlllι унц-унц
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 14 сентября 2010 г. 9:58, спустя 15 минут 12 секунд

    в мемориз! :)
    А то порой заебывает консоле.лог )))
    Спустя 7 сек.
    спасибо!
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 10:29, спустя 31 минуту 6 секунд

    велосипед:
    сохраняем дебугинфу в формате json

    <?php

    class QbApp
    {

    function end()
    {
       $time  = microtime(TRUE);
       $start = Qb::get('start');

       $data = array(
           'request' => $_SERVER['REQUEST_METHOD'] . ':' . $_SERVER['REQUEST_URI'],
           'at'      => gmdate('r', $start),
           'time'    => $time - $start,
           'log'     => QbLog::get(),
       );

       $fileName = dirname(__FILE__) . '/../log/' . $start . '.txt';
       file_put_contents($fileName, json_encode($data));
    }

    }


    Где-то в шаблоне выводится ссылка на viewdebug.php?id=xxx
    а вот viewdebug.php

    <?php

    if (!isset($_GET['id']) || strspn($_GET['id'], '1234567890.') != strlen($_GET['id'])) {
       die('Wrong id');
    }

    $file = './log/'.$_GET['id'].'.txt';
    if (!file_exists($file)) {
       die('Log not found');
    }
    $data = file_get_contents($file);

    ?>
    <script type="text/javascript">
    var data = <?php echo $data ?>;

    function dump(varval, varname)
    {
     var text = '';
     var padding = '';

     if (typeof(dump.level) == 'undefined') dump.level = 0;
     dump.level++;
     for(var j = 1; j < dump.level; j++) padding += '  ';

     text = padding;
     if (typeof(varname) != 'undefined') {
       text += '"' + varname + '"' + ': ';
     }

     if (typeof(varval) == 'object') {
       text += '{\n';
       for (var key in varval) {
         var val = varval[key];
         text += dump(val, key);
       }
       text += padding + '},\n';
     } else {
       text += '"' + varval + '"' + ',\n';
     }

     dump.level–;
     return text;
    }

    </script>

    <h1>Debug info</h1>

    <script type="text/javascript">
    document.write('<b>Request</b>: ' + data['request'] + '<br/>\n');
    document.write('<b>At</b>: ' + data['at'] + '<br/>\n');
    document.write('<b>Exec. time</b>: ' + data['time'] + ' sec<br/>\n');
    document.write('<h2>Log</h2><pre>' + dump(data['log']) + '</pre>');
    </script>



    fullsize screenshot
    результат
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 11:38, спустя 1 час 8 минут 54 секунды

    да ну нафиг, мне console.log() хватает… не люблю я лишние библиотеки встраивать
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 12:32, спустя 54 минуты 22 секунды

    хозяин барин. мне вот понадобилось
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 14 сентября 2010 г. 12:59, спустя 26 минут 57 секунд

    я js почти не трогаю, так, по крайней необходимости. в console.log мне не нравится, что эта штука везде кроме FF+FireBug будет порождать ошибку. а когда отлаживаешся, постоянно переключаешся FF->Opera->IE и по кругу. некузяво жить с ошибками
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 26 сентября 2010 г. 10:16, спустя 11 дней 21 час 16 минут

    UP

    Захотелось мне выводить время генерации страницы и всякие логи прямо на самой странице. Получил проблему курицы и яйца: в момент рендеринга страницы я еще не обладаю всей нужной инфой.

    Выручает JavaScript. Реальную инфу я могу сохранять во внешний файл в своем обработчике shutdown или в деструкторе объекта приложения, что один хрен.
    А во время рендеринга мне достаточно знать id этого сеанса. Браузер за меня обратится к js с отладочной инфой и через document.write() всё отрисует.


    <script type="text/javascript" src="js/dump.js"></script>
    <script type="text/javascript" src="<?php echo $app->debugFile ?>"></script>


    Здесь $app->debugFile имя файла с данными в формате JSON, имя включает в себя microtime() для уникальности.

    И никакого AJAX не понадобилось :)
    К.О. торжествуе!

    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 сентября 2010 г. 13:23, спустя 3 часа 7 минут 4 секунды

    а ведь можно повесить listener на отдачу ответа классом Response
    в теле handler'а, который будет обрабатывать ответ будет находиться что-то типа
    str_ireplace('</body>', $toolbar . '</body>', $response->getContent());
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 26 сентября 2010 г. 14:01, спустя 38 минут 6 секунд

    я не понял. или ты не понял
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 сентября 2010 г. 14:15, спустя 13 минут 25 секунд

    Получил проблему курицы и яйца: в момент рендеринга страницы я еще не обладаю всей нужной инфой.

    после рендеринга но перед отдачей ответа пользователю проходишься поиском и заменой по телу ответа и вставляешь свои логи и время генерации (я в прошлом сообщении это показал).
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 26 сентября 2010 г. 14:42, спустя 27 минут 40 секунд

    здесь много "если"

    - да я написал "рендеринг страницы", но не факт, что я буду отдавать html. а логи желательно сохранять в любом случае

    - смотря что я хочу замерить. в идеале я меряю время до exit(). в твоем случае - до конца работы шаблонизатора. это близко, но опять не факт. зависит от структуры приложения

    - кто сказал что у меня есть объект response и вообще что я в явную использую буферизацию

    слишком много зависимостей.
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!