Token Replacement
MB
- konvertierung
- programmiertechnik
moin,
Was ich kann
Token Replacements z.B. {#user#}
zu Max Mustermann
kann ich entwickeln.
Da sind Delimiter {#
und #}
und ein Token user
was mit Max Mustermann
ersetz wird.
<i class="user">Max Musterman</i>
.
realisiere könnte man das hier mit Token::add ( 'user', 'Max Musterman' )
und.
<i class="user">
und </i>
zwischen dem Replacement sind Formatierungen des Replacements. Da jedes Replacement in diesem Stiel Formatiert wird, ist es in diesem Beispiel sehr statisch.
Wo ich bei mir Probleme sehe in "erweitertem" Replacement
wenn ich zusätzlich formatierungen haben will z.B. eine Adresse von Max Mustermann: Max mustermann, Musterstr. 1, 12345 Musterstadt
reicht dieses Token Replacement nicht aus, da ich es bei mir - wenn ich mein Beispie weiter führen will - so aussehen würde.
<i class="user">
Max mustermann, Musterstr. 1, 12345 Musterstadt
</i>
und nicht
<address>
Max mustermann<br>
Musterstr. 1<br>
12345 Musterstadt<br>
</address>
Also muss ich zusätzliche Angaben vornehmen mit einem - sage wir - Identifier?.
{#user:address#}
oder {#user:fullname#}
Fragen
habe ihr Quellen wo ich mich in diesem Bereich "Tokens Replacement" weiterbilden kann oder reicht einfach eine Kleine abstrakte Anleitung in SelfHTML-Forum von einem von Euch 😉.
P.S.: Wieder zurück im SelfHTML Universum tut gut 😀!!!
lgmb
Hallo MB,
was Du da tust, ist nicht ganz transparent, und mutmaßlich auch nicht völlig sauber.
Du schreibst im Sourcecode also Token::add('name', 'value')
.
Welche Programmiersprache ist das? PHP? Schreibst Du das tatsächlich so im Sourcecode oder wolltest Du nur andeuten, dass add
eine Methode der Klasse Token ist?
Worauf will ich hinaus? Eine statische Methode würde bedeuten, dass Du eine Klasse Token hast, die statisch einen Satz von key-value Paaren enthält. Was ausschließt, dass es zur einem Zeitpunkt mehr als einen Satz dieser Paare geben kann, und das wäre unnötig einschränkend. Du solltest auf jeden Fall mit einer Token-Instanz arbeiten, nicht mit der statischen Klasse.
Was mir auch nicht klar ist: Woher weiß die Token-Klasse, welches Replacement-Muster für {#user#} anzuwenden ist? Ist es immer "<i class='$tokenname'>$tokenvalue</i>"
? Auch das wäre unnötig starr.
Wie legst Du die Replacement-Muster fest? An dieser Stelle wäre es möglich, erweiterte Replacements vorzusehen (Formatierer genannt). Bevor ich da in eine Diskussion einsteige, würde ich gern mehr von dem wissen, wie Du deine Templates verwendest.
Du könntest, statt das Rad selbst zu erfinden, auch fertige Template-Libraries einsetzen. Welche aktuell die beliebteste ist, weiß ich nicht, ich kenne nur Smarty. Das ist zwar schon ziemlich alt, wird aber noch betreut und ist gut dokumentiert.
Rolf
moin,
was Du da tust, ist nicht ganz transparent, und mutmaßlich auch nicht völlig sauber.
Ja ich hab nur mit preg_replace_callback_array gearbeitet. Wie erwähnt sehe ich mich im stande diese "Projekt" zu programieren aber wie du schon vermutest unsauber ohne zu forschen. Ich müsste wirklich "das Rad neu erfinden".
Du schreibst im Sourcecode also
Token::add('name', 'value')
.
Je nach UseCase denke ich, kann man mit statischen Klassen arbeiten.
Welche Programmiersprache ist das? PHP? Schreibst Du das tatsächlich so im Sourcecode oder wolltest Du nur andeuten, dass
add
eine Methode der Klasse Token ist?
Das Zweite. Ich verwende eine Skriptsprache die keine Klassen kennt, die abseit des WWW ist und nicht geläufig ist aber ähnlichkeiten zu allen anderen Sprachen aufweist. Da ich generell die Replacement Technik wissen möchte, passt das - meines erachtens - ganz gut in dieses Forum rein.
Was mir auch nicht klar ist: Woher weiß die Token-Klasse, welches Replacement-Muster für {#user#} anzuwenden ist? Ist es immer
"<i class='$tokenname'>$tokenvalue</i>"
? Auch das wäre unnötig starr.
Habe ich ja erwähnt. Es gibt in meinem Beispiel kein Replacement Muster. Ein Replacement Muster zu programmieren ist das Ziel meines Threads. Sorry wenn das nicht erkennbar ist.
Wie legst Du die Replacement-Muster fest? An dieser Stelle wäre es möglich, erweiterte Replacements vorzusehen (Formatierer genannt).
Klar habe ich ja angedeutet {#user:address#}
. address
wäre die Formatierung anders als bei fullname
. Aber sorry ich kenne mich diesbezüglich nicht aus deswegen meine Frage 😉.
Du könntest, statt das Rad selbst zu erfinden, auch fertige Template-Libraries einsetzen.
Klingt gut aber wie erwähnt verwende ich eine Skripsprache die propietär ist. Und ich möchte das Rad immer wieder neu erfinden um so besser lernen zu können. Nichts für ungut 😉.
lgmb
Hallo MB,
ja, da hätte ich wohl genauer lesen müssen.
D.h. deine Scriptsprache kennt Klassen und Instanzen von Klassen?
Der einfachste Fall, für den man keine Klassifikation wie {{user:address}} braucht, ist eine 1:1 Ersetzung. D.h. du konvertierst den an add übergebenen Wert in einen String und ersetzt das Token dadurch. Alles andere braucht ein Muster.
Deine Token-Klasse (die vielleicht besser Template heißt?) kann einige vordefinierte Templates mitbringen. {{name:italic}} oder {{beruf::bold}} zum Beispiel, die dann durch <i>$name</i> oder <b>$beruf</b> ersetzt werden. Aber das ist eigentlich nicht sinnvoll. SOLCHE Formatierungen baust Du besser gleich ins Template ein: <i class='name'>{{name}}</i>
und dann nur Token::add('name', 'Müller')
.
Deine Adresse ist etwas, was ich "break separated values" nennen würde. D.h. Du hast eine Liste von Werten und sie sollen durch einen bestimmten String voneinander getrennt werden. Hier gehört, finde ich, eine Zweiteilung hin. Aus dem kommaseparierten String muss ein Array werden (wenn deine Sprache das kennt), das sollte außerhalb des Templates passieren. Und die Array-Elemente müssen formatiert werden, das gehört ins Template.
Also einmal - in PHP-Schreibweise:
Template::add('address', explode(',', $addres));
und im Template
<address>{{address:implode:<br>}}</address>
Das ist nur eine Idee, wie man den Separator festlegen könnte.
Dem entgegen stehen echte Listen, die Du mit <ul> und <li> formatieren willst, das musst Du anders lösen. Dafür brauchst Du Iterationsstrukturen:
<ul>
{{items:array:%item}}
<li>{{%item}}</li>
{{/array}}
</ul>
Nur eine Beispielsyntax. Das Templateelement items ist ein Array, die Template-engine durchläuft es und weist die Werte dem internen Symbol %item zu. Das steht dann innerhalb des Durchlaufs als Wert zur Verfügung.
Viel Spaß 😀
Rolf
moin,
ja, da hätte ich wohl genauer lesen müssen.
ich drück mich ja auch undeutlich aus 😀. Mit vielen ausschmückungen von daher...
D.h. deine Scriptsprache kennt Klassen und Instanzen von Klassen?
[...]
Ok. Besten Dank für beispiels der herrangehensweise.
Viel Spaß 😀
werde ich haben 😉.
lgmb