______________________________________
hab mich mal an was versucht
______________________________________
hallo tp-ler!
ich habe in diesem forum eigentlich sehr wenig ueber templates gefunden, deshalb habe ich mir selbst etwas gebastelt. diese scripts sind eigentlich nicht schwer nachzuvollziehen und jeder 2.beste scripter koennte sie ohne weiters fuer sich selbst schreiben, jedoch habe ich mir gedacht ich stells doch mal rein

. ich fange heute damit an, und werde im laufe der zeit "erweiterungen" zum script (sind im mom noch nicht sehr ausgereift) zur verfuegung stellen (bis jetzt: styleswitcher und 3-sprachigkeit).
auch die scripts selbst sind mehr als genug selbst kommentiert. falls einer mit den scripts nicht klarkommt, weil er nicht genuegend kenntnisse von PHP und MYSQL hat, bitte nicht in diesen thread schreiben, dafuer gibts genug andere

. auch falls einem dieses script nicht gefaellt, soll er bitte keine kommentare schreiben, wie "wer braucht denn sowas" (bsp.: Patch). dann einfach nur zurueckhalten und das seine denken, bitte.
======================================================
WAS KANN DIESES SCRIPT UEBERHAUPT?
- marker im 'typo-format' ersetzten: ###MARKER###
a) manuell, also man weiss den namen
b) alle, die in einer datenbank vorkommen
c) alle, die in einer datenbank vorkommen aber mit prefix
- subparts im 'typo-format' ersetzen: <!-- ###SUBPART### begin--> <!-- ###SUBPART### end-->
======================================================
WAS WIRD ES (vielleicht

) NOCH KOENNEN, WENN ES FERTIG IST?
- erweiterung: loginbereich (und adminpanel nur ganz vielleicht

)
a) speichern der letzten sprache des users
b) speichern des letzten styles des users
- marker je nach sprache ersetzen (samt login, also letzte sprache gespeichert)
- styleswitcher mit template und css aenderung (also komplett andere site)
======================================================
ich finde templates in sofern interessant, da man, falls man mit dynamischen seiten arbeitet, sehr schnell den ueberblick ueber den code verliert, falls man ueberall mit <?php .... ?> seine inhalte einfuegt. macht man das per marker, bleibt der code uebersichtlich und HTML wird strikt vom programmieren getrennt.
fuer das template-building (ich nenns halt jetzt mal so) habe ich einige funktionen des jax-guestbook verwendet (es ist glaub ich mit der GPL geschuetzt -> sofern ich das nicht verkaufe, darf ichs verwenden. ausserdem habe ich noch den kommentar zu jax-gb im code). sie funktionieren praechtig, also passt es ja.
======================================================
DIE ANGEHAENGTEN DATEIEN:
- classes.inc.php hat die funktionen drinnen.
ich werde diese dateien unter .txt in den anhang geben, da ich jetzt (ich schreibs grad im notepad vor) nicht weiss, ob man .php anhaengen darf.
======================================================
zu den xtemplate funktionen (von jax-gb) werde ich hier fast nichts erklaeren, aber meine funktionen (es sind nicht viele) werde ich versuchen so gut wie moeglich zu erklaeren. (ps.: wenn mir danach irgendjemand erklaeren kann, wie ich ausser mit quote solche boxen erscheinen lasse mit formatiertem inhalt, dann werde ich den post veraendern, damits uebersichtlicher wird).
in der klasse xtemplate befinden sich folgende funktionen:
- load_file($file) -> selbsterklaerend, laedt das template $file
- replace($var,$substitute) -> bereitet das ersetzen von $var mit $substitute vor
- replaced() -> gibt das template mit den ersetzten markern zurueck
in der klasse main_replacements befinden sich:
- marker_replace_all($template,$field,$conn) -> ersetzt marker mit den entsprechenden eintraegen in einer datenbank (genauere erklaerung spaeter)
- marker_replace($prefix,$template,$field,$conn) -> ersetzt alle marker mit den eintraeegen der datenbanktabelle mit dem praefix $praefix
- subpart_replace($subpart,$replace,$output) -> ersetzt die subpart $subpart mit $replace im string $output
======================================================
einfuehrung:
ein template wird hier folgendermassen initialisiert:
Zitat:
$template = new XTemplate();
$template->load_file("templatefile.tpl");
|
die funktionen zum speziellen ersetzten von markern sieht bei mir so aus:
Zitat:
|
$main = new main_replacements();
|
so habe ich also in $main alle meine funktionen von der klasse main_replacements
hier ein paar beispiele, wie man einen marker ersetzt:
Zitat:
|
$template->replace ("###MARKER###", $ersetztext); //ersetzen eines einzelnen markers
|
um meine funktion subpart_replace einsetzen zu koennen, muss man aber erst mal alle wie oben gezeigt ersetzten teile ersetzen (replace bereitet sie nur vor). das geht dann mit $template->replaced(). hier bekommt man den ausgabestring, also die HTML, die der benutzer zu gesicht bekommt. mit meiner funktion mache ich also nichts anderes, als textteile in einem string zu ersetzen (deshalb wollte ich eigentlich das hier nicht ins forum stellen). meinen ausgabestring nenne ich mal $output.
nehmen wir mal an, ich will eintraege aus meiner datenbank ersetzen.
die tabelle, die ich hier verwende, heisst 'content'. die verbindung fuer die datenbank habe ich vorher irgendwo schon in $conn gespeichert
(ja, irgendwo kling nicht gut, aber...). ich habe ein feld namens 'titel'. die marker in meinem template, die ich ersetzen will, muessen alle gleich heissen wie in 'titel' und gross geschrieben sein, sonst werden sie nicht ersetzt. mit der funktion marker_replace_all ersetze ich den marker mit dem inhalt von $field bei 'titel' = marker. das kling jetzt vielleicht konfus, deshalb - beispiel:
Zitat:
titel -> $field
---------------------
rechts_eins -> 'text in rechts_eins'
rechts_zwei -> 'text in rechts_zwei'
links_eins -> 'text in links_eins'
links_zwei -> 'text in links_zwei;
|
in meinem template kommen irgendwo die marker
Zitat:
###RECHTS_EINS###
###RECHTS_ZWEI###
###LINKS_EINS###
###LINKS_ZWEI###
|
vor. diese werden also beim aufruf marker_replace_all alle mit den texten in $field ersetzt.
marker_replace funktioniert aehnlich. wuerde man zum beispiel als praefix 'rechts' mitgeben, so wuerde er nur die ersten beiden marker ersetzten, da dies die einzigen mit dem praefix 'rechts' sind.
subpart_replace habe ich noch nicht automatisiert, werde es auch nicht machen, da dies unnoetig ist. ich habe es bisher verwendet um den content einer seite einzufuegen, oder auch um teile eines templates verschwinden zu lassen (zum beispiel das loginformular, falls ein benutzer eingeloggt ist).\
======================================================
fuer jene, die PHP und MYSQL gar nicht koennen, versuche ich mal die funktionen (source) selbst zu erklaeren (nur meine 3).
aufbau einer verbindung zu einer datenbank:
Zitat:
$conn = mysql_connect('host','username','passwort') or die ("Could not connect to database!");
mysql_select_db('datenbankname') or die ("Could not select database!");
|
mit diesen zwei zeilen stelle ich die verbindung zur datenbank 'datenbankname' her. ich bin der benutzer 'benutzername' mit dem passwort 'passwort'. falls diese daten nicht zutreffen, gebe ich mit 'die' (vom engl. sterben) eine fehlermeldung aus, dass die datenbank nicht ausgewaehlt werden konnte.
dank dieser zeilen habe ich nun im restlichen script die variable $conn. sie wird bei weiteren mysql befehlen verwendet (muss eigentlich nicht sein, aber falls eine 2.verbindung besteht, brauchts die).
funktion marker_replace
Zitat:
$query = "SELECT * FROM content WHERE (titel LIKE '".$prefix."_%');";
$result = mysql_query ($query,$conn) or die ("Query failed! ".$query);
|
damit erhalte ich alle eintraege in der tabelle 'content', welche einen titel haben, der mit $prefix_ anfaengt (also bei $prefix = 'rechts' kriege ich alle rechts_...). auch hier gibts eine fehlermeldung bei einem fehlversuch. ich haenge mir $query ran, damit ich weiss, um welcher abfrage es sich handelt.
mit $result alleine kann ich jedoch nicht viel anfangen. es enthaelt nicht direkt die daten, sondern informationen, wo man sich die daten holen kann, und das machen wir jetzt:
Zitat:
$i = 0;
while ($row = mysql_fetch_array($result,MYSQL_ASSOC)) {
$temp[$i] = $row;
$i++;
}
|
ich setze einen zaehler auf 0. danach hole ich mir so lange die daten als array von $result heraus, bis keine mehr da sind (bedingung falsch, while bricht ab). ich speichere sie in ein 2stufiges array (array = sowas wie ne tabelle, hab ich oben vergessen zu erklaeren) rein, bis ich keine mehr kriege.
mein array koennte jetzt also so aussehen
Zitat:
|
[0] ARRAY([feld1]='text im feld "feld1"', [feld2]= 'text im feld "feld2"' usw...) [1] ARRAY([feld1]='text im feld "feld1"', [feld2]= 'text im feld "feld2"' usw...)
|
somit kann ich mit $temp[0][feld1] die daten des feldes feld1 vom ersten datensatz (PHP faengt bei 0 an zu zaehlen) lesen.
jetzt werden die marker mit den daten ersetzt (bei mir wird das feld $feld verwendet, es koennen aber noch mehrere andere spalten existieren)
Zitat:
foreach ($temp as $value) {
$template->replace ("###".strtoupper($value['titel'])."###",$value[$field]);
}
|
fuer jedes (foreach) element (erste 'dimension', also in unserem fall die mit $i zugewiesenen) im array $temp kriege ich immer $value (laeuft immer wieder durch, bis das letzte element erreicht wurde). in $value stehen (laut obigen beispiel) zb [feld1]='text im feld "feld1"', [feld2]= 'text im feld "feld2"' usw.... das template $template habe ich beim funktionsaufruf (wie auch $prefix) als parameter erhalten. ich bereite dann mit der vorgegebenen funktion (von xtemplate) replace das ersetzen vor.
funktion marker_replace macht genau das selbe, nur dass nicht mit (titel LIKE '".$prefix."_%') nach den elementen mit dem richtigen prefix gesucht wird.
funktion subpart_replace
mit
Zitat:
$subpart_begin = "<!-- ###";
$subpart_bend = "### begin-->";
$subpart_eend = "### end-->";
|
definiere ich mir das aussehen der subparts. ich muss also im template EXAKT die selbe zeichenfolge haben wie hier! (also nicht wie in typo3, dass man das begin oder das end weglassen koennte).
ich habe zum beispiel so etwas im code stehen:
Zitat:
<!-- ###SUBPART### begin-->
dies ist der inhalt der subpart
<!-- ###SUBPART### end-->
|
hier der vorteil von subparts gegenueber markern (sonst waere es ja egal, ob man jetzt marker oder subpart nimmt):
beim entwickeln kann man keine laestigen markertexte ###MARKER### sehen, da dies ja kommentare sind. auch kann man einen platzhaltertext einfuegen, der nacher ersetzt wird.
Zitat:
$sub_begin = $subpart_begin.strtoupper($subpart).$subpart_bend;
$sub_end = $subpart_begin.strtoupper($subpart).$subpart_eend;
|
hier stelle ich mir meine suchstrings zusammen. wenn ich also 'subpart' uebergeben habe, krieg ich jetzt <!-- ###SUBPART### begin--> und <!-- ###SUBPART### end--> zurueck. mit
Zitat:
$start = strpos($output,$sub_begin);
$end = strrpos($output,$sub_end) + strlen($sub_end);
$length = $end - $start;
|
krieg ich die ($)start - position (strpos liefert das erste vorkommen von $sub_begin in $output zurueck), die ($)end - position (muss noch die stringlaenge dazuzaehlen, sonst <!-- ###SUBPART### end--> nicht ersetzt und steht als unnuetzer kommentar herum). da ich aber bei
Zitat:
|
$log = substr($output,$start,$length);
|
noch die laenge brauche (substr: ab $start mit der laenge $length von $output zurueckgeben), ziehe ich noch die startposition von der endposition ab.
in $log steht nun der string
Zitat:
<!-- ###SUBPART### begin-->
dies ist der inhalt der subpart
<!-- ###SUBPART### end-->
|
dieser muss jetzt noch ersetzt werden:
Zitat:
|
$output = str_replace($log,$replace,$output);
|
und mit return (wie in jeder funktion) wird der $output noch zurueckgegeben.
======================================================
ich hoffe ich konnte euch ein bisschen helfen. falls jemand diese scripts verwendet, bitte immer einen kommentar
zum quelltext hinzufuegen. link kann ich leider nicht verlangen, weil ich erstens selbst noch keine site habe und 2. das auf manchen sites sehr unschoen waere (aber falls ich mir mal selbst einen site mache, aendere ich diesen beitrat

)
gruss martin