php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.02.2007, 23:59  
GN
Erfahrener Benutzer
 
Registriert seit: 17.01.2004
Beiträge: 155
GN zeigte ein beschämendes Verhalten in der Vergangenheit
Standard Template + while-Schleife

Hallo,

derzeit versuche ich mich, in Sachen Templates.

Ich habe folgende Klasse:
// Template-Klasse.php
PHP-Code:
class parser
 
{
     var 
$search    =   array();
     var 
$replace   =   array();
     var 
$content   =   "";

     
// die Template-Datei laden
     
function loadTemplatefile($file)
     {
         
$this->content file_get_contents($file);
     }

     
// die Zeilendaten, den Template-Platzhaltern zuweisen
     
function setVariables($search$replace)
     {
         
$this->search[$search] = $search;
         
$this->replace[$search] = $replace;
     }

     
// die Webseite ausgeben
     
function show()
     {
         print 
str_replace($this->search$this->replace$this->content);
     }
 } 
Diese Klasse sucht nach Platzhaltern und ersetzt diese.
Bei einem einzelnen Datensatz funzt dies auch, aber wenn ich eine Ergebnistabelle erzeugen möchte, funzt es nicht.

Die Template-Datei sieht so aus:
// Result.html
Code:
<table>
<thead>
  <tr>
    <th>ID:</th>
    <th>Bezeichnung:</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td>{ID}</td>
    <td>{Bezeichnung}</td>
  </tr>
</tbody>
</table>
Wenn ich mir aber die Daten aus der DB hole und die mir auflisten lassen will, bringt er mir immer nur einen Datensatz zur Ausgabe.

// Result.php
PHP-Code:
  $sql $db->query("SELECT id, bezeichnung FROM daten WHERE id BETWEEN 1 AND 100);
  require_once " 
Template-Klasse.php ";
  $template = new parser();
  $template->loadTemplatefile("
Result.html");

  $i = 0;
  while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
  {
      $template->setVariables('{ID}', $row['id']);
      $template->setVariables('{Bezeichnung}', $row['bezeichnung']
      $i++;
  }

  $template->show(); 

Frage: Wieso funzt das in einer Schleife nicht?


GN
GN ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.02.2007, 02:29  
Benutzer
 
Registriert seit: 18.05.2008
Beiträge: 41
MrZYX befindet sich auf einem aufstrebenden Ast
MrZYX eine Nachricht über ICQ schicken MrZYX eine Nachricht über AIM schicken MrZYX eine Nachricht über MSN schicken MrZYX eine Nachricht über Yahoo! schicken MrZYX eine Nachricht über Skype™ schicken
Standard

Ich denke $template->show(); muss mit in die Schleife
__________________
Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. - Albert Einstein
MrZYX ist offline  
Alt 11.02.2007, 11:46  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Du überschreibst doch {ID} nach jedem mal wenn du die Schleife durchläufst. Also beim ersten mal wird z.b. {ID} zu 1 dann wirds beim nächsten Durchlauf {ID} zu 2 und am Ende hast du halt nur den letzten Datensatz.

Außerdem wird bei dir auch im Template nur einmal das {ID} und {Bezeichnung} angezeigt. Du musst im Template schon definieren was alles geloopt werden soll.
Flor1an ist offline  
Alt 11.02.2007, 16:46  
GN
Erfahrener Benutzer
 
Registriert seit: 17.01.2004
Beiträge: 155
GN zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von RaZoR
Du überschreibst doch {ID} nach jedem mal wenn du die Schleife durchläufst. Also beim ersten mal wird z.b. {ID} zu 1 dann wirds beim nächsten Durchlauf {ID} zu 2 und am Ende hast du halt nur den letzten Datensatz.

Außerdem wird bei dir auch im Template nur einmal das {ID} und {Bezeichnung} angezeigt. Du musst im Template schon definieren was alles geloopt werden soll.
Hallo,

wie meinst du das?
Was muss ich denn alles im Template mit angeben?


GN
GN ist offline  
Alt 11.02.2007, 18:14  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
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 GN,

Was stellst du da für Fragen? Du hast doch die Parser-Klasse selbst geschrieben?! Wenn du dein Template nur an einer Stelle transformierst, wirst du auch nur eine ausgabe bekommen.

Solltest sowas machen, wobei das Template dann anders gewählt werden muss:

PHP-Code:

$sql 
$db->query("SELECT id, bezeichnung FROM daten WHERE id BETWEEN 1 AND 100);
  require_once " 
Template-Klasse.php ";
  $template = new parser();
  $template->loadTemplatefile("
Result.html");

  $sBuffer = (string)'';
  while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
  {
      $template->setVariables('{ID}', $row['id']);
      $template->setVariables('{Bezeichnung}', $row['bezeichnung']
      $sBuffer .= $template->show();
  }

  echo $sBuffer;
?> 
Aber das hättest du aus den bisherigen Posts auch sehen können...
__________________
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  
Alt 11.02.2007, 18:14  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Bei dir wird jetzt einfach {ID} und {Bezeichnung} ersetzt ... aber du willst doch für jeden Eintrag in der Datenbank dass sich dieser Teil hier:
Code:
<tr>
    <td>{ID}</td>
    <td>{Bezeichnung}</td>
  </tr>
wiederholt oder??
Flor1an ist offline  
Alt 26.03.2007, 20:45  
GN
Erfahrener Benutzer
 
Registriert seit: 17.01.2004
Beiträge: 155
GN zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von RaZoR
Bei dir wird jetzt einfach {ID} und {Bezeichnung} ersetzt ... aber du willst doch für jeden Eintrag in der Datenbank dass sich dieser Teil hier:
Code:
<tr>
    <td>{ID}</td>
    <td>{Bezeichnung}</td>
  </tr>
wiederholt oder??
Hallo,

einige Tage später, aber ja.
Ich möchte, dass für jeden Eintrag in der Datenbank sich dieser Teil ({ID} und {Bezeichnung}) wiederholt.

GN
GN ist offline  
Alt 26.03.2007, 21:13  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Dann musst du im Template irgendwie definieren dass genau dieser Teil wiederholt werden soll. Irgendwie z.b.

Code:
{foreach $array}
<tr>
    <td>{$array.ID}</td>
    <td>{$array.Bezeichnung}</td>
</td>
{/foreach}
Und dann musst du mit deiner Klasse eben {foreach ...} und {/foreach} rausfiltern und den Teil dazwischen per Schleife durchgehen. Das ganze ist allerdings sehr kompliziert daher rate ich dir wenn du ein so komplexes Templatesystem haben möchtest lieber ein fertiges zu nehmen. Smarty
Flor1an ist offline  
Alt 26.03.2007, 21:59  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

tja
jetzt kommen wir zum ergebnis, dass eine Moderne template die schleifen unterstützen muss, und noch 3 Tage später kommst du zu dem ergebnis, das auch die laufwariablen auch zur einer Template gehören
(um zbs wechselnde farben bei tabelle zu machen).
nach einem monat, wäre es auch nicht schlecht ein paar anderen dingen oder funktionen rein zuhauen.
Wenn du genug gedult hast, dann entwickelst du etwas was schon vorhanden ist wie Smarty oder andere stringersetzende Templatesystemen die auf basis von einer interpreter-sprache PHP neue Interpreter-sprachen programmiert haben und für mich als Fehlentwicklung zu bezeichnen sind.

"Jetzt werde ich als verrückt bezeichnet"

Bitte versuch nie mehr PHP von HTML zu trennen, da am ende hast du statt PHP eine andere pseudo-sprache die immer noch in HTML steckt.
Trenne bitte deine Geschäftslogik von Ausgabel_und_Layoutlogik und wenn das sein muss, dann verwende bei Ausgabel_und_Layoutlogik die funktionen die PHP bietet, statt kommische pseudo-code, das sich in wirklichkeit kaum von PHP unterscheidet aber performance, arbeitspeicher und unnötige einarbeitungszeit verlangt.
beispiel Smarty
deine Template würde etwa so aussehen.

<table>
<thead>
<tr>
<th>ID:</th>
<th>Bezeichnung:</th>
</tr>
</thead>
<tbody>
{foreach from=$myArray item=foo}
<tr>
<td>{$foo.ID}</td>
<td>{$foo.Bezeichnung}</td>
</tr>
{/foreach}
</tbody>
</table>

wuala, du hasst die code bekommen, die sich kaum von normalem PHP-code unterscheidet und die Designer verstehen von diesem code genau so viel wie von php.
ausserdem muss du alle ergebnisse von deiner mysql-abfrage erst in ein array zwischenspeichern und erst danach an die assign übergeben und dann mit php noch mal interpretiert wird.
Dadurch steigt der speicherverbrauch und sinkt die geschwindigkeit von deiner Anwendung.

Wenn du dich für die trennung von Geschäftslogik von Ausgabe und Layoutlogik beschäftigen möchtest, dann werde ich bei bedarf die passende Einsätze vorschlagen.
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 26.03.2007, 22:26  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Zitat von Slava
wuala, du hasst die code bekommen, die sich kaum von normalem PHP-code unterscheidet und die Designer verstehen von diesem code genau so viel wie von php.
ganz ehrlich, dieser gedanke ist mir auch schon öfter gekommen. aber zwei grundlegende vorteile hat ein template eben doch.

1. Du hast soweit wir möglich Inhalt und Layout getrennt. Wenn Du Dein Template gut machst, brauchst Du Dich nur einmal darum zu kümmern. Danach nur noch nutzen.
2. das Layout ist für sich von einem Designer bearbeitbar. Selbst wenn du ein Peudotemplate nutzt, indem du das tust:
Code:
<table>
<thead>
<tr>
<th>ID:</th>
<th>Bezeichnung:</th>
</tr>
</thead>
<tbody>

<tr>
<td><?= $FooID ?></td>
<td><?= $FooBezeichnung ?></td>
</tr>

</tbody>
</table>
(mal ohne die Schleife, sonst aber ähnlich simpel) gibts immer noch das Problem, dass die Felder ohne Parsing und konkrete Vorgaben keine Inhalte besitzen. Damit ändert sich zwangsläufig auch das Aussehen der html Anzeige beim Layouten.
nikosch ist offline  
 


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
While schleife -> letzter durchgang Skazi PHP Tipps 2006 7 16.09.2006 00:11
Problem mit while schleife obi PHP Tipps 2006 6 31.08.2006 13:40
mysql_query verschmelzen zweier abfragen (while schleife) Buschdieb PHP Tipps 2006 10 15.07.2006 17:11
while schleife - spezial datensatz einblenden Buschdieb PHP Tipps 2006 2 09.04.2006 13:05
while Schleife gibt nicht alle Daten aus PHP Tipps 2006 2 12.01.2006 19:24
[Erledigt] While schleife in while schleife = nur ein datensatz?! PHP Tipps 2005-2 9 28.10.2005 12:48
while schleife in einer while schleife beim tmpl-sys PHP Tipps 2005-2 0 27.07.2005 15:07
While Schleife Beatbox Off-Topic Diskussionen 8 19.05.2005 21:55
while schleife beenden PHP Tipps 2005 3 29.03.2005 20:35
IF ELSEIF ELSEIF ELSE mit While Schleife PHP Tipps 2005 9 04.03.2005 23:27
Variabel aus while schleife ausserhalb der schleife nutzen PHP Tipps 2005 8 12.02.2005 18:04
resultausgabe mit while schleife in pdf dokument PHP Tipps 2004 2 23.09.2004 14:56
Nach while Schleife funzt nix mehr?! PHP Tipps 2004 15 25.08.2004 00:25
[Erledigt] probleme mit ner while schleife PHP Tipps 2004 5 23.07.2004 17:28
Prob mit While schleife JEGO PHP Tipps 2004 2 04.06.2004 12:01

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php schleife in template, template for schleife, \wechselnde farben\ eintrag smarty

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:42 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.