36 votes

Comment utiliser les fonctions du préprocesseur du thème pour mes propres modèles ?

J'ai plusieurs fichiers .tpl.php pour les nœuds, les champs CCK et les thèmes de vues. Ces fichiers de modèles contiennent beaucoup de logique pour déplacer des éléments, supprimer des liens, créer de nouveaux liens, etc. Je comprends que c'est un mauvais développement et que ce n'est pas "la méthode Drupal".

Si j'ai bien compris, la "méthode Drupal" consiste à utiliser les fonctions du préprocesseur dans vos pages Web. template.php pour manipuler les variables et ajouter de nouvelles variables. J'ai quelques questions à ce sujet :

  • Existe-t-il une convention de dénomination pour la création d'une fonction de préprocesseur pour un thème spécifique ? Par exemple, si j'ai un modèle de champ CCK appelé content-field-field_transmission_make_model.tpl Comment dois-je nommer la fonction du préprocesseur ?
  • Puis-je utiliser les fonctions du préprocesseur de modèles pour les modèles de nœuds, les modèles de champs CCK et les modèles de vues ? Ont-elles des méthodes différentes pour modifier les variables de modèle ou en ajouter de nouvelles ?

56voto

Henrik Opel Points 16296

Pour un aperçu général, vous devriez se renseigner sur la manipulation des variables dans les fonctions de prétraitement .


En ce qui concerne la convention d'appellation, c'est normalement assez simple, mais il y a un problème pour votre exemple actuel (voir ci-dessous) :

La signature d'une fonction de prétraitement doit être

[yourModuleName|yourThemeName]_preprocess_[themeFunctionName](&$variables)

Ainsi, l'implémentation d'un modèle de page dans le fichier template.php d'un thème entraînerait les résultats suivants

themeName_preprocess_page(&$variables)

La plupart du temps, le nom de la fonction du thème sera le nom du fichier *.tpl.php, sans la terminaison .tpl.php et avec des traits de soulignement à la place des traits d'union. Mais il y a un problème si le fichier modèle est sélectionné sur la base de Suggestions de modèles car la fonction de prétraitement ne peut être mise en œuvre que pour le nom de base, et non pour les suggestions supplémentaires ! (Les suggestions de fichiers de modèles alternatifs sont ajoutées dans les fonctions preprocess elles-mêmes).

Votre exemple actuel est l'un de ces cas. content-field-field_transmission_make_model.tpl.php est une telle suggestion, le nom de base étant content-field.tpl.php et la fonction thématique correspondante étant content_field . Il faudrait donc implémenter une fonction de prétraitement nommée yourThemeName_preprocess_content_field(&$variables) et, dans ce cadre, inspectez les entrées disponibles dans le tableau $variables pour vérifier si vous êtes effectivement appelé pour le champ 'field_transmission_make_model', et non pour un champ CCK complètement différent, par exemple :

function yourThemeName_preprocess_content_field(&$variables) {
  // Are we called for the right field?
  if ('field_transmission_make_model' == $variables['field_name']) {
    // Yes, add/manipulate entries within the variables array
    $variables['new_entry'] = 'A useless new variable';
    $variables['label'] = 'A useless change of the existing label variable';
  }
}

(Note : code non testé, attention aux fautes de frappe)

Après cela, il devrait y avoir une nouvelle variable $new_entry étant disponible dans votre fichier de modèle, et le contenu de la rubrique $label devrait avoir changé (toutes les entrées de premier niveau dans le tableau $variables seront transformées en variables distinctes pour le fichier de modèle, nommées après l'index du tableau).


Pour ce qui est de votre deuxième question, l'utilisation de base des fonctions de prétraitement est la même pour tous les fichiers de modèle, mais attention :

  • Les fonctions de prétraitement sont uniquement disponibles pour les appels de thèmes qui utilisent des fichiers *.tpl.php, pas pour les fonctions du thème
  • Le contenu du tableau $variables varie fortement, en fonction de ce qui est thématisé.
  • D'autres modules peuvent également implémenter les fonctions de prétraitement, et elles seront appelées l'une après l'autre, donc si vous voulez modifier quelque chose qui est ajouté par un autre module, vous ne pourrez le faire que si votre implémentation est appelée après celle-ci (ce qui ne posera pas de problème dans votre cas, car les implémentations au sein d'un thème sont appelées après toutes les implémentations au sein des modules - je voulais juste mentionner qu'il peut y avoir plusieurs implémentations à la fois).

2voto

amitgoyal Points 548

Afin de déterminer le nom de notre fonction de prétraitement, nous devons savoir de quel fichier de modèle ou de quelle fonction de thème provient une sortie, et Un bon moyen d'y parvenir est d'utiliser la fonction développeur de thèmes module .

Voici une vidéo qui l'explique en détail. http://buildamodule.com/video/drupal-theming-essentials-template-files-theme-function-overrides-and-preprocessing-functions-how-to-use-simple-preprocessing-functions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X