Ik maak op mijn website gebruik van Smarty om templates te parsen, dit werkt allemaal leuk en aardig. Ik gebruik file_get_contents() om pagina's te includen en deze aan een smarty variabelen te koppelen. Het probleem is dat smarty en PHP code niet wordt geparst op de included pagina, html wordt wel correct weergegeven. Een stukje van mijn code:

index.php
<?php
// put full path to Smarty.class.php
require('/usr/lib/php5/Smarty/Smarty.class.php');

$smarty = new Smarty();

$smarty->template_dir = 'smarty/templates';
$smarty->compile_dir = 'smarty/templates_c';
$smarty->cache_dir = 'smarty/cache';
$smarty->config_dir = 'smarty/configs';

$smarty->assign('emailmessage', '');

$pages = array('home','about','links', 'contact', 'portfolio', 'cv');
$names = array('home' => 'Home','about' => 'Over mij','links' => 'Links', 'contact' => 'Contact', 'portfolio' => 'Portfolio', 'cv' => 'Curriculum Vitae');


if(!isset($_GET['p']))
{
$smarty->assign('content', file_get_contents('home.php'));
$smarty->assign('breadcrumb', '<a href="index.php">Home</a>');
$smarty->assign('title', 'Jurgen-Meijer.nl - Welkom op de webpagina van Jurgen Meijer');
}
else
{
if(!in_array($_GET['p'], $pages))
{
$smarty->assign('content', file_get_contents('home.php'));
$smarty->assign('breadcrumb', '<a href="index.php">Home</a>');
$smarty->assign('title', 'Jurgen-Meijer.nl - Welkom op de webpagina van Jurgen Meijer');
}
else
{
$smarty->assign('content', file_get_contents($_GET['p'].'.php'));
$smarty->assign('breadcrumb', '<a href="index.php?p='.$_GET['p'].'">'.$names[$_GET['p']].'</a>');
$smarty->assign('title', 'Jurgen-Meijer.nl - '.$names[$_GET['p']]);
}
}
?>

Het doel is dus dat ik Smarty code wil gebruiken op de included pagina's maar deze worden gewoon letterlijk op het scherm weergegeven. Is het misschien een optie om de variablen te parsen voordat ik hem aan een smarty var koppel en hoe moet dit?
Dit komt omdat je file_get_contents gebruikt.
Als je het op deze manier wilt doen dan moet je is naar de ob_* functies kijken, daarmee kan je wat jij wilt.

Toch raad ik aan om smarty.include te gebruiken, dat is een stuk makkelijker.
Ja, dat werkt voor de template, maar ik wil dus verschillende pagina's kunnen includen d.m.v. één variabelen (die heet in de .tpl file {$content}) deze veranderd elke keer als er op een andere link wordt geklikt. Dus de vraag is eigenlijk hoe kan ik de navigatie maken zodat ik wel verschillende pagina's kan includen, maar ook nog smarty tags gebruiken op die include pagina's.

mijn template ziet er zo uit:




<body>
<div class="wrapper">
	<div class="header">
	<div class="menu">
		<ul class="menu">
			<li><a href="index.php">Home</a></li>
			<li><a href="index.php?p=about">Over mij</a></li>
			<li><a href="http://fotoalbum.jurgen-meijer.nl" target="_blank">Fotoalbum</a></li>
			<li><a href="http://mediacollectie.jurgen-meijer.nl" target="_blank">Media collectie</a></li>
			<li><a href="index.php?p=portfolio">Portfolio</a></li><li><a href="index.php?p=cv">CV</a></li>
			<li><a href="index.php?p=links">Links</a></li>
			<li><a href="index.php?p=contact">Contact</a></li>	
		</ul>
		<a href="http://www.linux.org" target="_blank" style="float: right;"><img src="/smarty/templates/design/images/tux.png" alt="Linux" /></a>
	</div>
	<div class="headertext">
		<strong>Jurgen-Meijer.nl</strong>
		<span class="subtext"><strong>Webdevelopment, zware metalen en meer!</strong></span>
	</div>
	<div class="quote">{$quote}</div> 
	</div>
	<div class="content">
		<div class="breadcrumb">U bent hier: {$breadcrumb}</div>
		{$content}
		{$emailmessage}
	</div>
	<div class="footer">
	&copy; <strong>Jurgen Meijer</strong> 2008 alle rechten voorbehouden.
	</div>
	<div class="submenu">
		<ul>
			<li><a href="http://validator.w3.org/check?uri=www.jurgen-meijer.nl">XHTML</a></li>
			<li><a href="http://jigsaw.w3.org/css-validator/validator?uri=http://www.jurgen-meijer.nl" target="_blank">CSS</a></li>
			<li><a href="sitemap.xml">Sitemap</a></li>
		</ul>
	</div>
</div>
</body>

file_get_contents() geeft geparste php, oftewel html terug.
include() is pure php code die er als het ware tussen wordt gezet.

Testje gedaan
<?php
$var = 1;
echo '<br/>' . $var;
$file1 = file_get_contents('bla.php');
echo '<br/>' . $var;
include('bla.php');
echo '<br/>' . $var;
?>

En in bla.php deze code:
<?php
$var=$var+1;
?>

Resultaat:
1
1
2
Ja, maar ik kan een include toch niet aan een variabelen hangen?
@SanThe ok wist ik niet.

@TS

Wat je kan doen:

ipv
<?php $smarty->assign('content', file_get_contents($_GET['p'].'.php')); ?>

doe je:

<?php $smarty->assign ( 'content', $_GET['p'] . '.php' ); ?>

Dan kan je in je tpl file zoiets doen:

<?php {include file="$content"} ?>

Als het goed is wordt dan wel je smarty geparsed in je geinclude file.
Hartelijk dank Stien dit werkt perfect! Hier worstel ik al een aantal maanden mee.

Reageren