Files
smarty/docs/de/appendixes/tips.xml
2005-06-20 14:44:30 +00:00

435 lines
12 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- EN-Revision: 1.9 Maintainer: andreas Status: ready -->
<!-- $Revision$ -->
<chapter id="tips">
<title>Tips &amp; 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 "&amp;nbsp;" auszugeben, damit er korrekt
angezeigt wird. Damit dafür keine <link
linkend="language.function.if">{if}</link> Anweisung verwendet
werden muss, gibt es in Smarty eine Abkürzung: die Verwendung des
<emphasis>default</emphasis> Variablen-Modifikators.
</para>
<example>
<title>"&amp;nbsp;" ausgeben wenn eine Variable nicht zugewiesen ist</title>
<programlisting>
<![CDATA[
{* kompliziert *}
{if $titel eq ""}
&amp;nbsp;
{else}
{$titel}
{/if}
{* einfach *}
{$titel|default:"&amp;nbsp;"}
]]>
</programlisting>
</example>
<para>
Siehe auch <link linkend="language.modifier.default">default
(Standardwert)</link> und <link
linkend="tips.default.var.handling">Handhabung von
Standardwerten</link>.
</para>
</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 <link
linkend="language.modifier.default"><emphasis>default</emphasis></link>-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>
<![CDATA[
{* schreiben sie dieses statement an den Anfang des Templates *}
{assign var="titel" value=$titel|default:"kein Titel"}
{* falls 'titel' bei der Anweisung leer war, enthält es nun den Wert
'kein Titel' wenn Sie es ausgeben *}
{$titel}
]]>
</programlisting>
</example>
<para>
Siehe auch <link linkend="language.modifier.default">default
(Standardwert)</link> und <link
linkend="tips.blank.var.handling">Handhabung nicht zugewiesener
Variablen</link>.
</para>
</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 mit<link
linkend="language.function.include">{include}</link> 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>
<para>
<filename>mainpage.tpl</filename>
</para>
<programlisting>
<![CDATA[
{include file="header.tpl" title="Hauptseite"}
{* template body hier *}
{include file="footer.tpl"}
]]>
</programlisting>
<para>
<filename>archives.tpl</filename>
</para>
<programlisting>
<![CDATA[
{config_load file="archiv.conf"}
{include file="header.tpl" title=#archivSeiteTitel#}
{* template body hier *}
{include file="footer.tpl"}
]]>
</programlisting>
<para>
<filename>header.tpl</filename>
</para>
<programlisting>
<![CDATA[
<html>
<head>
<title>{$title|default:"Nachrichten"}</title>
</head>
<body>
]]>
</programlisting>
<para>
<filename>footer.tpl</filename>
</para>
<programlisting>
<![CDATA[
</BODY>
</HTML>
]]>
</programlisting>
</example>
<para>
Sobald die erste Seite geparsed wird, wird der Titel 'Erste Seite'
dem <filename>header.tpl</filename> ü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 <filename>'archiv_page.conf'</filename> geladen und
nicht von einem übergebenen Wert. Der Standardwert 'Nachrichten'
wird verwendet, wenn die '$titel' leer ist. Erneut wird dafür der
<link
linkend="language.modifier.default">default</link>-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>
<![CDATA[
{$startDate|date_format}
]]>
</programlisting>
<para>
AUSGABE:
</para>
<screen>
<![CDATA[
Jan 4, 2001
]]>
</screen>
<programlisting>
<![CDATA[
{$startDatum|date_format:"%Y/%m/%d"}
]]>
</programlisting>
<para>
AUSGABE:
</para>
<screen>
<![CDATA[
2001/01/04
]]>
</screen>
<programlisting>
<![CDATA[
{if $datum1 < $datum2}
...
{/if}
]]>
</programlisting>
</example>
<para>
Falls <link
linkend="language.function.html.select.date">{html_select_date}</link>
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 role="php">
<![CDATA[
<?php
// 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>
<para>
Siehe auch
<link linkend="language.function.html.select.date">{html_select_date}</link>,
<link linkend="language.function.html.select.time">{html_select_time}</link>,
<link linkend="language.modifier.date.format">date_format</link>
und <link linkend="language.variables.smarty.now">$smarty.now</link>,
</para>
</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>
<![CDATA[
<?php
// 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($params)
{
// folgende Funktion erwartet ein $inhalt argument
if (empty($params['inhalt'])) {
return;
}
header($params['inhalt']);
return;
}
?>
]]>
</programlisting>
<para>
Ihr Template <emphasis>muss</emphasis> danach wie folgt beginnen:
</para>
<programlisting>
<![CDATA[
{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>
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 mit <link
linkend="api.assign">assign()</link> zu und geben das Template mit
<link linkend="api.display">display()</link> 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>
<para>
<filename>function.load_ticker.php</filename> -
Diese Datei gehört ins <link
linkend="variable.plugins.dir">$plugins directory</link>
</para>
<programlisting role="php">
<![CDATA[
<?php
// setup our function for fetching stock data
function fetch_ticker($symbol)
{
// put logic here that fetches $ticker_info
// from some ticker resource
return $ticker_info;
}
function smarty_function_load_ticker($params, $smarty)
{
// call the function
$ticker_info = fetch_ticker($params['symbol']);
// assign template variable
$smarty->assign($params['assign'], $ticker_info);
}
?>
]]>
</programlisting>
<para>
<filename>index.tpl</filename>
</para>
<programlisting>
<![CDATA[
{load_ticker symbol="YHOO" assign="ticker"}
Stock Name: {$ticker.name} Stock Price: {$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 <link
linkend="language.function.mailto">{mailto}</link>-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>
{* in index.tpl *}
Anfragen 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>
<para>
Siehe auch <link linkend="language.modifier.escape">escape</link>
und <link linkend="language.function.mailto">{mailto}</link>.
</para>
</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
-->