Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Problem mit Schleifenparsing im eigen TPL System [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Problem mit Schleifenparsing im eigen TPL System


 
eternitysoft
15-06-2006, 21:05 
 
Hi hab mir nen kleines Templatesystem geschrieben geht auch soweit auch das mit den Schleifen bis auf eine Sache:

Wenn ich jetzt in einer schleife zB folgendes zu stehen hab

<a href="link.php?id={%platzhalter%}">{%platzhalter2%}</a>


spinnt er rum und parst mir den rest in der Schleife nicht mehr richtig.

(liegt am ersten platzhalter im link das hab ich schon rausbekommen nur warum nicht)



hier mal die Funktion für die Schleifen.


function replace($search,$replace)
{


if(!is_array($replace))
{
$this->content = str_replace("{%".$search."%}", $replace, $this->content);
}
else
{


preg_match_all("/<--- BEGIN name=".$search."--->(.*?)<--- END name=".$search."--->/si"
, $this->content, $muster, PREG_PATTERN_ORDER);

$musterneu =preg_replace("/<--- BEGIN name=".$search."--->(.*?)<--- END name=".$search."--->/is"
, "\\1", $muster[0][0]);

//zählt die zu ersetzenden arrayelemente und speichert sie in $i
$count=count($replace);
$i=0;

//sucht die zu ersetzende namen raus bsp {%ersetzen.name%} << name wird gespeichert usw
preg_match_all("/{%".$search.".(.*?)%}/U", $musterneu, $zeichen, PREG_PATTERN_ORDER);
//zählt die anzahl und speicher sie in $count2
$count2=count($zeichen[1]);

//schleife solange laufen lassen bis alle arrayelemte eingesetzt wurden
while($i<$count)
{
//zählervariable
$x=0;

//speichert das neue ersetzende muster ab
$muster2=$musterneu;

//schleife solange laufen lassen bis alle platzhalter ersetzt wurden
while($x<$count2)
{
$zeichen2=$zeichen[1][$x];
$z=strlen($zeichen2);

$muster2 =str_replace("{%".$search.".".$zeichen2."%}", $replace[$i][$zeichen2], $muster2);
$x++;
}
$ausgabe .=$muster2;
$i++;
}
//platzhalter code mit dem geparsten teil ersetzen
$this->content =preg_replace("/<--- BEGIN name=".$search."--->(.*?)<--- END name=".$search."--->/si"
, $ausgabe,$this->content);
}

}


die Variablen (Arrays) zu den Schleifen sind dann folgendermaßen aufgebaut:


$ersetze = array();
array_push($ersetzen, Array(
"name" => $name,
"alter" => $alter,

)

);
array_push($ersetzen Array(
"name" => $name2,
"alter" => $alter2,

)

);


Array ( [0] => Array ( [name] => name [alter] => alter )
[1] => Array ( [name] => name2 [alter] => alter2 ) )


HTML:(geht)

<--- BEGIN name=ersetzen--->
{%ersetzen.name%}<br>
{%ersetzen.alter%}
<--- END name=ersetzen--->



HTML:(würde nicht geht)

<--- BEGIN name=ersetzen--->
<a href="link.php?alter={%ersetzen.alter%}">{%ersetzen.name%}</a><br>
<--- END name=ersetzen--->


Code ist nicht gerade der beste hoffe aber das man trotzdem durchblickt.

mfg
et

 
Slava
15-06-2006, 22:13 
 
du suchst nach {% machst aber deine platzhalter {
also ohne %-zeichen.
Das ist das, was mit aufgefallen ist, sonnst muss du uns relevante Zeilen zeigen, damit hast du mehr schanzen, dass dir geholfen wird.
Nicht jeder hat bock deine ganze code bei sich zu testen.

 
eternitysoft
15-06-2006, 22:29 
 
sry hab ich nur hier im thread vergessen im Script hab ich {%%} zu stehen.


//sucht die zu ersetzende namen raus bsp {%ersetzen.name%} << name wird gespeichert usw
preg_match_all("/{%".$search.".(.*?)%}/U", $musterneu, $zeichen, PREG_PATTERN_ORDER);

[...]

//schleife solange laufen lassen bis alle platzhalter ersetzt wurden
while($x<$count2)
{
$zeichen2=$zeichen[1][$x];
$z=strlen($zeichen2);

$muster2 =str_replace("{%".$search.".".$zeichen2."%}", $replace[$i][$zeichen2], $muster2);
$x++;
}
$ausgabe .=$muster2;
$i++;

hier nochmal die wichtigsten beiden stellen (mMn)

 
Slava
16-06-2006, 11:54 
 
so direkt kann ich nichts erkennen, weil ich keine Möglichkeit habe die werte von Variablen kontrollieren.
Es sieht so aus, dass ich doch deine code durch meine debuger laufen lassen muss.
sende per Anhang deine function, Aufruf mit deinen Parameter, und template.
es kann natürlich sein, dass zum diesem Zeitpunkt hast du ein paar print_r und echo eingebaut und dadurch selber fehler gefunden :)

 
eternitysoft
16-06-2006, 14:22 
 
So hab da mal nen kleine änderung vorgenommen damit du zum testen jetzt nicht soviel arbeit hast und zwar folgendes.

Im Orginalen werden alle Daten aus der Datenbank geholt.
Sprich das entsprechende Tpl wird aus der Db geladen und die zu ersetzenden Daten das hab ich jetzt abgeändert.

Hab mit print_r und echo auch schon nach Fehlern gesucht aber keine gefunden :P

Danke dir das du dir das mal anguckst
mfg
et

edit: sry Datei wurde nicht angehangen
Link: http://eternitysoft2.et.funpic.de/tplclass.rar

 
Slava
16-06-2006, 15:03 
 
wenn man error_reporting(E_ALL); setzt, dann kann man viele dinge entdecken
z.b.s
Notice: Undefined index: id%}">{%news_headline.newstitle in D:\wamp\www\tplclass\inc\class\tplclass.php on line 69

Notice: Undefined index: date%} / {%news_headline.time in D:\wamp\www\tplclass\inc\class\tplclass.php on line 69

Notice: Undefined variable: ausgabe in D:\wamp\www\tplclass\inc\class\tplclass.php on line 72

Notice: Undefined index: id%}">{%news_headline.newstitle in D:\wamp\www\tplclass\inc\class\tplclass.php on line 69

Notice: Undefined index: date%} / {%news_headline.time in D:\wamp\www\tplclass\inc\class\tplclass.php on line 69
-------------
soll ich weiter machen? oder du hast schon ein paar Ideen?:)

 
eternitysoft
16-06-2006, 15:42 
 
K also ich weiß jetzt wodrann das liegt weiß aber nicht wie ich das behoben kriege ><

Also

Notice: Undefined index: id%}">{%news_headline.newstitle in D:\wamp\www\tplclass\inc\class\tplclass.php on line 69

Notice: Undefined index: date%} / {%news_headline.time in D:\wamp\www\tplclass\inc\class\tplclass.php on line 69

etc kommt weil die Variablen nebennander stehen >< und er da irgendwie faxen macht


Notice: Undefined variable: ausgabe in D:\wamp\www\tplclass\inc\class\tplclass.php on line 72
weil es die Variable $ausgabe beim erstenmal anhängen nicht gab

kannst du mir da weiterhelfen ?

mfg
et

edit: ah sry danke für die Hilfe ich hab den fehler lag an den modifer U ><

 
Slava
16-06-2006, 18:37 
 
wegen fehler bei pattern darstellung
sende ich es ohne highleiting

function replace($search,$replace)
{
if(!is_array($replace))
{
$this->content = str_replace("{%".$search."%}", $replace, $this->content);
}
else
{
$ausgabe="";
preg_match_all("/<--- BEGIN name=".$search."--->(.*?)<--- END name=".$search."--->/si",
$this->content, $muster, PREG_PATTERN_ORDER);
$musterneu= preg_replace("/<--- BEGIN name=".$search."--->(.*?)<--- END name="
.$search."--->/is","$1", $muster[0][0]);

$count=count($replace);
$i=0;
preg_match_all("/\{%".$search."\.([^%]+)%\}/U",
$musterneu, $zeichen, PREG_PATTERN_ORDER);
$count2=count($zeichen[1]);
while($i<$count)
{
$x=0;
$muster2=$musterneu;
while($x<$count2)
{
$zeichen2=$zeichen[1][$x];
$z=strlen($zeichen2);
$muster2 = str_replace("{%".$search.".".$zeichen2."%}",
$replace[$i][$zeichen2], $muster2);
$x++;
}
$ausgabe.=$muster2;
$i++;
}
$this->content = preg_replace("/<--- BEGIN name=".$search."--->(.*?)<--- END name="
.$search."--->/si", $ausgabe,$this->content);
}
}

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:00 Uhr.