Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Tidbits Template Class (habe ich selbst gemacht!) (https://boardunity.de/tidbits-template-class-habe-selbst-gemacht-t2480.html)

LonelyPixel 04.01.2005 19:57

Die Bedingungen und Ausdrücke werden direkt in PHP-Syntax notiert und unverändert übergeben, oder? Ne, die Variablen müssen ja angepasst werden. 'Versteht' dein Parser dann die angegebene (PHP ja recht ähnliche) Syntax komplett oder werden da nur Teile drin ersetzt? Wie machst du das dann mit komplexeren Ausdrücken mit mehreren Operanden, Rangfolge und Klammerung?

Ich hab mir überlegt, dafür nen einfachen Prefix-Parser zu bauen. Damit lässt sich jedes Problem mit Operatoren-Assoziativität umgehen. Sieht für die meisten zwar zuerst etwas ungewohnt aus, ist aber in jedem Fall eindeutig.

So recht kann mich auch die Syntax der Schleifen nicht überzeugen. Ich würde bei jeder Instanz gerne den Namen der Variable sehen, die gerade das aktuelle Datum enthält, wie in PHP/C üblich. Außerdem wären Äquivalente für break und continue sicherlich sinnvoll.

eBoy 13.01.2005 07:30

So, ich habe mir zuerstmal die Template-Klasse 1.02 (sollte das sein... evtl auch 1.03) angeschaut und fand diese sehr gut, einfach und (sehr wichtig) kinderleicht einzusetzen. Jetzt habe ich mir das neue Template-System angeschaut und muss leider zugeben das ich davon nicht mehr begeistert bin. Ich bin noch Änfanger in php und kann mich deshalb nur auf Optik, Verständlichkeit und Einfachheit beziehen und dahingehend wurde der Engine auf den ersten Blick verschlechtert!
Gut finde ich die include-Funktion, die integriert wurde, aber die Syntax-Änderungen (abgesehen von einem evtl. $ vor Variablen, welches mich nicht stören würde) machen das ganze auf den ersten Blick komplizierter (was viele Anfänger abschrecken wird) und das der engine jetzt aus 3 Dateien besteht sehe ich auch eher als Nachteil...

Je einfacher und schneller das TPL-System ist, desto beliebter könnte es werden.
Trotzdem will ich dich hier mal loben. Die Version 1.02 (bzw. 1.03) ist super, ob die neue Version besser oder schneller ist, kann ich nicht sagen, da ich ihn eben erst heruntergeladen habe und nur einen kurzen Blick vor diesem Beitrag darauf geworfen habe.

[EDIT]
Nochmal zusammenfassend:
Sinnvoll mit Sicherheit
- IF, ELSEIF, ELSE
- FOREACH
- INCLUDE
- Variablen als {$variablenname} oder {$variablenname.array} oder der Zugriff auf Globals/ $_GET,...

Multi-Language
- hab ich nicht ganz verstanden, hört sich aber sinnvoll an...

Was ist der Vorteil von Konstanten statt Variablen?

Entschuldigt falls ich euch nerve, aber ich will mich einarbeiten und dann evtl auch konstrukivere Beiträge zu schreiben...
[/EDIT]

MfG

eBoy

Fabchan 13.01.2005 12:35

@eBoy: Der Vorteil von Konstanten liegt darin, dass sie sich, sobald sie einmal definiert wurden nicht mehr verändern lassen und keinen Scope haben.
Variablen, die innerhalb einer Funktion verwendet werden, lassen sich nicht direkt von außerhalb der Funktion ansteuern und innerhalb der Funktion muss man auf Variablen, die außerhalb der Funktion definiert wurden zugreifen, indem man entweder
PHP-Code:

$GLOBALS['variable'

schreibt oder diese per global
PHP-Code:

global $variable

innerhalb der Funktion verfpgbar macht.
Der Vorteil von Konstanten liegt halt darin, dass sie diesen Nachteil haben, allerdings können sie nur skalare Werte haben (kein Array oder Objekt).

In manchen Skripts braucht man sie überhaupt nicht, manche Leute brauchen sie allerdings (u.a. ich).

In der nächsten Version von TT wird man eigene Syntax-Elemente für die Template-Engine definieren können, ich werde trotz des höheren Schreibaufwands an der XML-Syntax festhalten, vielleicht werde ich irgendwann eine Kurzschreibweise einbauen.

Zum Sprachsystem:
Mehrsprachige PHP-Skripte speichern Sprachvariablen oft in einem Array, beim vBulletin3 heißt es $vbphrase. Bei TT heißt das voreingestellte Array $phrase. Wenn du jetzt nur einen einfachen Satz hast, dann reicht es, die Variable direkt in den Quellcode zu schreiben: {$phrase.name}
Wenn du allerdings diesen Satz mit Variablen füllen willst, brauchst du den Phrase-Tag. Meine Implementierung des "phrase"-tags stimmt weitestgehend mit der des vBulletin 3 überein.
http://www.vbulletin.com/docs/html/t...e_conditionals
http://www.vbulletin.com/docs/html/l...rase_templates

eBoy 13.01.2005 13:21

Also werden die "{Nummerierung}" im "phrase"-tag interpretiert/ ersetzt durch den Inhalt (z.B. aus der entsprechenden Sprachdatei wenn die verschiedenen Sprachen in solchen gespeichert werden)?
Kling gut, auch wenn ich den Sytax mal testen muss und nochmal anschauen muss.
In einigen Scripts werden Definitionen z.B. für die Sprachdateien verwendet. Andere Einsatzmöglichkeiten fallen mir für mich da momentan eh nicht ein. Macht das Sinn oder sollte man da einfach Variablen benutzen?
Sinnvoll sind wohl auch Variablen die durch eine Funktion geschickt werden (z.B. in einer if-Abfrage), aber vom Syntax her würde sich da für mich folgender anbieten, da ähnlich wie in php und einfach:
{function(variable)}
Wobei ich den entstehenden Aufwand für die Programmierung und evtl. Schnelligkeitseinbußen nicht bekannt sind...
Ich werde evtl mit der alten 1.02/ 1.03-Version arbeiten, da mir die neue zu Komplex (sowohl Einarbeitung/ Verständnis als auch die Anzahl und Größe der Datei).
Mal sehen, ich schau mir das alles in Ruhe nochmal an und werde das ganze weiter verfolgen ;)

Fabchan 13.01.2005 16:15

Ich kann bei Bedarf nochmal die 1.03 online stellen, die beseitigt einige Fehler aus der 1.02!

Die Syntax {function(variable)} ist in der Version 1.1 erlaubt!

LonelyPixel 14.01.2005 00:37

Darf ich als Quasi-Konkurrent hier eigentlich auf meine Template-Lösung hinweisen? ;) Aber ich hab auch 4 Dateien (weiß grad net, wie viele es in TT sind, dachte aber ähnlich viele). 1x Runtime-Funktionen und 1x Compiler, jeweils mit einer config-Datei. Dadurch wird der von PHP zu parsende Code im Normalfall (Template ist bereits fertig compiliert im Cache) weniger (bei mir ca. auf 1/4) und es sollte schneller gehen. Der zusätzliche Include beim Compilieren dauert dann zwar wieder etwas länger, aber das Compilieren dauert ja sowieso schon länger.

Naja, die Sache mit dem XML ist womöglich noch mir zuzuschieben, nachdem ich hier mal reingeworfen hab, man könnte doch. Allerdings bin ich mittlerweile selbst wieder davon abgekommen...

eBoy 14.01.2005 07:34

@LonelyPixel:
Aha, der Übeltäter *g*
Ich würde mir auch deinen Code mal anschauen und gegebenenfalls testen, wobei ich mit der 1.02-Version von Dracaelius schon sehr zufrieden war (1 Datei). Die neue Version wird bestimmt auch gut sein, aber für meine Zwecke eigentlich mit 3(?) Dateien zu aufgebläht.

@Dracaelius:
Das wäre praktisch ;)
Bei der Version 1.03 steht aber noch kein include-Tag zur verfügen oder?
Der wäre für Sub-Templates halt enorm praktisch. Ich würde an deiner Stelle eh den 1.03er Code irgendwo zum DL anbieten, da manche ein komplexeres System benötigen (neue Version) und andere mit der einfachen Version zufrieden zu stellen sind. Und 1.03 ist SEHR praktisch für Anfänger.
Könntest du evtl die Include-Funktion noch hinzufügen? Ich denke zwar nicht (anderweitig fleißig), wäre aber sehr praktisch und für dich bestimmt einfacher ;)

Werde aber trotzdem den neuen Code mal bei Gelegenheit testen und meine Erfahrungen damit dann hier posten... wird aber noch dauern

LonelyPixel 14.01.2005 19:33

Du kannst dir meine Version natürlich mal anschauen: http://px.no-ip.com/proj/ute/release/ute-0.2.zip (15 kB) (Ein DSL-connected PC, be gentle with it.) Alle nötigen Infos sind im Archiv enthalten.

Und aus 4 mach 1: `cat *.conf.php *.lib.php > ute.lib.php` (bedeutet: zuerst conf-, dann lib-Dateien einfach zusammenkopieren) :) - Naja, diverse cross-include's müssen dann noch entfernt werden.

eBoy 15.01.2005 10:45

@LonelyPixe:l @Dracaelius:
Darf man eure TPL-Systeme auch in eigenen Projekten einsetzen (mit entsprechendem Hinweis auf den Programmierer)?

@Dracaelius:
Ich habe mit deinem TPL-System mal angefangen und getestet (V1.02) und mir fehlt der Zugriff aus array-Variablen ($_SESSION['nick'], $settings['titel'],...) außerhalb von Schleifen und die Include-Funktion für Sub-Templates (scheint bei 1.03 dabei zu sein).
Bei den array-Variablen bin ich mir da nicht so sicher. Sind die integriert? Wie setzt man diese ein?

@LonelyPix:l:
Hab momentan nicht die Zeit noch viele weitere Systeme zu testen, werde mir aber auch deins mal demnächst anschauen. Heruntergeladen habe ich es mir mal ;)

Ist nach einem ähnlichen Prinzip aufgebaut oder?
Hat das auch eine Cache-Funktion?

LonelyPixel 15.01.2005 11:22

Die Unclassified Template Engine verwendet kaum reguläre Ausdrücke, sondern findet die Template Code Tags durch eine effiziente Suche durch den Quelltext. Dadurch brauche ich keine Bereiche zu maskieren, die nicht geparst werden sollen, um sie anschließend wiederherzustellen. Aber pass auf, Funktionen, Ausdrücke und eigentlich alles musst du bei meinem System in Prefix-Notation angeben. Beispiele stehen in der Textdatei. Das macht den Expression Parser wesentlich einfacher und kommt vollständig ohne Operator-Prioritäten, Seiten-Assoziativität oder Klammerung aus, die in üblichen Programmiersprachen ganze Seiten an Tabellen füllt.

Und der Cache ist bereits mit dabei, ja. Ich hab's mal grob verglichen, und soweit ich die alltags-nützlichen Smarty-Features erkannt hab, kann mein Code praktisch das gleiche, nur vermutlich mit ungleich weniger Aufwand. Ich hab noch keinen Vergleichstest zwischen diesen 3 Systemen gemacht.

Ich werd das ganze Wohl unter der GPL veröffentlichen, da ich es später wahrscheinlich in meinem ebenfalls-GPL-Forum verbauen will.

Fabchan 15.01.2005 11:45

@eBoy: Wie gesgt, ich werde mal 1.03 online stellen, muss dafür vorher allerding snoch einiges anpassen.

Version 1.1 ist halt eine Version, die zwar massenhaft Regexps einsetzt, aber ebenfalls ohne maskieren auskommt. Außerdem wird die Syntax für Variablen innerhalb von Schleifen folgendermaßen geändert werden:
Code:

<foreach var="$user">
  {$username}
 <a href="profile.php?u={$userid}&amp;session={$SID}&amp;style={$_STYLE[styleid]">Profil anzeigen</a><br />
 </foreach>

Die Variable User enthält die Benutzerdaten, SID ist eine globale Variable und _STYLE ist ein globales Array.

Auf andere Variable, die nicht in der config-Datei als global definiert wurden, kann innerhalb von Schleifen über $_parent.variable['schlüssel'] oder $_parent.variable zugegriffen werden. Darin besteht der Unterschied zur PHP-Syntax, denn der Punkt wird zum Trennen von Objekten in Variablen verwendet. Ein weiterer Unterschied wird sein, dass Konstanten durch # gekennzeichnet werden müssen, denn eine solche Syntax ermöglicht, dass die schlüssel von Arrays ($array[schlüssel]) nicht durch Anführungszeichen gekennzeichnet werden müssen. Normalerweise würde PHP dann einen Fehler ausgeben, da man versucht, auf eine nicht definierte Konstante zuzugreifen. TT würde in diesem Fall den Schlüssel automatisch in Anführungszeichen setzen, um diesen Fehler zu vermeiden.

eBoy 15.01.2005 12:02

Scheit gut zu sein, aber um ehrlich zu sein komme ich mit 1.02-Version viel besser zurecht und die Recht für meine Zwecke aus.
Ich werde aber trotzdem dessen neue Version ausprobieren und auch deine mal testen und dann evtl umsteigen. Momentan progge ich nur an kleineren Sachen, die ich später zusammenfügen will und dann evtl auch das TPL-System ersetze ;)
Somit wird in der nächsten Zeit noch keine Entscheidung fallen.

@Dracaelius:
Ändert sich zwischen 1.03 und 1.02 was am Syntax?
Bezieht sich das:
Zitat:

Version 1.1 ist halt eine Version, die zwar massenhaft Regexps einsetzt, aber ebenfalls ohne maskieren auskommt. Außerdem wird die Syntax für Variablen innerhalb von Schleifen folgendermaßen geändert werden:
Code:

<foreach var="$user">
{$username}
<a href="profile.php?u={$userid}&amp;session={$SID}&a mp;style={$_ST YLE[styleid]">Profil anzeigen</a><br />
</foreach>




Die Variable User enthält die Benutzerdaten, SID ist eine globale Variable und _STYLE ist ein globales Array.

Auf andere Variable, die nicht in der config-Datei als global definiert wurden, kann innerhalb von Schleifen über $_parent.variable['schlüssel'] oder $_parent.variable zugegriffen werden. Darin besteht der Unterschied zur PHP-Syntax, denn der Punkt wird zum Trennen von Objekten in Variablen verwendet. Ein weiterer Unterschied wird sein, dass Konstanten durch # gekennzeichnet werden müssen, denn eine solche Syntax ermöglicht, dass die schlüssel von Arrays ($array[schlüssel]) nicht durch Anführungszeichen gekennzeichnet werden müssen. Normalerweise würde PHP dann einen Fehler ausgeben, da man versucht, auf eine nicht definierte Konstante zuzugreifen. TT würde in diesem Fall den Schlüssel automatisch in Anführungszeichen setzen, um diesen Fehler zu vermeiden.
nur auf die Version 1.1 oder auch (teilweise) auf 1.03?

Fabchan 15.01.2005 12:17

@eBoy: Nein, die XML-Syntax gibt es erst ab Version 1.1. Includes wurden in Version 1.03 hinzugefügt.

eBoy 15.01.2005 12:32

Mir sollte die 1.03 reichen, aber ich muss halt irgendwie auf die Session-Variablen und arrays wie $settings['titel'] (kann ja im TPL gerne als {settings.titel} stehen, hauptsache es funktioniert ;)
Nur in dieser Hinsicht blicke ich momentan einfach nicht durch...
Ist oder wirst du das noch in die 1.03-Version integrieren? Wäre super :)

LonelyPixel 15.01.2005 13:46

Ich versteh immer noch nicht, wozu man $var.key[key] schreiben sollte, also mal mit Punkt und dann wieder in []-Klammern. Wo ist da der Unterschied? Mir reicht eigentlich der Punkt voll und ganz aus.

eBoy 15.01.2005 14:04

Wer will den var.key[key] schreiben??? Entweder var[key] ODER var.key halte ich für sinnvoll, aber eine KOMBINATION daraus ist eher unsinnig...

eBoy 17.01.2005 07:16

@Dracaelius:
Ändert sich eigentlich nach Änderung einer Datei die gecachte Datei automatisch (beim nächsten Aufruf) mit oder müsste man da bei Änderungen durch das Admin-Center auch die Datei durch eine Abfrage löschen lassen?

Bis wann kann ich mit der Version 1.03 rechnen?

@LonelyPixel:
Hast ein schönes Forum gebastelt. Jabber-IM ist doch sowas ähnliches wie ICQ oder? Wenn ja, wieso hast du dann nicht (zumindest wahlweise) auch ICQ integriert?

LonelyPixel 17.01.2005 11:27

Normalerweise muss von der Cache-Verwaltung erkannt werden, ob die Datei neu compiliert werden muss.

Jabber ist ein offenes, XML-basiertes Instant Messaging and Presence System, genau. Urspruenglich gab es in meinem Board nur E-Mail und ICQ-Benachrichtigung, spaeter kam Jabber dazu, und dann hat sich ICQ dazu entschlossen, automatisiertes Absenden von Nachrichten zu unterbinden. Naja, gib mir ne PHP-Library fuer ICQ, dann bau ich's vielleicht wieder ein. Bis dahin musst du dich mit einem offenen, erweiterbaren, mittlerweile RFC-konformen System begnuegen, das der kommerziellen Konkurrenz noch zu denken geben wird. ;)

eBoy 17.01.2005 12:52

Wie kann ich Daten aus der DB in folgendes FOrmat bringen?
Code:

$tpl->vars['reBoxen'] =
                            array (
                            array ('titel' => 'Titel1', 'inhalt' => 'Inhalt1'),
                            array ('titel' => 'Titel2', 'inhalt' => 'Inhalt2'),
                            array ('titel' => 'Titel3', 'inhalt' => 'Inhalt3'),
                            array ('titel' => 'Titel4', 'inhalt' => 'Inhalt4')
                                    );

Jeweils Titel1, Titel2,... und Inhalt1, Inhalt2,... soll aus der Datenbank kommen.
Zu beachten, in der letzten Zeile ist KEIN Komma!
Jede Zeile wird per Schleife (while) aus der DB geladen und soll in das Array eingefügt werden. Die Anzahl der Arrays sollte Variabel sein (abhängig von den Ergebnissen auch der DB)...
Ich bin mit meinem begrenzten Wissen da leider noch nicht weitergekommen :(

LonelyPixel 17.01.2005 12:58

Dazu musst du erstmal wissen, wie du auf deine Datenbank zugreifen kannst. Dazu gehoert natuerlich auch, was fuer eine DB das ueberhaupt ist... Das PHP-Manual sollte hier weiterhelfen.

eBoy 17.01.2005 13:27

Okay, mein Fehler.
MySQL. ABfrage funktioniert und wird per while-Schleife ausgelesen.
Das Ergebnis wird z.B. in $result (oder wie auch immer) abrufbar sein.
Es geht also nur um die "Format-Änderung"

$boxen['boxtitel'] und $boxen['boxinhalt'] in das array als 'titel' => wert bzw 'inhalt' => wert.
Und das logischerweise für jedes Vorkommen.
Damit will ich Boxen erstellen, diese in das array übergeben und das array wird dann dem TPL-Parser übergeben, in dem per foreach-Schleife das ganze dann ausgegeben wird...

Ich hoffe das war verständlicher. Habe schon verschiedene meiner Gedankengänge getestet, was entweder zu keiner Ausgabe oder einem Fehler geführt hat...

LonelyPixel 17.01.2005 16:01

Dein letzter Beitrag lässt mich stark vermuten, dass du bereits dazu in der Lage bist, Daten von einem Array in ein anderes zu schreiben. foreach war das Stichwort. Mir ist also unklar, was es da noch zu erklären gibt. :confused:

eBoy 17.01.2005 16:33

Okay, ich habe es jetzt geschafft, habe einen kleinen Fehler gemacht. Ging mir nur drum zu sehen, ob mein Lösungsweg falsch war oder ich einen Fehler eingebaut habe. Ich zähle mich immernoch zu php-Anfängern ;)

Eduard Zintz 14.04.2005 22:31

Hi,

sorry das ich das Thema wieder hoch hole, allerdings glaube ich das {var} nicht so ganz funktioniert in der Klasse oder Irre ich mich da? Am Code selber habe ich nichts verändert.

Fabchan 15.04.2005 12:27

Ja, in der aktuellsten Version sind einige Fehler drin, ich habe aber bisher nicht die Zeit gefunden, diese zu beseitigen. Ich arbeite zurzeit auch an genug anderen Projekten, daher wird dies in absehbarer Zeit auch nciht geschehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.

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