Date de publication: le samedi 12 avril 2008 à 18h15
Dernière modification: par Pascal BOYER le dimanche 26 septembre 2010 à 22h31
« Article précédent: Template overview / Présentation d'un template
» Article suivant: Cache-blocks optimization / Optimisation des cache-blocks
Template compilation / Compilation de template
Paramétrage du fichier de configuration site.ini.append.php:
[TemplateSettings] TemplateCache=enabled TemplateCompile=enabled TemplateOptimization=enabled
The template language is parsed and executed by eZ Publish. Since this task can be quite time-consuming, there is a feature in eZ Publish to convert templates to pure PHP code. This makes execution quite a lot faster. The TemplateCache setting enables cache-blocks (as explained on the next page) and template compilation to be used. TemplateCompile controls whether template compilation should be done and TemplateOptimization attempts to optimize the PHP in these files.
Le langage de template est analysé puis exécuté par eZ Publish. Cette tâche pouvant s'avérer gourmande en temps, eZ Publish possède une fonctionnalité de conversion les templates en code PHP pur, rendant l'exécution beaucoup plus rapide. Le paramètre TemplateCache active l'utilisation des cache-blocks (comme expliqué page suivante) et la compilation des templates. Le paramètre TemplateCompile détermine si la compilation des templates doit être ou non effectuée et le paramètre TemplateOptimization essaye d'optimiser le PHP de ces fichiers.
Custom template operators / Opérateurs de templates personnalisés
For better performance, you could replace complex pieces of template code with custom operators that do the same thing in PHP code.
Pour obtenir de meilleures performances vous pouvez remplacer les parties complexes du code de vos templates par des opérateurs personnalisés réalisant la même chose en PHP.
Here is an example of a complex piece of template code that will return some redundant data:
Voici un exemple de code de template complexe retournant des résultats redondants:
{def $article_list=fetch( content, tree, hash( parent_node_id, $node.node_id ) ) $main_node_ids_array=array() $unique_article_list_array=array()} {foreach $article_list as $article} {if $main_node_ids_array|contains($article.object.main_node_id)|not} {set main_node_ids_array=$main_node_ids_array|append($article.object.main_node_id)} {set unique_article_list_array=$unique_article_list_array|append($article)} {/if} {/foreach} {foreach $unique_article_list_array as $unique_article} {node_view_gui view=line content_node=$unique_article.object.main_node} {/foreach}
Assume now that we need to display a drop-down list with the names of a hundred objects stored under a folder somewhere in the content structure. Instead of fetching all objects, we can use a custom template operator to return the SQL query result as an array with object names.
Supposons à présent que nous devions afficher une liste déroulante des noms d'une centaine d'objets stockés dans un dossier situé quelque part dans la structure de contenus. Plutôt que de rechercher tous les objets, nous pouvons utiliser un opérateur de template personnalisé qui retournera le résultat de la requête SQL sous la forme d'un tableau contenant les noms des objets.
Here is an example SQL query for use in a template operator:
Voici un exemple de requête SQL à utiliser dans un opérateur de template:
SELECT ezcontentobject.name, ezcontentobject.id, ezcontentobject_tree.contentobject_id
FROM ezcontentobject_tree, ezcontentobject, ezcontentobject_name
WHERE path_string LIKE '/1/124/%'
AND depth <=2
AND node_id !=124
AND ezcontentobject_tree.contentobject_id = ezcontentobject.id
AND ezcontentobject_tree.contentobject_id = ezcontentobject_name.contentobject_id
AND ezcontentobject_tree.contentobject_version = ezcontentobject_name.content_version
AND ezcontentobject_name.content_translation = 'eng-GB'
ORDER BY ezcontentobject.published DESC
This returns all object names and their ids where the parent node id is 124. Then, in the template we can use the following code:
Ceci retourne tous les objets et leur ID dont le parent à pour ID 124. Nous pouvons alors utiliser le code suivant dans le template:
<select name=""> {foreach objectsqlnames() as $object} <option value="{$object.id}">{$object.name}</option> {/foreach} </select>
With 100 objects, the code above can be three times faster than code with the regular fetch function. It requires two fewer SQL queries and returns only the data that is needed.
Avec 100 objets, ce code peut être 3 fois plus rapide que le code faisant appel à la fonction fetch. Il demande deux fois moins de requêtes SQL et retourne seulement les données souhaitées.
Children / Les enfants
If you need to display some information about node children or grandchildren in the node template, this is possible with $node.children and $node.children.0.children.
Pour afficher dans un template des informations sur des noeuds enfants ou petits enfants, il est possible d'utiliser les variables $node.children et $node.children.0.children.
Instead of grabbing content with the fetch function like this:
Plutôt que de récupérer le contenu avec la fonction fetch, comme ceci:
{def $children=fetch( 'content', 'list', hash( 'parent_node_id', $node.node_id ) )} {foreach $children as $child} {$child.url_alias|ezurl} {$child.name} {$child.node_id} {/foreach}
...display child data as follows:
...affichez ainsi les données des enfants:
{foreach $node.children as $child} {$child.url_alias|ezurl} {$child.name} {$child.node_id} {/foreach}
This requires two fewer SQL queries and thus reduces the page load time.
Ce dernier code engendre deux fois moins de requêtes SQL et réduit donc le temps de chargement de la page.
Limit, offset
When fetching objects you should always use limit and offset in order to control the records that are returned. Some queries return a lot of redundant records if you do not specify the number of results to return (limit) and the record where the return count (offset) should start.
Lorsque vous recherchez des objets, utilisez toujours les paramètres limit et offset pour contrôler les enregistrements retournés. Certaines requêtes retourneront de nombreux enregistrements redondants si vous ne spécifiez pas le nombre de résultats à renvoyer ( limit) et l'enregistrement à partir duquel ( offset) le compteur de résultats doit commencer.
Here is an example fetch statement that uses both limit and offset.
Voici un exemple d'emploi de la fonction de recherche fetch utilisant les deux paramètres limit et offset:
{fetch( 'content', 'list', hash( 'parent_node_id', 2, 'limit', 15, 'offset', 10, 'only_translated', true(), 'language', 'ger-DE' ) )}
Commentaires














