mirror of
https://github.com/smarty-php/smarty.git
synced 2025-11-01 04:41:37 +01:00
409 lines
13 KiB
Plaintext
409 lines
13 KiB
Plaintext
<!-- Smarty German Documentation Port -->
|
|
<!-- appendixes.sgml,v 1.5 2003/01/10 08:15:14 dexxter Exp -->
|
|
<!-- dexxter -->
|
|
<!-- 1.5 -->
|
|
<part id="appendixes">
|
|
<title>Anhänge</title>
|
|
<chapter id="troubleshooting">
|
|
<title>Problemlösung</title>
|
|
<para></para>
|
|
<sect1 id="smarty.php.errors">
|
|
<title>Smarty/PHP Fehler</title>
|
|
<para>
|
|
Smarty kann verschiedene Fehler-Typen, wie fehlende Tag-Attribute oder syntaktisch falsche Variablen-Namen abfangen. Wenn dies geschieht, wird Ihnen eine Fehlermeldung ausgegeben. Beispiel:
|
|
</para>
|
|
|
|
<example>
|
|
<title>Smarty Fehler</title>
|
|
<programlisting>
|
|
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
|
in /path/to/smarty/Smarty.class.php on line 1041
|
|
|
|
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
|
in /path/to/smarty/Smarty.class.php on line 1041</programlisting>
|
|
</example>
|
|
|
|
<para>
|
|
In der ersten Zeile zeigt Smarty den Template-Namen, die Zeilennummer
|
|
und den Fehler an. Darauf folgt die betroffene Zeile in der Smarty Klasse welche den Fehler erzeugt hat.
|
|
</para>
|
|
|
|
<para>
|
|
Es gibt gewisse Fehlerkonditionen, die Smarty nicht abfangen kann (bsp: fehlende End-Tags). Diese Fehler
|
|
resultieren jedoch normalerweise in einem PHP-'compile-time' Fehler.
|
|
</para>
|
|
|
|
<example>
|
|
<title>PHP Syntaxfehler</title>
|
|
<programlisting>
|
|
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75</programlisting>
|
|
</example>
|
|
|
|
<para>
|
|
Wenn ein PHP Syntaxfehler auftritt, wird Ihnen die Zeilennummer des
|
|
betroffenen PHP Skriptes ausgegeben, nicht die des Templates. Normalerweise
|
|
können Sie jedoch das Template anschauen um den Fehler zu lokalisieren.
|
|
Schauen sie insbesondere auf Folgendes: fehlende End-Tags in einer {if}{/if} Anweisung
|
|
oder in einer {section}{/section} und die Logik eines {if} Blocks. Falls Sie den Fehler
|
|
so nicht finden, können Sie auch das kompilierte Skript öffnen und zu der
|
|
betreffenden Zeilennummer springen um herauszufinden welcher Teil des Templates
|
|
den Fehler enthält.
|
|
</para>
|
|
</sect1>
|
|
</chapter>
|
|
<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>
|
|
<chapter id="resources">
|
|
<title>Weiterführende Informationen</title>
|
|
<para>
|
|
Smarty's Homepage erreicht man unter http://smarty.php.net/.
|
|
Sie können der Smarty Mailingliste beitreten in dem
|
|
sie ein E-mail an smarty-general-subscribe@lists.php.net senden. Das Archiv
|
|
der Liste ist hier http://marc.theaimsgroup.com/?l=smarty&r=1&w=2 einsehbar.
|
|
</para>
|
|
</chapter>
|
|
<chapter id="bugs">
|
|
<title>BUGS</title>
|
|
<para>
|
|
Bitte konsultieren Sie die Datei 'BUGS' welche mit Smarty ausgeliefert wird,
|
|
oder die Webseite.
|
|
</para>
|
|
</chapter>
|
|
</part> |