PHP [SMARTY] Pfatrelationen und einbindung in 2ebenen

asseskiller

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
447
Ich habe folgendes Problem

1.
ich will das in meiner index.tpl PHP-Dateien includet werden welche wiederum TPL-Dateien includen usw. Wie geht das?
Hab es probiert mit include file="xyz" dabei wurde aber nur der quellcode ausgegeben.
Bei include_php kam ein anderer fehler.

im xtc_commerceshop geht das sogar über variablen. Wie ein include zb über {$box_LOGIN} funktioniert wäre auch mal sehr interessant.

2.
Ich bekomm dabei ne macke mit den Pfadrelationen.
Worauf beziehen sich die Pfade die ich angebe?
Beziehen sie sich auch die index.php oder auf die box_login.php oder auf die tiefste ebeneusw?

Auch der befehl config_load irritiert mich.
ich rufe in meiner index.tpl sie folgendermaßen auf

{config_load file='lang/ger/lang_ger.conf'}
(das ist der pfad von der index.tpl aus)

Hab sie überall hinverschoben und bekomme es nicht hin, das der die lädt.

Wie geht das?
Bitte helft mir. Danke im Vorraus
 
Der Include von Smarty funktioniert wie die include-Funktion von PHP, also immer relativ zum Dokument, in dem der Befehl steht.

Wenn du includes über Variablen {$box_LOGIN} vornehmen lassen willst, dann musst du dem Template den Code des anderen Templates in dieser Variable mitgeben. Dazu muss das einzufügende Template kompiliert werden, und in der Variable gespeichert werden. Das machst du über die Methode fetch, die ansonsten ähnlich Funktioniert wie display
PHP:
$anderes_template = $smarty->fetch('anderes_template.tpl');
$smarty->assign('box_LOGIN', $anderes_template);

Lies dir am besten mal das Manual zu Smarty durch, da steht eigentlich alles drin.
 
Moin moin ;)

Ich bin grad selbst n bisl am CMS programmieren mit Smary. Maybe kann ich dir helfen.


Generell musst du Smarty angeben, wo der Stammpfad deiner Templates ist. An diesen Pfad richtet sich php_include, config_load usw. Ergo müssen tatsächlich die PHP- und Config-Dateien immer im Template-Ordner liegen. Wenn die da in einem Subordner liegen, muss dieser dann auch beim includen angegeben werden.


Zu deinem Problem bzw. deiner Frage mit dem "includen über Variablen":

Wenn du beispielsweise wie bei xtcommerce eine Variable im Template für einen Include nutzen willst, musst du im php-Script selbst diese Variable schon mit Content "füllen". Beispielsweise mit Daten aus der Datenbank, die du mit Smarty in "Subtemplates" (so nenn ich die jedenfalls) temporär in eine Variable schreibst, und diese per Smarty-Assign dann definierst. Ich hoffe ich habs nicht zu kompliziert ausgedrückt :D hier mal ein Code-beispiel:

Dateistruktur im Template-Ordner:

- subtemplates
- - subtemplate.tpl
- index.tpl

Inhalt des PHP-Scripts:
Code:
<?php

// daten aus der datenbank holen und $smarty-variable zuweisen, hier ists nur mal
// beispielhaft mit einem normalen string

$data = "Hier kann irgendwas stehen";

// Variable in subtemplate.tpl zuweisen
$smarty->assign("subvariable", $data);

// jetzt holen wir das Subtemplate, ersetzen {$subvariable} im subtemplate mit $data und speichern 
// dies in einer weiteren Smarty-Variable, die in der Haupt-Templatedatei platziert ist

$box_subtemplate_tmp = $smarty->fetch("subtemplates/subtemplate.tpl");
$smarty->assign("box_subtemplate", $box_subtemplate_tmp);

// jetzt laden wir das Haupttemplate und rendern die seite. Im Haupttemplate kommt 
// {$box_subtemplate} vor!

$smarty->display("index.tpl");

?>

Du kannst, wie du siehst, auch Templates aus Unterordnern im Templateordner vorladen, vorparsen und in eine PHP-Variable schreiben, um diese Daten am Ende dann in die Haupt-Templatedatei zu schreiben und auszugeben.


---


mal was zu config_load:
Die Verwendung muss nicht zwingend sein und ist unter Umständen auch nicht wirklich sinnvoll, muss jeder für sich selbst entscheiden. Die .conf-Datei muss aber im selben Ordner wie die Templates liegen, damit diese eingebunden werden.


---

Includen und ausführen von PHP-Code:
Solltest du immer über {php} include("pfad/zur/datei.php"); {/php} machen. Ich mag mich zwar grad irren, da ich das nie versucht habe (weil ich das schlicht nicht brauche), aber ich hab des öfteren mal gelesen, dass über {php_include} dies nicht immer klappt, wie man sichs vorstellt.

Generell aber würde ich eh davon abraten - Templates sind Templates, da sollte PHP-Code wenn irgend möglich rausgehalten werden ;)



Ich hoffe ich konnte dir helfen. Vor allem hoff ich, dass ich mich einigermaßen verständlich ausgedrückt hab :D
 
@muhkuh ich hab dich verstanden

Hab aber irgendwe probleme das umzusetzen.
Hier mal meine ordnerstruktur:

99625


und hier meine index.php
PHP:
<?php
    error_reporting(E_ALL);
    define('SMARTY_DIR', 'smarty/');
    // den Pfad entsprechend anpassen. Der Slash am ende muss
    // vorhanden sein
	
	$smarty->template_dir = 'templates/';
	$smarty->compile_dir = 'templates_c/';
	$smarty->config_dir = 'configs/';
	$smarty->cache_dir = 'cache/';

    require(SMARTY_DIR.'Smarty.class.php');
    // Die Smarty-Klasse laden

    $smarty = new Smarty;

	$login_template = $smarty->fetch('module/box_login.tpl');
	$smarty->assign('box_LOGIN', $login_template); 

    $smarty->display('index.tpl');
	
	?>

hier meine index.tpl

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>{#titel#}</title>
<link type="text/css" rel="stylesheet" href="style.css">
</head>

<body>
        <table border="1" cellspacing="0" cellpadding="0" class="seitengeruest">
          <tr>
            <td colspan="3">header</td>
          </tr>
          <tr>
            <td>navi</td>
            <td>content</td>
            <td>{$box_login}</td>
          </tr>
          <tr>
            <td colspan="3">footer</td>
          </tr>
        </table>
</body>
</html>

in meiner box_login.tpl steht reiner text sowie
HTML:
{config_load file='../lang/ger/lang_ger.conf' section='allgemeines'}
dies müsste ja alles aufgerufen werden wenn ich die seite öffne, wird es aber nicht.
Es wird nichtmal der reine Text angezeigt. An der stelle wo in der index {$box_login} steht ist nichts.

Die config gibt außerdem einen fehler aus
So müsste der aufruf der config ja funzen aber es passiert nichts.
 
Zuletzt bearbeitet:
okay da lag der fehler aber das mit dem config besteht immernoch das problem

außerdem kann ich nach eurer methode keine anderen php-dateien einbinden wie zb. ein box_login.php
die das gleiche macht wie meine index, bloß eine ebene tiefer.

Wie geht das? Außerdem werden variablen in diesem "subtemplate" garnicht anerkannt habe ich festgestellt.

Könnt ihr mir bitte helfen.
 
Zuletzt bearbeitet:
super danke fuzt. Hab mich da nen bisschen doof angestellt.
Jetzt ist nur noch die frage mit den verschiedenen ebenen offen.

mach ich nämlich folgendes:

index.php
PHP:
$smarty->assign('field_mail', '<input name="mail" type="text">');
dann kann ich die variable in der index.tpl nutzen aber in der boxlogin.tpl nicht.
Daher wollte ich eine php-datei (box_login.php) anzeigen lassen, die sozusagen fast das gleiche macht wie die index.php. Sie soll variablen deklarieren, allgorythmen durchlaufen und dann die box_login.tpl laden die die in der php gesetzten variablen enthält
 
Zuletzt bearbeitet:
Deine index.php kann so eigentlich gar nicht richtig funktionieren.
PHP:
$smarty->template_dir = 'templates/';
    $smarty->compile_dir = 'templates_c/';
    $smarty->config_dir = 'configs/';
    $smarty->cache_dir = 'cache/';
Der Teil wird nicht berücksichtigt, weil du das Smarty-Objekt noch gar nicht initialisiert hast. Richtiger wäre:

PHP:
<?php
    error_reporting(E_ALL);
    define('SMARTY_DIR', 'smarty/');

    require(SMARTY_DIR.'Smarty.class.php');
    // Die Smarty-Klasse laden

    $smarty = new Smarty;

    // den Pfad entsprechend anpassen. Der Slash am ende muss
    // vorhanden sein
    
    $smarty->template_dir = 'templates/';
    $smarty->compile_dir = 'templates_c/';
    $smarty->config_dir = 'configs/';
    $smarty->cache_dir = 'cache/';

    $login_template = $smarty->fetch('module/box_login.tpl');
    $smarty->assign('box_login', $login_template); 

    $smarty->display('index.tpl');
    
    ?>

Das box_LOGIN war mein Fehler, habe mich verguckt, sorry dafür!
 
hab alles so verschoben wie gesagt.
Hab aber keine veränderung/verbesserung in dem sinne gebracht, das ich nun die variablen auch in der 2 ebene nutzen kann oder eine php datei dort einbinden kann.
 
wenn du

PHP:
$box_login = $smarty->fetch("template.tpl");

VOR

PHP:
$smarty->assign('field_mail', '<input name="mail" type="text">');

erwähnst, dann ist natürlich klar, dass du auf {$field_mail} nur in der index.tpl zugreifen kannst. Wenn du aber

PHP:
$smarty->assign('field_mail', '<input name="mail" type="text">');

VOR

PHP:
$box_login = $smarty->fetch("template.tpl");

erwähnst, dann kannst du in index.tpl UND box_login.tpl auf {$field_mail} zugreifen. Wie du das programmiertechnisch regelst, das bleibt dir überlassen ;)
Du musst immer VOR dem Fetchen eines Subtemplates die Variablen definieren, die Smarty im Subtemplate ersetzen soll.
 
klasse, das hab ich verstanden.

Nun meine wirklich letzte frage. Wie kann ich eine php dazu bringen in einer solchen einbindung so zu funktionieren wie die index.php
 
meinst du über die Template-einbindung einer PHP-Datei (also {include_php}) oder meinst du über eine andere scriptdatei parallel zur index.php?

ich glaube aber in beiden Fällen musst du eine neue Smarty-klasse initialisieren - es sei denn, du bindest über die index.php eine PHP-Datei ein. Wenn du über das Template eine PHP einbinden willst, musst du zum einen den kompletten Pfad zur Datei angeben (hier gilt scheinbar doch nicht der Template-Stammpfad) und definitiv eine neue Smarty-Klasse initialisieren, wenn du in der PHP Datei weitere Smarty-Funktionen wie assign oder fetch ausführen willst.


//EDIT

Ouuuouou, ich korrigiere!

du brauchst, wenn du PHP-Dateien über die Templates einbindest ({include_php file="path/to/file.php"}) NICHT die Klasse neu instanzieren! Du kannst mit

PHP:
$this->assign("varname", $vardata);

neue Zuweissungen etc machen!
 
Zuletzt bearbeitet:
ich möchte quasi eine box_login.php einbinden, die die box_login.tpl anzeigt und zwar genau so wie die index.php die index.tpl

versteht ihr was ich meine.
 
Zuletzt bearbeitet:
jow, dann gibbet da 2 möglichkeiten.

1.) Include über die index.php

in der index.php steht:

PHP:
<?php
....
//vorangegangene Abläufe


//box login includen
include('box_login.php');

//templatevariable "box_login" zuweisen
$smarty->assign("box_login", $box_login);

//templateausgabe
$smarty->display("index.tpl");
?>

in der box_login.php steht dann:

PHP:
<?php
...
//datenbankabfragen etc pp

//variablenzuweisungen
$smarty->assign("box_login_varname", "box login data");
...usw...

//subtemplate fetchen
$box_login = $smarty->fetch("box_login.tpl");

?>


2.) über das Template box_login.php einbinden

in der index.tpl steht:

Code:
{include_php file="pfad/zur/box_login.php"}
...weitere HTML Tags usw...
{$box_login}

in der box_login.php steht dann:

PHP:
<?php
...
//datenbankabfragen etc pp

//variablenzuweisungen
$this->assign("box_login_varname", "box login data");
...usw...

//subtemplate fetchen
$box_login = $this->fetch("box_login.tpl");

//oder alternativ per display - dann entfällt {$box_login} im Haupttemplate
$this->display("box_login.tpl");

?>


Man kann den kram verflucht vielfältig einbinden. An deiner Stelle würde ich grundsätzlich keinen PHP-Code über das Template selbst ausführen lassen, weils zu unübersichtlich wird.
 
Zurück
Oben