mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-27 18:31:36 +01:00
435 lines
12 KiB
XML
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 & 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 <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>"&nbsp;" ausgeben wenn eine Variable nicht zugewiesen ist</title>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{* kompliziert *}
|
|
|
|
{if $titel eq ""}
|
|
&nbsp;
|
|
{else}
|
|
{$titel}
|
|
{/if}
|
|
|
|
|
|
{* einfach *}
|
|
|
|
{$titel|default:"&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
|
|
-->
|