コード例 #1
0
    /**
     * Render debug toolbar
     *
     * @return string
     */
    public static function render()
    {
        $loaded_classes = application::get(['application', 'loaded_classes']);
        self::$data['session'] = [];
        if (!empty($_SESSION)) {
            self::$data['session'] = [$_SESSION];
        }
        $application = application::get();
        $result = '<div class="container" dir="ltr">';
        $result .= '<table cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<td>';
        $result .= '<table width="100%">';
        $result .= '<tr>';
        $result .= '<td nowrap>&nbsp;' . html::a(['value' => 'Hide All', 'href' => 'javascript:void(0);', 'onclick' => "\$('.debuging_toolbar_class').hide();"]) . '&nbsp;</td>';
        foreach (self::$data as $k => $v) {
            if ($k == 'errors') {
                $count = count(error_base::$errors);
            } else {
                if ($k == 'classes') {
                    $count = count($loaded_classes);
                } else {
                    if ($k == 'application') {
                        $count = count($application);
                    } else {
                        if ($k == 'phpinfo') {
                            $count = 1;
                        } else {
                            $count = count($v);
                        }
                    }
                }
            }
            $result .= '<td nowrap>&nbsp;' . html::a(['value' => ucwords($k) . ' (' . $count . ')', 'id' => "debuging_toolbar_{$k}_a", 'href' => 'javascript:void(0);', 'onclick' => "\$('#debuging_toolbar_{$k}').toggle();"]) . '&nbsp;</td>';
        }
        $result .= '<td width="50%" align="right">' . html::a(['href' => '/numbers/frontend/system/controller/dev', 'value' => 'Dev. Portal']) . '</td>';
        $result .= '</tr>';
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // errors
        $result .= '<tr id="debuging_toolbar_errors" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Errors (' . count(error_base::$errors) . ')</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        foreach (error_base::$errors as $k => $v) {
            $result .= '<tr>';
            $result .= '<td><b>' . error_base::$error_codes[$v['errno']] . ' (' . $v['errno'] . ') - ' . implode('<br/>', $v['error']) . '</b></td>';
            $result .= '</tr>';
            $result .= '<tr>';
            $result .= '<td>File: ' . $v['file'] . ', Line: ' . $v['line'] . '</td>';
            $result .= '</tr>';
            $result .= '<tr>';
            $result .= '<td><pre>' . $v['code'] . '</pre></td>';
            $result .= '</tr>';
            $result .= '<tr>';
            $result .= '<td><pre>' . implode("\n", $v['backtrace']) . '</pre></td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // suppressed
        $result .= '<tr id="debuging_toolbar_suppressed" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Suppressed (' . count(self::$data['suppressed']) . ')</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        foreach (self::$data['suppressed'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td><b>' . error_base::$error_codes[$v['errno']] . ' (' . $v['errno'] . ') - ' . implode('<br/>', $v['error']) . '</b></td>';
            $result .= '</tr>';
            $result .= '<tr>';
            $result .= '<td>File: ' . $v['file'] . ', Line: ' . $v['line'] . '</td>';
            $result .= '</tr>';
            $result .= '<tr>';
            $result .= '<td><pre>' . $v['code'] . '</pre></td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // javascript
        $result .= '<tr id="debuging_toolbar_js" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Javascript Errors (' . count(self::$data['js']) . ')</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        foreach (self::$data['js'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td><b>' . implode('<br/>', $v['error']) . '</b></td>';
            $result .= '</tr>';
            $result .= '<tr>';
            $result .= '<td>File: ' . $v['file'] . ', Line: ' . $v['line'] . '</td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '<div id="debuging_toolbar_js_data">';
        $result .= '&nbsp;';
        $result .= '</div>';
        $result .= '</td>';
        $result .= '</tr>';
        // benchmark first
        $result .= '<tr id="debuging_toolbar_benchmark" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Benchmark (' . count(self::$data['benchmark']) . ')' . '</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Name</th>';
        $result .= '<th>Time</th>';
        $result .= '<th>Start</th>';
        $result .= '<th>Total</th>';
        $result .= '<th>Memory</th>';
        $result .= '</tr>';
        foreach (self::$data['benchmark'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td>' . $v['name'] . '</td>';
            $result .= '<td align="right">' . $v['time'] . '</td>';
            $result .= '<td align="right">' . $v['start'] . '</td>';
            $result .= '<td align="right">' . $v['total'] . '</td>';
            $result .= '<td align="right">' . format::memory($v['memory'], 'm') . '</td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // sql
        $result .= '<tr id="debuging_toolbar_sql" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Sql (' . count(self::$data['sql']) . ')' . '</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Sql</th>';
        $result .= '<th>Error</th>';
        $result .= '<th>Errno</th>';
        $result .= '<th>Num Rows</th>';
        $result .= '<th>Affected Rows</th>';
        //$result.= '<th>Rows</th>';
        $result .= '<th>Key</th>';
        $result .= '<th>Structure</th>';
        $result .= '<th>Time</th>';
        $result .= '</tr>';
        foreach (self::$data['sql'] as $k => $v) {
            $temp = is_array($v['key']) ? implode('<br/>', $v['key']) : $v['key'];
            // header first
            $result .= '<tr>';
            $result .= '<td valign="top"><pre style="width: 500px;">' . nl2br($v['sql']) . '</pre></td>';
            $result .= '<td valign="top">' . implode('<br/>', $v['error']) . ' - ' . implode('<br/>', $v['error_original'] ?? []) . '</td>';
            $result .= '<td valign="top">' . $v['errno'] . '</td>';
            $result .= '<td valign="top">' . $v['num_rows'] . '</td>';
            $result .= '<td valign="top">' . $v['affected_rows'] . '</td>';
            //$result.= '<td valign="top">' . html::table(['options' => $v['rows']]) . '</td>';
            $result .= '<td valign="top">' . $temp . '</td>';
            $result .= '<td valign="top">' . html::table(['options' => $v['structure']]) . '</td>';
            $result .= '<td valign="top">' . $v['time'] . '</td>';
            $result .= '</tr>';
            // results second
            if (!empty($v['rows'])) {
                $temp = array_keys(current($v['rows']));
                $header = array_combine($temp, $temp);
                if (!empty($header)) {
                    $result .= '<tr>';
                    $result .= '<td valign="top" colspan="8" style="max-width: 1000px; overflow: scroll;">' . html::table(['header' => $header, 'options' => $v['rows']]) . '</td>';
                    $result .= '</tr>';
                }
            }
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // cache
        $result .= '<tr id="debuging_toolbar_cache" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Cache (' . count(self::$data['cache']) . ')' . '</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Type</th>';
        $result .= '<th>Link</th>';
        $result .= '<th>Cache #</th>';
        $result .= '<th>Has Data</th>';
        $result .= '</tr>';
        foreach (self::$data['cache'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td valign="top">' . $v['type'] . '</td>';
            $result .= '<td valign="top">' . $v['link'] . '</td>';
            $result .= '<td valign="top">' . $v['cache_id'] . '</td>';
            $result .= '<td valign="top">' . ($v['have_data'] ? 'Yes' : 'No') . '</td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // dump
        $result .= '<tr id="debuging_toolbar_dump" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Dump (' . count(self::$data['dump']) . ')' . '</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Name</th>';
        $result .= '<th>Dump</th>';
        $result .= '</tr>';
        foreach (self::$data['dump'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td valign="top">' . $v['name'] . '</td>';
            $result .= '<td valign="top"><pre>' . print_r($v['value'], true) . '</pre></td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // input
        $result .= '<tr id="debuging_toolbar_input" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Input (' . count(self::$data['input']) . ')' . '</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Input</th>';
        $result .= '</tr>';
        foreach (self::$data['input'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td valign="top"><pre>' . print_r($v, true) . '</pre></td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // session
        $result .= '<tr id="debuging_toolbar_session" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Session (' . count(self::$data['session']) . ')' . '</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Session</th>';
        $result .= '</tr>';
        foreach (self::$data['session'] as $k => $v) {
            $result .= '<tr>';
            $result .= '<td valign="top"><pre>' . print_r($v, true) . '</pre></td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // autoloaded classes
        $result .= '<tr id="debuging_toolbar_classes" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Loaded Classes (' . count($loaded_classes) . ')</h3>';
        $result .= '<table border="1" cellpadding="2" cellspacing="2" width="100%">';
        $result .= '<tr>';
        $result .= '<th>Class Name</th>';
        $result .= '<th>File</th>';
        $result .= '<th>Media</th>';
        $result .= '</tr>';
        foreach ($loaded_classes as $k => $v) {
            $result .= '<tr>';
            $result .= '<td><b>' . $v['class'] . '</b></td>';
            $result .= '<td>' . $v['file'] . '</td>';
            $result .= '<td>' . html::table(['options' => $v['media']]) . '</td>';
            $result .= '</tr>';
        }
        $result .= '</table>';
        $result .= '</td>';
        $result .= '</tr>';
        // application
        $result .= '<tr id="debuging_toolbar_application" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Application (' . count($application) . ')</h3>';
        $result .= print_r2($application, true);
        $result .= '</td>';
        $result .= '</tr>';
        // phpinfo
        $result .= '<tr id="debuging_toolbar_phpinfo" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>PHPInfo</h3>';
        helper_ob::start();
        phpinfo();
        $str = helper_ob::clean();
        $str = preg_replace('%^.*<body>(.*)</body>.*$%ms', '$1', $str);
        $str .= <<<TTT
\t\t\t\t\t\t\t<style type="text/css">
\t\t\t\t\t\t\t\t#phpinfo table {
\t\t\t\t\t\t\t\t\tborder: 1px solid #000;
\t\t\t\t\t\t\t\t}
\t\t\t\t\t\t\t\t#phpinfo table tr {
\t\t\t\t\t\t\t\t\tborder-bottom: 1px solid #000;
\t\t\t\t\t\t\t\t}
\t\t\t\t\t\t\t</style>
TTT;
        $result .= '<div id="phpinfo">' . $str . '</div>';
        $result .= '</td>';
        $result .= '</tr>';
        // acls
        $result .= '<tr id="debuging_toolbar_acls" class="debuging_toolbar_class" style="display: none;">';
        $result .= '<td>';
        $result .= '<h3>Acls (' . count(debug::$data['acls']) . ')</h3>';
        $result .= print_r2(debug::$data['acls'], true);
        $result .= '</td>';
        $result .= '</tr>';
        $result .= '</table>';
        $result .= '</div>';
        return $result;
    }