Sie sind hier:  LinkpfeilPowerCMS LinkpfeilSmarty-Tricks LinkpfeilString-Modifikatoren »Besondere Modifikatoren


Verschiedene String - Funktionen

Nachstehend einige Beispiele die man im Prinzip zu Steuerungszwecken verwenden würde, aber mit Strings zu tun haben.

Funktion count_chars - Vorkommen von Zeichen zählen

Die Variable test enthält:

Zwei Z und ein F.

Das Template:

{counter start=-1 assign='co' print=0}
{assign var='test2' value=$test|count_chars:0}
{foreach from=$test2 item=entry}
{counter}
{if $entry >0}
Das Zeichen "{$co|chr}" kommt {$entry} vor .<br />
{/if}
{/foreach}

Die Ausgabe:

Das Zeichen " " kommt 4 vor .
Das Zeichen "." kommt 1 vor .
Das Zeichen "F" kommt 1 vor .
Das Zeichen "Z" kommt 2 vor .
Das Zeichen "d" kommt 1 vor .
Das Zeichen "e" kommt 2 vor .
Das Zeichen "i" kommt 2 vor .
Das Zeichen "n" kommt 2 vor .
Das Zeichen "u" kommt 1 vor .
Das Zeichen "w" kommt 1 vor .

Wie es funktioniert:

Die PHP Funktion count_chars gibt ein Array zurück in dem die Nummer des Zeichens der Key (Index) ist und der Wert die Anzahl der Zeichen.

Bei diesem Aufruf werden auch die Zeichen gezählt, die nicht im Text vorhanden sind , diese haben dann den Wert 0.

Deswegen wird hier anders vorgegangen und zwar indirekt.

Es wird ein counter verwendet (Smarty - Counter) mit einem Anfangswert von -1 (Arrays in dieser Art fangen bei [0] an.

count_chars wird in Verbindung mit einer Zuweisung (assign) zur Variable test2 genutzt, test2 enthält nun das Array.

Arrays müssen in einer Schleife abgearbeitet werden (foreach).

Bei jedem Durchlauf wird der Counter um einen Wert höher gesetzt.

Damit wir nicht die Anzahl der nicht verwendeten Zeichen (0) erhalten gbt es die Filterung mit der kleinen IF Abfrage.

Die Nummer des Zeichens wird über die PHP Funktion chr als Modifikator in ein Zeichen umgewandelt und danach die Anzahl ausgegeben - fertig.

Das ist hier ein sehr schön es Beispiel dafür, das ein Designer ohne Eingriff in die Programmierung und damit vor allem auch ohne das er auf den Programmierer angewiesen ist, Dinge machen kann, die ohne der Templateengine nicht zu machen wären.

Länge einer Zeichenkette ermitteln

Wir verwenden dazu die PHP Funktion strlen.

Die Variable test hat den Wert

Das ist ein Test.

Einsatz:

{$test|strlen}

Ausgabe:

17

Sortierungen von Arrays

Es gibt unter PHP einige Sortierfunktionen.

In diesem Beispiel verwenden wir die Funktion sort.

Die Variable test enthält ein array :

array(5,8,1,2,19,11,1)

Das Template:

{assign var='test2' value=$test|@sort}
{foreach from=$test item=entry}
{$entry}<br />
{/foreach}

Die Ausgabe:

1 1
2
5
8
11
19

Wie sort hier funktioniert

Die Zuweisung ist eigentlich eine Dummyzuweisung.

Die Funktion sort gibt einen Wert true oder false zurück, den wir nicht gebrauchen können und deswegen wird er hier abgefangen, ansonsten würde test den Wert true oder false erhalten, nicht aber ein sortiertes Array.

Wichtig ist auch das Zeichen @ vor der Funktion, ansonsten würde es in dem Fall nicht funktionieren.

Arrays werden wie übich in einer Schleife ausgegeben und so auch hier.

Und wie man eindeutig sehen kann - es funktioniert.

Numerische Werte eines Arrays addieren

Das ist eine Aufgabe, die häufiger zu bewältigen ist.

Wir verwenden die PHP Funktion array_sum.

Die Variable test enthält ein array :

array(5,8,1,2,19,11,1)

Der Einsatz:

{$test|@array_sum}

Die Ausgabe:

47

Hinweis: Auch hier muss das Zeichen @ eingesetzt werden.

Das Produkt aller Werte eines Arrays

Mit der Funktion array_product kann man das Produkt aller Werte des Arrays errechnen.

array_product steht allerdings erst ab PHP 5.1 zur Verfügung.

Die Variable test enthält ein Array:

array(5,8,1,2,19,11,1)

Der Einsatz ist wie folgt:

{$test|@array_product}

Die Ausgabe:

16720

Zufälliger Wert aus einem Array

Das ist eine Sache die z.B. hervorragend dazu geeignet ist ein Ereignis zufällig zu machen - z.B. die Ausgabe eines Bildes.

Die Variable test hat folgenden Inhalt:

array('Bild1','Bild2','Bild3','Bild4')

Im Ernstfall sind das natürlich Links oder Linkteile.

Der Einsatz:

{assign var='index' value=$test|@array_rand}
{$test[$index]}

Funktionsweise

array_rand gibt einen key (Index) zurück.

Deshalb wird der Wert in die Variable index gespeichert.

Damit kann dann der betreffende Wert angezeigt werden.

Interessant wäre es, wenn man ein Array direkt im Template bilden könnte - da hat Smarty jedoch kein Standardplugin um ein Array im Template zuweisen zu können.

Es gibt aber ein Plugin das man sich hier holen kann.

Array mit Smarty erzeugen

Man muss ja nur fummeln - aber es geht mit der PHP Funktion split.

Das witzige an der Sache - es funktioniert ohne das eine an Smarty bereits zugewiesene Variable vorhanden ist, rein übers Template:

{assign var='tt' value=','|split:"Apfel,Birne,Banane,Orange"}
{$tt|var_dump}

Mit var_dump erfolgt die Kontrollausgabe.

Array aus String erzeugen

Es wird die PHP Funktion explode verwendet.

Einsatz:

{assign var='a' value=','|explode:"Max,Heini,Geierwally"}
{$a|var_dump}

Ausgabe:

string 'Max' (length=3)
string 'Heini' (length=5)
string 'Geierwally' (length=10)
Array

Funktionsweise:

, ist der Trenner für die Stringteile.

Kontrollausgabe eines Arrays

Man kann natürlich debug von Smarty einsetzen um die Inhalte auszugeben, die Smarty als Variable kennt.

Aber - das ist häufig zu viel des guten.

Mit der PHP Funktion var_dump läßt sich auch das regeln.

Die Variable test ist ein Array mit dem Inhalt:

array('hallo','ich','bin','es')

Der Einsatz:

{$test|var_dump}

Die Ausgabe:

string 'hallo' (length=5)
string 'ich' (length=3)
string 'bin' (length=3)
string 'es' (length=2)
Array

Eine wertvolle kleine Hilfe bei der Entwicklung von Templates.

In Arrays suchen

Dafür gibt es die PHP Funktion array_search.

Die Variable test enthält ein array:

array("Apfel","Birne","Orange", "Banane")

Der Einsatz (wir suchen nach "Banane":

{capture assign=ergebnis}{'Banane'|array_search:$test}{/capture}
{if $ergebnis==""}
Nix is !
{else}
{$test[$ergebnis]}
{/if}

Das Ergebnis:

Banane

Im Normalfall möchte man ja nur wissen ob der gesuchte Wert vorhanden ist und will ihn nicht ausgeben.

Beim Einsatz von Smarty capture muss man aufpassen, das da nichts dazwischen steht, ansonsten sind da auch Zeilenumbrüche etc. enthalten und somit ist der Inhalt wertlos.

Binärer Vergleich

Vergleichsmöglichkeiten werden benötigt, da man Templates inhaltlich damit gestalten kann.

Wir verwenden hier mal die PHP Funktion strcasecmp,

Aus dem PHP Handbuch:

strcasecmp — Binärer Vergleich von Zeichenketten ohne Unterscheidung der Groß- und Kleinschreibung

Beschreibung int strcasecmp ( string $str1, string $str2 )

Ist str1 kleiner als str2 wird < 0 zurückgegeben, ist str1 größer als str2 > 0, und bei Gleichheit gibt die Funktion 0 zurück.

Wir haben zwei Variable:

test hat den Inhalt Hallo
test2 hat den Inhalt hallo

Einsatz:

{$test|strcasecmp:$test2}

Der Rückgabewert ist 0 da Groß- und Kleinschreibung nicht berücksichtigt werden.

Ändert man den Wert von test auf Halloo - dann ist der Ausgabwert 1.

Läßt man test auf Hallo und ändert man test2 auf halloo ab ist der Wert -1.

Man hat also dann mehrere Möglichkeiten in Templates eine Steuerung vorzunehmen.

Zufallszahl erzeugen

Es wird die PHP Funktion rand verwendet.

Einsatz:

{0|rand:10}

Ausgabe:

Es wird eine Zufallszahl angezeigt die zwischen 0 und 10 liegt.

Verzeichnis auslesen

Unter PHP 5 gibt es die Funktion scandir, mit dessen Hilfe man elegant ein Verzeichnis auslesen kann.

Einsatz:

{'templates'|scandir|var_dump}

Ausgabe:

string '.' (length=1)
string '..' (length=2)
string 'csv.tpl' (length=7)
string 'data' (length=4)
string 'index.tpl' (length=9)
string 'kontakt.tpl' (length=11)
string 'kontakt_hotel.tpl' (length=17)
string 'kontakt_ok.tpl' (length=14)
string 'menu.tpl' (length=8)
string 'mininews' (length=8)
string 'pipictures' (length=10)
string 'pirss.tpl' (length=9)
string 'pirss_forum.tpl' (length=15)
string 'pisearch.tpl' (length=12)
string 'pisearchmod.tpl' (length=15)
string 'poll.tpl' (length=8)
string 'simple_collapse3.tpl' (length=20)
string 'simple_collapse3mod.tpl' (length=23)
string 'test.tpl' (length=8)
Array

Wie es funktioniert:

templates ist das Verzeichnis, das eingelesen werden soll.

Mit |var_dump geben wir hier das Ergebnis aus, es ist immer ein Array.

Geben wir scandir keinen weiteren Parameter mit, wird aufsteigend sortiert.

Beim Aufruf

{'templates'|scandir:2|var_dump}

wird absteigend sortiert, bei

{'templates'|scandir:0|var_dump}

wird nicht sortiert.

Will man es jedoch weiter verarbeiten (das gilt auch für viele andere Beispiele), dann muss man das Ergebnis zuweisen.

Nachfolgend weisen wir das Ergebnis direkt einer Variable mit dem Namen dircontent zu.

{assign var='dircontent' value='templates'|scandir}

Damit könnte man das gewonnene Ergebnis direkt im Template verarbeiten.

Nachfolgend ein Beispiel mit Auswertung um nur Dateien anzuzeigen, welche die Endung tpl haben:

{assign var='dircontent' value='templates'|scandir}
{foreach from=$dircontent item=d}
{assign var='path_info' value=$d|pathinfo}
{if $path_info.extension eq 'tpl'}
{$d} <br />
{/if}
{/foreach}

Ausgabe:

csv.tpl
index.tpl
kontakt.tpl
kontakt_hotel.tpl
kontakt_ok.tpl
menu.tpl
pirss.tpl
pirss_forum.tpl
pisearch.tpl
pisearchmod.tpl
poll.tpl
simple_collapse3.tpl
simple_collapse3mod.tpl
test.tpl

Funktionsweise:

Zunächst wird das Verzeichnis wie beschrieben ausgelesen.

Da das Ergebnis ein Array ist erfolgt die Auswertung in einer Schleife (foreach).

Jeder Eintrag wird innerhalb der Schleife der Variable d zugeführt.

Mit

{assign var='path_info' value=$d|pathinfo}

holen wir uns die Dateiinformationen und verwenden dabei die PHP Funktion pathinfo.

Auszug aus dem PHP Handbuch:

pathinfo() gibt ein assoziatives Array mit Informationen über den Pfad path zurück. Die folgenden Arrayelemente werden zurückgegeben: den Verzeichnisnamen dirname, den Dateinamen basename, und die Dateinamenserweiterung extension.

Mit

{if $path_info.extension eq 'tpl'} {$d} <br /> {/if}

filtern wir das ganze, da nur die Dateien mit der Endung tpl erwünscht sind und geben die Informationen bei einem Treffer aus.

Das ist übrigens ein Beispiel dafür welche neuen Möglichkeiten man mit Hilfe dieser Modifikator - Methode gewonnen hat. Kein großartiges Gefummel und überraschende Wirkungen und einfache wie auch schnelle LÖsungen.

Ermittlung des Verzeichnisnamens

Es wird die PHP Funktion dirname verwendet.

Einsatz:

{$smarty.server.SCRIPT_FILENAME|dirname}

Ausgabe:

C:/xampp/xampp/htdocs/smartytest

Datei auf Existenz prüfen

Es wird die PHP Funktion file_exists verwendet.

Einsatz:

{if 'index.php'|file_exists eq ''} Nicht vorhanden {else} Alles klar. {/if}

In dem Beispiel wird geprüft ob die Datei index.php existiert.

Diese Funktion ist wertvoll, da so etwas häufig eingesetzt werden kann.

Datei direkt einlesen

Es wird die PHP Funktion file_get_contents verwendet.

Einsatz:

{assign var='t' value='dateiname'|file_get_contents}

Funktionserklärung:

Die Datei - hier dargestellt durch dateiname, wird mut file_get_contents eingelesen und direkt der Variable t zugewiesen.

Datei schreiben

Es wird die PHP Funktion file_put_contents verwendet.

Die Variable t hat den Inhalt:

Das ist der Test

Einsatz:

{'test.txt'|@file_put_contents:$t}

Ausgabe:

In dem Fall 16 = Anzahl der geschriebenen Bytes.

Funktionsweise:

Die Datei test.txt wird geöffnet oder angelegt und der Inhalt der Variable (Text!) wird geschrieben und die Datei danach geschlossen.

Datei löschen

Es wird die PHP Funktion unlink verwendet.

Einsatz:

{'test.txt'|@unlink }

Ausgabe:

Bei Erfolg 1 ansonsten nichts.

Cookie setzen

Die Variable test hat den Wert:

neuerCookie

Der Aufruf:

{$test|setcookie:"der inhalt"}

Der Ausgabewertwert ist 1 bei Erfolg oder 0 wenn der Versuch erfolglos war.

Der Cookie hat den Wert der inhalt.

Normalerweise würde man den Wert nicht ausgeben sondern mit einem assign abfangen.

Cookies werden in der globalen PHP - Variable $_COOKIE gespeichert.

Unter Smarty würde sich der Wert direkt abrufen und somit auswerten lassen.

{$smarty.cookies.neuerCookie}

Mit dem Trick hat man natürlich ziemliche Gestaltungsmöglichkeiten !

Reihenfolge

Smarty übergibt immer die Variable als ersten Parameter.

Das aber funktioniert nicht bei allen PHP Funktionen, die erwarten an der Stelle etwas anderes.

Nachfolgend zeige ich am Beispiel der PHP Funktion date wie man das übergeht.

Datum formatieren

Wir verwenden die PHP Funktion date.

Aus dem PHP Handbuch:

string date ( string $Format [, int $Timestamp] )

Der erste Parameter muss also ein String mit den Formatangaben sein.

Die Variable zeit hat einen Timestamp als Information zu Datum und Uhrzeit.

1200325321

Der Aufruf ist eine linke Bazille - wir modifizieren die Formatangabe und nicht wie manche es erwarten würden die Information der Variable zeit.

Das können wir machen weil als Endprodukt nicht das Format sondern die formatierte Datum - Uhrzeitangabe ausgegeben wird - darauf muss man erst einmal kommen:

{assign var='format' value='d.m.y H:i:s'} {$format|date:$zeit}

Die Ausgabe:

14.01.08 16:42:01

Mit dieser Methode lassen sich auch andere PHP Funktionen überlisten, die ansonsten nicht für uns in der Form arbeiten wollen.

Wert runden

Wir verwenden die PHP Funktion round.

Einsatz:

{'123.4567'|round:2}

Ausgabe:

123.46

In dem Beispiel wurde ein Wert direkt eingegeben, normal wäre die Übergabe einer Variablen.

Die :2 sagt der Funktion, das sie auf 2 Kommastellen runden soll.

Aufrunden auf nächst höhere ganze Zahl

Wir verwenden die PHP Funktion ceil.

Einsatz:

{4.2|ceil}

Ausgabe:

5
 

Letzte Änderung auf dieser Seite am: 09.02.2008 12:37:47


Vorherige Seite: LinkpfeilString-Modifikatoren  | Nächste Seite: LinkpfeilPowerSite TPLE