web-dev-qa-db-fra.com

Comment créer une variable à laquelle mon fichier page.tpl.php peut accéder?

Dans Drupal 7, j'ai un module qui implémente hook_node_load. Il crée une variable que j'aimerais utiliser dans mon fichier page.tpl.php. Imaginons que c'est le nombre de des nœuds qui sont du même type que le nœud actuellement chargé. Pour l'instant, je ne fais que rendre la variable globale, comme ceci:

global $node_count;
$node_count = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $node->type"))->fetchAll()[0]->count;

Ensuite, dans mon fichier page.tpl.php, je dois faire quelque chose comme ceci:

global $node_count;
echo "<p>$node_count</p>";

Je sais qu'il existe un moyen de faire de mon $node_count variable de portée, de la même manière que $node ou $user sont. Les tutoriels que je trouve sur le sujet semblent impliquer la réécriture de la fonction de thème entière - je n'essaye pas de faire quelque chose d'aussi compliqué. Existe-t-il un moyen simple de simplement rendre cette variable dans la portée de mes fichiers .tpl.php? Quelque chose comme une fonction?

7
rybosome

Dans Drupal, fonctions de prétraitement de modèle sont les fonctions qui préparent les variables qui peuvent être utilisées dans un certain modèle. Les fonctions de prétraitement de modèle sont exécutées les unes après les autres et elles passent autour d'un tableau avec toutes les variables. Vous pouvez ajouter le vôtre dans le template.php de votre thème, sous la forme de function THEMENAME_preprocess_TEMPLATENAME(&$variables) { // Your code here. }.

Si vous ajoutez une valeur à un objet nœud dans une implémentation hook_node_load, cela ressemble probablement à ceci:

function mymodule_node_load($nodes, $types) {
  foreach ($nodes as $node) {
    $node->myvariable = 'somevalue';
  }
}

Maintenant, vous voulez accéder à $ node-> myvariable dans votre page.tpl.php. Pour cela, vous n'avez même pas besoin d'écrire une fonction de prétraitement, car Drupal ajoute déjà l'objet nœud actuel aux variables par défaut. (Cela se produit dans template_prepocess_page .) Cela signifie que vous pouvez simplement ajouter ceci à votre page.tpl.php:

<?php if ($node->myvariable): ?>
  <div class="myvariable">
    <?php print $node->myvariable; ?>
  </div>
<?php endif; ?>
6
marcvangend

Les variables accessibles à partir d'un fichier modèle peuvent être définies dans sa fonction de prétraitement, qui peut également être implémentée dans un module.

Dans votre cas, votre module doit implémenter un code similaire au suivant (remplacez "mymodule" par le nom court de votre module):

function mymodule_preprocess_page(&$variables) {
  if (!empty($variables['node'])) {
    $variables['node_count'] = db_query("SELECT count FROM {node} WHERE type = :type", array(":type" => $variables['node']->type"))->fetchField();
  }
}

Je vérifie $variables['node'] n'est pas vide car le modèle de page est également utilisé pour les pages qui ne sont pas associées à un nœud.
Dans page.tpl.php, vous accédez au même ensemble de variables à partir de la fonction de prétraitement à l'aide de $node_count.

0
kiamlaluno