Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 11. November 2011 11:39

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Dokumentation von Smarty-kompatiblen PHP-Funktionen?

Gibt es irgendwo eine Ansammlung von Smarty-Modifiern, die eigentlich von PHP kommen? Also zB |@shuffle, |strstr, |strpos, |substr, |glob usw?

Darüber habe ich in der Smarty Dokumentation nichts gefunden!!

Offline

#2 11. November 2011 15:54

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.171

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

Eigentlich suchst Du da an der falschen Stelle. http://www.php.net/manual/de/index.php wäre hier richtig, da all diese "Modifikatoren" normale PHP Funktionen sind:

smarty docs schrieb:

All php-functions can be used as modifiers implicitly, as demonstrated in the example above. However, using php-functions as modifiers has two little pitfalls:

    First - sometimes the order of the function-parameters is not the desirable one. Formatting $foo with {"%2.f"|sprintf:$foo} actually works, but asks for the more intuitive, like {$foo|string_format:"%2.f"} that is provided by the Smarty distribution.

Im Prinzip muss man sich einen Modifkator als eine PHP Funktion vorstellen, die so aufgebaut ist:

function modifikator( $arg_1 , $arg_2 , $arg_3 , ... ) {
    ...
}

In Smarty sähe der Aufruf dann so aus:
{arg_1|modifikator:arg_2:arg_3:...}

Bei reinen Smarty-Modifikatoren kommt als Erstes immer erst das Subject, also die Variable, mit der ich irgendetwas machen will. Dann kommt der Funktionsname und dann alle weiteren Argumente.

Bei PHP-Modifikatoren müssen die Argumente in der Reihenfolge stehen, wie es in der PHP Funktion verlangt wird (siehe dazu PHP-Doku). D.h. das Subject kann irgendwo in der Reihe der Argumente vorkommen.

Einfaches Beispiel sei hier mal die PHP Funktion explode. Laut PHP Syntax kommt

1. das Trennzeichen,
2. der Wert, den ich aufteilen will, und
3. die Anzahl der Elemente, die ich haben will:

explode( ',' , $string , 4 )

In Smarty sähe das dann also so aus:

{','|explode:$string:4}

Wenn jemand einen Smarty-Explode-Modifikator schreiben würde, müsste der dann (beispielhaft) so aussehen:

function smarty_explode( $subject , $delimiter , $num ) {
    return explode( $delimiter , $subject , $num);
}

Der Aufruf wäre dann so:

{$string|smarty_explode:',':4}

Mehr gibt's dazu meiner Meinung nach eigentlich nicht zu sagen.

Offline

#3 11. November 2011 15:59

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

Aber von Modifikationen schreiben war ja nicht die Rede.

Ich will einfach nur die vorhandenen Funktionen benutzen und nicht für alles ne extra Smarty-Variante bauen. Außerdem weiß man ja eben nicht, welche PHP-Funktionen mit Smarty von Hause aus abrufbar sind.

Aber du schreibst ja dass es grundsätzlich mit allen php funktionen geht?! "All php-functions can be used as modifiers implicitly". Das widerspricht sich ja mit deinem beispielhaften Explode-Code oder?

Offline

#4 11. November 2011 16:02

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.171

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

Hä?
Wieso?
Welcher Teil von

NaN schrieb:

{arg_1|modifikator:arg_2:arg_3:...}

verleitet Dich zu der Annahme, für jede PHP Funktion einen eigenen Modifikator schreiben zu müssen?

Du musst halt nur wissen, in welcher Reihenfolge die PHP-Funktion ihre Argumente erwartet. Das mit dem smarty_explode war doch nur ein Beispiel, um zu zeigen, wo der Unterschied zwischen Smarty-aufbereiteten Modifikatoren und reinen PHP Funktionen besteht.

Smarty Modifikator: {$subject|modifikator:argument_2:argument_3: ... }
PHP Modifikator (gemäß der Doku): {argument_1|modifikator:$subject:argument_3: ... }

(um mal beim Beispiel explode zu bleiben - an welcher Stelle genau $subject und welche Werte für welches Argument gelten müssen, hängt von der jeweiligen PHP-Funktion ab).

Offline

#5 11. November 2011 16:07

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.815
Webseite

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

In Smarty sind ALLE PHP-Funktionen als Modifikator verfügbar.

Wichtig daran ist einfach, dass die Reihenfolge z.T. ein wenig gewöhnungsbedürftig ist. Vor kurzem habe ich mich mit explode in meinem Blog befasst:

http://www.blattertech.ch/blog/49/Smart … andeln.htm


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#6 11. November 2011 16:10

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

ok danke für die erläuterung

Offline

#7 11. November 2011 16:11

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.171

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

nockenfell schrieb:

Wichtig daran ist einfach, dass die Reihenfolge z.T. ein wenig gewöhnungsbedürftig ist.

Sie ist nicht gewöhnungsbedürftig. Sie ist exakt die gleiche.

{argument_1|modifikator:argument_2:argument_3: ...}

Das ist bei Smarty-Modifikatoren exakt das gleiche wie bei PHP Funktionen.

Der einzige Unterschied besteht darin, dass das erste Argument bei Smarty immer das Argument ist, mit dem etwas gemacht werden soll (Subject). Bei PHP ist das erste Argument immer das, was laut PHP-Doku an erster Stelle verlangt wird. Dazu muss man sich die Doku der jeweiligen PHP-Funktion durchlesen.

Offline

#8 11. November 2011 16:14

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

wobei. eine kurze frage. shuffle funktioniert ja mal ganz anders als in smarty als in php oder?

smarty: {$array|@shuffle}

wie soll man darauf kommen? ich bin durch zufall drauf gekommen

Offline

#9 11. November 2011 16:23

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.171

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

Wieso funktioniert shuffle anders?
Laut PHP Doku:

D.h. in Smarty

Exakt das gleiche wie mit jedem anderen Modifikator.

Warum Du an dieser Stelle das @-Zeichen verwenden musst, habe ich auch schon mal in einem anderen Zusammenhang erklärt.

Wenn $argument_1 ein Array ist und Du in Smarty einfach nur {$argument_1} schreibst, würdest Du ein Array als String ausgeben wollen. Und das geht nicht. Das Ergebnis wäre wortwörtlich "Array".

Mit {$argument_1|shuffle} erhältst Du als Ergebnis auch nur wieder ein Array, was also zum gleichen Resultat führen würde.

Du möchtest aber an dieser Stelle das Array gar nicht ausgeben, sondern es nur modifizieren.

D.h. Du musst die Ausgabe des Ergebnisses von {$argument_1|shuffle} unterdrücken. Und das macht man in Smarty mit diesem @-Zeichen.

Um ganz korrekt zu sein, gibt das @-Zeichen an, dass man die Variable lediglich an den Modifikator übergeben will. Ob da etwas ausgegeben wird, hängt vom Modifikator ab.

Offline

#10 11. November 2011 16:24

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.815
Webseite

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

NaN schrieb:
nockenfell schrieb:

Wichtig daran ist einfach, dass die Reihenfolge z.T. ein wenig gewöhnungsbedürftig ist.

Sie ist nicht gewöhnungsbedürftig. Sie ist exakt die gleiche.

{argument_1|modifikator:argument_2:argument_3: ...}

Gewöhnungsbedürfig ist es insofern, dass die Variable erst am Schluss kommt und zuerst die anderen Argumente. Da Smarty Modifikatoren jeweils mit $variable|Modifikator:Argument aufgebaut sind, ist es ungewohnt Argument|Modifikator:Argument:$variable zu nutzen.

nicmare schrieb:

wobei. eine kurze frage. shuffle funktioniert ja mal ganz anders als in smarty als in php oder?
smarty: {$array|@shuffle}
wie soll man darauf kommen? ich bin durch zufall drauf gekommen

Finde ich nicht. Ist doch genau der gleiche Aufruf.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#11 11. November 2011 16:42

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.171

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

nockenfell schrieb:

Gewöhnungsbedürfig ist es insofern, dass die Variable erst am Schluss kommt und zuerst die anderen Argumente. Da Smarty Modifikatoren jeweils mit $variable|Modifikator:Argument aufgebaut sind, ist es ungewohnt Argument|Modifikator:Argument:$variable zu nutzen.

Wenn man sich immer vor Augen hält, dass ein Smarty-Modifikator nichts weiter ist als eine PHP Funktion wie oben beschrieben, dann sollte man das allgemeine Prinzip von Modifikatoren (ob nun PHP oder smartyfiziert) schnell verstehen.

Jede Funktion ist anders aufgebaut und erwartet demzufolge Argumente in einer jeweils ihr eigenen spezifischen Reihenfolge. Alle smartyfizierten Funktionen, die für die Template-Engine Smarty geschrieben wurden, haben glücklicherweise immer dasselbe Schema. Sie sind sozusagen für den Template-Designer intuitiver und vor allem einheitlich gestaltet:

{was_will_ich_ändern|womit_will_ich_es_ändern:wie_will_ich_es_ändern: ... }

Die dazu nötige PHP Funktion sähe dann so aus:

function womit_will_ich_es_ändern(was_will_ich_ändern, wie_will_ich_es_ändern, ... ) {
   ...
}


Bei PHP sieht das leider nun mal anders aus. Da kann es eben sein, dass eine Funktion so aufgebaut ist:

mache_dies( anhand_jenem, mit_folgendem, und_beschränke_auf_soundsoviel);
(immer noch explode wink )

oder

mache_das( anhand_diesem , und_jenem, mit_folgendem );
(str_replace)

Und das ist bei PHP leider nicht einheitlich. Wodurch der Smarty-Code dann so aussähe:

{wie_will_ich_es_ändern|womit_will_ich_es_ändern:was_will_ich_ändern:wie_will_ich_es_ändern: ... }

bzw.

{wie_will_ich_es_ändern|womit_will_ich_es_ändern:wie_will_ich_es_ändern:was_will_ich_ändern: ... }

D.h. man muss manchmal einfach nur über den Smarty-Tellerrand nach PHP schauen, wenn man etwas verwenden will, wofür es keine smartyfizierte Entsprechung gibt, weil das eigentliche Subject nicht immer an derselben Stelle steht.

Aber die Anwendung eines Modifikators ist im Prinzip immer gleich. Nur die Reihenfolge der Argumente (bzw. deren jeweilige Bedeutung an dieser Stelle) beim Aufruf eines Modifikators hängt davon ab, ob smartyfiziert oder PHP.

Man muss sozusagen den Smarty-Aufruf immer auf die jeweilige Funktion mappen, um zu wissen, wo man was angeben muss.

Offline

#12 11. November 2011 16:45

nicmare
Server-Pate
Registriert: 15. Dezember 2010
Beiträge: 1.314
Webseite

Re: Dokumentation von Smarty-kompatiblen PHP-Funktionen?

NaN schrieb:

Aber die Anwendung eines Modifikators ist im Prinzip immer gleich. Nur die Funktionsweise bzw. die Reihenfolge der Argumente beim Aufruf eines Modifikators hängt davon ab, ob smartyfiziert oder PHP.

smartyfiziert gefällt mir  monkey

Offline