• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Exception + template Problemschen

Mars@Gera

Mitglied
Guten Abend Community,
ich bin derzeit an meinem System daran meine Fehler Klasse einzuarbeiten, welche eigentlich nichts weiter macht, als gewisse Exception-Informationen auszugeben (line, file, ... ect.pp.)

Nun zur Situation:
ich habe eine Klasse image, welche Informationen und weiteres beinhaltet, um ein Bild ordentlich darzustellen, sowie die "Vaterklasse" von Thumbnails ist, sollte aber hier keine Rolle spielen.
So ok, hier eine Memberfunktion, aus der Klasse Image
PHP:
public function getImageSize(){
		$error = new Error();
		try{
			if(is_file($this->path)){
				$size = getimagesize($this->path);

				if(!$size){
					throw new exception("Konnte Bildgröße nicht definieren");
				}else{
					return $size;
				}
			}else{
				throw new exception("konnte datei nicht finden");
			}
		}catch(Exception $e){
			$error->__set('error_msg', $e->getMessage());
			$error->__set('error_code', $e->getCode());
			$error->__set('error_file', $e->getFile());
			$error->__set('error_line', $e->getLine());
			$error->__set('error_typ', 2);
			$error->display();
		}
	}
Des Weiteren ist ist es noch wichtig zu Wissen, das ich als Template das Smarty Template in der 2-er Version nutze.
Nun soll meine Fehlermeldung wie folgt ausgegeben werden
+-----------------------------------+
| head |
+-----------------------------------+
+-----------------------------------+
| wenn exception geworfen wird |
| dann gebe Meldung aus |
+-----------------------------------+

das Mysteriöse an der Geschichte ist, wenn ich in einem Modul ein neues Objekt von Image anlege und die oben genannte fkt. getimageSize() ausführe sieht meine Oberfläche wie folgt aus
+-----------------------------------+
| exception-tpl ohne jegliche Ausgabe|
+-----------------------------------+
+-----------------------------------+
| head |
+-----------------------------------+
+-----------------------------------+
| exception, ohne ausgabe |
+-----------------------------------+

Wieso wird über den Head Bereich automatisch das Template nochmals ohne alles eingefügt?
MfG Marcel

PS: wenn noch mehr Codeausschnitte, dann bitte sagen!
 
Werbung:
Wenn Du eine Exception fangen möchtest, musst Du so eine auch werfen - Groß- und Kleinschreibung beachten.

Grüße
 
ahhh ... also is es nen unterschied, ob ich exception und Exception mache ... hätt ich auch mal drauf kommen können :D

PS: dein webrex kann ich ne installieren, weil die libs ne vorhanden sind, wollt ich gerade mal anschauen ;)
 
Werbung:
ahhh ... also is es nen unterschied, ob ich exception und Exception mache ... hätt ich auch mal drauf kommen können :D
Ja, kannst Dir vorstellen wie Type Hints. Du gibst zuerst den Klassennamen an, nach welchem das Objekt (also $e) aufgebaut sein soll. Wenn Du ne eigene Exception-Klasse schreibst (zB MeineException), dann kannst Du eine Exception von diesem Typ werfen und in einem catch-Block fangen:

PHP:
class MeineException extends Exception {
    // ....
}

try {
    throw new MeineException('bla');
} catch (MeineException $e) {

}


PS: dein webrex kann ich ne installieren, weil die libs ne vorhanden sind, wollt ich gerade mal anschauen ;)
Ach so n Mist, danke fürs Bescheid sagen!

Grüße
 
Nicht die magischen Methoden direkt aufrufen. Dazu sind sie nicht gedacht.

PHP:
$error->__set('error_msg', $e->getMessage());

Besser:

PHP:
$error->error_msg = $e->getMessage();
 
Werbung:
Weil sie automatisch aufgerufen werden. Ist error_msg kein öffentliches Klassen-Attribut, prüft der Parser, ob die Interzeptormethode __set() deklariert wurde. Falls ja, wird diese aufgerufen und als Parameter wird Ihr der String error_msg übergeben und der Wert, den Du error_msg zuweisen willst (also: $e->getMessage()).

Bei $error->error_msg = $e->getMessage() kommt es zu folgendem Methodenaufruf: $error->__set('error_msg', $e->getMessage());
 
$error_msg ist private^^

so ... ich hab jetzt das mal alles meines Wissens nach angepasst.
mal Grobe Konstrukte

error.class.php
PHP:
// wichtigesten auszuege
class Error extends Exception{
     public function __construct($msg = "", $type = ""){
 	       if(!empty($msg)){
 		          $this->error_msg = $msg;
 	       }
		
        	if(!empty($type) || is_int($type)){
 		           $this->error_typ = $this->error[$type];
       	}  
 	      $this->display();
      }

      public function display(){
 	         $tpl = new Smarty();
		
 	         $tpl->assign('error_type', $this->error_typ[0]);
 	         $tpl->assign('error_msg', $this->error_msg);
 	         $tpl->assign('error_file', $this->error_file);
 	         $tpl->assign('error_line', $this->error_line);
		
 	         $tpl->display("error.tpl");
     }
}

eine Klasse wo eine Exception geworfen wird (in meinem Falle image.class.php)
PHP:
class image{
   public function getImageSize(){
       try{
    	     if(is_file($this->path)){
 		           $size = getimagesize($this->path);
			
 		           if(!$size){
 			                throw new Error("Konnte Bildgröße nicht definieren");
    		        }else{
 			                return $size;
 		           }
    	     }else{
 		             throw new Error("konnte datei nicht finden");
    	     }
     }catch(Error $e){
          $e->display();
     }
     }
}

und die Anwendung in einem Modul
PHP:
// fehlerhafter Pfad zum Bild
$img->setPath('blah');
$size = $img->getImageSize();

Ich weiss ist alles noch nicht der wahre Code, aber will erstmal anhand dieser Problemstellung das mit den Exceptions und der Fehlerausgabe hinbekommen

so sieht es aus
image-upload.de
die oberen beiden Bereich (farbig) sollten eigentlich EINS sein und unter dem head-Bereich sein

mfg Marcel
 
Werbung:
Unglaublich ^^

weisst du noch, wie ich die position so hinbekomme, wie es sein soll,
im smarty template ist es unterhalb vom header normalerweise

mfg marcel
 
stimmt ^^
also ich brauche sozusagen eine dynamische Lösung, um eine Überprüfung bei Smarty einzubauen.
hier mal die template datei für den Header
HTML:
{config_load file='../language/lang_de.conf'}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//DE" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="de">
    <head>
        <title>{#version_name#}</title>
        <link rel="stylesheet" type="text/css" href="style/advanced.css">
        <link rel="stylesheet" type="text/css" href="style/style.css">

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta name="robots" content="noindex,nofollow" />
    </head>
    <body class="bs_body">
        <div onload="uhr()" class="bs_border">
            <div>
                {* der Banner *}
                <div class="bs_headline"></div>
                {* die Navigation *}
                <div class="bs_menu_wrapper">
                    <ul class="bs_menu">
                        <li><a href="index.php?action=index" target="_self">{#nav0#}</a></li>
                        <li><a href="index.php?action=news" target="_self">{#nav1#}</a></li>
                        <li><a href="index.php?action=teams" target="_self">{#nav2#}</a></li>
                        <li><a href="index.php?action=training" target="_self">{#nav3#}</a></li>
                        <li><a href="index.php?action=history" target="_self">{#nav4#}</a></li>
                        <li><a href="index.php?action=galerie" target="_self">{#nav5#}</a></li>
                        <li><a href="index.php?action=gbook" target="_self">{#nav6#}</a></li>
                        <li><a href="index.php?action=sponsoren" target="_self">{#nav7#}</a></li>
                        <li><a href="index.php?action=links" target="_self">{#nav8#}</a></li>
                        <li><a href="index.php?action=impressum" target="_self">{#nav9#}</a></li>
                    </ul>
                    <br style="clear: both;" />
                </div>
                {* Welcome Bereich mit Uhr und Admin Link bzw. Logout *}
                <div class="bs_welcome">
                    <ul class="bs_welcome bs_none_list">
                        <li class="bs_welcome_left">
                            {#hallo#} <b>{$username}</b>
                        </li>
                        <li class="bs_welcome_right">
                            {if isset($cookie)}
                                <a href="index.php?action=admin">{#admin#}</a> &middot; <a href="index.php?action=logout">{#logout#}</a>
                            {else}
                                <a href="index.php?action=login">{#login#}</a>
                            {/if}
                        </li>
                    </ul>
                </div>
            </div>
        </div>
        {if isset($e)}
               {include file='error.tpl'}
        {/if}
 
Werbung:
Sorry, aber ich habe ganz große Schwierigkeiten, deinen Beschreibungen zu folgen.

Das passt für mich alles überhaupt nicht zusammen.
 
ok sorry, ich versuche es mal bissl besser zu beschreiben.
also ich möchte, wenn eine exception geworfen wird, egal von wo im system und wieso weshalb warum, das genau an einer vordefinierten Stelle mein Template angezeigt wird.
{include file='error.tpl'}
dies habe ich jetzt "nur" mit einer trivialen Bedingung eingeblendet, und zwar, wenn die (Error) Exception Variable $e vorhanden ist. Jedoch wird wie schon in einem älteren Beirag schon beschrieben, dieses Template über der definierten Stelle angezogt. also bei der jetzigen Situation erst die Fehlerausgabe und dann der head Bereich mit der Navigaion ect. pp.. Jedoch sollte es genau anders herum sein.
Und meine Frage ist, wie bekomm ich das so hin, sowie, wie kann ich meine Bedingung in Smarty so gestalten bzw. im Code umsetzten, das ich nicht unbedingt auf die Error-Exception Variable $e zugreifen muss.

Ich hoffe, ich habe mein Problem etwas besser umschreiben können.

mfg Marcel
 
also ich möchte, wenn eine exception geworfen wird, egal von wo im system und wieso weshalb warum, das genau an einer vordefinierten Stelle mein Template angezeigt wird.

Dann müsstest du die Exception an einer entsprechenden Stelle (entsprechend „weit oben“) fangen und die mitgelieferten Informationen Template-Variablen zuweisen.

Jedoch wird wie schon in einem älteren Beirag schon beschrieben, dieses Template über der definierten Stelle angezogt. also bei der jetzigen Situation erst die Fehlerausgabe und dann der head Bereich mit der Navigaion ect. pp.. Jedoch sollte es genau anders herum sein.

Das liegt bestimmt daran, dass du wie gesagt an der falschen Stelle die display-Methode von Error aufrufst.

Und meine Frage ist, wie bekomm ich das so hin, sowie, wie kann ich meine Bedingung in Smarty so gestalten bzw. im Code umsetzten, das ich nicht unbedingt auf die Error-Exception Variable $e zugreifen muss.

Welcher Variable du da was zuweist, bleibt doch so oder so dir überlassen… Du bist der Programmierer.
 
Werbung:
ich weiss jetzt, wo der fehler ist. da ich jetzt nicht wrklich ein mcv-prinzip nachgehe, wird die ausgabe von error-display vor dem display des Modules stattfinden. hat jemand eine idee, wie ich das machen kann, ohne mein ganzes projekt auf mcv umustellen?

mfg marcel
 
Was würde gegen MVC sprechen :) ?
Vielleicht ist die Umstellung auf MVC moenatan für dich aufwendig, später wirst Du dir dank der MVC-Struktur aber viel Zeit sparen.

hat jemand eine idee, wie ich das machen kann, ohne mein ganzes projekt auf mcv umustellen?
Naja, da gibts mehrere Möglichkeiten. Du kannst z.B. mittels Output-Buffer die Fehlermeldungen zwischenspeichern, in einem Registry ablegen und im Template über das Registry auf die Meldungen zugreifen. Aber um einiges eleganter gehts natürlich mit (H)MVC.

Grüße
 
Dann werd ich wohl das nochmal überdenken müssen.
krabbelt zwar in den finger, mich drüber zu belesen, jedoch hab ich ab montag klausurzeit (+3Wochen) :(

mfg Marcel
 
Werbung:
Zurück
Oben