add german docs to dist

This commit is contained in:
mohrt
2003-03-06 23:37:24 +00:00
parent 88aabaa6dd
commit 9a957de25a
10 changed files with 8789 additions and 0 deletions

409
docs/de/appendixes.sgml Normal file
View File

@@ -0,0 +1,409 @@
<!-- 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&auml;nge</title>
<chapter id="troubleshooting">
<title>Probleml&ouml;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&ouml;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&ouml;nnen Sie auch das kompilierte Skript &ouml;ffnen und zu der
betreffenden Zeilennummer springen um herauszufinden welcher Teil des Templates
den Fehler enth&auml;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&ouml;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&uuml;r
keine {if} Anweisung verwendet werden muss, gibt es in Smarty eine Abk&uuml;rzung: die Verwendung des <emphasis>default</emphasis>
Variablen-Modifikators.
</para>
<example>
<title>"&amp;nbsp;" ausgeben wenn eine Variable nicht zugewiesen ist</title>
<programlisting>
{* kompliziert *}
{if $titel eq ""}
&amp;nbsp;
{else}
{$titel}
{/if}
{* einfach *}
{$titel|default:"&amp;nbsp;"}</programlisting>
</example>
</sect1>
<sect1 id="tips.default.var.handling">
<title>Handhabung von Standardwerten</title>
<para>
Wenn eine Variable in einem Template h&auml;ufig zum Einsatz kommt,
kann es ein bisschen st&ouml;rend wirken, den 'default'-Modifikator jedes mal anzuwenden.
Sie k&ouml;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&auml;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&ouml;glichkeit, dem eingebundenen Template, Variablen
zu &uuml;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
----------
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;{$title|default:"Nachrichten"}&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
footer.tpl
----------
&lt;/BODY&gt;
&lt;/HTML&gt;</programlisting>
</example>
<para>
Sobald die erste Seite geparsed wird, wird der Titel 'Erste Seite'
dem header.tpl &uuml;bergeben und fortan als Titel verwendet. Wenn
die Archivseite ausgegeben wird, wird der Titel 'Archive' ausgegeben.
Wie Sie sehen k&ouml;nnen, wird der Wert daf&uuml;r aus der Datei
'archiv.conf' geladen und nicht von einem &uuml;bergebenen Wert. Der
Standardwert 'Nachrichten' wird verwendet, wenn die '$titel' leer ist.
Erneut wird daf&uuml;r der <emphasis>default</emphasis>-Modifikator angewandt.
</para>
</sect1>
<sect1 id="tips.dates">
<title>Zeitangaben</title>
<para>
Um dem Template Designer h&ouml;chstm&ouml;gliche Kontrolle &uuml;ber die Ausgabe
von Zeitangaben/Daten zu erm&ouml;glichen, ist es empfehlenswert Daten immer
als Timestamp zu &uuml;bergeben. Der Designer kann danach die Funktion
<link linkend="language.modifier.date.format">date_format</link> f&uuml;r
die Formatierung verwenden.
</para>
<para>
Bemerkung: Seit Smarty 1.4.0 ist es m&ouml;glich jede Timestamp zu
&uuml;bergeben, welche mit strtotime() ausgewertet werden kann. Dazu
geh&ouml;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&ouml;glichkeit den Wert wieder in ein Timestamp-Format zu &auml;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&auml;re, eine Funktion
zu schreiben, welche den Header ausgibt. Falls sie den Caching Mechanismus
verwenden, sollten Sie auf das 'insert'-Tag zur&uuml;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"}
&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;
&lt;!-- neues wml deck --&gt;
&lt;wml&gt;
&lt;!-- erste karte --&gt;
&lt;card&gt;
&lt;do type="accept"&gt;
&lt;go href="#zwei"/&gt;
&lt;/do&gt;
&lt;p&gt;
Welcome to WAP with Smarty!
Willkommen bei WAP mit Smarty!
OK klicken um weiterzugehen...
&lt;/p&gt;
&lt;/card&gt;
&lt;!-- zweite karte --&gt;
&lt;card id="zwei"&gt;
&lt;p&gt;
Einfach, oder?
&lt;/p&gt;
&lt;/card&gt;
&lt;/wml&gt;</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&ouml;rsenticker in unserem
Template haben, stellen wir die Kursinformationen in unserer Anwendung
zusammen, weisen Sie dem Template zu und geben es aus. W&auml;re es jedoch nicht
nett diesen B&ouml;rsenticker einfach in ein Template einer anderen Applikation
einbinden zu k&ouml;nnen ohne deren Programmcode zu &auml;ndern?
</para>
<para>
Sie k&ouml;nnen PHP-Code mit {php}{/php} in Ihre Templates einbetten.
So k&ouml;nnen Sie Templates erstellen, welche die Datenstrukturen
zur Anweisung der eigenen Variablen enthalten. Durch die Bindung von
Template und Logik entsteht so eine eigenst&auml;ndig lauff&auml;hige Komponente.
</para>
<example>
<title>Template/Script Komponenten</title>
<programlisting>
{* Smarty *}
{php}
// unsere funktion um die b&ouml;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
---------------
&lt;?php
// unsere funktion um die b&ouml;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);
?&gt;
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
&uuml;ber Webseiten. Um dieses Problem zu bek&auml;mpfen, k&ouml;nnen sie
den 'mailto'-Plugin verwenden. Er &auml;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&ouml;glicher
Spammer die Decodierung in sein Sammelprogramm einbauen k&ouml;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&uuml;hrende Informationen</title>
<para>
Smarty's Homepage erreicht man unter http://smarty.php.net/.
Sie k&ouml;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&amp;r=1&amp;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>

46
docs/de/common.dsl Normal file
View File

@@ -0,0 +1,46 @@
;; -*- Scheme -*-
;;
;; common.dsl,v 1.1.1.1 2003/01/09 09:44:46 dexxter Exp
;;
;; This file contains stylesheet customization common to the HTML
;; and print versions.
;;
;; Stylesheets Localization
(define %default-language% "en")
(define %use-id-as-filename% #t)
(define %gentext-nav-tblwidth% "100%")
(define %refentry-function% #t)
(define %refentry-generate-name% #f)
(define %funcsynopsis-style% 'ansi)
(define ($legalnotice-link-file$ legalnotice)
(string-append "copyright" %html-ext%))
(define %generate-legalnotice-link% #t)
(define %footnotes-at-end% #t)
(define %force-chapter-toc% #t)
(define newline "\U-000D")
(define %number-programlisting-lines% #f)
(define %linenumber-mod% 1)
(define %shade-verbatim% #t)
(define ($generate-book-lot-list$)
;; REFENTRY generate-book-lot-list
;; PURP Which Lists of Titles should be produced for Books?
;; DESC
;; This parameter should be a list (possibly empty) of the elements
;; for which Lists of Titles should be produced for each 'Book'.
;;
;; It is meaningless to put elements that do not have titles in this
;; list. If elements with optional titles are placed in this list, only
;; the instances of those elements that do have titles will appear in
;; the LOT.
;;
;; /DESC
;; AUTHOR N/A
;; /REFENTRY
(list (normalize "table")))
(define (php-code code)
(make processing-instruction
data: (string-append "php " code "?")))

4619
docs/de/designers.sgml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,408 @@
<!-- Smarty German Documentation Port -->
<!-- $Id$ -->
<!-- $Author$ -->
<!-- $Revision$ -->
<part id="getting.started">
<title>Erste Schritte</title>
<chapter id="what.is.smarty">
<title>Was ist Smarty?</title>
<para>
Smarty ist eine Template-Engine f&uuml;r PHP. Genauer gesagt erlaubt es
die einfache Trennung von Applikations-Logik und Design/Ausgabe. Dies
ist vor allem w&uuml;nschenswert, wenn der Applikationsentwickler nicht
die selbe Person ist wie der Designer. Nehmen wir zum Beispiel eine
Webseite die Zeitungsartikel ausgibt. Der Titel, die Einf&uuml;hrung,
der Author und der Inhalt selbst enthalten keine Informationen dar&uuml;ber
wie sie dargestellt werden sollen. Also werden sie von der Applikation
an Smarty &uuml;bergeben, damit der Designer in den Templates mit einer Kombination von
HTML- und Template-Tags die Ausgabe (Tabellen, Hintergrundfarben,
Schriftgr&ouml;ssen, Stylesheets, etc.) gestalten kann. Falls nun die
Applikation eines Tages angepasst werden muss, ist dies f&uuml;r den
Designer nicht von Belang, da die Inhalte immer noch genau gleich
&uuml;bergeben werden. Genauso kann der Designer die Ausgabe der
Daten beliebig ver&auml;ndern, ohne dass eine &Auml;nderung der
Applikation vorgenommen werden muss. Somit k<>nnen der Programmierer
die Applikations-Logik und der Designer die Ausgabe frei anpassen,
ohne sich dabei in die Quere zu kommen.
</para>
<para>
Was Smarty nicht kann: Smarty versucht nicht die gesamte Logik aus dem
Template zu verbannen. Solange die verwendete Logik ausschlie<69>lich f&uuml;r die
Ausgabe verwendet wird, kann sie auch im Template eingebettet werden. Ein Tip:
versuchen Sie Applikations-Logik aus dem Template und Pr&auml;sentations-Logik
aus der Applikation herauszuhalten. Nur so bleibt die Applikation auf absehbere Zeit
gut skalier- und wartbar.
</para>
<para>
Einer der einzigartigen Aspekte von Smarty ist die Kompilierung der
Templates. Smarty liest die Template-Dateien und generiert daraus neue
PHP-Skripte; von da an werden nur noch diese Skripte verwendet. Deshalb
m&uuml;ssen Templates nicht f&uuml;r jeden Seitenaufruf performance-intensiv
neu geparst werden und jedes Template kann voll von PHP Compiler-Cache
L&ouml;sungen profitieren.
(Zend, http://www.zend.com; PHP Accelerator, http://www.php-accelerator.co.uk)
</para>
<para>
Ein paar Smarty Charakteristiken
</para>
<itemizedlist>
<listitem><para>Sehr schnell.</para></listitem>
<listitem><para>Sehr effizient, da der PHP-Parser die 'schmutzige' Arbeit &uuml;bernimmt.</para></listitem>
<listitem><para>Kein Overhead durch Template-Parsing, nur einmaliges kompilieren.</para></listitem>
<listitem><para>Re-kompiliert nur g&auml;nderte Templates.</para></listitem>
<listitem><para>Sie k&ouml;nnen die Engine um <link linkend="language.custom.functions">individuelle Funktionen</link> und <link linkend="language.modifiers">Variablen-Modifikatoren</link> erweitern.</para></listitem>
<listitem><para>Konfigurierbare Syntax f<>r Template-Tags: Sie k&ouml;nnen {}, {{}}, &lt;!--{}--&gt;, etc. verwenden.</para></listitem>
<listitem><para>'if/elseif/else/endif'-Konstrukte werden direkt dem PHP-Parser &uuml;bergeben. Somit k&ouml;nnen {if ...} Ausdr<64>cke sowohl sehr einfach als auch sehr komplex sein.</para></listitem>
<listitem><para>Unbegrenzte Verschachtelung von 'section', 'if' und anderen Bl&ouml;cken.</para></listitem>
<listitem><para>Erm&ouml;glicht die direkte Einbettung von PHP-Code. (Obwohl es weder ben&ouml;tigt noch empfohlen wird, da die Engine einfach erweiterbar ist.)</para></listitem>
<listitem><para>Eingebauter Caching-Support</para></listitem>
<listitem><para>Beliebige Template-Quellen</para></listitem>
<listitem><para>Eigene Cache-Handling Funktionen</para></listitem>
<listitem><para>Plugin Architektur</para></listitem>
</itemizedlist>
</chapter>
<chapter id="installation">
<title>Installation</title>
<sect1 id="installation.requirements">
<title>Anforderungen</title>
<para>
Smarty ben&ouml;tigt einen Webserver mit PHP >=4.0.6.
</para>
</sect1>
<sect1 id="installing.smarty.basic">
<title>Basis Installation</title>
<note>
<title>Technische Bemerkung</title>
<para>
Dieser Leitfaden geht davon aus, dass Sie Ihr Webserver- und PHP-Setup kennen
und mit den Namenskonventionen f&uuml;r Dateien und Verzeichnisse Ihres Betriebssystems
vertraut sind. Im Folgenden wird ein Unix-Dateisystem verwendet, stellen Sie also
sicher, dass sie die f&uuml;r Ihr Betriebssystem n&ouml;tigen &Auml;nderungen vornehmen.
</para>
<para>
Das Beispiel geht davon aus, dass '/php/includes' in Ihrem PHP-'include_path'
liegt. Konsultieren Sie das PHP-Manual f&uuml;r weiterf&uuml;hrende Informationen hierzu.
</para>
</note>
<para>
Installieren Sie als erstes die Smarty-Library Dateien. Diese Dateien
sollten von Ihnen NICHT editiert und von allen Applikationen
verwendet werden. Sie werden nur erneuert, wenn Sie eine neue Version von Smarty installieren.
</para>
<note>
<title>Technische Bemerkung</title>
<para>
Wir empfehlen keine &Auml;nderungen an den Smarty-Library Dateien vorzunehmen.
Dies macht ein m&ouml;gliches Upgrade wesentlich einfacher. Sie m&uuml;ssen
diese Dateien auch nicht anpassen, um Smarty zu konfigurieren! Benutzen Sie f<>r
diesen Zwecke eine Instanz der Smarty-Klasse.
</para>
</note>
<para>
Folgende Library Dateien werden mit Smarty geliefert und werden ben&ouml;tigt:
</para>
<example>
<title>Smarty-Library Dateiliste</title>
<screen>
Smarty.class.php
Smarty_Compiler.class.php
Config_File.class.php
debug.tpl
/plugins/*.php (alle Dateien!)</screen>
</example>
<para>
Sie k&ouml;nnen diese Dateien entweder in Ihrem PHP-'include_path' oder
auch in irgend einem anderen Verzeichnis ablegen, solange die Konstante
<link linkend="constant.smarty.dir">SMARTY_DIR</link> auf den korrekten
Pfad zeigt. Im Folgenden werden Beispiele f&uuml;r beide F&auml;lle aufgezeigt.
</para>
<para>
So erzeugt man eine Instanz der Smarty-Klasse im PHP-Skript:
</para>
<example>
<title>Smarty Instanz aus 'include_path' erstellen:</title>
<screen>
require('Smarty.class.php');
$smarty = new Smarty;</screen>
</example>
<para>
Wenn sich die Dateien ausserhalb des PHP-'include_path' befinden,
muss die Konstante <link linkend="constant.smarty.dir">SMARTY_DIR</link>
auf den absoluten Pfad zeigen und mit einem '/' enden. Nehmen wir an,
die Library-Dateien befinden sich in '/usr/local/lib/php/Smarty/':
</para>
<example>
<title>Instanz von Smarty aus SMARTY_DIR erstellen:</title>
<screen>
define('SMARTY_DIR','/usr/local/lib/php/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty;</screen>
</example>
<para>
Jetzt, wo die Library Dateien an ihrem Platz sind, wird es
Zeit, die Smarty Verzeichnisse zu erstellen.
</para>
<para>
F&uuml;r unser Beispiel werden wir die Smarty Umgebung f&uuml;r eine
G&auml;stebuch-Applikation konfigurieren. Wir verwenden den Applikationsnamen
nur, um die Verzeichnis-Struktur zu verdeutlichen. Sie k&ouml;nnen die selbe
Umgebung f&uuml;r alle Ihre Applikationen verwenden indem Sie 'guestbook'
durch dem Namen Ihrer Applikation ersetzen.
</para>
<para>
Stellen Sie sicher, dass Sie die DocumentRoot Ihres Webservers kennen.
In unserem Beispiel lautet sie '/web/www.domain.com/docs/'.
</para>
<para>
Die Smarty Verzeichnisse werden in den Klassen-Variablen $template_dir,
$compile_dir, $config_dir und $cache_dir definiert. Die Standardwerte sind:
"templates", "templates_c", "configs" und "cache". F&uuml;r unser Beispiel
legen wir alle diese Verzeichnisse unter '/web/www.domain.com/smarty/guestbook/' an.
</para>
<note>
<title>Technische Bemerkung</title>
<para>
Wir empfehlen, diese Verzeichnisse ausserhalb der DocumentRoot anzulegen,
um m&ouml;gliche Direktzugriffe zu verhindern.
</para>
</note>
<para>
In Ihrer DocumentRoot muss mindestens eine Datei liegen, die f&uuml;r Browser
zug&auml;nglich ist. Wir nennen dieses Skript 'index.php', und legen
es in das Verzeichnis '/guestbook/' in unserer DocumentRoot.
</para>
<note>
<title>Technische Bemerkung</title>
<para>
Bequem ist es, den Webserver so zu konfigurieren, dass 'index.php' als
Standard-Verzeichnis-Index verwendet wird. Somit kann man das Skript
direkt mit 'http://www.domain.com/guestbook/' aufrufen. Falls Sie Apache
verwenden, l&auml;sst sich dies konfigurieren indem Sie 'index.php'
als letzten Eintrag f&uuml;r DirectoryIndex verwenden. (Jeder Eintrag muss
mit einem Leerzeichen abgetrennt werden).
</para>
</note>
<para>
Die Dateistruktur bis jetzt:
</para>
<example>
<title>Beispiel der Dateistruktur</title>
<screen>
/usr/local/lib/php/Smarty/Smarty.class.php
/usr/local/lib/php/Smarty/Smarty_Compiler.class.php
/usr/local/lib/php/Smarty/Config_File.class.php
/usr/local/lib/php/Smarty/debug.tpl
/usr/local/lib/php/Smarty/plugins/*.php
/web/www.mydomain.com/smarty/guestbook/templates/
/web/www.mydomain.com/smarty/guestbook/templates_c/
/web/www.mydomain.com/smarty/guestbook/configs/
/web/www.mydomain.com/smarty/guestbook/cache/
/web/www.mydomain.com/docs/guestbook/index.php</screen>
</example>
<note>
<title>Technische Bemerkung</title>
<para>
Falls Sie kein Caching und keine Konfigurationsdateien verwenden, ist es nicht
erforderlich die Verzeichnisse '$config_dir' und '$cache_dir' zu erstellen.
Es wird jedoch trotzdem empfohlen, da diese Funktionalit&auml;ten eventuell sp&auml;ter
genutzt werden sollen.
</para>
</note>
<para>
Smarty ben&ouml;tigt Schreibzugriff auf die Verzeichnisse '$compile_dir' und '$cache_dir'.
Stellen Sie also sicher, dass der Webserver-Benutzer (normalerweise Benutzer 'nobody' und Gruppe 'nogroup')
in diese Verzeichnisse schreiben kann. (In OS X lautet der Benutzer normalerweise 'web' und
ist in der Gruppe 'web'). Wenn Sie Apache verwenden, k&ouml;nnen Sie in der httpd.conf (gew<65>hnlich in '/usr/local/apache/conf/')
nachsehen, unter welchem Benutzer Ihr Server l&auml;uft.
</para>
<example>
<title>Dateirechte einrichten</title>
<screen>
chown nobody:nobody /web/www.mydomain.com/smarty/templates_c/
chmod 770 /web/www.mydomain.com/smarty/templates_c/
chown nobody:nobody /web/www.mydomain.com/smarty/cache/
chmod 770 /web/www.mydomain.com/smarty/cache/</screen>
</example>
<note>
<title>Technische Bemerkung</title>
<para>
'chmod 770' setzt ziemlich strenge Rechte und erlaubt nur dem Benutzer 'nobody'
und der Gruppe 'nobody' Lese-/Schreibzugriff auf diese Verzeichnisse. Falls Sie
die Rechte so setzen m&ouml;chten, dass auch andere Benutzer die Dateien lesen
k&ouml;nnen (vor allem f&uuml;r Ihren eigenen Komfort), so erreichen Sie dies mit 775.
</para>
</note>
<para>
Nun m&uuml;ssen wir die 'index.tpl' Datei erstellen, welche Smarty laden soll.
Die Datei wird in Ihrem '$template_dir' abgelegt.
</para>
<example>
<title>Editieren von /web/www.mydomain.com/smarty/templates/index.tpl</title>
<screen>
{* Smarty *}
Hallo, {$name}!</screen>
</example>
<note>
<title>Technische Bemerkung</title>
<para>
{* Smarty *} ist ein Template-Kommentar. Der wird zwar nicht ben&ouml;tigt,
es ist jedoch eine gute Idee jedes Template mit einem Kommentar zu versehen.
Dies erleichtert die Erkennbarkeit des Templates, unabh&auml;ngig von der
verwendeten Dateierweiterung. (Zum Beispiel f&uuml;r Editoren die Syntax-Highlighting
unterst&uuml;tzen.)
</para>
</note>
<para>
Als n&auml;chstes editieren wir die Datei 'index.php'. Wir erzeugen eine
Smarty-Instanz, weisen dem Template eine Variable zu und geben 'index.tpl' aus.
</para>
<example>
<title>Editieren von /web/www.mydomain.com/docs/guestbook/index.php</title>
<screen>
define('SMARTY_DIR','/usr/local/lib/php/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
$smarty->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
$smarty->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
$smarty->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';
$smarty->assign('name','Ned');
$smarty->display('index.tpl');</screen>
</example>
<note>
<title>Technische Bemerkung</title>
<para>
In unserem Beispiel verwenden wir durchwegs absolute Pfadnamen zu den
Smarty-Verzeichnissen. Falls '/web/www.mydomain.com/smarty/guestbook/' in
Ihrem PHP-'include_path' liegt, w&auml;re dies nicht n&ouml;tig. Es ist jedoch
effizienter und weniger fehleranf&auml;llig die Pfade absolut zu setzen.
Und es garantiert, dass Smarty die Templates aus dem geplanten Verzeichnis l&auml;dt.
</para>
</note>
<para>
Wenn Sie 'index.php' nun in Ihrem Webbrowser &ouml;ffnen, sollte 'Hallo, Ned!' ausgegeben werden.
</para>
<para>
Die Basis-Installation von Smarty w&auml;re somit beendet.
</para>
</sect1>
<sect1 id="installing.smarty.extended">
<title>Erweiterte Konfiguration</title>
<para>
Dies ist eine Weiterf&uuml;hrung der <link linkend="installing.smarty.basic">Basis Installation</link>, bitte lesen Sie diese zuerst!
</para>
<para>
Ein flexiblerer Weg um Smarty aufzusetzen ist, die Klasse zu erweitern und
eine eigene Smarty-Umgebung zu initialisieren. Anstatt immer wieder
die Verzeichnisse zu definieren, kann diese Aufgabe auch in einer einzigen
Datei erledigt werden. Beginnen wir, indem wir ein neues Verzeichnis namens '/php/includes/guestbook/'
erstellen und eine Datei namens 'setup.php' darin anlegen.
</para>
<example>
<title>Editieren von /php/includes/guestbook/setup.php</title>
<screen>
// Smarty Library Dateien laden
define('SMARTY_DIR','/usr/local/lib/php/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');
// ein guter Platz um Applikations spezifische Libraries zu laden
// require('guestbook/guestbook.lib.php');
class Smarty_GuestBook extends Smarty {
function Smarty_GuestBook() {
// Konstruktor. Diese Werte werden f&uuml;r jede Instanz automatisch gesetzt
$this->Smarty();
$this->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
$this->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
$this->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
$this->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';
$this->caching = true;
$this->assign('app_name','Guest Book');
}
}</screen>
</example>
<note>
<title>Technische Bemerkung</title>
<para>
In unserem Beispiel werden die Library Dateien ausserhalb der DocumentRoot
abgelegt. Diese Dateien k&ouml;nnten sensitive Informationen enthalten,
die wir nicht zug&auml;nglich machen m&ouml;chten.
Deshalb legen wir alle Library Dateien in '/php/includes/guestbook/' ab
und laden sie in unserem 'setup.php' Skript, wie Sie im oben gezeigten
Beispiel sehen k&ouml;nnen.
</para>
</note>
<para>
Nun passen wir 'index.php' an, um 'setup.php' zu verwenden:
</para>
<example>
<title>Editieren von /web/www.mydomain.com/docs/guestbook/index.php</title>
<screen>
require('guestbook/setup.php');
$smarty = new Smarty_GuestBook;
$smarty->assign('name','Ned');
$smarty->display('index.tpl');</screen>
</example>
<para>
Wie Sie sehen k&ouml;nnen, ist es sehr einfach eine Instanz von Smarty zu erstellen.
Mit Hilfe von Smarty_GuestBook werden alle Variablen automatisch initialisiert.
</para>
</sect1>
</chapter>
</part>

382
docs/de/html-common.dsl Normal file
View File

@@ -0,0 +1,382 @@
;; -*- Scheme -*-
;;
;; html-common.dsl,v 1.1.1.1 2003/01/09 09:44:46 dexxter Exp
;;
;; Returns the depth of the auto-generated TOC (table of contents) that
;; should be made at the nd-level
(define (toc-depth nd)
(if (string=? (gi nd) (normalize "book"))
3 ; the depth of the top-level TOC
1 ; the depth of all other TOCs
))
(element (funcdef function)
($bold-seq$
(make sequence
(process-children)
)
)
)
(define (is-true-optional nl)
(and (equal? (gi (parent nl)) (normalize "parameter"))
(equal? 0 (string-length (strip (data (preced nl)))))
(equal? 0 (string-length (strip (data (follow nl)))))
)
)
(define (has-true-optional nl)
(is-true-optional
(node-list-first-element
(select-elements
(descendants nl)
(normalize "optional"))
)
)
)
(define (count-true-optionals nl)
(let loop
((result 0)
(nl (select-elements (descendants nl) (normalize "optional")))
)
(if(node-list-empty? nl)
result
(if(is-true-optional(node-list-first nl))
(loop (+ result 1) (node-list-rest nl))
(loop result (node-list-rest nl))
)
)
)
)
;; there are two different kinds of optionals
;; optional parameters and optional parameter parts
;; an optional parameter is identified by an optional tag
;; with a parameter tag as its parent
;; and only whitespace between them
(element optional
;;check for true optional parameter
(if (is-true-optional (current-node))
;; yes - handle '[...]' in paramdef
(process-children-trim)
;; no - do '[...]' output
(make sequence
(literal %arg-choice-opt-open-str%)
(process-children-trim)
(literal %arg-choice-opt-close-str%)
)
)
)
;; now this is going to be tricky
(element paramdef
(make sequence
;; special treatment for first parameter in funcsynopsis
(if (equal? (child-number (current-node)) 1)
;; is first ?
(make sequence
;; start parameter list
(literal "(")
;; is optional ?
( if (has-true-optional (current-node))
(literal %arg-choice-opt-open-str%)
(empty-sosofo)
)
)
;; not first
(empty-sosofo)
)
;;
(process-children-trim)
;; special treatment for last parameter
(if (equal? (gi (ifollow (current-node))) (normalize "paramdef"))
;; more parameters will follow
(make sequence
;; next is optional ?
( if (has-true-optional (ifollow (current-node)))
;; optional
(make sequence
(literal " ")
(literal %arg-choice-opt-open-str%)
)
;; not optional
(empty-sosofo)
)
(literal ", " )
)
;; last parameter
(make sequence
(literal
(let loop ((result "")(count (count-true-optionals (parent (current-node)))))
(if (<= count 0)
result
(loop (string-append result %arg-choice-opt-close-str%)(- count 1))
)
)
)
( literal ")" )
)
)
)
)
(element function
(let* ((function-name (data (current-node)))
(linkend
(string-append
"function."
(string-replace
(string-replace function-name "_" "-")
"::" ".")))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
;; function names should be plain in FUNCDEF
((equal? parent-gi "funcdef")
(process-children))
;; if a valid ID for the target function is not found, or if the
;; FUNCTION tag is within the definition of the same function,
;; make it bold, add (), but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
function-name))
($bold-seq$
(make sequence
(process-children)
(literal "()"))))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-seq$
(make sequence
(process-children)
(literal
)
(literal "()"))))))))
(element command
(let* ((command-name (data (current-node)))
(linkend
(string-append
"language.function."
(string-replace
(string-replace command-name "_" ".")
"::" ".")))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
;; function names should be plain in FUNCDEF
((equal? parent-gi "funcdef")
(process-children))
;; if a valid ID for the target function is not found, or if the
;; FUNCTION tag is within the definition of the same function,
;; make it bold, add (), but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
command-name))
($bold-seq$
(make sequence
(literal "{")
(process-children)
(literal "}"))))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-seq$
(make sequence
(literal "{")
(process-children)
(literal "}"))))))))
(element classname
(let* ((class-name (data (current-node)))
(linkend
(string-append
"class."
(string-replace
(case-fold-down class-name) "_" "-")))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
;; function names should be plain in SYNOPSIS
((equal? parent-gi "synopsis")
(process-children))
;; if a valid ID for the target class is not found, or if the
;; CLASSNAME tag is within the definition of the same class,
;; make it bold, but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
class-name))
($bold-seq$
(process-children)))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-seq$
(process-children)))))))
(element constant
(let* ((constant-name (data (current-node)))
(linkend
(string-append "constant."
(case-fold-down
(string-replace constant-name "_" "-"))))
(target (element-with-id linkend))
(parent-gi (gi (parent))))
(cond
; ;; constant names should be plain in FUNCDEF
; ((equal? parent-gi "funcdef")
; (process-children))
;; if a valid ID for the target constant is not found, or if the
;; CONSTANT tag is within the definition of the same constant,
;; make it bold, add (), but don't make a link
((or (node-list-empty? target)
(equal? (case-fold-down
(data (node-list-first
(select-elements
(node-list-first
(children
(select-elements
(children
(ancestor-member (parent) (list "refentry")))
"refnamediv")))
"refname"))))
constant-name))
($bold-mono-seq$
(process-children)))
;; else make a link to the function and add ()
(else
(make element gi: "A"
attributes: (list
(list "HREF" (href-to target)))
($bold-mono-seq$
(process-children)))))))
(element example
(make sequence
(make element gi: "TABLE"
attributes: (list
(list "WIDTH" "100%")
(list "BORDER" "0")
(list "CELLPADDING" "0")
(list "CELLSPACING" "0")
(list "CLASS" "EXAMPLE"))
(make element gi: "TR"
(make element gi: "TD"
($formal-object$))))))
(element (paramdef parameter)
(make sequence
font-posture: 'italic
(process-children-trim)
)
)
(mode book-titlepage-recto-mode
(element authorgroup
(process-children))
(element author
(let ((author-name (author-string))
(author-affil (select-elements (children (current-node))
(normalize "affiliation"))))
(make sequence
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(literal author-name))
(process-node-list author-affil))))
)
(define (chunk-element-list)
(list (normalize "preface")
(normalize "chapter")
(normalize "appendix")
(normalize "article")
(normalize "glossary")
(normalize "bibliography")
(normalize "index")
(normalize "colophon")
(normalize "setindex")
(normalize "reference")
(normalize "refentry")
(normalize "part")
(normalize "sect1")
(normalize "sect2")
(normalize "section")
(normalize "book") ;; just in case nothing else matches...
(normalize "set") ;; sets are definitely chunks...
))
(define ($section-body$)
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
($section-separator$)
($section-title$)
(if (or (not (node-list-empty? (select-elements (children (current-node))
(normalize "sect2"))))
(not (node-list-empty? (select-elements (children (current-node))
(normalize "sect3")))))
(build-toc (current-node) 1)
(empty-sosofo))
(process-children)))

21
docs/de/html.dsl Normal file
View File

@@ -0,0 +1,21 @@
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/html/docbook.dsl" CDATA DSSSL>
<!ENTITY html-common.dsl SYSTEM "html-common.dsl">
<!ENTITY common.dsl SYSTEM "common.dsl">
]>
<style-sheet>
<style-specification id="docbook-smarty-html" use="docbook">
<style-specification-body>
(define %html-ext% ".html")
&html-common.dsl;
&common.dsl;
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>

48
docs/de/manual.sgml Normal file
View File

@@ -0,0 +1,48 @@
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY preface SYSTEM "preface.sgml">
<!ENTITY getting.started SYSTEM "getting-started.sgml">
<!ENTITY smarty.for.designers SYSTEM "designers.sgml">
<!ENTITY smarty.for.programmers SYSTEM "programmers.sgml">
<!ENTITY appendixes SYSTEM "appendixes.sgml">
]>
<!-- Smarty German Documentation Port -->
<!-- $Id$ -->
<!-- $Author$ -->
<!-- $Revision$ -->
<book id="index" lang="de">
<bookinfo id="bookinfo">
<title>Smarty - die kompilierende PHP Template-Engine</title>
<authorgroup id="authors">
<author>
<firstname>Monte</firstname><surname>Ohrt &lt;monte@ispi.net&gt;</surname>
</author>
<author>
<firstname>Andrei</firstname><surname>Zmievski &lt;andrei@php.net&gt;</surname>
</author>
</authorgroup>
<authorgroup id="translators">
<author>
<firstname>Andreas</firstname><surname>Halter &lt;smarty@andreashalter.ch&gt; (Deutsche &Uuml;bersetzung)</surname>
</author>
<author>
<firstname>Thomas</firstname><surname>Schulz &lt;ths@4bconsult.de&gt; (Review der deutschen &Uuml;bersetzung)</surname>
</author>
</authorgroup>
<edition>Version 2.0</edition>
<copyright>
<year>2001</year>
<year>2002</year>
<year>2003</year>
<holder>ispi of Lincoln, Inc.</holder>
</copyright>
</bookinfo>
&preface;
&getting.started;
&smarty.for.designers;
&smarty.for.programmers;
&appendixes;
</book>

73
docs/de/preface.sgml Normal file
View File

@@ -0,0 +1,73 @@
<!-- Smarty German Documentation Port -->
<!-- $Id$ -->
<!-- $Author$ -->
<!-- $Revision$ -->
<preface id="preface">
<title>Vorwort</title>
<para>
Die Frage, wie man die Applikations-Logik eines PHP-Scriptes vom Layout trennt, ist unzweifelhaft
eines der am h&auml;figsten diskutierten Themen. Da PHP als
"in HTML eingebettete Scripting-Sprache" angepriesen wird, ergibt sich
nach einigen Projekten in denen man HTML und PHP gemischt hat schnell die Idee,
Funktionalit&auml;t und Darstellung zu trennen. Dazu kommt, dass in vielen Firmen Applikationsentwickler
und Designer nicht die selbe Person sind. In Konsequenz beginnt die Suche nach einer Template-L<>sung.
</para>
<para>
Als Beispiel: In unserer Firma funktioniert die Entwicklung einer Applikation
wie folgt: Nachdem die Spezifikationen erstellt sind, entwickelt der
Interface Designer einen Prototypen des Interfaces und &uuml;bergibt dieses
dem Programmierer. Der Programmierer implementiert die Gesch&auml;ftslogik
in PHP und verwendet den Interface-Prototypen zur Erstellung eines Template-Skeletts.
Danach &uuml;bergibt der Programmierer die Templates dem HTML/Webseiten-Designer
welcher ihnen den letzten Schliff verleiht. Das Projekt kann mehrfach zwischen
dem Programmieren und dem Designer ausgetauscht werden. Deshalb ist es wichtig,
dass die Trennung von Logik und Design klar stattfindet. Der Programmierer will
sich normalerweise nicht mit HTML herumschlagen m&uuml;ssen und m&ouml;chte auch
nicht, dass der Designer seinen PHP-Code ver&auml;ndert. Designer selbst
ben&ouml;tigen Konfigurationsdateien, dynamische Bl&ouml;cke und andere Interface spezifische
Eigenheiten, m&ouml;chten aber auch nicht direkt mit PHP in Ber&uuml;hrung kommen.
</para>
<para>
Die meisten Template-Engines die heutzutage angeboten werden, bieten eine
rudiment&auml;re M&ouml;glichkeit Variablen in einem Template zu ersetzen
und beherschen eine eingeschr&auml;nkte Funktionalit&auml;t f&uuml;r dynamische
Bl&ouml;cke. Unsere Anforderungen forderten jedoch ein wenig mehr. Wir wollten
erreichen, dass sich Programmierer &uuml;berhaupt nicht um HTML Layouts
k&uuml;mmern m&uuml;ssen. Dies war aber fast unumg&auml;nglich. Wenn ein
Designer zum Beispiel alternierende Farben in einer Tabelle einsetzen wollte,
musste dies vorhergehend mit dem Programmierer abgesprochen werden. Wir wollten
weiter, dass dem Designer Konfigurationsdateien zur Verf&uuml;gung st&uuml;nden,
aus denen er Variablen f&uuml;r seine Templates extrahieren kann. Die Liste ist endlos.
</para>
<para>
Wir begannen 1999 mit der Spezifikation der Template Engine. Nachdem dies
erledigt war, fingen wir an eine Engine in C zu schreiben, die - so hofften
wir - in PHP eingebaut w&uuml;rde. Nach einer hitzigen Debatte dar&uuml;ber
was eine Template Engine k&ouml;nnen sollte und was nicht, und nachdem wir feststellen
mussten, dass ein paar komplizierte technische Probleme auf uns zukommen
w&uuml;rden, entschlossen wir uns die Template Engine in PHP als Klasse
zu realisieren, damit sie von jederman verwendet und angepasst werden kann.
So schrieben wir also eine Engine, die wir <productname>SmartTemplate</productname>
nannten (anm: diese Klasse wurde nie ver&ouml;ffentlicht). SmartTemplate
erlaubte uns praktisch alles zu tun was wir uns vorgenommen hatten: normale
Variablen-Ersetzung, M&ouml;glichkeiten weitere Templates einzubinden,
Integration von Konfigurationsdateien, Einbetten von PHP-Code, limitierte 'if'-Funktionalit&auml;t
und eine sehr robuste Implementation von dynamischen Bl&ouml;cken die
mehrfach verschachtelt werden konnten. All dies wurde mit Regul&auml;ren Ausdr&uuml;cken
erledigt und der Sourcecode wurde ziemlich un&uuml;bersichtlich. F&uuml;r gr&ouml;ssere
Applikationen war die Klasse auch bemerkenswert langsam, da das Parsing bei jedem
Aufruf einer Seite durchlaufen werden musste. Das gr&ouml;sste Problem aber war,
dass der Programmierer das Setup, die Templates und dynamische Bl&ouml;cke in seinem
PHP-Skript definieren musste. Die n&auml;chste Frage war: wie k&ouml;nnen wir dies
weiter vereinfachen?
</para>
<para>
Dann kam uns die Idee, aus der schlie<69>lich Smarty wurde. Wir wussten
wie schnell PHP-Code ohne den Overhead des Template-Parsing ist. Wir wussten
ebenfalls wie pedantisch PHP aus Sicht eines durchschnittlichen
Designers ist und dass dies mit einer einfacheren Template-Syntax
verborgen werden kann. Was w&auml;re also, wenn wir diese
beiden St&auml;rken vereinten? Smarty war geboren...
</para>
</preface>

2772
docs/de/programmers.sgml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -3618,6 +3618,13 @@ OUTPUT: (both examples)
<entry><emphasis>web server doc root</emphasis></entry>
<entry>directory to base relative paths from</entry>
</row>
<row>
<entry>link</entry>
<entry>string</entry>
<entry>no</entry>
<entry><emphasis>n/a</emphasis></entry>
<entry>href value to link the image to</entry>
</row>
</tbody>
</tgroup>
</informaltable>
@@ -3632,6 +3639,10 @@ OUTPUT: (both examples)
DOCUMENT_ROOT) is used as the base. If security is enabled, the
path to the image must be within a secure directory.
</para>
<para>
link is the href value to link the image to. If link is supplied, an
&lt;a href="LINKVALUE"&gt;&lt;a&gt; tag is put around the image tag.
</para>
<note>
<title>Technical Note</title>
<para>