PHP, Templates, Loops und Blöcke...
gepostet vor 17 Jahre, 8 Monate von RoKa
Hallo Community,
ich habe mich nun schon durch einige Tuts gequält, SuFus genutzt, etc. Dennoch besteht mein bisheriges Problem immer noch.
Mit dem Ziel eine Template-parsende Klasse in PHP zu schreiben (welche bereits einfache Platzhalter durch "gefüllte" Variablen ersetzen kann!) bin ich auf das Problem der Datenbankabfragen (MySQL) gestossen. Infolge dessen gegoogelt kam die erste Frage auf: Was sind Blöcke und was unterscheidet sie von Loops? Nunja, wie bereits beschrieben habe ich schon gelesen, gelesen,...tue es mir aber immer noch schwer "zu verstehen".
Bspw.: Ich habe...
- eine Datenbank (MySQL) mit mehreren Newseinträgen mit den Angaben ID, Titel, Inhalt
- eine Templatedatei "index.tpl.html"
- eine Templatedatei "news.tpl.html"
- das PHP-Skript "index.php
- die PHP-Klasse "class.php"
Die index.tpl.html ist das Haupttemplate und wird von der index.php mit der class.php geparsed. Die news.tpl.html ist eine Templatedatei die lediglich den Teil der Darstellung der Newseinträge enthält und soll durch die index.php und eine {Platzhalter} in das Haupttemplate "inkludiert" werden.
Was wäre für die Abfrage und Darstellung der News "am besten" angebracht: Blöcke oder Loops?
Wie könnte man nun die (der gewählten Methode "Blöcke oder Loops" entsprechende) Funktion der Klasse und die MySQL-Abfrage der index.php, bzw. den Methodenaufruf gestalten?
Ich bin für jeden konstruktiven, "inspirierenden" Beitrag dankbar. "Benutz' doch mal Google"-Beiträge mag ich nicht, denn den Onkel habe ich mehrfach gefragt.
Freundliche Grüße
Roka
gepostet vor 17 Jahre, 8 Monate von BlackOperator
Mit Loops sind in der Regel Schleifen gemeint. Blöcke sind sie Elemente, die in dein Template eingesetzt werden.
Es wäre aber sicher von Vorteil, wenn du etwas Code hier posten würdest.
gepostet vor 17 Jahre, 8 Monate von Toby
Ganz grob gesagt:
Bei Loops schickst du ein mehrdimensionales Array in dein Template, wo das dann durchlaufen wird.
Bei Blöcken parst du den gleichen Templateteil immer wieder, nimmst aber immer andere Daten her.
Der Unterschied ist eigentlich marginal, ich find aber Loops bequemer, weil man gleich das passende Array aus der DB ziehen kann und das einfach nur weitergibt.
gepostet vor 17 Jahre, 8 Monate von RoKa
Danke, dass hat mir geholfen!!!
Das heißt bei der "Loop"-Methode müsste ich in mehrdimensionales Array erzeugen, welches NACH der MySQL-Abfrage, an den Parser, bzw. die entsprechende Methode, übergeben wird.
$abfrage = ("SELECT titel, inhalt FROM news");
$ergebnis = mysql_query($abfrage);
while ($row = mysql_fetch_array($ergebnis)) { //...
...in der while-Schleife wird zwar ein assoziatives Array mit Schlüsseln nach Spaltennamen erzeugt, allerdings nur "einzeilig". Danach wird das Array also "erneut gefüllt" (bei mehreren Datensätzen), da ja die Assoziationen gleich bleiben.
Wie also mit "mysql_fetch_array" ein mehrdimensionales Array erzeugen?
FG roka
gepostet vor 17 Jahre, 8 Monate von Amun Ra
$qry = 'SELECT ...';
while ($data = mysql_fetch_assoc($qry)) {
$arr[] = $data;
}
gepostet vor 17 Jahre, 8 Monate von RoKa
@Amun Ra:
Wenn ich das entpsrechend meines Query ausprobiere, erhalte ich folgende Fehlermeldung:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /Applications/xampp/xamppfiles/htdocs/roka/admin/index.php on line 46EDIT:
Habe den Fehler gefunden; so sollte es aussehen:
$abfrage = ("SELECT titel, inhalt FROM news");
$ergebnis = mysql_query($abfrage);
while ($qry = mysql_fetch_assoc($ergebnis)) {
$array[] = $qry;}
Jetzt habe ich das erstmal verstanden, wie ein solches mehrdimensionales, indiziert-assoziatives Array durch eine MySQL-Abfrage erzeugt wird. Das hat mir sehr gut geholfen. Danke.
Als nächstes werde ich versuchen die entsprechende Methode des Parsers zu schreiben. Wenn dann noch Fragen oder Hinweise auftauchen sollten, werde ich sie hier posten.
Grüße
Roka
gepostet vor 17 Jahre, 8 Monate von Amun Ra
Was dir vielleicht auch zum Verständnis helfen könnte:
Einfach mal das entstandene Array so ausgeben lassen:
echo '
';
var_dump($arr);
echo '';
Dann erhältst du ungefähr folgende Ausgabe:
array(2) {
[0]=>
array(2) {
["id"]=>
string(1) "1"
["name"]=>
string(4) "News"
}
[1]=>
array(2) {
["id"]=>
string(1) "2"
["name"]=>
string(6) "Weblog"
}
}
Wie du siehst ist ein numerisches Array entstanden,
welches wiederum 2 assoziative Arrays enthält,
welche du dann so ansprechen kannst:
$arr[$i]['cid'];
gepostet vor 17 Jahre, 8 Monate von RoKa
Finales Verständnis für mehrdimensionale Arrays aus MySQL-Abfragen!!!!! Danke.
GTA
Roka
gepostet vor 17 Jahre, 8 Monate von HEADACHE
@RoKa
so wie es aussieht, hast du noch nicht wirklich viel programmiert(ist nicht böse gemeint).
Ich kann allen Leuten die mit PHP programmieren wollen nur folgendes Tutorial empfehlen:
Da" target="_blank">http://tut.php-q.net/
Da werden dir dann auch einige Sachen klarer.
gepostet vor 17 Jahre, 8 Monate von RoKa
@Headache: Danke. Ich habe schon verhältnismäßig viel programmiert, allerdings mit vielen, vielen langen Pausen. Da brauchst teilw. schon ein bisschen Nachhilfe um wieder "in Gang" zu kommen.
Trotzdem vielen Dank für den Link.
FG roka
gepostet vor 17 Jahre, 8 Monate von The-Winner
Ein Templatesystem würde ich allerdings nicht unbedingt selbst schreiben. Da ist ein fertiges (z.B. Smarty) imo besser geeignet. Hier würde ich insbesondere zu "kompilierenden" Systemen raten, die das template in php übersetzen. Das ist schon ein stück schneller, besonders in verbindung mit php-beschleunigern.
gepostet vor 17 Jahre, 8 Monate von RoKa
Für meine "Projekte" sind Smarty (und andere) viel zu aufgebläht. Desweiteren möchte ich in der Hinsicht unabhängig von den Releases anderer sein. Ausserdem schult das Schreiben eines eigenen Parsers in PHP ungemein.
EDIT: Wie den oberen Posts zu entnehmen bekomme ich aus einer MySQL-Abfrage ein mehrdimensionales indiziert-assoziatives Array. Momentan raucht mir die Birne wegen der entsprechenden Methode meiner Klasse. Das ich das Array mit einer verschachtelten "foreach"-Schleife durchlaufen muss ist klar. Was mir allerdings noch Probleme bereitet ist anhand der Methode zwei Tags im Template sowie alle dazwischen liegenden Platzhalter zu erkennen. Eine Möglichkeit wäre vllt. per "preg_match_all" im Template zu suchen und den Inhalt zwischen beiden Tags bzw. Blockmarkierungen in einen String zu schreiben. ...
Bin für alle inspirierenden Posts dankbar.
Grüße
Roka
gepostet vor 17 Jahre, 8 Monate von FlashingPumpkin
Kuck gleich mal PN's. Sehr einfache Templateklasse, kannst gut als Beispiel brauchen. Provided alle relevanten Funktionen in sehr kompakter Art und Weise.
gepostet vor 17 Jahre, 8 Monate von knalli
Wenn ich mich nicht ganz irre, wäre eine Lösung über "preg_*" nicht gerade eine schnelle und "effiziente" Lösung.
Weitere Inspiration:
XSLT als Template-EngineDa haben wir an dieser Stelle diskutiert, ob man nicht auch XSL/XSLT als Templateengine nutzen kann.
gepostet vor 17 Jahre, 8 Monate von Drezil
wenn dier smarty zu aufgebläht ist, kannst du dir mal
savant3 anschauen. ist im prinzip nur 1 große klasse, die die templateengine php nutzt, und nicht so schwachsinnige sachen, wie ne eigene syntax einführt.
gepostet vor 17 Jahre, 8 Monate von Amun Ra
Ich stimme Drezil zu, allerdings find ich Savant
auch schon wieder zu aufgebläht...
Ich hab mich leicht von dem Artikel inspirieren lassen:
www.massassi.com/php/articles/template_engines/und dann was eigenes nach dieser Machart geschrieben.
Noch als Anregung wie du dein Array durchlaufen könntest:
"> Ach so und für einfache Textersetzungen nimmt man nicht preg_*,
sondern str_replace.
gepostet vor 17 Jahre, 8 Monate von knalli
Alles eine Frage der Sichtweise. Einmal abgesehen davon, dass ich solche "Templates" als Basisvoraussetzung für eine gute PHP-Anwendung (ich rede jetzt nicht von so einer 1-Funktion-Script-Sache) ist, hat die vorgestellte Sache sonst nichts besonderes. Eigentlich sagt sie ja nur aus, das man Design und Code strikt und diszipilinert zu trennen hat (und eben weder "HTML" in den Code packt noch im "HTML" mal schnell eine Berechnung reinschiebt).
Eine Anmerkung zu dem Link, den mein Vorposter im Code aber richtig gemacht hat: Die Kurzschreibweise von PHP-Code (also bzw mit print ) ist nicht zu empfehlen. Sollte nämlich der Code einmal auf einem Server laufen, der die Kurzschreibweise NICHT unterstützt, hat man einen Haufen Arbeit. Eventuell kommt man auch nicht sofort auf diesen "Fehler", weil er mW nicht so angemeckert wird.
Daher mein Rat: Immer vollständig (also: ).
gepostet vor 17 Jahre, 8 Monate von birne
Zumal bei erlaubter Kurzschreibweise auch leicht Probleme mit XML auftreten können.
gepostet vor 17 Jahre, 8 Monate von riki1512
Original von Amun Ra
$qry = 'SELECT ...';
while ($data = mysql_fetch_assoc($qry)) {
$arr[] = $data;
}
Genau so etwas soll man eigentlich nicht tun mit DB-Ergebnissen. Dazu sind ja die optimierten SQL-Funktionen da, damit man ein 1000 Zeilen Ergebnis eben nicht nochmal in ein Array schiebt und Unmengen Zeit und Resourcen verschleudert.
Was Template-Systeme für PHP angeht, so finde ich, sorry, dass sie keine Daseinsberechtigung haben. Wieso ? Weil PHP eigentlich selbst schon eines ist, genau dafür ja erfunden wurde. Muss ich Drezil voll recht geben. Als ich mich zum ersten mal mit den Engines herumgeschlagen habe, merkte ich, dass PHP in der alternativen Schreibweise das alles selbst schon kann. Eine eigene Syntax (??) und dann noch Unmengen an Performance einbüßen ? Kann ich keinen Sinn darin erkennen.
Hallo name ?> !
...
name ?>
alliance ?>
..
getRow()): ?>
...
usw.
Normales PHP, ist alles von Haus aus schon in PHP drin. Mit etwas Geschick baut man sich noch seine eigene Klasse, die in den Tags aufgerufen wird und das ein wenig verfeinert, ist aber nicht unbedingt notwendig. Reicht wie ich finde vollkommen aus.
[edit: huh, punkte statt pfeilen...]
gepostet vor 17 Jahre, 8 Monate von Amun Ra
Oje, das könnte eine Grundsatzdiskussion werden
Ich stimme riki1512 auch grundsätzlich zu.
Zu dem Schnipsel Code, den ich gepostet habe,
kann ich nur sagen das ich nur auf die Frage eingegangen bin,
wie man ein mehrdimensionales Array aus einer SQL Abfrage füllt.
Ich nutze das so ähnlich in meinem Blogscript,
dort fülle ich das Array lediglich mit maximal 10 Zeilen,
die Einbußen sind marginal.
Wenns auf Performance ankommt spar ich mir den Umweg...
gepostet vor 17 Jahre, 8 Monate von RoKa
Wenns auf Performance ankommt spar ich mir den Umweg...
...und schreibst den sich wiederholenden Teil des Templates in eine eigene Variable und parst diesen Teil so oft wie die "while"-Schleife deiner MySQL-Abfrage durchläuft. Jedes mal wird dann eine nicht geparste Kopie der Variable an diese selbst gehängt, und wieder von vorne geparst.
Wird dann das Template ausgegeben, werden an der entsprechenden Stelle im Template der sich wiederholende Teil durch die "eigene Variable" ersetzt. Oder?
FG roka