200922
Jui
Php Error Template
by TomDans le cadre du développement de notre framework Php, nous avons crée un template pour afficher les exceptions Php:
Ce simple fichier Php permet d’afficher en plus de l’erreur “attrapée”, la pile des appels de fonction avec 10 lignes de tous les fichiers autour de la bonne ligne. Un petit script Javascript (Tiny Accordion) permet un layout en accordéon, très pratique.
Bref ce fichier fait partie des outils indispensables pour le développement Php, il va vous faire gagner un temps précieux.
Utilisation:
Pour un résultat parfait, vous devez mettre en tampon toute sortie (fonctions ob_) afin d’effacer toute sortie qui a eu lieu avant l’erreur, ensuite, installez un bloc try / catch autour de votre code puis incluez le template comme ceci:
try
{
... code php ...
}
catch(Exception $e)
{
ob_end_clean();
include("errorTemplate.php");
}
Code Source:
<html>
<title>eBuildy Error!</title>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style>
.message {margin:1em 0px;padding:1em;background-color:#FFF1A8;-moz-border-radius: 5px;-webkit-border-radius: 5px;}
.trace {margin-bottom:10px;padding:1em;background:#F0F0F0;border:1px solid #C0C0C0;}
* {margin:0; padding:0; font-family:Arial,sans-serif;}
BODY {margin:2em;}
.title {font-size:15px;display:block;padding:5px;background-color:#EBEFF9;}
#nested {list-style:none; color:#033;font-size:11px;}
#nested h3 {font-size:13px;border-bottom:1px solid #EBEFF9;padding:6px 6px 8px; font-weight:bold; margin-top:5px; cursor:pointer;}
#nested h3.selected,#nested h3:hover {text-decoration:underline;background-color:#EBEFF9;}
#nested .acc-section {overflow:hidden; background:#fff}
#nested .acc-content {padding:15px; border:1px solid #C9D7F1; border-top:none; background:#fff}
#code {list-style:none;}
#code li {height:20px;display:block;line-height:20px;}
</style>
</head>
<body bgcolor="#FFFFFF">
<?php
echo "<h3 class='title'>eBuildy: error!</h3><br />";
echo "In the file ".$e->getFile()." at line ".$e->getLine().":";
echo "<div class='message'>".$e->getMessage()."</div>";
echo "<h3 class='title'>Stack Trace:</h3>";
echo '<ul class="acc" id="nested">';
echo "<li><h3>".$e->getFile()." line ".$e->getLine()."</h3>";
echo "<div class='acc-section'><div class='acc-content'>";
readFile_($e->getFile(),$e->getLine());
echo "</div></div></li>";
foreach ($e->getTrace() AS $item)
{
echo "<li><h3>".$item['file']." line <b>".$item['line']."</b></h3>";
echo "<div class='acc-section'><div class='acc-content'>";
echo "<blockquote>function <b>".$item['function']."</b> (";
var_dump($item['args']);
echo ")</blockquote><br /><br />";
readFile_($item['file'],$item['line']);
echo "</div></div>";
echo "</li>";
}
echo "</ul>";
function readFile_($file_,$line_)
{
$handle = @fopen($file_, "r");
if ($handle)
{
$line = 0;
echo "<ul id='code'>";
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
if ($line > $line_ - 10 && $line < $line_ + 10)
{
$buffer = htmlentities($buffer);
$i = 20 * substr_count($buffer,"\t") - 20;
$c = $line%2 ? '#FFFFFF' : '#F0F0F0';
if ($line + 1 == $line_) $c = "#FF7F7F";
echo "<li style='background-color:$c;'>".($line+1).": <span style='padding-left:".$i."px;'>$buffer</span></li>";
}
$line ++;
}
echo "</ul>";
fclose($handle);
}
}
?>
<script type="text/javascript">
var TINY={};
function T$(i){return document.getElementById(i)}
function T$$(e,p){return p.getElementsByTagName(e)}
TINY.accordion=function(){
function slider(n){this.n=n; this.a=[]}
slider.prototype.init=function(t,e,m,o,k){
var a=T$(t), i=s=0, n=a.childNodes, l=n.length; this.s=k||0; this.m=m||0;
for(i;i<l;i++){
var v=n[i];
if(v.nodeType!=3){
this.a[s]={}; this.a[s].h=h=T$$(e,v)[0]; this.a[s].c=c=T$$('div',v)[0]; h.onclick=new Function(this.n+'.pr(0,'+s+')');
if(o==s){h.className=this.s; c.style.height='auto'; c.d=1}else{c.style.height=0; c.d=-1} s++
}
}
this.l=s
};
slider.prototype.pr=function(f,d){
for(var i=0;i<this.l;i++){
var h=this.a[i].h, c=this.a[i].c, k=c.style.height; k=k=='auto'?1:parseInt(k); clearInterval(c.t);
if((k!=1&&c.d==-1)&&(f==1||i==d)){
c.style.height=''; c.m=c.offsetHeight; c.style.height=k+'px'; c.d=1; h.className=this.s; su(c,1)
}else if(k>0&&(f==-1||this.m||i==d)){
c.d=-1; h.className=''; su(c,-1)
}
}
};
function su(c){c.t=setInterval(function(){sl(c)},20)};
function sl(c){
var h=c.offsetHeight, d=c.d==1?c.m-h:h; c.style.height=h+(Math.ceil(d/5)*c.d)+'px';
c.style.opacity=h/c.m; c.style.filter='alpha(opacity='+h*100/c.m+')';
if((c.d==1&&h>=c.m)||(c.d!=1&&h==1)){if(c.d==1){c.style.height='auto'} clearInterval(c.t)}
};
return{slider:slider}
}();
var nestedAccordion=new TINY.accordion.slider("nestedAccordion");
nestedAccordion.init("nested","h3",1,-1,"selected");
</script>
</body>
</html>
com