Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > PHP template und schleifen
Antwort
 
Themen-Optionen
Alt 21.09.2007, 16:08   Nach oben    #41
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

Langsam wird es mir peinlich >.< , aber irgendwie ist da noch was falsch und zwar ergibt die daten zwar nun richtig aus, aber er wiederwohlt die ganze seite und nicht nur die schleife??



Ich werd langsam wahnsinig.

Geändert von Victorious (21.09.2007 um 17:43 Uhr).
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.09.2007, 17:12   Nach oben    #42
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Dir fehlen noch ein paar Grundlagen, aber das kommt

Du musst die Schleife rauslösen, abarbeiten und dann komplett ersetzen. Dann sollte auch nur der Teil wiederholt werden...
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.09.2007, 17:19   Nach oben    #43
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

ohja mir fehlt einiges, ich hab zwar schon lange mit php angefangen aber ca 2 jahre pause gehabt. Die kam ned so gut. Aber es wird hab wieder einiges dazu gerlernt.
Ich weiß zwar nicht wie ich die schleife rauslösen kann. Hast vlt nen tipp oder so bzw seiten wo ich grundlegen php kenntnisse nach arbeiten kann?
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.09.2007, 17:31   Nach oben    #44
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Erstmal suchst du die Schleifen, dann weißt du auch, was darin ersetzt werden soll. Dann sammelst du alle Daten in einer temporären Variable. Danach machst du mit dem gleichen Suchmuster, mit dem du deine Schleife gefunden hast, ein replace darauf und setzt dafür den Inhalt deiner temporären Variable rein. Fertig

Probiers mal aus.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.09.2007, 18:13   Nach oben    #45
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

hm ich denke das ich das verstanden habe. sprich ich soll per

preg_match(); die ganze tpl durch suchen und die dann sagen wir mal der

var $loop =""; speichern. mit den werten mache ich ein preg_replace();
so das ich nur die schleife habe. richtig?

Wenn ja habe ich nur ein prob vlt auch nen großes und das wäre ich hab noch ned wirklich mit regexp gearbeitet.
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.09.2007, 18:21   Nach oben    #46
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Dank CIX88 gibts eine wunderschöne Lernhilfe für Regex: http://www.regex-tester.de/regex.html
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.09.2007, 18:23   Nach oben    #47
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

ah cool danke. aber die vorgehnsweise war korrekt oder?
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.09.2007, 00:09   Nach oben    #48
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

Nach ca 4 1/2 stunden habe ich es doch noch geschaft es zum laufen zu bekommen.
Ich glaub aber das es nicht gerade ne elegante lösung ist.

PHP-Code:
//temporäre variable
var $tmp "";
   
//temporäre variable 2
var $tmp2 "";
   
// Inhalt der Schleife
var $loop ="";

function 
assign_array($replace$replacement_array){
    
//Hier wird nach der Schleife gesucht
    
$match = array ();
     
     
preg_match('/\{foreach \$'.$replace.'\}(.*?)\{\/foreach\}/si'$this->template$match);
    
    
//Hier wird die Schleife in der temporären Varibale 2 gespeichert
    
$this->tmp2 $match[0];
    
    
$matches = array ();
     
    
preg_match('/\{foreach \$'.$replace.'\}(.*?)\{\/foreach\}/si'$this->tmp2$matches);
    
    
$row '';
              
    
$items $matches['1'];

    foreach (
$replacement_array as $keys => $key){
        
$items str_replace($this->leftDelimiter.$keys.$this->rightDelimiter$key$items);
    }
        
$row .= str_replace($matches['1'], $row$items);
        
$row rtrim($row);
     
        
$all_rows preg_replace('/\r\n/si'''rtrim($row), 1);
          
        
//Hier wird der Inhalt der Schleife gespeichert
        
$this->loop .= str_replace($matches[0], $all_rows$this->tmp2);
         
        
$this->tmp preg_replace('/\{foreach \$'.$replace.'\}(.*?)\{\/foreach\}/ims' ,$this->loop ,$this->template);
       
        return 
true;

Und ganz ok ist das auch noch ned, weil wenn ich zb ne 2 foreach schleife einbaue haut das hinten und vorne ned hin.
Dann sieht das ganze so aus.
HTML-Code:
Forum

{foreach $news} {$topic_title}
Themenzeit: Deine Gilde!
{foreach $news2} {$name}
Wartungen am Montag
{foreach $news2} {$name}
Herzlichen Glückwunsch zum 3ten
{foreach $news2} {$name}
Frohe Weihnachten und einen Guten rutsch
{foreach $news2} {$name}
Koosai feiert 2. Geburtstag
{foreach $news2} {$name}
Ragnarok no Seishi
Ro Cards
Ragnarok Online
euro-Ro
Ragnarok Online Database Engine
{/foreach} 
Ich mach da noch ganz schön große denk fehler.

Geändert von Victorious (22.09.2007 um 00:49 Uhr).
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.09.2007, 03:47   Nach oben    #49
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

So ich hab es nun fast geschaft, das hin zu bekommen was ich wollte.Da gibt es nur noch 1 fehler bzw ein prob und ich weiss ned wie ich das lösen kann.
So sieht momentan die Ausgabe aus. Soweit schon richtig bis auf den letzten teil.
HTML-Code:
  Infos          
Link: Ragnarok Online Database Engine      
Beschreibung:  Infos für updates in naher zukunft               

Link: DoddlerRO      
Beschreibung:  Infos Über updates von kRO                              
Ally          
Link: {name}      
Beschreibung:  {besch}                           
Also diesen :
HTML-Code:
Ally          
Link: {name}      
Beschreibung:  
{besch}
Info und Ally sind die Kategorien.Darunter sind dann die einzeln links also in diesem Beispiel. Aber zur Kategorie Ally ist kein eintrag, also soll bis auf der Kategoriename nix stehn.

Die index.tpl sieht so aus:
PHP-Code:
<!-- BEGIN linkcat -->
<
table width='567' height='22'>
<
tr>
<
td width='100%'>{cate}</b></td>
</
tr>
</
table>

<!-- 
BEGIN links -->
<
table  width='562' height='38'>
<
tr>
<
td width='100' height='19'><b>Link:</b></font></td>
<
td width='462' height='19'><A href='http://{link}'  target='_blank'>{name}</a></td>
</
tr>
<
tr>
<
td width='100' height='19'><b>Beschreibung:</b>
</
td>
<
td width='462' height='19'>{besch}
</
td>
</
tr>
</
table>
<!-- 
END links -->
<!-- 
END linkcat --> 
die tpl.class.php:
PHP-Code:
 /*-- Hinzufügen verschachtelter Blöcke --*/

    
function assign_array($replace$replacement_array){
        if(
strstr($replace'.')){
            
$block           explode('.' ,$replace);
            
$countblock   sizeof($block) -1;
            
$str              '$this->template[$this->counttpl]';

            for(
$i 0$i$countblock$i++){
                
$str .= '[\''$block[$i] .'.\']';
                eval(
'$lastkey = sizeof('.$str .') -1;');
                
$str .=    '['$lastkey ']';
            }
            
$str .= '[\''.$block[$countblock].'.\'][] = $replacement_array;';
            eval(
$str);
        } else {
            
$this->template[$this->counttpl][$replace.'.'][] = $replacement_array;
        }
     return 
true;
    }




    
/*-- Überprüfen, ob der übergebene $key einen Punkt enthält. Wenn nicht, einen anhängen --*/

    
function createkey($key){
        if(
strstr($key,'.')){
            return 
$key;
        } else {
            return 
$key.".";
        }
    }




    
/*-- Ersetzten der verschachtelten Blöcke --*/

    
function blockReplace($replace$code$fileNum){
        
$codecopy $code;
        
$data "";

        if(
substr(stripslashes($replace),0,11) == "serialized:"){
            
$blockNum unserialize(stripslashes(substr($replace,11)));
        } elseif(
array_key_exists($this->createKey($replace),$this->template[$fileNum])) {
            
$blockNum $this->template[$fileNum][$this->createKey($replace)];
        } else {
            
$blockNum 'NONE';
        }


        if(
$blockNum != 'NONE'){
            for(
$i=0;$i<count($blockNum);$i++) {
                
$code $codecopy;
                foreach(
$blockNum[$i] as $key => $value) {
                    if(
is_array($value) && strstr($key,'.')){
                        
$key substr($key,0,-1);
                        
$dimensions addslashes('serialized:'.serialize($blockNum[$i][$this->createKey($key)]));

                        
$code preg_replace("#<!-- BEGIN ".$key." -->(.*)<!-- END ".$key." -->#Ueis","\$this->blockReplace('$dimensions', '$1', $fileNum)",$code);
                    } else {
                        
$code preg_replace("#{[[:space:]]*?(".$key."){1,}?[[:space:]]*?}#"$value$code);
                    }
                }
                
$data .= $code;

            }
            return 
$data;
        } else {
            return 
/*$code*/'';
        }
    }
    
/*-- Ersetzten --*/

    
function out() {
        for(
$tmpFile=0;$tmpFile<count($this->opentpl);$tmpFile++){
            
$this->opentpl[$tmpFile] = preg_replace("#<!-- BEGIN (.*) -->(.*)<!-- END \\1 -->#Ueis","\$this->blockReplace('$1','$2', $tmpFile)",$this->opentpl[$tmpFile]);
            
$i 0;
            foreach(
$this->template[$tmpFile]['.'] as $key => $value){
                
$this->opentpl[$tmpFile] = preg_replace("#{[[:space:]]*?(".$key."){1,}?[[:space:]]*?}#"$value$this->opentpl[$tmpFile]);
            }
        }
    
    
$this->replacefunctions();
        
$this->output();
        exit;
    }



    
/*--  Löscht alle \ vor " und ' --*/

    
function output(){
        
$code implode("",$this->opentpl);
        
$code preg_replace("#(\\\){1,}(\"|')#Uis","$2",$code);
        echo 
$code;
    } 
Sieht nun ganz anders aus als was ich vorher hatte, aber mit dem alten hat das einfach nicht hingehauen wie es sollte.Bis halt auf das eine läuft es soweit gut.

Geändert von Victorious (23.09.2007 um 03:53 Uhr).
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.09.2007, 20:11   Nach oben    #50
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Zitat:
Aber zur Kategorie Ally ist kein eintrag, also soll bis auf der Kategoriename nix stehn.
Genau jetzt fängt es an, wenn ein Templatesystem komplex wird.
Du müsstest also jetzt einen IF Bereich in deinem Templatesystem einbauen und dann z.B. dein Template so erweitern:

PHP-Code:
<!-- BEGIN linkcat -->
<
table width='567' height='22'>
<
tr>
<
td width='100%'>{cate}</b></td>
</
tr>
</
table>
{if 
type="notempty" var="link"}
<!-- 
BEGIN links -->
<
table  width='562' height='38'>
<
tr>
<
td width='100' height='19'><b>Link:</b></font></td>
<
td width='462' height='19'><A href='http://{link}'  target='_blank'>{name}</a></td>
</
tr>
<
tr>
<
td width='100' height='19'><b>Beschreibung:</b>
</
td>
<
td width='462' height='19'>{besch}
</
td>
</
tr>
</
table>
{/if}
<!-- 
END links -->
<!-- 
END linkcat --> 
Nur so als Beispiel... aber wie gesagt: jetzt wirds komplex
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.09.2007, 08:02   Nach oben    #51
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

hm hab die ganze zeit überlegt wie und wo ich das genau einbauen soll in der template klasse. Mit einer IF Bedingung habe ich mir auch schon überlegt, aber ich komm ned drauf wo.
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.09.2007, 10:50   Nach oben    #52
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Ich würde halt ein "parser" bauen, der beim out() aufgerufen wird, direkt bevor das Template ausgeliefert wird. Zu dem Zeitpunkt sollten alle Details existieren und ein IF wissen, ob es true oder false ist.
Halt einfach eine neue Methode machen
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.09.2007, 12:56   Nach oben    #53
Benutzer
 
Registriert seit: 16.09.2007
Beiträge: 43
Standard

So zb ?

PHP-Code:
   function out() {
        for(
$tmpFile=0;$tmpFile<count($this->opentpl);$tmpFile++){
            if(
$value ==0){            $this->opentpl[$tmpFile] = preg_replace("#<!-- BEGIN (.*) -->(.*)<!-- END \\1 -->#Ueis","",$this->opentpl[$tmpFile]);
            
$i 0;}else{
            
$this->opentpl[$tmpFile] = preg_replace("#<!-- BEGIN (.*) -->(.*)<!-- END \\1 -->#Ueis","\$this->blockReplace('$1','$2', $tmpFile)",$this->opentpl[$tmpFile]);
            
$i 0;}
            foreach(
$this->template[$tmpFile]['.'] as $key => $value){
                
$this->opentpl[$tmpFile] = preg_replace("#{[[:space:]]*?(".$key."){1,}?[[:space:]]*?}#"$value$this->opentpl[$tmpFile]);
            }
        }
    
    
$this->replacefunctions();
        
$this->output();
        exit;
    } 
oder wie ist das gemeint?
Victorious ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.09.2007, 13:03   Nach oben    #54