2009-10-13 10 views
1

Le Smarty FAQ suggère un moyen de gérer les fragments pouvant être mis en cache, mais chaque contrôleur de page doit effectuer des tâches au début, au lieu d'encapsuler les éléments correctement.Composants de mise en cache Smarty

Nous voulons arriver à un stade où nous pouvons faire quelque chose comme:

<div id="header"> 
    {our_categories} 
    {our_subcategories category=$current_category} 
</div> 

La sortie des our_ fonctions préfixées doit être complètement cacheable, en se fondant uniquement sur les paramètres nommés (le cas échéant). Si nous renvoyé à {our_categories} dans plus d'un modèle, ils doivent tous faire référence au même contenu mis en cache.

(il est probablement utile de mentionner que nous avons essayé d'utiliser {insert name="..."} et le codage nos propres fonctions, mais les résultats ne sont pas cacheable, et nous avons fini la main en lançant le HTML retunred, plutôt que de profiter de la transformation du modèle de Smarty.)

Notre première fissure à cette utilise une fonction personnalisée smarty_function_our_categories, mais la mise en cache va horriblement mal. Voici ce que notre fonction ressemble:

function smarty_function_our_categories($params, &$smarty) { 
    $smarty->caching = 2; 
    $smarty->cache_lifetime = 3600; # 1 hour 
    if (!$smarty->is_cached(...)) { 
    // ... do db access to fetch data for template... 
    $smarty->assign(....); 
    } 
    return $smarty->fetch(...); 
} 

Le problème est: appeler $smarty->fetch() dans une fonction embrouille Smarty, faisant perdre la trace des modèles ont insérer des balises, et qui ne le font pas. Le résultat final est que Smarty oublie de remplacer certains marqueurs lors de la mise en cache du contenu (il met ici les marqueurs: "remplacez ceci par les résultats d'un appel {insert ...} non mis en cache.) Dans notre cas, cela se manifeste par notre site. Nous supposons que nous avons fait une erreur dans la façon dont nous construisons nos composants, donc la question devient finalement

Comment créer en toute sécurité un composant de mise en cache en utilisant Smarty pour se rendre?

Répondre

0

vous ne devriez pas modifier les paramètres de mise en cache à l'intérieur de la fonction Smarty. Wheither ou non t Le résultat de la sortie du plugin est cacheable est défini lorsque vous inscrivez le plugin.

http://www.smarty.net/manual/en/caching.cacheable.php

Pour créer le contenu uncachable intérieur modèle cachable il suffit d'utiliser des blocs {dynamiques} comme ceci:

//Registering dynamic non-caching block with Smarty 
$template->register_block('dynamic', 'smarty_block_dynamic', false); 
function smarty_block_dynamic($param, $content, &$smarty) { 
    return $content; 
} 
+0

Cela a trois inconvénients que nous voulons éviter: (1) les mises en œuvre de blocs pré-enregistrement au lieu de auto-loading, (2) le template a besoin d'ouvrir et de fermer chaque block, (3) l'implémentation du block construit le HTML manuellement au lieu de le rendre en utilisant smarty. Nous cherchons à voir si et comment nous pouvons contourner chaque problème et aimerions avoir des suggestions. – searlea

+0

(1) vous pouvez placer votre fonction de bloc dynamique dans le répertoire smarty et il va le charger à la demande. (2) Je n'ai pas compris (3) Je n'ai pas compris non plus. Quel est le problème? –