php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack (1) Themen-Optionen Thema bewerten
Alt 14.10.2008, 22:13  
Neuer Benutzer
 
Registriert seit: 14.10.2008
Beiträge: 23
methanol befindet sich auf einem aufstrebenden Ast
methanol eine Nachricht über ICQ schicken methanol eine Nachricht über Skype™ schicken
Standard [Erledigt] Template "Fehler"

Nabend zusammen,

ich habe folgendes Problem mit meiner eigenen "Template-Engine":

Hier erstmal die target Seite {TITLE} (mit dem "Fehler")

Der Fehler ist offensichtlich. Die Tabelle mit den Logs ist nicht im Content-Bereich.
Meine Frage: Wie kommt das, dass die über dem Layout ist?

Normale Strings kann er anzeigen wie {DATUM} z.B.

Würde mich freuen wenn jemand einen Einfall für die Lösung hat.
PHP-Code:
# tpl.php

<?php
session_start
();
include(
'inc/inc.config.php');
include(
'lib/class.template.php');
include(
'lib/class.log.php');
$class1log = new Logging();

$tpl = new Template;
$tpl->makeFile('tpl/template.html');
$tpl->makeReplace('TITEL','Header');
$tpl->makeReplace('LOGINNAME'$tpl->showLoginname());
$tpl->makeReplace('DATUM'$tpl->showDate());
$tpl->makeReplace('CONTENT'$class1log->showLogs());

echo 
$tpl->compileTemplate();
?>
PHP-Code:
# class.template.php

<?php
class Template {
    var 
$template;
    var 
$tpltag = array();
    var 
$output;

        function 
makeFile($file){
            if (
file_exists($file)) {
                
$this->template '';
                
$fp fopen ($file'r');
                    while(!
feof($fp)){
                        
$this->template .= fgets ($fp128);
                    }
                
fclose ($fp);
            } else {
                return 
false;
            }
        }

        function 
makeReplace($name$content){
            
$this->tpltag[$name] = $content;
        }

        function 
compileTemplate(){
            if(!
$this->output)
                
$this->output $this->template;
                
$keys = @array_keys($this->tpltag);
                
$status 0;
                
$start "{";
                
$end "}";
                    foreach (
$keys as $key){
                        
$this->output preg_replace('/'.$start.$key.$end.'/'$this->tpltag[$key], $this->output);
                            if (
preg_match('/'.$start.$key.$end.'/'$this->output)) {
                            
$status 1;
                        }
                    }
                    if (
$status) {
                    
$this->compileTemplate();
                    }

                return 
$this->output;
        }

        function 
showLoginname(){
            
$sql "SELECT vorname, nachname FROM user WHERE email='".$_SESSION['login_email']."'";
            
$result mysql_query($sql);
            
$row mysql_fetch_assoc($result);
            return 
$row['vorname']." ".$row['nachname'];
        }

        function 
showDate(){
            return 
date("H:i")." Uhr am ".date("m.d.Y");
        }
}
?>
PHP-Code:
# template.html

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' 'xhtml11.dtd'>
<
html>
<
head>
<
link rel='stylesheet' type='text/css' href='style.css' media='all' />
<
title>{TITLE}</title>
</
head>
<
body>
<
div class='container'>
   <
div class='headleft'><img src='image/top-links.jpg' alt='' width="6" height="19" /></div>
   <
div class='headmiddle'>Logged in as <a href='#' class='headmiddlelink'>{LOGINNAME}</a>&nbsp;
      <
span class="headmiddle1">|</span>&nbsp;Time: <span class="headmiddle2">{DATUM}</span>
      <
span class="headmiddle1">|</span>
      <
span class="headmiddle2"><a href='logout.php' class='headmiddlelink'>Logout</a></span>
   </
div>
   <
div class='headright'><img src='image/top-rechts.jpg' alt='' width="6" height="19" /></div>
   <
div class='headbuttom'></div>
   <
div class='header'></div>
   <
div class='headred'></div>
   <
div class='headend'></div>
      <
div class='content'>
         <
div class='navi'>
            <
div class='navimain'><img src='image/main_menu.jpg' width='191' height='43' alt='' /></div>
            <
div class='navirot'><a href='?menu=close' class='navirotlink'>&nbsp;&nbsp;News</a></div>
            <
div class='navisub'>&nbsp;&nbsp;Hinzufuegen</div>
            <
div class='navisub'>&nbsp;&nbsp;Loeschen</div>
            <
div class='navinorm'><a href='getlogs.php'>&nbsp;&nbsp;Log</a></div>
         </
div>
         <
div class='context'>
            <
div class='con1'></div>
            <
div class='con2'></div>
            <
div class='con3'></div>
            <
div class='con4'>
               <
input class='searchinput' type='text' name='search' value='Ihr Suchebegriff...' />
               <
input name='searchbutton' type='submit' class='searchbutton' value='Senden' />
            </
div>
            <
div class='con5'></div>
               <
div class='contextmitte'>{CONTENT}</div>
            </
div>
         </
div>
</
div>
</
body>
</
html
methanol ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 14.10.2008, 22:56  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Vermutlich weil deine showLogs() Methode der Logging Klasse den Wert nicht per return zurückliefert, sondern mit echo in den Ausgabepuffer schreibt.

Benutz mal HTML-Validierung, das ist ja grauenhaft und kann dir bei einigen Problemen mit HTML sehr helfen (diesem allerdings nicht).

Für Firefox:
https://addons.mozilla.org/de/firefox/addon/249
https://addons.mozilla.org/de/firefox/addon/60
(Tools -> Validate HTML)
Chriz ist offline   Mit Zitat antworten
Alt 14.10.2008, 23:13  
Neuer Benutzer
 
Registriert seit: 14.10.2008
Beiträge: 23
methanol befindet sich auf einem aufstrebenden Ast
methanol eine Nachricht über ICQ schicken methanol eine Nachricht über Skype™ schicken
Standard

Lasse ich es aber als return ausgeben wird nur eine Zeile aus der DB geholt. Verständlich nach einem return bricht er ja auch ab. Eine Idee wie ich das lösen kann?

Das Template sollte doch Valid sein ansonsten wäre das eine Aufgabe die ich später in Angriff nehmen werde. Trotzdem danke für deine Antwort.
methanol ist offline   Mit Zitat antworten
Alt 14.10.2008, 23:45  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo methanol,

SQL-Abfrage-Routingen haben in einer Template-Engine designtechnisch nichts zu suchen. Die Komponente sollte so unabhängig sein, dass sie ohne das funktioniert. SQL-Abfragen und Ausgaben sollten in eigenen Präsentationslogik-Komponenten residieren.

Just my 2 cents!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 15.10.2008, 00:00  
Neuer Benutzer
 
Registriert seit: 14.10.2008
Beiträge: 23
methanol befindet sich auf einem aufstrebenden Ast
methanol eine Nachricht über ICQ schicken methanol eine Nachricht über Skype™ schicken
Standard

Naja die SQL-Abfrage hat ja auch nur indirekt mit der Template-Engine zu tun. Ich habe keine Ahnung wie ich sonst die Ausgabe der Tpl-Engine übergeben soll.

Wie gehe ich am besten vor? Die showLogs()-Funktion umschreiben oder etwas an der Tpl-Engine ändern. Wo soll ich ansätzen?

Ansonsten bedanke ich mich auch bei dir für deine Mühe.
methanol ist offline   Mit Zitat antworten
Alt 15.10.2008, 00:02  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Definiere eine externe Klasse, die die Datenbankabfragen übernimmt. Deine Templateklasse benutzt dann nur noch diese Datenbankklasse als Schnittstelle und hat nichts mehr selbst damit am Hut.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 15.10.2008, 01:26  
Neuer Benutzer
 
Registriert seit: 14.10.2008
Beiträge: 23
methanol befindet sich auf einem aufstrebenden Ast
methanol eine Nachricht über ICQ schicken methanol eine Nachricht über Skype™ schicken
Standard

Indirekt hat die Tpl-Engine trotzdem etwas damit zu tun. Jetzt macht die Tpl-Engine doch auch keine SQL-Abfrage.

Ich steh auf dem Schlauch. Kannst du mir evt. ein bsp. geben oder einen Ansatz.

PHP-Code:
class meinSQL
{
    var 
$sqlquery$sqlresult$sqlfetch$sqlrows;

    function 
meinSQL(){
        
$this->sqlquery "SELECT * FROM log ORDER BY id DESC";
        
$this->sqlresult mysql_query($this->sqlquery);
        
$this->sqlfetch mysql_fetch_assoc($this->sqlresult);
        
$this->sqlrows mysql_num_rows($this->sqlresult);
    }

}

class 
Logging extends meinSQL
{
...

Etwa so?
methanol ist offline   Mit Zitat antworten
Alt 15.10.2008, 01:37  
Erfahrener Benutzer
 
Registriert seit: 06.09.2008
Beiträge: 189
#Avedo befindet sich auf einem aufstrebenden Ast
Standard

Also ich weiß nicht... Ich kann mit dieser Klasse im Allgemeinen nichts Anfangen. Der Support von PHP 4 wurde mit dem Release der Version 4.4.9 nun offiziell eingestellt. Dieser Schritt wurde bereits letztes Jahr angekündigt und sollte mit dem Start der Olympischen Spiele in Bejing zusammenfallen. Ich kann nur empfehlen, dass schnellst möglich alle ihre alten und noch verwendbaren Klassen oder Scripte auf den Stand von PHP5 bringen (ist auch komfortabler). Zudem habe ich mir nur die Methode makeFile() angesehen und schon den Faden verloren. Wieso heißt diese Methode makeFile()? Soweit ich das sehe erstellt diese methode doch garkeine Datei sondern lädt ein Template. Daher solltest du lieber einen Konstruktor oder wenigstens einen Namen wie load() oder so verwenden. Zudem ist es viel einfacher das Template mit file_get_contents() einzulesen. Die Variable $template musst du im übrigen nicht nochmal in der Methode deklarieren. Es reicht auch, wenn du das am Anfang der Klasse machst. Wie kann das ganze nun alternativ aussehen?

Greife doch einfach auf die magischen Funktionen von PHP zurück. Mit __set(), __get() und __call läst sich eine sehr sehr einfache und übersichtliche Klasse basteln, mit der du dieses Problem nicht hast.

PHP-Code:
<?php

/***
* Class Template 
*
* Template class allows filling templates with life.
* Sure this class supports also the nesting of
* different templates. So you can manage superior
* designs and webpages.
*  
* @package Template
* @version 0.4
* @author Mauricio Hannika
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Mauricio Hannika, Andreas Wilhelm
**/  
class Template
{
    protected 
$template;
    protected 
$vars;

    
/**
    * Constructor - Sets the filename of the template
    *
    * @access public
    * @param Str $template
    * @return Boolean
    */
    
public function __construct($template)
    {
        if( !
file_exists($template) || !is_readable($template) )
        {
            throw new 
Exception('Could not load template file.');
        }   
      
        
$this->template $template;
    }

    
/**
    * __get() - Returns the queried value
    * 
    * @access public
    * @param Str $key
    * @return String
    */
    
public function __get($key)
    {
        return isset(
$this->vars[$key]) ? $this->vars[$key] : '';
    }

    
/**
    * __set() - Sets the variables
    * 
    * @access public
    * @param Str $key
    * @param Str $value
    * @return String
    */
    
public function __set($key$value)
    {
        if(isset(
$this->vars[$key]))
        {
            throw new 
Exception($key ' has already been set.');
        }
       
        
$this->vars[$key] = $value;
    }

    
/**
    * parse() - Parses a file and returns it
    * 
    * @access public
    * @param Str $path
    * @return String
    */
    
public function parse($path=''
    {    
        
ob_start(); 
        
        if( !@include_once(
$path) )
        {
            throw new 
Exception('Failed to parse file.');            
        }
        
        
$parsed ob_get_contents(); 
        
ob_end_clean(); 
        
        return 
$parsed
    }

    
/**
    * __toString() - Renders the template
    * 
    * @access public
    * @return String
    */
    
public function __toString() 
    {  
        return 
$this->parse$this->template ); 
    }
}
?>
Ein Template dazu könnte so aussehen:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">

    <head>            
        <title>&middot; <?= $this->title; ?> &middot;</title>

        <meta name="Title" content="<?= $this->title; ?>" />
        <meta name="Author" content="pseudo@mail.de" />
        <meta name="Publisher" content="pseudo.tld" />
        <meta name="Copyright" content="pseudo.tld" />
        <meta name="Revisit" content="After 2 days" />
        <meta name="Keywords" content="pseudo, test, titel, homepage, website" />
        <meta name="Description" content="Besuchen Sie meine Seite! Es k&ouml;nnte sich lohnen." />
        <meta name="Abstract" content="Visit my website. It'll be great." />
        <meta name="Robots" content="INDEX,FOLLOW" />
        <meta name="Language" content="Deutsch" />
        <meta name="Distribution" content="global" />
        <meta http-equiv="content-Type" content="text/html;charset=iso-8859-1" />
        
        <link rel="stylesheet" type="text/css" href="design.css"/>    
    </head>
        
    <body>
        <div id="page">
        
            <h1 id="headline"><?= $this->title; ?></h1>        
            
            <ul id="navigation">
                <?= $this->navigation; ?>
            </ul>
            
            <div id="content">
                <?= $this->content; ?>
            </div>                    
            
            <p id="footer">
                powered by <?= $this->title; ?> © <?= $this->date; ?>                
            </p>
        </div>
    </body>
</html>
Die index.php dazu sieht dann so aus:
PHP-Code:
<?php
    
try
    {
        
// load required classes
        
require_once('Template.php');
                        
        
$mysqli = new mysqli('DB_HOST''DB_USER''DB_PWD''DB_NAME');
            
        
$tpl = new Template('layout.html');
            
        if( empty(
$_GET['site']) )
        {
            
$content $tpl->parse('home.html');
        }
            
        elseif( !isset(
$_GET['site']) || !file_exists($_GET['site']) || !is_readable($_GET['site']) )
        {
            
$content '<p>Die Seite konnte leider nicht gefunden werden.</p>';
        }
            
        else
        {
            
$site $_GET['site'];
            
$content $tpl->parse($site);
        }
        
        
        
$sql "SELECT 
                *
            FROM
                navigation
            ORDER BY
                name"
;
        
        
// send sql-query
        
if ( $result $mysqli->query($sql) ) 
        {        
            
// save result into an array
            
$navigation '';
            while( 
$row $result->fetch_assoc() ) 
            {
                
$navigation .= '<li><a href="index.php?site='.$row['id'].'">'.$row['name'].'</a></li>';
            }
        }
        
        else
        {
            
$navigation '<b>Die Navigation konnte leider nicht geladen werden.</b>';
        }
        
        
$tpl->title $navigation;
        
$tpl->navigation $navigation;
        
$tpl->content $content;
        
$tpl->date date('Y');
            
        echo 
$tpl;
    }
        
    catch(
Exception $e)
    {
        echo 
'<p>'.$e->getMessage().'</p>';
    }
?>
Denke das ist doch sehr übersichtlich und absolut einfach. Um das ganze noch abszurunden, kann man noch die hässliche URL via mod-rewrite verstecken. Das Beispiel sollte so funktionieren, habe das ganze aber nicht getestet.

str_replace() kann man zwar verwenden, halte ich aber für eine schlechte Idee, da das ein echter Performance Fresser werden kann. Habe ich früher auch gemacht, geht auch für sehr sehr kleine Projekte, ist aber nicht sehr empfehlenswert und, wie man sieht, geht es doch auch sehr sehr viel einfacher.
MfG, Andy
__________________
I'm so tired of slitting the throats of people calling me a violent psychopath.

Geändert von #Avedo (16.10.2008 um 01:36 Uhr).
#Avedo ist offline   Mit Zitat antworten
Alt 15.10.2008, 02:29  
Neuer Benutzer
 
Registriert seit: 14.10.2008
Beiträge: 23
methanol befindet sich auf einem aufstrebenden Ast
methanol eine Nachricht über ICQ schicken methanol eine Nachricht über Skype™ schicken
Standard

Danke für deine Mühe!

Ich mag nicht sagen dass du sie evt. umsonst gemacht hast. Aber ich verstehe echt nur ein Bruchteil.
Ich habe mich eben zu Exceptions und diesem throw'n'catch angelesen. Ich kann es nur sehr schwer nachvollziehen.
Von __set() __get() habe ich auch das erste Mal gehört.

Nun gut, der Funktions-Name war sicherlich doof gewählt und zum Verständnis erst recht und ja ich habe $template fälschlicherweise zwei mal inizialisiert.
str_replace() verwende ich doch nicht.

Ich möchte ja einfach nur, dass ich durch makeReplace('CONTENT', "text oder".function()) meinen Inhalt anzeigen lassen kann.

Geändert von methanol (15.10.2008 um 03:18 Uhr).
methanol ist offline   Mit Zitat antworten
Alt 15.10.2008, 09:16  
Erfahrener Benutzer
 
Registriert seit: 06.09.2008
Beiträge: 189
#Avedo befindet sich auf einem aufstrebenden Ast
Standard

Du verwendest zwar nicht str_replace() aber du verwendest preg_replae(). Das meinte ich. Ich denke die Klasse ist relativ einfach zu verstehen. Kleine Schwierigkeiten bereiten, wie du bereits erwähntest, zumeist die magischen Methoden, sowie das Handling von Exceptions. Exceptions sind einfach eine gute und sehr saubere Fehlerbehandlung.

  • __get($memberName) wird aufgerufen, wenn lesend auf das Attribut $memberName eines Objekts zugegriffen wird, das Attribut aber nicht gesetzt ist.
  • __set($memberName, $value) wird aufgerufen, wenn schreibend auf das Attribut $memberName eines Objekts zugegriffen wird und das Attribut vorher nicht gesetzt war. Der zweite Parameter $value enthält den Wert, mit dem das Attribut belegt werden soll.
  • __toString() wird aufgerufen, wenn eine Typumwandlung eines Objekts in einen String durchgeführt werden soll.

(Quelle: selfphp.de)
MfG, Andy

__________________
I'm so tired of slitting the throats of people calling me a violent psychopath.
#Avedo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

LinkBacks (?)
LinkBack to this Thread: http://www.php.de/php-fortgeschrittene/48140-erledigt-template-fehler.html
Erstellt von For Type Datum
Erste Klasse, Fehlermeldung - PHP • Webdesign Forum This thread Refback 16.10.2008 02:33

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Lieber Template oder Normal für ein community? mysteryxxx PHP Tipps 2008 8 17.09.2008 23:04
Eckige Klammern in Template nutshell PHP Tipps 2006 9 05.06.2006 19:12
template mit funktion einlesen imported_kremser PHP Tipps 2006 16 03.02.2006 00:43
template in template einfuegen tonne PHP Tipps 2005-2 8 10.11.2005 22:24
Template Error: set_root: ./tpl/ is not a directory argon PHP Tipps 2007 11 01.11.2005 14:30
Wordpress Template HTML, Usability und Barrierefreiheit 8 22.08.2005 11:21
Template System oder Lösung gesucht PHP Tipps 2005 14 21.05.2005 22:07
Template verständniss problem; referenz PHP Tipps 2005 17 19.05.2005 06:06
Template: Verschachteln von foreach PHP Tipps 2005 2 12.05.2005 15:37
Smarty Problem (Template Laden) JanM PHP Tipps 2005 5 11.05.2005 16:36
Php Code als Variable definieren und in Template darstellen PHP Tipps 2004-2 4 31.12.2004 16:22
suche ein bestimmtes template system PHP Tipps 2004-2 2 07.11.2004 19:49
Template Parser PHP-Fortgeschrittene 9 06.10.2004 23:04
Inhalte von 2 Servern über 1 Template laufen lassen? scheibo PHP Tipps 2004 1 30.09.2004 01:20
[Erledigt] Template Scripting PHP-Fortgeschrittene 2 04.06.2004 18:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysteryxyx@web.de

Alle Zeitangaben in WEZ +1. Es ist jetzt 09:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum