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
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
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!
node.preprocess.inc
, ici je fais quelque chose comme ça:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
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 le node.preprocess.inc
fichier, sauf que nous n'appelons pas à nouveau la fonction de prétraitement:
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
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 le full
mode d'affichage et un autre pour leteaser
j'espère que cela vous aidera, si quelqu'un tombe à nouveau sur cette question (:
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.