Archiv verlassen und diese Seite im Standarddesign anzeigen : vB und Smarty?
quakeinside
17.11.2005, 09:11
Gibt es schon Erfahrungen in der Kombination zwischen vB und der Template Engine Smarty?
Soweit ich hier im Forum gesehen habe, unterstützt die hauseigene Template Engine von vB keine Schleifen und hat auch sonst nicht so viele Features wie z.B. Smarty. :(
Nun stellt sich mir die Frage, ob man z.B. bei eigenen PHP-Seiten, die jedoch in vB eingebettet sind (Umgebung, Header, Footer, ...) auch die Smarty-Engine fehlerfrei und problemlos nutzen kann?
s.molinari
17.11.2005, 19:28
Gibt es schon Erfahrungen in der Kombination zwischen vB und der Template Engine Smarty?
Soweit ich hier im Forum gesehen habe, unterstützt die hauseigene Template Engine von vB keine Schleifen und hat auch sonst nicht so viele Features wie z.B. Smarty. :(
Nun stellt sich mir die Frage, ob man z.B. bei eigenen PHP-Seiten, die jedoch in vB eingebettet sind (Umgebung, Header, Footer, ...) auch die Smarty-Engine fehlerfrei und problemlos nutzen kann?Hi quakeinside,
Was meinst du mit schleifen? Meinst du Schleifen innerhalb der Templates wie unsere Conditionals IF Anweisungen darstellen?
Ich würde sagen, Smarty wird sich nicht leicht in vB integrieren.
Scott
quakeinside
17.11.2005, 19:56
Was meinst du mit schleifen? Meinst du Schleifen innerhalb der Templates wie unsere Conditionals IF Anweisungen darstellen?
Ich würde sagen, Smarty wird sich nicht leicht in vB integrieren.
Ich vermute mal, dass eure IF-Anweisungen nur eine Abfrage erlauben. Bei Smarty gibt es die Funktion Section, mit der ich z.B. bei bisherigen Projekten eine Schleife (loop) zur Abarbeitung eines Arrays genutzt habe.
Hier der Link zum Smarty-Manual:
http://smarty.php.net/manual/de/language.function.section.php
Ein einfaches Beispiel wäre eine Auflistung von z.B. Mitgliedern (mal davon abgesehen, dass es bereits eine solche Liste in vB gibt).
Damit das Template auch wirklich Template bleibt, sollte kein HTML-Code über die PHP-Files erzeugt werden, sondern eben die exakte Trennung von beidem.
Hier mal ein Musterauszug von einem Smarty-Template (mal ohne viel HTML-Kram drumherum):
{section name=x loop=$a_user}
{$a_user[x].nickname}
{$a_user[x].firstname}
{/section}
Durch diese Anweisung wird das Array $a_user abgearbeitet und die Zeilen werden solange ausgegeben bis das Ende erreicht ist.
Ich kombiniere sowas gerne in HTML-Tabellen ohne die wirkliche Ausgabe im PHP-Code enthalten zu haben.
Sollte ich etwas zu umständlich beschrieben zu haben, bitte kurze PM oder auch eine direkte Antwort in diesem Thread.
s.molinari
17.11.2005, 23:43
Ist klar jetzt. :)
Da vB alle Schleifen in den PHP Code hat, sind dann Schleifen in den Templates nicht nötig ( obwohl die Idee könnte u.U. die Templates vereinfachen.)
Ich bin auch immer noch der Meinung die Integrierung von Smarty in vB wäre nicht leicht.
Scott
quakeinside
18.11.2005, 14:38
Also ich habe mir das ganze mal näher angeschaut und einen kleinen Test gestartet. Bisher sieht es so aus, als kann man scheinbar problemlos vB und Smarty kombinieren. :)
Als Test habe ich eine Ausgabe der vB-Userdatenbank (Userid und Username) ausgesucht. Es wird nur eine kleine Tabelle dargestellt, die pro User die Daten darstellt.
So sieht das vB-Template "content" (wurde als eigenes Template neu angelegt) aus:
$stylevar[htmldoctype]
<html dir="$stylevar[textdirection]" lang="$stylevar[languagecode]">
<head>
<title>$vboptions[bbtitle]</title>
$headinclude
</head>
<body>
$header
$navbar
<!-- Content -->
$myvar_content
<!-- / Content -->
$footer
</body>
</html>
So sieht das Smarty-Template "content.tpl" aus:
<table align="left" width="100%" cellpadding="3" cellspacing="1" border="0">
<tr>
<td class="bg2">
Nickname
</td>
<td class="bg2">
Vorname
</td>
<td class="bg2">
Land
</td>
<td class="bg2">
Ort
</td>
</tr>
{section name=x loop=$a_user}
<tr>
<td class="bg1">
<a href="user.details.php?id={$a_user[x].id}">{$a_user[x].nickname}</a>
</td>
<td class="bg1">
{$a_user[x].firstname}
</td>
<td class="bg1">
{if $a_user[x].country_id != ""}<img src="gfx/icons/flags/{$a_user[x].country_id}.gif">{else} {/if}
</td>
<td class="bg1">
{$a_user[x].city}
</td>
</tr>
{/section}
</table>
So sieht das eigene PHP-Script aus:
<?php
// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
// #################### DEFINE IMPORTANT CONSTANTS #######################
define('NO_REGISTER_GLOBALS', 1);
define('THIS_SCRIPT', 'my.listuser');
// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();
// get special data templates from the datastore
$specialtemplates = array();
// pre-cache templates used by all actions
$globaltemplates = array(
'content'
);
// pre-cache templates used by specific actions
$actiontemplates = array();
// ######################### REQUIRE BACK-END ############################
require_once('./global.php');
// draw nav bar
$navbits = array();
$parentlist = array_reverse(explode(',', $foruminfo['parentlist']));
foreach ($parentlist AS $forumID)
{
$forumTitle = $forumcache["$forumID"]['title'];
$navbits["forumdisplay.php?$session[sessionurl]f=$forumID"] = $forumTitle;
}
$navbits["my.listuser.php"] = "User auflisten";
$navbits = construct_navbits($navbits);
eval('$navbar = "' . fetch_template('navbar') . '";');
// #######################################################################
// ######################## Nachfolgende Ihr eigener Code#################
// #######################################################################
// ## ----- ##
// ## Setup ##
// ## ----- ##
define("SETTINGS_SMARTY_MAINPATH", "/home/<...>/opt/php/Smarty/libs/");
define("SETTINGS_SMARTY_VARPATH", "/home/<...>/www/<...>/smarty/");
// ## ------ ##
// ## Smarty ##
// ## ------ ##
define('SMARTY_DIR',constant("SETTINGS_SMARTY_MAINPATH"));
require(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = constant("SETTINGS_SMARTY_VARPATH").'templates/';
$smarty->compile_dir = constant("SETTINGS_SMARTY_VARPATH").'templates_c/';
$smarty->config_dir = constant("SETTINGS_SMARTY_VARPATH").'configs/';
$smarty->cache_dir = constant("SETTINGS_SMARTY_VARPATH").'cache/';
// ## ---- ##
// ## Main ##
// ## ---- ##
$myvar_sql_users = $db->query_read("
SELECT userid, username
FROM " . TABLE_PREFIX . "user
");
while ($myvar_user = $db->fetch_array($myvar_sql_users))
{
$myvar_users[] = array('userid' => $myvar_user[userid]
,'username' => $myvar_user[username]
);
}
$smarty->assign("myvar_users",$myvar_users);
$myvar_content = $smarty->fetch("content.tpl");
eval('print_output("' . fetch_template('content') . '");');
Zur Sicherheit habe ich meine "eigenen" Variablen jeweils mit einem Präfix "myvar_" ausgestattet.
P.S.: Die Konfig von Smarty würde später in einem Include sein und wurde nur testweise direkt in dem PHP-Script versenkt. Die richtigen und vollständigen Pfade habe ich auch etwas abgekürzt, damit meine Projektnamen und Usernamen nicht enthalten sind.
vBulletin® v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.