Portal > Foren > PHP > PHP-Programmierung > Templatesystem - Foreach-Schleifen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 22.12.2005, 12:48 Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 287
Standard Templatesystem - Foreach-Schleifen

Ja das haben wir alle schon mal durchgekaut...dennoch möchte ich auch dieses Rad selbst bauen.

Nun das Templatesystem Tutorial hier im Forum ist wirklich gut. Ich hab es durchgemacht und so klappt es auch prima.

Jedenfalls wollte ich wie bei Smarty ein {foreach} hinzufügen, jedoch weiß ich nicht so recht wie man das so am geschicktesten implementiert.

Ich hatte mir das so überlegt. Beim assign() wird ja die zu ersetzende Variable übergeben und der dementsprechende Text. in der Klasse wird nun geprüft ob es sich dabei um ein Array handelt. Nun weiß ich nicht so recht ob man dafür ne neue private Funktion machen sollte die Arrays abarbeitet oder ob ich das in die replaceFunction einbauen sollte, was eigentlich mir besser erscheint. Nun ja hat jemand dazu vielleicht nen kleinen Tip wie man sowas abarbeiten würde?
ex³ ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.12.2005, 12:57 Nach oben    #2
Verplanter Benutzer
 
Registriert seit: 14.12.2004
Beiträge: 238
Standard

Hmmm also ich würde in dem

{foreach [name]}

folgendes nur das array [namen] mitgeben. Dann in der umsetzung wie im Tut
das Array per assign definieren und dann einfach bei der umsetzung wie mit
den anderen Möglichkeiten nach ...

{foreach [name]} // evtl. noch mit Filenamen für ein ausgabe template pro schleife
{foreach name:[name] file:[file]}

suchen bzw. die übereinstimmung mit [name] in der tpl Anweisung mit der
in den assign definierten vergleichen und das ganze dann wie die andern auch
mit preg_replace ersetzen.

Das Array müsste halt vorher wie gewollt zusammen gestellt werden.

Da habe ich mir auch schon gedanken gemacht ob ich das per Template mache oder
gleich im Code, ich habe mich für gleich im Code entschieden plus die ausgabe dann
per assign zu definieren.
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!

Geändert von DasMööp (22.12.2005 um 13:00 Uhr)
DasMööp ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.12.2005, 04:21 Nach oben    #3
Goldman.de
 
Benutzerbild von J33d3X
 
Registriert seit: 09.10.2005
Ort: Frankfurt am Main
Beiträge: 190
Standard

ich verstehe nicht warum immer so kompliziert ....


bsp.tpl
Code:
<div>
{% foreach($das as $des:( %}
<p>{$des}</p>
{% endforeach %}

<!-- mit while, for, do alles machbar auch bedingngen ala if -->

{% while(TRUE:( %}
<p>zeige mich</p>
{% endwhile %}

{% if(TRUE:( %}
<p>zeige mich</p>
{% endif %}

</div>
.php
PHP-Code:
<?php

// jetzt kommt eine vollwertige templateengine

$search=array('{%''%}'':;'';;'' echo "\r\n""; ');
$replace=array('"; ''; echo "'': '';''');


$tpl file_get_contents('bsp.tpl');
$tpl str_replace($search$replace$tpl);
$tpl str_replace('"''\"'$tpl);


eval(
'ob_start(); $ret = "'.$tpl.'"; $ret .= ob_get_contents();');
ob_end_clean();

echo 
$ret;

// und das war es auch schon

?>

mfg


[edit]

wenn ich ein "aufgeplustertes" system haben will nehme ich smarty
also schreibt man doch nur eine engine wenn man ein "small" system haben will ... dann aber bitte auch konsequent small
__________________
Code:
eval('echo "'.gzinflate(base64_decode('8zI2TjGOAAA=')).'";'); 

Geändert von J33d3X (23.12.2005 um 04:28 Uhr)
J33d3X ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.12.2005, 15:48 Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 287
Standard

Ich hätte grad dazu nochmal eine Frage. Ich bin dabei das Template System vom Tutorial zu verändern. Wenn ich ein {* Kommentar *} in das Template schreibe habe ich eine leere Zeile in der Ausgabe. Das ist auch das Problem wenn ich ne eigene Funktion schreibe die Arrays abarbeitet. Es bleibt immer ne Leere Zeile (Da wo foreach steht und endet) hab mit trim, etc. schon einiges probiert aber das wird nix.

Code:
{foreach $users}
    <tr>
        <td>{$id}</td>
        <td>{$name}</td>
    </tr>
{/foreach}
Ausgabe:

Code:
    <tr>
        <td>1</td>
        <td>Heinz</td>
    </tr>
Wenn ich nun irgendwie mit trim rummache oder die \n replace hin und her krieg ich auch nichts gescheites dabei raus:

Code:
<tr>
        <td>1</td>
        <td>Heinz</td>
    </tr></table>
Denke mir doch mein match Array von preg_match beinhaltet den Anfang und Ende von dem Foreach Inhalt. Warum existieren dann aber noch die leere Zeile wenn ich am Ende das gefunde Match Element komplett ersetze?
ex³ ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2006, 01:59 Nach oben    #5
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Ich hab auch mal ne Frage zu foreach Schleifen und mir gedacht ich kann diesen Thread dafür missbrauchen.
In meinem Template möchte ich das gerne so lösen:
Code:
{foreach $aEntries AS $aEntry}
    {include file="entry.tpl"}
{/foreach}
Meine PHPFunktion in meiner Templateklasse sieht so aus:
PHP-Code:
<?php
                 
// template::load()
                 
extract($this -> knownVariablesEXTR_SKIP);
                 
printArray($this -> knownVariables);
                 
$tpl $this -> replaceFunctions($tpl);
                                    
                 
$tpl str_replace('"''\"'$tpl);
                 eval(
'ob_start(); $tpl = "'.$tpl.'"; $tpl .= ob_get_contents(); ob_end_clean();');

                
// template::replaceFunctions

        
function replaceFunctions($tpl) {
                
// Funktionen innerhalb der Templates ersetzen
                
extract($this -> knownVariablesEXTR_SKIP);
                
printArray($aEntries);
                
                
// Foreach
                
while(preg_match('/' $this -> leftDelimiter 'foreach (.*) AS (.*)' $this -> rightDelimiter '(.*)' $this -> leftDelimiter '\/foreach' $this -> rightDelimiter '/isUe'$tpl)) {
                        
$tpl preg_replace('/' $this -> leftDelimiter 'foreach (.*) AS (.*)' $this -> rightDelimiter '(.*)' $this -> leftDelimiter '\/foreach' $this -> rightDelimiter '/isUe'
                                            
                                           
'print "OKAY";
                                            foreach(\\1 AS \\2) {
                                            }
                                            print "FERTIG";
                                           '
,
                        
                                            
$tpl);
                }

                return 
$tpl;
        }
?>
Nun, als Output bekomme ich "OKAY". Baue ich absichtlich einen Fehler ein so bekomme ich folgenden "Debug-Output":
Zitat:
Fatal error: preg_replace( Failed evaluating code: "print "OKAY"; foreach($aEntries AS $aEntry) { } print "FERTIG"; in [...]\php\classes\class.template.inc.php on line 188
\\1 und \\2 ($aEntries und $aEntry) werden also schon richtig eingesetzt. In dem Foreach, und nach dem Foreach geht allerdings nichts (auch wenn in der Foreach-Anweisung ein prin() steht oder so). Warum?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2006, 11:02 Nach oben    #6
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Zitat:
{% foreach($das as $des %}
<p>{$des}</p>
{% endforeach %}
Hmm mal ehrlich, das hat ja wenig etwas mit einem Templatessystem zu tun.
Der Sinn und Zweck, warum man eigentlich Templates einsetzt, ist hier eigentlich im A.....

Wenn man wieder anfängt, irgendwelchen PHP-Kram mit HTML zu vermischen, brauch man keine Templates einzusetzen.

Weis nicht wo hier die strikte und saubere Trennung von PHP und HTML sein soll ...
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2006, 11:34 Nach oben    #7
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von CIX88
Zitat:
{% foreach($das as $des %}
<p>{$des}</p>
{% endforeach %}
Hmm mal ehrlich, das hat ja wenig etwas mit einem Templatessystem zu tun.
Der Sinn und Zweck, warum man eigentlich Templates einsetzt, ist hier eigentlich im A.....

Wenn man wieder anfängt, irgendwelchen PHP-Kram mit HTML zu vermischen, brauch man keine Templates einzusetzen.

Weis nicht wo hier die strikte und saubere Trennung von PHP und HTML sein soll ...
Hm finde ich nicht. Ich finde es nämlich umständlich wenn ich das im PHPScript lösen müsste.
PHP-Code:
<?php
$_tmp 
'';
foreach(
$das as $des) {
        
// Ab dem zweiten Aufruf von template::load() wird das TPL aus
        // dem Cache geholt
        
$this -> template -> load('main');
        
$this -> template -> assign('var'$var);
        
$this -> template -> assign('var2'$var2);
        
// [...]
        
$_tmp .= $this -> template -> getTpl();
}

$this -> template -> assign('content'$_tmp);
?>
Diese Methode finde ich viel umständlicher als wenn mein Template das quasi von selber lösen würde.
Code:
{foreach $aEntries AS $aEntry}
    {include file="entry.tpl"}
{/foreach}
wäre an dieser Stelle doch viel geschickter.
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (23.04.2006 um 11:53 Uhr)
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2006, 13:20 Nach oben    #8
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Ist das selbe wie ein Template-Block.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2006, 13:45 Nach oben    #9
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von Lars
Ist das selbe wie ein Template-Block.
Joa, nur hilft mir das jetzt nicht gerade bei meinem akuten Problem (da oben) .. Ich finde es trotzdem ziemlich praktisch und möchte es gerne auch in meiner Templateklasse verwenden, außer es gibt gute Argumente dagegen.. Die Strikte Trennung von Code und HTML möchte ich natürlich schon einhalten..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2006, 13:52 Nach oben    #10
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

foreach-Schleifen sind in meinen Augen das selbe wie Templateblöcke und daher ausdrücklich erwünscht.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP] Ein eigenes Templatesystem schreiben Corvin Tutorials 42 19.03.2008 17:58
PHP template und schleifen Victorious PHP-Programmierung 57 25.09.2007 00:18
Schleifen im Templatesystem Stefan125 PHP-Programmierung 4 19.07.2007 02:36
Schleifen in einem Template verarbeiten Prophet PHP-Programmierung 11 10.09.2006 19:16
mit foreach schleife auf 4 fach verschachteltes Array zugreifen Doggi PHP-Programmierung 4 01.02.2006 15:45


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45