mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-26 18:01:36 +01:00
361 lines
11 KiB
XML
361 lines
11 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision$ -->
|
|
<chapter id="tips">
|
|
<title>Tips & Tricks</title>
|
|
<para>
|
|
</para>
|
|
<sect1 id="tips.blank.var.handling">
|
|
<title>Handhabung unangewiesener Variablen</title>
|
|
<para>
|
|
Manchmal möchten Sie vielleicht, dass anstatt einer Leerstelle ein Standardwert ausgegeben wird - zum
|
|
Beispiel um im Tabellenhintergrund "&nbsp;" auszugeben, damit er korrekt angezeigt wird. Damit dafür
|
|
keine {if} Anweisung verwendet werden muss, gibt es in Smarty eine Abkürzung: die Verwendung des <emphasis>default</emphasis>
|
|
Variablen-Modifikators.
|
|
</para>
|
|
<example>
|
|
<title>"&nbsp;" ausgeben wenn eine Variable nicht zugewiesen ist</title>
|
|
<programlisting>
|
|
|
|
{* kompliziert *}
|
|
|
|
{if $titel eq ""}
|
|
&nbsp;
|
|
{else}
|
|
{$titel}
|
|
{/if}
|
|
|
|
|
|
{* einfach *}
|
|
|
|
{$titel|default:"&nbsp;"}</programlisting>
|
|
</example>
|
|
</sect1>
|
|
|
|
<sect1 id="tips.default.var.handling">
|
|
<title>Handhabung von Standardwerten</title>
|
|
<para>
|
|
Wenn eine Variable in einem Template häufig zum Einsatz kommt,
|
|
kann es ein bisschen störend wirken, den 'default'-Modifikator jedes mal anzuwenden.
|
|
Sie können dies umgehen, indem Sie der Variable mit der <link linkend="language.function.assign">assign</link> Funktion
|
|
einen Standardwert zuweisen.
|
|
</para>
|
|
<example>
|
|
<title>Zuweisen des Standardwertes einer Variable</title>
|
|
<programlisting>
|
|
{* schreiben sie dieses statement an den Anfang des Templates *}
|
|
{assign var="titel" value=$titel|default:"kein Titel"}
|
|
|
|
{* fall 'titel' bei der Anweisung leer war, enthält es nun den Wert 'kein Titel' wenn Sie es ausgeben *}
|
|
{$titel}
|
|
</programlisting>
|
|
</example>
|
|
</sect1>
|
|
<sect1 id="tips.passing.vars">
|
|
<title>Variablen an eingebundene Templates weitergeben</title>
|
|
<para>
|
|
Wenn die Mehrzahl Ihrer Templates den gleichen Header und Footer verwenden,
|
|
lagert man diese meist in eigene Templates aus und bindet diese ein. Was
|
|
geschieht aber wenn der Header einen seitenspezifischen Titel haben soll?
|
|
Smarty bietet die Möglichkeit, dem eingebundenen Template, Variablen
|
|
zu übergeben.
|
|
</para>
|
|
<example>
|
|
<title>Die Titel-Variable dem Header-Template zuweisen</title>
|
|
<programlisting>
|
|
|
|
ersteseite.tpl
|
|
------------
|
|
|
|
{include file="header.tpl" title="Erste Seite"}
|
|
{* template body hier *}
|
|
{include file="footer.tpl"}
|
|
|
|
|
|
archiv.tpl
|
|
------------
|
|
|
|
{config_load file="archiv.conf"}
|
|
{include file="header.tpl" title=#archivSeiteTitel#}
|
|
{* template body hier *}
|
|
{include file="footer.tpl"}
|
|
|
|
|
|
header.tpl
|
|
----------
|
|
<HTML>
|
|
<HEAD>
|
|
<TITLE>{$title|default:"Nachrichten"}</TITLE>
|
|
</HEAD>
|
|
<BODY>
|
|
|
|
|
|
footer.tpl
|
|
----------
|
|
</BODY>
|
|
</HTML></programlisting>
|
|
</example>
|
|
<para>
|
|
Sobald die erste Seite geparsed wird, wird der Titel 'Erste Seite'
|
|
dem header.tpl übergeben und fortan als Titel verwendet. Wenn
|
|
die Archivseite ausgegeben wird, wird der Titel 'Archive' ausgegeben.
|
|
Wie Sie sehen können, wird der Wert dafür aus der Datei
|
|
'archiv.conf' geladen und nicht von einem übergebenen Wert. Der
|
|
Standardwert 'Nachrichten' wird verwendet, wenn die '$titel' leer ist.
|
|
Erneut wird dafür der <emphasis>default</emphasis>-Modifikator angewandt.
|
|
</para>
|
|
</sect1>
|
|
<sect1 id="tips.dates">
|
|
<title>Zeitangaben</title>
|
|
<para>
|
|
Um dem Template Designer höchstmögliche Kontrolle über die Ausgabe
|
|
von Zeitangaben/Daten zu ermöglichen, ist es empfehlenswert Daten immer
|
|
als Timestamp zu übergeben. Der Designer kann danach die Funktion
|
|
<link linkend="language.modifier.date.format">date_format</link> für
|
|
die Formatierung verwenden.
|
|
</para>
|
|
<para>
|
|
Bemerkung: Seit Smarty 1.4.0 ist es möglich jede Timestamp zu
|
|
übergeben, welche mit strtotime() ausgewertet werden kann. Dazu
|
|
gehören Unix-Timestamps und MySQL-Timestamps.
|
|
</para>
|
|
<example>
|
|
<title>Die Verwendung von date_format</title>
|
|
<programlisting>
|
|
{$startDatum|date_format}
|
|
|
|
AUSGABE:
|
|
|
|
Jan 4, 2001
|
|
|
|
|
|
{$startDatum|date_format:"%Y/%m/%d"}
|
|
|
|
AUSGABE:
|
|
|
|
2001/01/04
|
|
|
|
|
|
{if $datum1 < $datum2}
|
|
...
|
|
{/if}</programlisting>
|
|
</example>
|
|
<para>
|
|
Falls {html_select_date} in einem Template verwendet wird, hat der Programmierer
|
|
die Möglichkeit den Wert wieder in ein Timestamp-Format zu ändern. Dies
|
|
kann zum Beispiel wie folgt gemacht werden:
|
|
</para>
|
|
<example>
|
|
<title>Formular Datum-Elemente nach Timestamp konvertieren</title>
|
|
<programlisting>
|
|
// hierbei wird davon ausgegangen, dass Ihre Formular Elemente wie folgt benannt sind
|
|
// startDate_Day, startDate_Month, startDate_Year
|
|
|
|
$startDate = makeTimeStamp($startDate_Year,$startDate_Month,$startDate_Day);
|
|
|
|
function makeTimeStamp($year="",$month="",$day="")
|
|
{
|
|
if(empty($year))
|
|
$year = strftime("%Y");
|
|
if(empty($month))
|
|
$month = strftime("%m");
|
|
if(empty($day))
|
|
$day = strftime("%d");
|
|
|
|
return mktime(0,0,0,$month,$day,$year);
|
|
}</programlisting>
|
|
|
|
</example>
|
|
</sect1>
|
|
<sect1 id="tips.wap">
|
|
<title>WAP/WML</title>
|
|
<para>
|
|
WAP/WML Templates verlangen, dass ein Content-Type Header im Template
|
|
angegeben wird. Der einfachste Weg um dies zu tun, wäre, eine Funktion
|
|
zu schreiben, welche den Header ausgibt. Falls sie den Caching Mechanismus
|
|
verwenden, sollten Sie auf das 'insert'-Tag zurückgreifen ('insert'-Tags
|
|
werden nicht gecached), um ein optimales Ergebnis zu erzielen. Achten Sie darauf,
|
|
dass vor der Ausgabe des Headers keine Daten an den Client gesendet werden, da
|
|
die gesendeten Header-Daten ansonsten von Client verworfen werden.
|
|
</para>
|
|
<example>
|
|
<title>Die verwendung von 'insert' um einen WML Content-Type header zu senden</title>
|
|
<programlisting>
|
|
// stellen Sie sicher, dass Apache mit .wml Dateien umgehen kann!
|
|
// schreiben Sie folgende Funktion in Ihrer Applikation, oder in Smarty.addons.php
|
|
function insert_header() {
|
|
// this function expects $content argument
|
|
// folgende Funktion erwartet ein $inhalt argument
|
|
extract(func_get_arg(0));
|
|
if(empty($inhalt))
|
|
return;
|
|
header($inhalt);
|
|
return;
|
|
}
|
|
|
|
// Ihr Template _muss_ danach wie folgt beginnen:
|
|
|
|
{insert name=header inhalt="Content-Type: text/vnd.wap.wml"}
|
|
|
|
<?xml version="1.0"?>
|
|
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
|
|
|
|
<!-- neues wml deck -->
|
|
<wml>
|
|
<!-- erste karte -->
|
|
<card>
|
|
<do type="accept">
|
|
<go href="#zwei"/>
|
|
</do>
|
|
<p>
|
|
Welcome to WAP with Smarty!
|
|
Willkommen bei WAP mit Smarty!
|
|
OK klicken um weiterzugehen...
|
|
</p>
|
|
</card>
|
|
<!-- zweite karte -->
|
|
<card id="zwei">
|
|
<p>
|
|
Einfach, oder?
|
|
</p>
|
|
</card>
|
|
</wml></programlisting>
|
|
</example>
|
|
</sect1>
|
|
<sect1 id="tips.componentized.templates">
|
|
<title>Template/Script Komponenten</title>
|
|
<para>
|
|
Dieser Tip ist nicht ausgiebig getestet, aber dennoch eine nette Idee. Verwendung auf eigene Gefahr. ;-)
|
|
</para>
|
|
<para>
|
|
Normalerweise werden Variablen dem Template wie folgt zugewiesen:
|
|
In Ihrer PHP-Applikation werden die Variablen zusammengestellt
|
|
(zum Beispiel mit Datenbankabfragen). Danach kreieren Sie eine
|
|
Instanz von Smarty, weisen die Variablen zu und geben das Template aus.
|
|
Wenn wir also zum Beispiel einen Börsenticker in unserem
|
|
Template haben, stellen wir die Kursinformationen in unserer Anwendung
|
|
zusammen, weisen Sie dem Template zu und geben es aus. Wäre es jedoch nicht
|
|
nett diesen Börsenticker einfach in ein Template einer anderen Applikation
|
|
einbinden zu können ohne deren Programmcode zu ändern?
|
|
</para>
|
|
|
|
|
|
<para>
|
|
Sie können PHP-Code mit {php}{/php} in Ihre Templates einbetten.
|
|
So können Sie Templates erstellen, welche die Datenstrukturen
|
|
zur Anweisung der eigenen Variablen enthalten. Durch die Bindung von
|
|
Template und Logik entsteht so eine eigenständig lauffähige Komponente.
|
|
</para>
|
|
<example>
|
|
<title>Template/Script Komponenten</title>
|
|
<programlisting>
|
|
{* Smarty *}
|
|
|
|
{php}
|
|
|
|
// unsere funktion um die börsenkurse zu holen
|
|
function fetch_ticker($symbol,&$ticker_name,&$ticker_price) {
|
|
// hier wird $ticker_name und $ticker_price zugewiesen
|
|
}
|
|
|
|
// aufruf der funktion
|
|
fetch_ticker("YHOO",$ticker_name,$ticker_price);
|
|
|
|
// zuweisung der variablen
|
|
$this->assign("ticker_name",$ticker_name);
|
|
$this->assign("ticker_price",$ticker_price);
|
|
|
|
{/php}
|
|
|
|
Symbol: {$ticker_name} Preis: {$ticker_price}</programlisting>
|
|
</example>
|
|
<para>
|
|
Seit Smarty 1.5.0, gibt es einen noch einfacheren und auch saubereren Weg
|
|
in dem man die Logik mit {include_php ...} einbindet. So kann man weiterhin
|
|
die Logik vom Design getrennt halten. Mehr Informationen gibt es in der <link linkend="language.function.include.php">include_php</link> Dokumentation.
|
|
</para>
|
|
<example>
|
|
<title>Template/Script Komponenten mit include_php</title>
|
|
<programlisting>
|
|
load_ticker.php
|
|
---------------
|
|
|
|
<?php
|
|
// unsere funktion um die börsenkurse zu holen
|
|
function fetch_ticker($symbol,&$ticker_name,&$ticker_price) {
|
|
// hier wird $ticker_name und $ticker_price zugewiesen
|
|
}
|
|
|
|
// aufruf der funktion
|
|
fetch_ticker("YHOO",$ticker_name,$ticker_price);
|
|
|
|
// zuweisung der variablen
|
|
$this->assign("ticker_name",$ticker_name);
|
|
$this->assign("ticker_price",$ticker_price);
|
|
?>
|
|
|
|
|
|
index.tpl
|
|
---------
|
|
|
|
{* Smarty *}
|
|
|
|
{include_php file="load_ticker.php"}
|
|
|
|
Symbol: {$ticker_name} Preis: {$ticker_price}</programlisting>
|
|
</example>
|
|
</sect1>
|
|
<sect1 id="tips.obfuscating.email">
|
|
<title>Verschleierung von E-mail Adressen</title>
|
|
<para>
|
|
Haben Sie sich auch schon gewundert, wie Ihre E-mail Adresse auf so viele
|
|
Spam-Mailinglisten kommt? Ein Weg, wie Spammer E-mail Adressen sammeln, ist
|
|
über Webseiten. Um dieses Problem zu bekämpfen, können sie
|
|
den 'mailto'-Plugin verwenden. Er ändert die Zeichenfolge mit Javascript
|
|
so, dass sie im HTML Quellcode nicht lesbar ist, jedoch von jedem Browser
|
|
wieder zusammengesetzt werden kann. Den 'mailto'-Plugin gibt es im Smarty-Repository
|
|
auf http://smarty.php.net. Laden sie den Plugin herunter und speichern Sie ihn im
|
|
'plugins' Verzeichnis.
|
|
</para>
|
|
<example>
|
|
<title>Beispiel von verschleierung von E-mail Adressen</title>
|
|
<programlisting>
|
|
|
|
index.tpl
|
|
---------
|
|
|
|
Fragen bitte an
|
|
{mailto address=$EmailAddress encode="javascript" subject="Hallo"}
|
|
senden
|
|
|
|
</programlisting>
|
|
</example>
|
|
<note>
|
|
<title>Technische Details</title>
|
|
<para>
|
|
Die Codierung mit Javascript ist nicht sehr sicher, da ein möglicher
|
|
Spammer die Decodierung in sein Sammelprogramm einbauen könnte. Es wird jedoch damit
|
|
gerechnet, dass, da Aufwand und Ertrag sich nicht decken, dies nicht oft der Fall ist.
|
|
</para>
|
|
</note>
|
|
</sect1>
|
|
</chapter>
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"../../../../manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
--> |