J'ai quelques types de contenu que je dois prétraiter de différentes manières. Donc, template.php
dans mon thème foo
ressemble actuellement à:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Je voudrais pouvoir spécifier une fonction de prétraitement spécifique à Drupal qui accrocherait le nom de machine du type de contenu. J'ai essayé d'utiliser foo_preprocess_news
mais on ne l'appelle jamais.
Y a-t-il une meilleure façon?
foo_preprocess_node
en l'implémentant commecall_user_func('_preprocess_' . $vars['type'], $vars);
pour éviter de répéter les ifs mais il vaut probablement mieux rester simple.hook_preprocess_node()
un module personnalisé et j'espérais que cela restreindrait le moment où le hook serait appelé, mais ce n'est pas le cas. Est-il possible de restreindre le moment où le hook est appelé par type de contenu?if ($vars['node']->type == 'foo') { ...
obtiendrez l'effet que vous recherchezhook_block_view_MODULE_DELTA_alter()
. Je fais actuellement ce que vous dites, mais j'aimerais qu'il y ait un moyen de restreindre le moment où le crochet est touché.Le sous-thème zen accomplit cela en ajoutant ceci à sa fonction theme_preprocess_node:
Si vous avez un type de contenu appelé 'news', vous pourrez alors créer une fonction appelée foo_preprocess_node_news dans votre fichier template.php.
la source
Je viens juste d'avoir un problème similaire , c'est pourquoi Google m'a amené à cette page: ma fonction de prétraitement de nœud grandissait tellement énormément, que je préférerais diviser la fonction en plusieurs fichiers.
J'ai déjà fait une approche similaire dans mon fichier template.php qui contient toutes les fonctions alter, et puisque la même méthode fonctionne parfaitement bien ici, j'ai pensé partager mon approche:
configuration du fichier dans le dossier
MYTHEME/preprocess
:vous devriez déjà avoir
node.preprocess.inc
, les autres que vous pouvez créer vous-même. la façon dont vous les appelez est vraiment plutôt arbitraire, mais il vaut mieux leur donner des noms qui les identifient bien et qui correspondent à tout le système de nommage drupal.au contenu de ces fichiers!
nous passons essentiellement par le type du nœud actuel. ce que vous passez dépend de vous;
#id
,#view_mode
Tout en fonction de vos besoins.une fois qu'il y a correspondance, il chargera le fichier spécifié et agira sur son contenu comme s'il avait été écrit directement dans cette fonction.
le contenu de ces
included
fichiers ressemble exactement à ce que vous auriez mis dans lenode.preprocess.inc
fichier, sauf que nous n'appelons pas à nouveau la fonction de prétraitement:vous pouvez essentiellement le faire avec autant de fichiers que vous le souhaitez et même mettre en cascade plusieurs commutateurs, par exemple en divisant davantage des fichiers de prétraitement de nœuds spécifiques en fonction du
#view_mode
, en ayant un fichier pour lefull
mode d'affichage et un autre pour leteaser
j'espère que cela vous aidera, si quelqu'un tombe à nouveau sur cette question (:
la source
call_user_func()
ne transmet pas les paramètres par référence. Ainsi, dans le cas où$variables
vospreprocess_foo()
fonctions fonctionneront uniquement sur des copies de la matrice d'origine; les modifications sur les non-objets ne s'appliqueront pas pendant le processus de rendu restant.la source
Dans votre hook_preprocess_node principal Implémentez le code suivant à la fin
Vous devriez donc prétraiter maintenant par type de nœud
la source