web-dev-qa-db-fra.com

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

J'ai plusieurs fichiers .tpl.php pour les nœuds, les champs CCK et le thème Vues. Ces fichiers de modèle contiennent beaucoup de logique pour déplacer les choses, supprimer les liens, créer de nouveaux liens, etc. Je comprends que c'est un mauvais développement et non "The Drupal Way").

Si je comprends bien, "The Drupal Way" consiste à utiliser les fonctions de préprocesseur dans votre template.php fichier pour manipuler les variables et ajouter de nouvelles variables. Quelques questions à ce sujet:

  • Existe-t-il une convention de dénomination pour créer 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 nommer la fonction de préprocesseur?
  • Puis-je utiliser les fonctions de préprocesseur de modèle pour les modèles de noeud, les modèles de champ CCK et les modèles de vues? Ont-ils différentes méthodes pour modifier les variables de modèle ou en ajouter de nouvelles?
36
jergason

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


Concernant la convention de dénomination, c'est normalement assez simple, mais il y a un hic pour votre exemple actuel (voir ci-dessous):

Une signature de fonctions de prétraitement doit être

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

donc en implémenter un pour le modèle de page dans un fichier de thèmes template.php entraînerait

themeName_preprocess_page(&$variables)

La plupart du temps, le nom de la fonction de thème sera le nom du fichier * .tpl.php, sans la fin du .tpl.php et avec des traits de soulignement au lieu des tirets. Mais il y a un hic si le fichier de modèle est sélectionné sur la base de suggestions de modèle , car la fonction de prétraitement ne peut être mis en œuvre pour le nom de base, pas pour les suggestions supplémentaires! (Les suggestions de fichiers modèles alternatifs sont ajoutées dans les fonctions de prétraitement elles-mêmes.)

Votre exemple actuel est l'un de ces cas, car content-field-field_transmission_make_model.tpl.php Est une telle suggestion, avec le nom de base étant content-field.tpl.php Et la fonction de thème correspondante étant content_field. Vous devez donc implémenter une fonction de prétraitement nommée yourThemeName_preprocess_content_field(&$variables), et inspecter les entrées disponibles dans le tableau $ variables pour vérifier si vous êtes réellement appelé pour le 'field_transmission_make_model', et non pour un CCK complètement différent. domaine, 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';
  }
}

(Remarque: code non testé, méfiez-vous des fautes de frappe)

Après cela, il devrait y avoir une nouvelle variable $new_entry Disponible dans votre fichier modèle, et le contenu de la variable $label Devrait avoir changé (toutes les entrées de niveau supérieur dans le tableau $ variables seront tournées dans des variables distinctes pour le fichier modèle, nommées d'après l'index du tableau).


Quant à 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 sachez:

  • Les fonctions de prétraitement ne sont disponibles que pour les appels de thème qui utilisent des fichiers * .tpl.php, pas pour les fonctions de thème
  • Le contenu du tableau $ variables varie fortement, en fonction de ce qui est à thème
  • D'autres modules peuvent également implémenter les fonctions de prétraitement, et ils seront appelés les uns après les autres, donc si vous voulez changer quelque chose qui est ajouté par un autre module, vous ne pouvez le faire que si votre implémentation est appelée après cela (ce qui ne sera pas problème dans votre cas, car les implémentations dans un thème sont appelées après toutes les implémentations dans les modules - je voulais juste mentionner qu'il peut y avoir plusieurs implémentations à la fois)
56
Henrik Opel

Afin de déterminer le nom de notre fonction de prétraitement, nous devons savoir de quel fichier de modèle ou fonction de thème provient une sortie, et un excellent moyen de le faire est d'utiliser le - développeur de thème 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

2
amitgoyal