Drupal – Theming multigroup pour cck v3
J’ai souhaité dernièrement créer un thème pour un type de contenu CCK v3 qui utilise les multigroup.
L’utilisation de CCK v3 est justement pour utiliser les multigroup.
Pour personnaliser l’aspect d’un type de contenu, il existe un module Drupal très pratique nommé Contemplate (Content Template) qui permet de récupérer le code par défaut appelé par un type de contenu.
Par contre, c’est là la raison de mon article, Contemplate n’arrive pas à récupérer les variables liées aux multigroupes.
Voici le problème qui m’a amené à souhaitez personnaliser un multigroup cck :
Mon tableau actuellement à l’affichage est sur 3 colonnes :
Langues étrangères | Ajouter | Niveau de Connaissances |
Anglais | Bon | |
Japonais | Connaissances de bases |
Les colonnes «Langues étrangères» et «Ajouter» pointent sur la même taxonomie, je voudrais donc les rassembler en une seule colonne.
En gros je souhaiterais que mon affichage soit comme ci-dessous :
Langues étrangères | Niveau de Connaissances |
Anglais | Bon |
Japonais | Connaissances de bases |
Le premier champ est un champ «Content Taxonomy» au format liste déroulante qui va pointer sur la même taxonomie que le deuxième champs qui est lui aussi un champ «Content Taxonomy», mais lui est au format «autocomplete»
Le troisième champ est une bête champ texte au format liste déroulante avec un certain nombre de valeurs possible (lui on s’en fout)
Les gens qui remplissent mon type de contenu doivent choisir un élément de la liste déroulante (champ 1) et si il ne trouve pas ce qu’ils veulent, peuvent ajouter un terme via le champ autocomplete (champ 2)
Le mieux aurait été un «conditionnal field» mais ça ne fait pas ce que je veux.
Mais du coup ça me donne 3 colonnes à l’affichage et je n’en veux que 2 comme illustré plus haut…
De plus, je suis obligé de connaître le nombre de ligne qu’il y aura à afficher car aucun champ n’est obligatoire, donc si je parcoure la première colonne, dès que ma boucle arrivera au dernier élément de la première colonne, l’affichage s’arrêtera, idem pour la deuxième…
Ceci explique la boucle qui compte la colonne la plus longue que vous allez voir ci-dessous, qui d’ailleurs m’a été proposé par Jean-Marc, et je ne remercie grandement
Donc voici le code à insérer pour personnaliser l’affichage de vos multigroup cck v3 : (Ce qui est en majuscule identifie votre variable à personnaliser bien sur)
// N'affiche pas le multigroup si vide < ?php if(!empty($node->content['group_NOM_GROUP']['group']['#children'])) { ?> <fieldset class="content-multigroup-group-NOM-GROUP content-multigroup-display-table-multiple-columns"> <legend>< ?php print $node->content['group_NOM_GROUP']['group']['#title']; ?></legend> // Permet d'afficher la description < ?php print (isset($node->content['group_NOM_GROUP']['group']['#description']) && $node->content['group_NOM_GROUP']['group']['#description'] ? ' <div class="description">'. $node->content['group_NOM_GROUP']['group']['#description'] .'</div> ' : ''); ?> < ?php $rows = null; // Permet de renseigner les headers du tableau $header_1= $node->content['group_NOM_GROUP']['group']['#fields']['field_NOM_FIELD_1']['widget']['label']; $header_2= $node->content['group_NOM_GROUP']['group']['#fields']['field_NOM_FIELD_2']['widget']['label']; $headers= (array("$header_1", "$header_2")); //Compte qu'elle est la colonne la plus longue et fournit la liste de tous les elements if (count($node->field_NOM_FIELD_1) > count($node->field_NOM_FIELD_2)) { $long = $node->field_NOM_FIELD_1; $short = $node->field_NOM_FIELD_2; } else { $long = $node->field_NOM_FIELD_2; $short = $node->field_NOM_FIELD_1; } //Parcourt la liste prealable et remplis la variable row $fields = array(); foreach($long as $key => $value) { if ($value['value'] == null) { $id = $short[$key]['value']; } else { $id = $long[$key]['value']; } $rows[] = array( $node->taxonomy[$id]->name, $node->field_NOM_FIELD_3[$key]['value'] ); } print theme('table', $headers, $rows); ?></fieldset> < ?php } ?>
Il est à noter que j’utilise la fonction theme_table disponible dans l’API Drupal
Pour info, cette ligne permet d’afficher tout le tableau mutligroup comme a l’origine
print $node->content['group_NOM_GROUP']['group']['#children'];
Voilà, vous savez désormais comment personnaliser l’affichage de vos mutligroup cck v3