2009-07-28 5 views
3

pour notre dernier projet, nous avons utilisé Django, où l'on peut spécifier une liste de dossiers, qui sont recherchés pour un modèle, disons, avec le nom example.html. Maintenant, nous sommes revenus à Smarty (PHP) et nous nous demandons s'il y a quelque chose de similaire.PHP, Smarty: Vérifier le modèle dans différents dossiers

Version Smarty: Peut être à la pointe de la technologie.

Comportement:

  1. RSS Smarty avec un tableau de dossiers. Appelez un modèle avec $smarty->display() ou {include}.
  2. Smarty effectue une recherche dans les dossiers et prend le premier modèle correspondant au nom.

J'ai regardé Smarty resources, mais ils semblent être exagérés pour cette tâche, et les documents sont un peu clairsemés sur ce sujet. Des idées comment cela pourrait-il être fait?

Un problème supplémentaire est que la liste des dossiers peut changer en fonction de l'URL demandée. Des idées pour dire à Smarty, quel modèle compilé utiliser?

Vive,

Répondre

4

Dans Smarty.class.php, dans le procédé Smarty::_parse_resource_name():

foreach ((array)$params['resource_base_path'] as $_curr_path) { 
    $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name']; 
    if (file_exists($_fullpath) && is_file($_fullpath)) { 
     $params['resource_name'] = $_fullpath; 
     return true; 
    } 
    // didn't find the file, try include_path 
    $_params = array('file_path' => $_fullpath); 
    require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); 
    if(smarty_core_get_include_path($_params, $this)) { 
     $params['resource_name'] = $_params['new_file_path']; 
     return true; 
    } 
} 

$params['resource_base_path'] est par défaut à $this->template_dir dans Smarty::_fetch_resource_info().

Il semble donc que vous pouvez définir $smarty->template_dir sur un tableau de répertoires à regarder. Notez que cela ne sera pas récursif. Cela doit être une fonctionnalité non documentée.

+0

Est-ce que Smarty compile ensuite en fonction du chemin ou est toujours basé sur le nom du modèle fourni? Dans ce dernier cas, en fournissant des listes changeantes de dossiers de gabarit va casser le gabarit ... – Boldewyn

+0

Je pense qu'il le fait en fonction du chemin. J'ai différents modèles dans différents dossiers qui s'appellent la même chose, et les fichiers compilés ont tous un préfixe différent. –

+0

Je n'avais pas encore eu le temps de le tester, mais si ça fonctionne avec la compilation, ce serait vraiment cool. – Boldewyn

0

Malheureusement, Smarty est conçu pour fonctionner avec un seul répertoire de modèles (la propriété template_dir de l'objet Smarty). Vous pouvez cependant changer cela au moment de l'exécution, ce qui peut vous donner certains des effets que vous recherchez.

2

Je sais que cela fait un moment que cette question a été posée, mais pour l'enregistrement, je voulais souligner une fonctionnalité de Smarty que je pense fait ce que l'OP demande. Voici une partie du code de mon application.

Fondamentalement ce qu'il fait est d'abord chercher le modèle dans /ext/templates. S'il ne le trouve pas, il utilisera celui de /base/templates. Mon code ne nécessite qu'un seul repli, mais d'autres pourraient facilement être ajoutés.

class View extends Smarty { 
    function __construct() { 
     parent::Smarty(); 

     $this->template_dir = LOCAL_APP_ROOT.'/ext/templates'; 
     $this->compile_dir = LOCAL_APP_ROOT.'/cache/compile'; 

     $this->default_template_handler_func = '__default_template_handler'; 
    } 
} 


function __default_template_handler($resource_type, $resource_name, &$template_source, &$template_timestamp, &$smarty_obj) { 
    if ($resource_type == 'file') { 
     if (!is_readable($resource_name)) { 
      $defaultPath = LOCAL_APP_ROOT."/base/templates/$resource_name"; 
      if (file_exists($defaultPath)) { 
       $template_source = file_get_contents($defaultPath); 
       $template_timestamp = filemtime($defaultPath); 
       return true; 
      } 
     } 
    } 
    return false; 
} 
1

La valeur de Smarty template_dir peut être un tableau de répertoires. Smarty parcourra les répertoires dans l'ordre jusqu'à ce qu'un modèle correspondant soit trouvé.

+0

c'est la meilleure réponse! – Peter

Questions connexes