zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden eigene Templateklasse

Antwort
 
LinkBack Themen-Optionen Ansicht
  #31 (permalink)  
Alt 22.09.2008, 20:50
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 16.09.2008
Beiträge: 29
Skullsplitter befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

ich habe das jetzt versucht... aber irgendwie komm ich nicht weiter.

Man müsste doch das ganze mittel preg_match_all lösen können?

PHP-Code:
        $suche '/\{loop:'.$name.'}(.*}{loop:end\}/';
        
preg_match_all($suche$this->inhalt$bloecke);
        
        foreach (
$bloecke as $block => $wert)
        {
            foreach(
$wert as $key => $elem)
            {
                
//echo $elem;
                //$this->mem_loop .= $elem;
            
}
        } 
Mit diesem Suchstring müsste man doch das ganze herausfiltern können, oder?

Das ist der Code in meiner HTML Datei.
Code:
                <table>
                  {loop:admin}
                    <tr>
                      <td>{admin.pw}</td>
                      <td>{admin.name}</td>
                    </tr>
                  {loop:end}
                </table>
Und das will ich ja rausfiltern:
Code:
                    <tr>
                      <td>{admin.pw}</td>
                      <td>{admin.name}</td>
                    </tr>
Zur Erklärung:
Es geht darum, den HTML-Code zwischen {loop:admin} und {loop:end} herauszufiltern (falls jemand ein bisschen später hinzugestoßen ist )

Wieso bringt er mir hier kein Ergebnis?

Danke!

Gruß,

Stefan

Geändert von Skullsplitter (22.09.2008 um 20:54 Uhr)
Mit Zitat antworten
Sponsored Links
  #32 (permalink)  
Alt 22.09.2008, 21:05
Benutzerbild von hemfrie
Administrator
XHTMLforum-Kenner
 
Registriert seit: 18.12.2003
Ort: Düsseldorf
Beiträge: 2.777
hemfrie ist jedem bekannthemfrie ist jedem bekannthemfrie ist jedem bekannthemfrie ist jedem bekannthemfrie ist jedem bekannthemfrie ist jedem bekannt
Standard

Hast Du vielleicht wie in diesem Beispiel hier die Klammer für die Backreferenz falsch gesetzt?

/\{loop:'.$name.'\}(.*}\{loop:end\}/
/\{loop:'.$name.'\}(.*)\{loop:end\}/
Mit Zitat antworten
Sponsored Links
  #33 (permalink)  
Alt 23.09.2008, 12:00
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 198
Curtains befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
<?php

$regex 
'!\{loop:([^\}]+)\}(.*)\{loop:end\}!sU';

$code =
'
<table>
    {loop:admin}
        <tr>
            <td>{admin.pw}</td>
            <td>{admin.name}</td>
        </tr>
    {loop:end}
    {loop:moderator}
        <tr>
            <td>{moderator.pw}</td>
            <td>{moderator.name}</td>
        </tr>
    {loop:end}
</table>
'
;

preg_match_all($regex$code$match);
$blocks = array();
if ( isset(
$match[1]) && isset($match[2]) )
{
    
$total sizeof($match[1]);
    for (
$i 0$i $total$i++)
    {
        
$nameObj trim($match[1][$i]);
        
$codeSnippet $match[2][$i];
        
$blocks[] = array($nameObj$codeSnippet);
    };
};

var_dump($blocks);

?>
Nachtrag: Bei verschachtelten Schleifen würde rekursives Programmieren (z.B. in Klassen) zum Einsatz kommen.
Stichwort: Compilerbau

Geändert von Curtains (23.09.2008 um 12:33 Uhr)
Mit Zitat antworten
  #34 (permalink)  
Alt 24.09.2008, 14:03
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 16.09.2008
Beiträge: 29
Skullsplitter befindet sich auf einem aufstrebenden Ast
Standard

Hallo.

Danke erstmal für deine Hilfe.

Ich habe dein Script jetzt getestet, aber das gibt mir lediglich die Platzhalter und den Namen des Loops aus.

Ich benötige doch den HTML-Code, um ihn später so oft zu duplizieren, wie ich Datensätze in der Datenbank habe bzw. je nachdem wie hoch der Wert ist, den ich als Parameter mitschicke.

Bei deiner Lösung steht in
$nameObj der Name des Loops und in
$codeSnippet {admin.pw} {admin.name} usw.

Da geht der HTML-Code unter. Benötige die <tr><td>....-Tags auch, oder irre ich mich?

Danke!

Gruß,
Stefan
Mit Zitat antworten
  #35 (permalink)  
Alt 24.09.2008, 14:32
Benutzerbild von Curtains
(Schlafen||Programmieren)
XHTMLforum-Mitglied
 
Registriert seit: 27.08.2008
Beiträge: 198
Curtains befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Skullsplitter Beitrag anzeigen
Da geht der HTML-Code unter. Benötige die <tr><td>....-Tags auch, oder irre ich mich?
Der HTML-Code ist vorhanden.
1) Beispiel im Webbrowser ausführen
2) rechte Maustaste -> Seitenquelltext
Mit Zitat antworten
  #36 (permalink)  
Alt 25.09.2008, 16:10
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 16.09.2008
Beiträge: 29
Skullsplitter befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Heute ist es passiert.
Die Klasse ist fertig und funktioniert auch soweit!

PHP-Code:
<?php
//Im Falle eines Syntax-Fehlers wird er ausgegeben
//Muss auskommentiert werden, wenn das Script online geht!!!
error_reporting(E_ALL);

class 
template
{
    var 
$inhalt//Inhalt der gesamten Templatedatei
    
var $tmp_file//Templatedatei
    
var $mem_loop ''//Speicher für Loop-Inhalt (Platzhalter + HTML Code)
    
    // __construct wird ausgeführt, wenn die Klasse zum ersten mal aufgerufen wird
    // Sie prüft die Templatedatei auf ihre Existenz.
    // Wenn es sie nicht gibt, wird das Script abgebrochen und eine Fehlermeldung ausgegeben
    
public function __construct($file$error '')
    {
        
// Überprüft, ob die Datei existiert, wenn ja dann
        
if(file_exists($file))
        {
            
$this->tmp_file $file;
            
$this->inhalt file_get_contents($file);
        }
        
// Wenn die Datei nicht exisitert, wird die Fehlermeldung ausgegeben und das Script
        // abgebrochen.
        
else
        {
            exit(
"Die Datei <b>".$file."</b> konnte nicht gefunden werden!<br>
                  Bitte stellen Sie sicher, dass die Datei exisitert!"
);
        }
    }
    
    
// Die Funktion "ersetzen" wird aufgerufen um einzelne Platzhalter zu ersetzen
    
public function ersetzen ($key$value)
    {
        
$suche '/\{'.$key.'\}/';
        
$this->inhalt preg_replace($suche$value$this->inhalt1);
    }
    
    
// Die Funktion "getLoop" wird aufgerufen um Loops zu ersetzen,
    // die in der HTML-Datei festgelegt wurden durch {loop:BEZEICHNUNG} ... {loop:end}
    
public function getLoop($name$anzahl$replacement)
    {
        
// Speichern der Anzahl an Datensätzen;
        // ermittelt mit z.B. mysql_num_rows(..);
        
$this->data_count $anzahl;
        
        
// Suchsyntax für das Durchsuchen der Templatedatei nach Loops
        
$regex '!\{loop:([^\}]+)\}(.*)\{loop:end\}!sU';
        
        
// Sucht nach den Loops in der Templatedatei.
        
preg_match_all($regex$this->inhalt$match);
        
        if (isset(
$match[1]) && isset($match[2]))
        {
            
$total sizeof($match[1]);
            for (
$i 0$i $total$i++)
            {
                
// Entfernt Whitespaces am Anfang eines Strings
                // Mehr unter: http://at.php.net/manual/de/function.trim.php
                
$nameObj trim($match[1][$i]);
                
                
// Speichert den HTML-Code zwischen {loop..} ... {loop:end}
                
$codeSnippet $match[2][$i];
                
                
// Loop Bauen!
                
$this->buildLoop($nameObj$codeSnippet$replacement);
            }
        }
        
        
// ersetzen des Loops mit den Platzhaltern
        
$this->replaceLoop();
    }
    
    
// Mit dieser Funktion wird der Loop zusammengebaut
    // Sprich: der HTML-Code wird sooft kopiert, wie es Datensätze gibt
    
private function buildLoop($name$snippet$replacement)
    {
        foreach (
$replacement as $replacer)
        {
            
// HTML-Code wird dieser Variabel zugeschrieben
            // und am Ende erneut hinzugefügt
            
$this->mem_loop .= $snippet;
            
            
// $i wird benötigt um zu erkennen wie viele Felder ersetzt werden müssen.
            
$i 1;
            
            do
            {
                foreach (
$replacer as $key => $value)
                {
                    
// Baut die Suchsyntax zusammen
                    
$searcher "{".$name.".".$key."}";
                    
                    
// Ersetzt die Ergebnisse der Suchsyntax
                    
$this->mem_loop preg_replace($searcher$value$this->mem_loop1);
                }
                
$i++;
                
            } while (
$i != count($replacer));
            
        }
    }
    
    private function 
replaceLoop()
    {
        
// Suchsyntax zusammenbauen
        
$regex '!\{loop:([^\}]+)\}(.*)\{loop:end\}!sU';
        
        
// Suchen und ersetzen in der eigentlichen Templatedatei!
        
$this->inhalt preg_replace($regex$this->mem_loop$this->inhalt1);
    }
    
    
// Die Funktion "ausgabe" gibt das Template aus!
    
public function ausgabe ()
    {
        echo 
$this->inhalt;
    }
}
?>
aufgerufen wird es so:
PHP-Code:
<?php
include("template_class.php");

$template "templates/index2.htm";

mysql_connect("localhost""root""") or die(mysql_error());
mysql_select_db("db")  or die(mysql_error());

$neu = new template($template);

$sql_a mysql_query("SELECT * FROM admin");
$num_a mysql_num_rows($sql_a);
$admin = array();

while(
$res_a mysql_fetch_array($sql_a))
{
    
$admin[] = array("name" => $res_a[1], "pw" => $res_a[2]);          
}

$neu->getLoop("admin"$num_a$admin);
$neu->ersetzen("TITEL""testseite");
$neu->ausgabe();
?>
Die HTML-Datei:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{TITEL}</title>
</head>

<body>
<div style="width: 500px;">
{loop:admin}
  <div style="width: 250px; float:left; ">{admin.name}</div>
  <div style="width: 250px; float: right;">{admin.pw}</div>
{loop:end}
</div>
</body>
</html>
Das einzige Problem, das ich jetzt noch habe ist, dass das Ergebnis so aussieht:
Code:
...
<div style="width: 500px;">

  <div style="width: 250px; float:left; ">{Stefan}</div>
  <div style="width: 250px; float: right;">{spammer}</div>

  <div style="width: 250px; float:left; ">{Laura}</div>
  <div style="width: 250px; float: right;">{wusel}</div>

  <div style="width: 250px; float:left; ">{Faischt}</div>
  <div style="width: 250px; float: right;">{wawa}</div>

  <div style="width: 250px; float:left; ">{Lilli}</div>
  <div style="width: 250px; float: right;">{brumbrum}</div>

  <div style="width: 250px; float:left; ">{Mitzi}</div>
  <div style="width: 250px; float: right;">{katze halt}</div>

  <div style="width: 250px; float:left; ">{Charlie}</div>
  <div style="width: 250px; float: right;">{Fetter Tiga}</div>

</div>

...
Irgendwo muss ich noch {} drinnen haben, die nicht dort hingehören. Aber das finde ich auch noch heraus, hoffe ich... ^^

Gruß
Stefan

PS:
Danke für eure Hilfe!
Seit wirklich spitze! Vielen, vielen herzlichen Dank!
Mit Zitat antworten
  #37 (permalink)  
Alt 25.09.2008, 16:26
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 11.09.2006
Beiträge: 1.008
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

In deiner Funktion buildLoop():

PHP-Code:
// Baut die Suchsyntax zusammen
$searcher "{".$name.".".$key."}"
Du verwendest {} als Delimiter, dementsprechend wird das nicht ersetzt.
Außerdem ist der . ein spezielles Zeichen bei Regulären Ausdrücken, den musst du escapen (macht hier preg_quote automatisch).
Reguläre Ausdrücke - Metazeichen

PHP-Code:
// Baut die Suchsyntax zusammen
$searcher "~\{" preg_quote ($name "." $key'~') . "\}~"
Mit Zitat antworten
  #38 (permalink)  
Alt 25.09.2008, 16:46
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 16.09.2008
Beiträge: 29
Skullsplitter befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Hehe alles klar. Vielen Dank.

Hab jetzt alle möglichen Varianten mit trim versucht in der replaceLoop-Funktion. War ja nah dran

In demfall sieht die fertige Klasse so aus:
PHP-Code:
<?php
###################################################################
# TEMPLATE CLASS                                                  #
###################################################################
//Im Falle eines Syntax-Fehlers wird er ausgegeben
//Muss auskommentiert werden, wenn das Script online geht!!!
error_reporting(E_ALL);

class 
template
{
    var 
$inhalt//Inhalt der gesamten Templatedatei
    
var $tmp_file//Templatedatei
    
var $mem_loop ''//Speicher für Loop-Inhalt (Platzhalter + HTML Code)
    
    // __construct wird ausgeführt, wenn die Klasse zum ersten mal aufgerufen wird
    // Sie prüft die Templatedatei auf ihre Existenz.
    // Wenn es sie nicht gibt, wird das Script abgebrochen und eine Fehlermeldung ausgegeben
    
public function __construct($file$error '')
    {
        
// Überprüft, ob die Datei existiert, wenn ja dann
        
if(file_exists($file))
        {
            
$this->tmp_file $file;
            
$this->inhalt file_get_contents($file);
        }
        
// Wenn die Datei nicht exisitert, wird die Fehlermeldung ausgegeben und das Script
        // abgebrochen.
        
else
        {
            exit(
"Die Datei <b>".$file."</b> konnte nicht gefunden werden!<br>
                  Bitte stellen Sie sicher, dass die Datei exisitert!"
);
        }
    }
    
    
// Die Funktion "ersetzen" wird aufgerufen um einzelne Platzhalter zu ersetzen
    
public function ersetzen ($key$value)
    {
        
$suche '/\{'.$key.'\}/';
        
$this->inhalt preg_replace($suche$value$this->inhalt1);
    }
    
    
// Die Funktion "getLoop" wird aufgerufen um Loops zu ersetzen,
    // die in der HTML-Datei festgelegt wurden durch {loop:BEZEICHNUNG} ... {loop:end}
    
public function getLoop($name$anzahl$replacement)
    {
        
// Speichern der Anzahl an Datensätzen;
        // ermittelt mit z.B. mysql_num_rows(..);
        
$this->data_count $anzahl;
        
        
// Suchsyntax für das Durchsuchen der Templatedatei nach Loops
        
$regex '!\{loop:([^\}]+)\}(.*)\{loop:end\}!sU';
        
        
// Sucht nach den Loops in der Templatedatei.
        
preg_match_all($regex$this->inhalt$match);
        
        if (isset(
$match[1]) && isset($match[2]))
        {
            
$total sizeof($match[1]);
            for (
$i 0$i $total$i++)
            {
                
// Entfernt Whitespaces am Anfang eines Strings
                // Mehr unter: http://at.php.net/manual/de/function.trim.php
                
$nameObj trim($match[1][$i]);
                
                
// Speichert den HTML-Code zwischen {loop..} ... {loop:end}
                
$codeSnippet $match[2][$i];
                
                
// Loop Bauen!
                
$this->buildLoop($nameObj$codeSnippet$replacement);
            }
        }
        
        
// ersetzen des Loops mit den Platzhaltern
        
$this->replaceLoop();
    }
    
    
// Mit dieser Funktion wird der Loop zusammengebaut
    // Sprich: der HTML-Code wird sooft kopiert, wie es Datensätze gibt
    
private function buildLoop($name$snippet$replacement)
    {
        foreach (
$replacement as $replacer)
        {
            
// HTML-Code wird dieser Variabel zugeschrieben
            // und am Ende erneut hinzugefügt
            
$this->mem_loop .= $snippet;
            
            
// $i wird benötigt um zu erkennen wie viele Felder ersetzt werden müssen.
            
$i 1;
            
            do
            {
                foreach (
$replacer as $key => $value)
                {
                    
// Baut die Suchsyntax zusammen
                    // { } sind deliminater und müssen dh deaktiviert werden. 
                    // Andernfalls werden sie bei der Ausgbae auch angezeigt!
                    // preg_quote baut den String zusammen.
                    // ohne preg_quote ist der "." ein spezielles Zeichen....
                    // mehr Infos: http://regexp-evaluator.de/tutorial/metazeichen/#punkt
                    
$searcher "~\{" preg_quote ($name "." $key'~') . "\}~";  
                    
                    
// Ersetzt die Ergebnisse der Suchsyntax
                    
$this->mem_loop preg_replace($searcher$value$this->mem_loop1);
                }
                
$i++;
                
            } while (
$i != count($replacer));
            
        }
    }
    
    private function 
replaceLoop()
    {
        
// Suchsyntax zusammenbauen
        
$regex '!\{loop:([^\}]+)\}(.*)\{loop:end\}!sU';
        
        
$this->mem_loop trim($this->mem_loop"\x7B..\x7D");
        
        
//echo $this->mem_loop;
        // Suchen und ersetzen in der eigentlichen Templatedatei!
        
$this->inhalt preg_replace($regex$this->mem_loop$this->inhalt1);
    }
    
    
// Die Funktion "ausgabe" gibt das Template aus!
    
public function ausgabe ()
    {
        echo 
$this->inhalt;
    }
}
?>
Freigegeben für die Verwendung von Jedermann.

Danke!

Grüße
Stefan

Geändert von Skullsplitter (25.09.2008 um 16:49 Uhr)
Mit Zitat antworten
Antwort


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Templateklasse Timo Serveradministration und serverseitige Scripte 10 12.09.2007 13:46


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:31 Uhr.