2012-12-16 3 views
2

Ma structure de fichier:Accès Smarty Modèle

--header.php 
--smarty 
    --templates 
    -- x.tpl 
    --cache 
    --configs 
    --templates_c 
--articles 
    -- testPage.php 

code dans header.php

$smarty = new Smarty(); 

$smarty->setTemplateDir('smarty/templates'); 
$smarty->setCompileDir('smarty/templates_c'); 
$smarty->setCacheDir('smarty/cache'); 
$smarty->setConfigDir('smarty/configs'); 

code dans testPage.php

<?php 
    include('../header.php'); 
    $smarty->display('x.tpl'); 
?> 

je frappe cette erreur:

PHP Fatal error: Uncaught exception 'SmartyException' with message 'Unable to 
load template file 'x.tpl'' in 
/usr/local/lib/php/Smarty/sysplugins/smarty_internal_templatebase.php:127 

Comment définir le bon chemin pour accéder au template smarty dans mon testPage.php?

+1

Avez-vous essayé de fournir le chemin absolu? – shawndreck

+0

Avez-vous déjà résolu ce problème? – Ted

Répondre

1

Réponse courte, comme vous avez besoin d'aller d'un répertoire de votre testpage.php pour accéder au répertoire qui contient votre répertoire smarty, comme vous l'avez fait pour l'entête.php vous devez faire la même chose pour le Smarty inclure des répertoires.

$smarty->setTemplateDir('../smarty/templates'); 

Une façon de le faire est bien définir comment obtenir dans le répertoire racine de votre projet, puis en utilisant que dans le comprennent.

par exemple. dans testPage.php

define("PATH_TO_ROOT", "../"); 

puis dans header.php

$smarty->setTemplateDir(PATH_TO_ROOT.'smarty/templates'); 
$smarty->setCompileDir(PATH_TO_ROOT.'smarty/templates_c'); 
$smarty->setCacheDir(PATH_TO_ROOT.'smarty/cache'); 
$smarty->setConfigDir(PATH_TO_ROOT.'smarty/configs'); 

Cela rend alors trivial à configurer les répertoires de Smarty, d'un autre fichier PHP qui peut être dans un autre endroit. par exemple. dans un répertoire appelé "tests/webtests/frontend" vous pouvez définir le PATH_TO_ROOT comme "../../../" et les appels pour installer Smarty fonctionneront toujours.

Vous pouvez également faire en sorte que header.php vérifie que PATH_TO_ROOT est défini, pour éviter qu'il soit appelé directement. En guise de remarque, vous pouvez envisager de ne pas avoir le répertoire templates_c et le cache dans le répertoire Smarty, mais plutôt créer un répertoire séparé pour écrire les données générées (et donc potentiellement vulnérables aux attaques par injection). Pour mes projets, j'ai un répertoire 'var' situé à côté du répertoire racine du projet, qui contient tous les répertoires pour les fichiers journaux, les caches, les modèles générés, etc. Tout ce qui est 'incertain' dans le sous-répertoire à propos de ce qui est sûr et de ce qui n'est pas beaucoup plus facile.

+0

Non, car si header.php est inclus à partir de plusieurs fichiers php à une profondeur différente dans le répertoire de l'arborescence, le chemin d'accès ../smarty est lié au répertoire inexistant. – Aubin

+0

Salut Aubin, vous avez mal compris. Le fichier en cours d'exécution est testPage.php donc tous les chemins de répertoire sont relatifs au répertoire dans lequel se trouve ce fichier, PAS relatif à header.php – Danack

+0

PATH_TO_ROOT n'est pas toujours "../" – Aubin