OK, damit der Wunschthread nicht zugepflastert wird, hier mal an zentraler Stelle ein "proof-of-concept" zum Thema
4images mit smarty.
Die folgenden Schritte wurden mit 4images 1.7.7 durchgeführt, funktionieren aber prinzipiell auch mit anderen Versionen.
1.) Smarty installierenDie jeweils aktuelle Version gibts hier:
http://smarty.netEinfach Zip-Archiv herunterladen und aus dem Archiv den Ordner "libs" nach "/4images/includes" entpacken.
Nun noch fix umbenennen von "libs" nach "smarty" -> Fertig!
Smarty befindet sich nun in "/4images/includes/smarty".
2.) Schalter einbauenDamit wir (mehr oder weniger komfortabel) einstellen können, ob Smarty verwendet werden soll oder nicht, fügen wir in unser Template-Verzeichnis eine Datei "settings.php" ein, die genau eine Zeile enthält:
$smarty_active = true;
Nun ändern wir noch die "global.php".
Die Zeilen
include_once(ROOT_PATH.'includes/template.php');
$site_template = new Template(TEMPLATE_PATH);
ändern wir wie folgt:
if (file_exists(TEMPLATE_PATH.'/settings.php')) {
include_once(TEMPLATE_PATH.'/settings.php');
} else {
$smarty_active = false;
}
if ($smarty_active) {
include_once(ROOT_PATH.'includes/smarty.class.php');
} else {
include_once(ROOT_PATH.'includes/template.php');
}
$site_template = new Template(TEMPLATE_PATH);
3.) Smarty-KlasseDie im Folgenden dargestellte Template-Klasse 'includes/smarty.class.php' stellt nur eine wirklich rudimetäre Implementierung dar und ist keineswegs komplett.
Sie sollte also auf keinen Fall in Produktivumgebungen eingesetzt werden.
<?php
if (!defined('ROOT_PATH')) {
die("Security violation");
}
require_once 'includes/smarty/Smarty.class.php';
class Template extends Smarty {
var $template_extension = 'html';
var $start = '{';
var $end = '}';
function __construct($template_path = "") {
if (!@is_dir($template_path)) {
$this->error("Couldn't open Template-Pack ".$template_path, 1);
}
parent::__construct();
$this->template_dir = $template_path;
$this->compile_dir = ROOT_PATH.'temp/compiled';
}
function register_vars($var_name, $value = "") {
if (is_array($var_name)) {
foreach ($var_name as $key=>$val) {
$this->assign($key, $val);
}
} else {
$this->assign($var_name, $value);
}
}
function un_register_vars($var_list) {
$vars = explode(",", $var_list);
foreach ($vars as $val) {
$this->clear_assign($val);
}
}
function parse_template($template) {
$template = $template.'.'.$this->template_extension;
return $this->fetch($template);
}
function parse_array($array) {
return $array;
}
function print_template($template) {
$this->assign('body', $template);
$this->display('smarty.html');
}
}
?>
4.) Templates anpassenDas Anpassen der Template-Dateien ist die eigentliche Arbeit, auch wenn vieles mit Suchen+Ersetzen (z.B. mit PSPad) zu schaffen ist.
- aus "{if variable}" wird "{if $variable}"
- aus "{endif variable}" wird "{/if}"
- aus "{header}" wird {include file='header.html'}
- aus "{footer}" wird {include file='footer.html'}
- JavaScript-Bereiche werden in "{literal} ... {/literal}" eingeschlossen
5.) StatusWas haben wir bis jetzt gewonnen?
Noch nicht soooo viel - insbesondere für "parse_array()" und die parametrisierten Sprachkonstanten habe ich auf die Schnelle noch keine zufriedenstellende Lösung gefunden.
Ein paar schöne Dinge sind aber bereits möglich:
- Statt "{if variable}{endif variable}" können wir "{if $variable}{else}{/if}" einsetzen.
- Statt nur "if" können wir auch "{if $userlevel == 9}" verwenden
- Wir können mit "{include file='template.html'}" ganz einfach Dateien in ein Template einbinden.
- Die Smarty-Modifier funktionieren
"{$datumsvariable|date_format:'%d.%m.%Y'}"
"{$smarty.now|date_format:'%d.%m.%Y %H:%M:%S'}" -> aktuelle Uhrzeit
"{$textvariable|capitalize}"
Das können auch PHP-Funktionen sein: "{$number|pow:2}"
- Durch einfügen von "{debug}" in ein Template erhalten wir ein Popup-Fenster mit allen Variablen.
Um die Fähigkeiten von Smarty jetzt wirklich ausschöpfen zu können, müssten allerdings tiefere Eingriffe in den Quelltext von 4images vorgenommen werden.
Statt z.B. jeden Kommentar einzeln mit einem Template ("comment_bit.html") zu verarbeiten, könnte man die komplette Liste der Kommentare als Array (oder Objekt) an Smarty übergeben und dann im Haupt-Template mit den Schleifen ("foreach" oder "section") arbeiten.
Sollte hierzu Informationsbedarf bestehen, können wir das gerne vertiefen.
6.) LinksProjektseite:
http://smarty.netCheat-Sheet:
http://www.phpxperts.net/SmartyCheatSheetVersion2.pdf*** EDIT ***Was hier natürlich noch fehlte, war die neue Template-Datei "smarty.html":
{$body}