Browse Source

New error/exception page WIP.

tags/2.0.0-beta
resurtm 12 years ago
parent
commit
fa0022e7e1
  1. 1
      apps/bootstrap/controllers/SiteController.php
  2. 99
      apps/bootstrap/www/tmp/main.css
  3. 81
      apps/bootstrap/www/tmp/main.js
  4. 119
      framework/yii/base/ErrorHandler.php
  5. 209
      framework/yii/views/errorHandler.php
  6. 34
      framework/yii/views/errorHandler/callStackItem.php
  7. 101
      framework/yii/views/errorHandler/main.php

1
apps/bootstrap/controllers/SiteController.php

@ -21,6 +21,7 @@ class SiteController extends Controller
public function actionIndex() public function actionIndex()
{ {
throw new \yii\base\HttpException(500, 'Test exception'); throw new \yii\base\HttpException(500, 'Test exception');
$x = 1;
echo $this->render('index'); echo $this->render('index');
} }

99
apps/bootstrap/www/tmp/main.css vendored

@ -50,9 +50,6 @@ h1,h2,p,img,ul li{
font-family: Arial,sans-serif; font-family: Arial,sans-serif;
color: #505050; color: #505050;
} }
body,html{
/*overflow-x: hidden;*/
}
/* header */ /* header */
.header{ .header{
@ -85,70 +82,70 @@ body,html{
text-shadow: 0 1px 0 #cacaca; text-shadow: 0 1px 0 #cacaca;
} }
/* traceback */ /* call stack */
.traceback{ .call-stack{
margin-top: 30px; margin-top: 30px;
margin-bottom: 40px; margin-bottom: 40px;
} }
.traceback ul li{ .call-stack ul li{
margin: 1px 0; margin: 1px 0;
} }
.traceback ul li .li-wrap{ .call-stack ul li .element-wrap{
cursor: pointer; cursor: pointer;
padding: 15px 0; padding: 15px 0;
} }
.traceback ul li.application .li-wrap{ .call-stack ul li.application .element-wrap{
background-color: #fafafa; background-color: #fafafa;
} }
.traceback ul li .li-wrap:hover{ .call-stack ul li .element-wrap:hover{
background-color: #edf9ff; background-color: #edf9ff;
} }
.traceback ul li .li{ .call-stack ul li .element{
min-width: 860px; /* 960px - 50px * 2 */ min-width: 860px; /* 960px - 50px * 2 */
max-width: 1100px; /* 1200px - 50px * 2 */ max-width: 1100px; /* 1200px - 50px * 2 */
margin: 0 auto; margin: 0 auto;
padding: 0 50px; padding: 0 50px;
position: relative; position: relative;
} }
.traceback ul li a{ .call-stack ul li a{
color: #505050; color: #505050;
} }
.traceback ul li a:hover{ .call-stack ul li a:hover{
color: #000000; color: #000000;
text-shadow: 0 1px 0 #cacaca; text-shadow: 0 1px 0 #cacaca;
} }
.traceback ul li .number{ .call-stack ul li .number{
width: 45px; width: 45px;
display: inline-block; display: inline-block;
} }
.traceback ul li .text{ .call-stack ul li .text{
color: #bbbbbb; color: #bbbbbb;
} }
.traceback ul li.application .text{ .call-stack ul li.application .text{
color: #505050; color: #505050;
} }
.traceback ul li .at{ .call-stack ul li .at{
position: absolute; position: absolute;
right: 110px; /* 50px + 60px */ right: 110px; /* 50px + 60px */
color: #bbbbbb; color: #bbbbbb;
} }
.traceback ul li.application .at{ .call-stack ul li.application .at{
color: #505050; color: #505050;
} }
.traceback ul li .line{ .call-stack ul li .line{
position: absolute; position: absolute;
right: 50px; right: 50px;
width: 60px; width: 60px;
text-align: right; text-align: right;
} }
.traceback ul li .code-wrap{ .call-stack ul li .code-wrap{
display: none; display: none;
position: relative; position: relative;
} }
.traceback ul li.application .code-wrap{ .call-stack ul li.application .code-wrap{
display: block; display: block;
} }
.traceback ul li .error-line{ .call-stack ul li .error-line,.call-stack ul li .hover-line{
background-color: #ffebeb; background-color: #ffebeb;
position: absolute; position: absolute;
width: 100%; width: 100%;
@ -156,29 +153,36 @@ body,html{
z-index: 100; z-index: 100;
margin-top: 15px; margin-top: 15px;
} }
.traceback ul li .code{ .call-stack ul li .hover-line{
background: none;
}
.call-stack ul li .hover-line.hover,.call-stack ul li .hover-line:hover{
background: #edf9ff !important;
}
.call-stack ul li .code{
min-width: 860px; /* 960px - 50px * 2 */ min-width: 860px; /* 960px - 50px * 2 */
max-width: 1100px; /* 1200px - 50px * 2 */ max-width: 1100px; /* 1200px - 50px * 2 */
margin: 0 auto; margin: 0 auto;
padding: 15px 50px; padding: 15px 50px;
position: relative; position: relative;
} }
.traceback ul li .code .lines{ .call-stack ul li .code .lines{
position: absolute; position: absolute;
z-index: 200; z-index: 200;
left: 50px; left: 50px;
line-height: 18px; line-height: 18px;
font-size: 14px; font-size: 14px;
font-family: Consolas, Courier New, monospaced; font-family: Consolas, Courier New, monospace;
color: #bbbbbb; color: #bbbbbb;
} }
.traceback ul li .code pre{ .call-stack ul li .code pre{
position: relative; position: relative;
z-index: 200; z-index: 200;
left: 50px; left: 50px;
line-height: 18px; line-height: 18px;
font-size: 14px; font-size: 14px;
font-family: Consolas, Courier New, monospaced; font-family: Consolas, Courier New, monospace;
display: inline;
} }
/* request */ /* request */
@ -190,15 +194,15 @@ body,html{
margin-bottom: 1px; margin-bottom: 1px;
} }
.request pre{ .request pre{
font-family: Consolas, Courier New, monospaced; font-family: Consolas, Courier New, monospace;
} }
/* footer */ /* footer */
.footer{ .footer{
position: relative; position: relative;
height: 222px; height: 222px;
min-width: 860px; /* padding compensation: 960px - 50px * 2 */ min-width: 860px; /* 960px - 50px * 2 */
max-width: 1100px; /* padding compensation: 1200px - 50px * 2 */ max-width: 1100px; /* 1200px - 50px * 2 */
padding: 0 50px; padding: 0 50px;
margin: 1px auto 0 auto; margin: 1px auto 0 auto;
} }
@ -223,30 +227,7 @@ body,html{
right: -50px; right: -50px;
} }
/* code */ /* highlight.js */
#code-wrap{
overflow: hidden;
position: relative;
}
#code-highlighter{
background-color: #ffffff;
position: fixed;
width: 100%;
z-index: 100;
}
#code-inner-wrap{
min-width: 860px; /* padding compensation: 960px - 50px * 2 */
max-width: 1100px; /* padding compensation: 1200px - 50px * 2 */
margin: 0 auto;
}
pre{
display: inline;
color: #505050;
font-size: 14px;
line-height: 18px;
z-index: 200;
position: relative;
}
pre .subst,pre .title{ pre .subst,pre .title{
font-weight: normal; font-weight: normal;
color: #505050; color: #505050;
@ -255,16 +236,16 @@ pre .comment,pre .template_comment,pre .javadoc,pre .diff .header{
color: #808080; color: #808080;
font-style: italic; font-style: italic;
} }
pre .annotation,pre .decorator,pre .preprocessor,pre .doctype,pre .pi,pre .chunk,pre .shebang, pre .annotation,pre .decorator,pre .preprocessor,pre .doctype,pre .pi,pre .chunk,pre .shebang,pre .apache .cbracket,
pre .apache .cbracket,pre .prompt,pre .http .title{ pre .prompt,pre .http .title{
color: #808000; color: #808000;
} }
pre .tag,pre .pi{ pre .tag,pre .pi{
background: #efefef; background: #efefef;
} }
pre .tag .title,pre .id,pre .attr_selector,pre .pseudo,pre .literal,pre .keyword,pre .hexcolor, pre .tag .title,pre .id,pre .attr_selector,pre .pseudo,pre .literal,pre .keyword,pre .hexcolor,pre .css .function,
pre .css .function,pre .ini .title,pre .css .class,pre .list .title,pre .clojure .title,pre .nginx .title, pre .ini .title,pre .css .class,pre .list .title,pre .clojure .title,pre .nginx .title,pre .tex .command,
pre .tex .command,pre .request,pre .status{ pre .request,pre .status{
color: #000080; color: #000080;
} }
pre .attribute,pre .rules .keyword,pre .number,pre .date,pre .regexp,pre .tex .special{ pre .attribute,pre .rules .keyword,pre .number,pre .date,pre .regexp,pre .tex .special{
@ -273,7 +254,7 @@ pre .attribute,pre .rules .keyword,pre .number,pre .date,pre .regexp,pre .tex .s
pre .number,pre .regexp{ pre .number,pre .regexp{
font-weight: normal; font-weight: normal;
} }
pre .string,pre .value,pre .filter .argument,pre .css .function .params,pre .apache .tag { pre .string,pre .value,pre .filter .argument,pre .css .function .params,pre .apache .tag{
color: #00aa00; color: #00aa00;
} }
pre .symbol,pre .ruby .symbol .string,pre .char,pre .tex .formula{ pre .symbol,pre .ruby .symbol .string,pre .char,pre .tex .formula{

81
apps/bootstrap/www/tmp/main.js vendored

@ -1,58 +1,43 @@
/*;
var lines = null;
var line = document.getElementById('code-highlighter')
var updateLines = function() {
lines = document.getElementById('code').getClientRects();
};
updateLines();
window.onresize = updateLines;
window.onscroll = updateLines;
document.onmousemove = function(e) {
var event = e || window.event;
var x = event.clientX, y = event.clientY;
for (var i = 0, max = lines.length; i < max; i++) {
if (y > lines[i].top && y < lines[i].bottom) {
line.style.height = parseInt(lines[i].bottom - lines[i].top + 1) + 'px';
line.style.top = parseInt(lines[i].top) + 'px';
break;
}
}
}
*/
window.onload = function() { window.onload = function() {
var i, j, max, max2, var i, imax,
codeBlocks = Sizzle('pre'), codeBlocks = Sizzle('pre'),
traceBackItems = Sizzle('.trace-back-item'); callStackItems = Sizzle('.call-stack-item');
// highlight code // highlight code blocks
for (i = 0, max = codeBlocks.length; i < max; i++) { for (i = 0, imax = codeBlocks.length; i < imax; ++i) {
hljs.highlightBlock(codeBlocks[i], ' '); hljs.highlightBlock(codeBlocks[i], ' ');
} }
// error lines //
// var updateErrorLines = function() { document.onmousemove = function(e) {
// for (i = 0, max = codeBlocks.length; i < max; i++) { var lines, i, imax, j, jmax, k, kmax,
// var lines = codeBlocks[i].getClientRects(), event = e || window.event,
// errorLine = codeBlocks[i].getAttribute('data-error-line'), y = event.clientY,
// top = 0; lineFound = false;
// if (errorLine > lines.length - 1) { for (i = 0, imax = codeBlocks.length; i < imax; ++i) {
// errorLine = lines.length - 1; lines = codeBlocks[i].getClientRects();
// } for (j = 0, jmax = lines.length; j < jmax; ++j) {
// for (j = 0; j < errorLine; j++) { if (y > lines[j].top && y < lines[j].bottom) {
// top += lines[j].height; lineFound = true;
// } break;
// Sizzle('.error-line', codeBlocks[i].parentNode.parentNode)[0].style.marginTop = top + 'px'; }
// } }
// }; if (lineFound) {
// updateErrorLines(); break;
}
}
var hoverLines = Sizzle('.hover-line');
for (k = 0, kmax = hoverLines.length; k < kmax; ++k) {
hoverLines[k].className = 'hover-line';
}
if (lineFound) {
Sizzle('.call-stack-item:eq(' + i + ') .hover-line:eq(' + j + ')')[0].className = 'hover-line hover';
}
}
// toggle code block visibility of each trace back item // toggle code block visibility
for (i = 0, max = traceBackItems.length; i < max; i++) { for (i = 0, imax = callStackItems.length; i < imax; i++) {
Sizzle('.li-wrap', traceBackItems[i])[0].addEventListener('click', function() { Sizzle('.element-wrap', callStackItems[i])[0].addEventListener('click', function() {
var code = Sizzle('.code-wrap', this.parentNode)[0]; var code = Sizzle('.code-wrap', this.parentNode)[0];
code.style.display = window.getComputedStyle(code).display == 'block' ? 'none' : 'block'; code.style.display = window.getComputedStyle(code).display == 'block' ? 'none' : 'block';
}); });

119
framework/yii/base/ErrorHandler.php

@ -16,6 +16,7 @@ use Yii;
* nature of the errors and the mode the application runs at. * nature of the errors and the mode the application runs at.
* *
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @author Timur Ruziev <resurtm@gmail.com>
* @since 2.0 * @since 2.0
*/ */
class ErrorHandler extends Component class ErrorHandler extends Component
@ -42,7 +43,11 @@ class ErrorHandler extends Component
/** /**
* @var string the path of the view file for rendering exceptions and errors. * @var string the path of the view file for rendering exceptions and errors.
*/ */
public $view = '@yii/views/errorHandler.php'; public $mainView = '@yii/views/errorHandler/main.php';
/**
* @var string the path of the view file for rendering exceptions and errors call stack element.
*/
public $callStackItemView = '@yii/views/errorHandler/callStackItem.php';
/** /**
* @var \Exception the exception that is being handled currently. * @var \Exception the exception that is being handled currently.
*/ */
@ -56,11 +61,9 @@ class ErrorHandler extends Component
public function handle($exception) public function handle($exception)
{ {
$this->exception = $exception; $this->exception = $exception;
if ($this->discardExistingOutput) { if ($this->discardExistingOutput) {
$this->clearOutput(); $this->clearOutput();
} }
$this->renderException($exception); $this->renderException($exception);
} }
@ -90,9 +93,8 @@ class ErrorHandler extends Component
if (YII_DEBUG) { if (YII_DEBUG) {
ini_set('display_errors', 1); ini_set('display_errors', 1);
} }
$view = new View(); $view = new View();
echo $view->renderFile($this->view, array('e' => $exception), $this); echo $view->renderFile($this->mainView, array('e' => $exception), $this);
} }
} }
} }
@ -100,7 +102,7 @@ class ErrorHandler extends Component
/** /**
* Converts special characters to HTML entities. * Converts special characters to HTML entities.
* @param string $text to encode. * @param string $text to encode.
* @return string encoded text. * @return string encoded original text.
*/ */
public function htmlEncode($text) public function htmlEncode($text)
{ {
@ -117,4 +119,109 @@ class ErrorHandler extends Component
@ob_end_clean(); @ob_end_clean();
} }
} }
/**
* Adds informational links to the given PHP type/class.
* @param string $code type/class name to be linkified.
* @return string linkified with HTML type/class name.
*/
public function addTypeLinks($code)
{
$html = '';
if (strpos($code, '\\') !== false) {
// namespaced class
foreach (explode('\\', $code) as $part) {
$html .= '<a href="http://yiiframework.com/doc/api/2.0/' . $this->htmlEncode($part) . '" target="_blank">' . $this->htmlEncode($part) . '</a>\\';
}
$html = rtrim($html, '\\');
}
return $html;
}
/**
* Creates HTML containing link to the page with the information on given HTTP status code.
* @param integer $statusCode to be used to generate information link.
* @return string generated HTML with HTTP status code information.
*/
public function createHttpStatusLink($statusCode)
{
return '<a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#' . (int)$statusCode .'" target="_blank">' . (int)$statusCode . '</a>';
}
/**
* Renders a single call stack element.
* @param string $file name where call has happened.
* @param integer $line number on which call has happened.
* @param integer $index number of the call stack element.
* @return string HTML content of the rendered call stack element.
*/
public function renderCallStackItem($file, $line, $index)
{
$line--; // adjust line number from one-based to zero-based
$lines = @file($file);
if ($line < 0 || $lines === false || ($lineCount = count($lines)) < $line + 1) {
return '';
}
$half = (int)(($index == 0 ? $this->maxSourceLines : $this->maxTraceSourceLines) / 2);
$begin = $line - $half > 0 ? $line - $half : 0;
$end = $line + $half < $lineCount ? $line + $half : $lineCount - 1;
$view = new View();
return $view->renderFile($this->callStackItemView, array(
'file' => $file,
'line' => $line,
'index' => $index,
'lines' => $lines,
'begin' => $begin,
'end' => $end,
), $this);
}
/**
* Determines whether given name of the file belongs to the framework.
* @param string $file name to be checked.
* @return boolean whether given name of the file belongs to the framework.
*/
public function isCoreFile($file)
{
return $file === 'unknown' || strpos(realpath($file), YII_PATH . DIRECTORY_SEPARATOR) === 0;
}
/**
* Creates string containing HTML link which refers to the home page of determined web-server software
* and its full name.
* @return string server software information hyperlink.
*/
public function createServerInformationLink()
{
static $serverUrls = array(
'http://httpd.apache.org/' => array('apache'),
'http://nginx.org/' => array('nginx'),
'http://lighttpd.net/' => array('lighttpd'),
'http://gwan.com/' => array('g-wan', 'gwan'),
'http://iis.net/' => array('iis', 'services'),
'http://php.net/manual/en/features.commandline.webserver.php' => array('development'),
);
if (isset($_SERVER['SERVER_SOFTWARE'])) {
foreach ($serverUrls as $url => $keywords) {
foreach ($keywords as $keyword) {
if (stripos($_SERVER['SERVER_SOFTWARE'], $keyword) !== false ) {
return '<a href="' . $url . '" target="_blank">' . $this->htmlEncode($_SERVER['SERVER_SOFTWARE']) . '</a>';
}
}
}
}
return '';
}
/**
* Creates string containing HTML link which refers to the page with the current version
* of the framework and version number text.
* @return string framework version information hyperlink.
*/
public function createFrameworkVersionLink()
{
return '<a href="http://github.com/yiisoft/yii2/" target="_blank">' . $this->htmlEncode(Yii::getVersion()) . '</a>';
}
} }

209
framework/yii/views/errorHandler.php

@ -1,209 +0,0 @@
<?php
/**
* @var \yii\base\View $this
* @var \Exception $e
* @var \yii\base\ErrorHandler $c
*/
$c = $this->context;
?>
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8"/>
<title></title>
<link rel="stylesheet" href="/tmp/main.css"/>
<script type="text/javascript" src="/tmp/highlight.js"></script>
<script type="text/javascript" src="/tmp/sizzle.min.js"></script>
<script type="text/javascript" src="/tmp/main.js"></script>
</head>
<?php ob_start(); ob_implicit_flush(false); ?>
<div class="code-wrap">
<div class="error-line" style="top: <?php echo 18 * (1 + 1); ?>px;"></div>
<div class="hover-line"></div>
<div class="code">
<span class="lines">
10<br/>11<br/>12<br/>13<br/>14<br/>15<br/>16<br/>17<br/>18<br/>19<br/>20<br/>21<br/>22<br/>
23<br/>24<br/>25<br/>26<br/>27<br/>28<br/>29<br/>30<br/>31<br/>32<br/>33<br/>34
</span>
<pre> {
return array(
'captcha' => array(
'class' => 'yii\web\CaptchaAction',
),
);
}
public function actionIndex()
{
// throw new \yii\base\HttpException(500);
$x = null;
$x->y = 1;
echo $this->render('index');
}
public function actionLogin()
{
$model = new LoginForm();
if ($this->populate($_POST, $model) && $model->login()) {
Yii::$app->response->redirect(array('site/index'));
} else {
echo $this->render('login', array(
'model' => $model,</pre>
</div>
</div>
<?php $codeBlock = ob_get_clean(); ?>
<body>
<div class="header">
<img src="/tmp/attention.png" alt="Attention"/>
<h1><span>Exception</span> &ndash; <a href="#">yii</a>\<a href="#">base</a>\<a href="#">HttpException</a> &ndash; 404</h1>
<h2>Requested user cannot be found!</h2>
</div>
<div class="traceback">
<ul>
<li class="application trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">1.</span>
<span class="text">in C:\_work\jetbrains\yii2\apps\bootstrap\protected\controllers\SiteController.php</span>
<span class="at">at line</span>
<span class="line">22</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
<li class="trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">2.</span>
<span class="text">at C:\_work\jetbrains\yii2\yii\base\InlineAction.php &ndash;</span>
<span class="call"><a href="#">call_user_func_array</a>()</span>
<span class="at">at line</span>
<span class="line">47</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
<li class="trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">3.</span>
<span class="text">at C:\_work\jetbrains\yii2\yii\base\Controller.php &ndash;</span>
<span class="call"><a href="#">yii</a>\<a href="#">base</a>\<a href="#">InlineAction</a><a href="#">runWithParams</a>()</span>
<span class="at">at line</span>
<span class="line">117</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
<li class="trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">4.</span>
<span class="text">at C:\_work\jetbrains\yii2\yii\web\Application.php &ndash;</span>
<span class="call"><a href="#">yii</a>\<a href="#">base</a>\<a href="#">Module</a><a href="#">runAction</a>()</span>
<span class="at">at line</span>
<span class="line">35</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
<li class="trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">5.</span>
<span class="text">at C:\_work\jetbrains\yii2\yii\web\Application.php &ndash;</span>
<span class="call"><a href="#">yii</a>\<a href="#">base</a>\<a href="#">Module</a><a href="#">runAction</a>()</span>
<span class="at">at line</span>
<span class="line">35</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
<li class="trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">6.</span>
<span class="text">at C:\_work\jetbrains\yii2\yii\base\Application.php &ndash;</span>
<span class="call"><a href="#">yii</a>\<a href="#">web</a>\<a href="#">Application</a><a href="#">processRequest</a>()</span>
<span class="at">at line</span>
<span class="line">146</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
<li class="application trace-back-item">
<div class="li-wrap">
<div class="li">
<span class="number">7.</span>
<span class="text">at C:\_work\jetbrains\yii2\apps\bootstrap\index.php &ndash; </span>
<span class="call"><a href="#">yii</a>\<a href="#">base</a>\<a href="#">Application</a><a href="#">run</a>()</span>
<span class="at">at line</span>
<span class="line">14</span>
</div>
</div>
<?php echo $codeBlock; ?>
</li>
</ul>
</div>
<?php /*
<div class="request">
<div id="code-wrap"></div>
<div id="code-highlighter"></div>
<div id="code-inner-wrap">
<pre id="code">$_GET = [
'show-post' => 100,
'refresh-page' => 'yes',
'ascending-sort' => 1,
];
$_POST = [
'blog-post-form' => [
'title' => 'hello',
'author_id' => '12',
],
];
$_SERVER = [
'DOCUMENT_ROOT' => '/home/resurtm/work/data',
'REMOTE_ADDR' => '::1',
'REMOTE_PORT' => '52694',
'SERVER_SOFTWARE' => 'PHP 5.4.3 Development Server',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'SERVER_NAME' => 'localhost',
'SERVER_PORT' => '8000',
'REQUEST_URI' => '/index.php?post-form[title]=hello&post-form[author_id]=12',
'REQUEST_METHOD' => 'GET',
'SCRIPT_NAME' => '/index.php',
'SCRIPT_FILENAME' => '/home/resurtm/work/data/index.php',
'PHP_SELF' => '/index.php',
'QUERY_STRING' => 'post-form[title]=hello&post-form[author_id]=12',
'HTTP_HOST' => 'localhost:8000',
'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0',
'HTTP_ACCEPT_LANGUAGE' => 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
'HTTP_CONNECTION' => 'keep-alive',
'REQUEST_TIME_FLOAT' => 1369146454.0856,
'REQUEST_TIME' => 1369146454,
];</pre>
</div>
</div>
</div>*/ ?>
<div class="footer">
<img src="/tmp/logo.png" alt="Yii Framework"/>
<p class="timestamp">2013-05-16, 19:14:12</p>
<p><a href="http://php.net/manual/en/features.commandline.webserver.php">PHP 5.4.3 Development Server</a></p>
<p><a href="http://yiiframework.com/">Yii Framework</a>/<a href="#">2.0-dev</a></p>
</div>
</body>
</html>

34
framework/yii/views/errorHandler/callStackItem.php

@ -0,0 +1,34 @@
<?php
/**
* @var \yii\base\View $this
* @var \yii\base\ErrorHandler $c
* @var string $file
* @var integer $line
* @var integer $index
* @var string[] $lines
* @var integer $begin
* @var integer $end
*/
$c = $this->context;
?>
<li class="<?php if (!$c->isCoreFile($file)) echo 'application'; ?> call-stack-item">
<div class="element-wrap">
<div class="element">
<span class="number"><?php echo (int)$index; ?>.</span>
<span class="text">in <?php echo $c->htmlEncode($file); ?></span>
<span class="at">at line</span>
<span class="line"><?php echo (int)$line; ?></span>
</div>
</div>
<div class="code-wrap">
<div class="error-line" style="top: <?php echo 18 * (int)($line - $begin); ?>px;"></div>
<?php for ($i = $begin; $i <= $end; ++$i): ?>
<div class="hover-line" style="top: <?php echo 18 * (int)($i - $begin); ?>px;"></div>
<?php endfor; ?>
<div class="code">
<span class="lines"><?php for ($i = $begin; $i <= $end; ++$i) echo (int)$i . '<br/>'; ?></span>
<pre><?php for ($i = $begin; $i <= $end; ++$i) echo $c->htmlEncode($lines[$i]); ?></pre>
</div>
</div>
</li>

101
framework/yii/views/errorHandler/main.php

@ -0,0 +1,101 @@
<?php
/**
* @var \yii\base\View $this
* @var \Exception $e
* @var \yii\base\ErrorHandler $c
*/
$c = $this->context;
?>
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8"/>
<?php if ($e instanceof \yii\base\Exception): ?>
<title><?php echo $c->htmlEncode($e->getName() . ' – ' . get_class($e)); ?></title>
<?php else: ?>
<title><?php echo $c->htmlEncode(get_class($e)); ?></title>
<?php endif; ?>
<link rel="stylesheet" href="/tmp/main.css"/>
<script type="text/javascript" src="/tmp/highlight.js"></script>
<script type="text/javascript" src="/tmp/sizzle.min.js"></script>
<script type="text/javascript" src="/tmp/main.js"></script>
</head>
<body>
<div class="header">
<img src="/tmp/attention.png" alt="Attention"/>
<h1>
<span>Exception</span> &ndash; <?php echo $c->addTypeLinks(get_class($e)); ?>
<?php if ($e instanceof \yii\base\HttpException): ?>
&ndash; <?php echo $c->createHttpStatusLink($e->statusCode); ?>
<?php endif; ?>
</h1>
<h2><?php echo $c->htmlEncode($e->getName()); ?></h2>
</div>
<div class="call-stack">
<ul>
<?php echo $c->renderCallStackItem($e->getFile(), $e->getLine(), 1); ?>
<?php for ($i = 1, $trace = $e->getTrace(), $length = count($trace); $i < $length; ++$i): ?>
<?php echo $c->renderCallStackItem($trace[$i]['file'], $trace[$i]['line'], $i + 1); ?>
<?php endfor; ?>
</ul>
</div>
<?php /*
<div class="request">
<div id="code-wrap"></div>
<div id="code-highlighter"></div>
<div id="code-inner-wrap">
<pre id="code">$_GET = [
'show-post' => 100,
'refresh-page' => 'yes',
'ascending-sort' => 1,
];
$_POST = [
'blog-post-form' => [
'title' => 'hello',
'author_id' => '12',
],
];
$_SERVER = [
'DOCUMENT_ROOT' => '/home/resurtm/work/data',
'REMOTE_ADDR' => '::1',
'REMOTE_PORT' => '52694',
'SERVER_SOFTWARE' => 'PHP 5.4.3 Development Server',
'SERVER_PROTOCOL' => 'HTTP/1.1',
'SERVER_NAME' => 'localhost',
'SERVER_PORT' => '8000',
'REQUEST_URI' => '/index.php?post-form[title]=hello&post-form[author_id]=12',
'REQUEST_METHOD' => 'GET',
'SCRIPT_NAME' => '/index.php',
'SCRIPT_FILENAME' => '/home/resurtm/work/data/index.php',
'PHP_SELF' => '/index.php',
'QUERY_STRING' => 'post-form[title]=hello&post-form[author_id]=12',
'HTTP_HOST' => 'localhost:8000',
'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0',
'HTTP_ACCEPT_LANGUAGE' => 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
'HTTP_CONNECTION' => 'keep-alive',
'REQUEST_TIME_FLOAT' => 1369146454.0856,
'REQUEST_TIME' => 1369146454,
];</pre>
</div>
</div>
</div>*/ ?>
<div class="footer">
<img src="/tmp/logo.png" alt="Yii Framework"/>
<p class="timestamp"><?php echo date('Y-m-d, H:i:s'); ?></p>
<p><?php echo $c->createServerInformationLink(); ?></p>
<p><a href="http://yiiframework.com/">Yii Framework</a>/<?php echo $c->createFrameworkVersionLink(); ?></p>
</div>
</body>
</html>
Loading…
Cancel
Save