Theming : Comment répartir le $content sur plusieurs régions ?

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Je cherche à répartir le contenu créé via un node ($content), dans une mise en page multicolonne.
Par exemple; le contributeur créer un contenu ayant un texte et des photos.Il va donc remplir le champ dédié au texte et ajouter ses photos (qui seront traitées par image cache et gallery assist); puis valider.
Tout ce beau monde va alors se retrouver dans le $content...je voudrais plutot que la galerie soit affiché dans une colonne (région $right par ex. à coté du texte) ? est ce possible sans passer par block ou panel ? sinon j'ai deja réussi à faire cela en css via un float, mais il ne s'agissait que d'une seul image sans effet (pas de LBox)...cela pourrait il marcher pour une galerie entière ?

avez vous des exemples de réalisation ? des conseils ?

merci

Version de Drupal : 

si tu fais ton tpl ça pourrais fonctionner avec un < div id="colonne_gauche"> et une autre < div id="colonne_droite"> que tu positionnes en css et où tu affiches les champs correspondants dans chaque div.

Display Suite (et sa suite de modules) peut faire l'affaire. Mais l'affichage se fera toujours par colonnes mais en place du $content, sans utiliser les colonnes gauche et droite du thème. Je sais pas si je suis claire, mais le mieux c'est de tester le module.

pas de problème pour avoir des colonnes dans mon tpl, j'ai une base en 3 colonnes..mon problème est de pouvoir indiquer quelle part du contenu créé via la création classique d'un noeud, va où ...car pour l'instant tout ce qui est créé via l'interface est automatiquement mis dans $content, non ? je maitrise la partie qui consiste à créer des régions pour y mettre des blocs...mais pas celle qui consiste à mettre dans ces régions du contenu issu d'un node...sauf à faire 2 types de contenu :

1- le texte
2- la galerie

puis faire une vue de type bloc qui affiche cette galerie et la positionner dans une région $right..mais cela oblige à créer 2 noeuds...ce que mes utilisateurs auront peut etre du mal à saisir en terme de logique...vous voyez le souci ? c'est de vouloir faire un mécanisme simple de création de noeud (1 compte rendu = 1 noeud) tout en ayant une mise en page plus travaillée..

duplique le fichier node.tpl.php en node-nom_ton_type_contenu.tpl.php et commente la ligne

<?php
 
print $content
?>

et à la place met par exemple n'importe quelle phrase en html.

Tu verras que quand tu voudras afficher ton contenu, tu n'auras plus le contenu mais ta phrase saisie.

Il te suffit donc d'insérer les variables que tu souhaites afficher.
Pour les connaître utilise le module contemplate ou fait un

< pre >
< ?php print_r($node); ?>
< /pre>

ainsi si dans ton tpl tu mets quelque chose comme

<?php
 
print $node->title
?>

ça t'affichera ton titre ...

très bien ca, ainsi je vais pouvoir décortiquer le contenu de $content..je m'y colle..par contre il faut que je créer un exemple factice avant afin de lister non ? mais une fois listé, je pourrais en effet dispatcher les éléments dans mes régions..exactement ce que je veux faire...

Je crois pas que ce module existe déjà. Panel pourrait faire très facilement qqc d'approchant, sinon DS comme je le disais.

Sinon, si tu ne souhaites "qu'attacher" un texte à une galerie, il te suffit d'utiliser, dans Views, les zones "Header" et/ou "Footer". Après je suppose que tu as une div qui entoure tout ça, (sinon tu la rajoutes dans le code) donc tu peux organiser comme bon te semble avec css et avoir un affichage sur deux colonnes ou trois colonnes par exemple.

en fait au point ou nous en sommes je recense pas moins de 4 possibilités voire 5 :

  • ma solution avec 2 nodes et View
  • la solution de Selinav en décomposant le $ content
  • les solutions de floown : soit avec DS, soit avec Panel
  • la solution View de floown

celle de selinav semble être celle qui va requérir le moins de ressources serveur,je pense, les modules ça alourdi la chose mais ça peut rendre service, tout dépend du niveau du créateur du site ( developpeur,designer, webmaster..) , la dernière solution avec View m'a l'air bien aussi, même si elle requiert des requêtes, ça peut le faire.

Je vais tenté la solution "light", si ça coince alors je passerai par view, car je ne veux pas trop alourdir le site avec trop de modules..

qu'en pensez vous ?

effectivement mieux vaut agir au niveau du tpl pour économiser de la ressource, en plus c'est indispensable de savoir faire car tôt ou tard tu auras besoin de modifier des tpl que ce soit pour tes pages, node ou views.

poppopoop ne vous énervez pas ! ;)
j'utilise view en effet,qui ne le fais pas d'ailleurs?; mais je teste plusieurs voies afin de voir laquelle je maitrise le mieux..

@selinav : donc j'ai commencé avec celle du tpl.php ; j'ai créé une page test : http://www.lycee-brise-lames.fr/sortie-test

et j'ai des tonnes d'infos..dont je ne sais pas trop laquelle choisir...

@floown : je vais quand même voir ta solution floown (pas de jaloux hein), car ça m'intéresse de creuser l'usage de view aussi, ce module étant surpuissant..si tu as des tutos sur et usage de view je suis preneur

La soluce de Selinav est sympa aussi. Mais pour cela il te faudrait également utiliser Insert Views si tu veux pas faire tes requêtes à la main... Donc à méditer...

Si tu choisis tout de même cette voie là, moi j'installerais Content template le temps de récupérer les variables, tu pourras toujours le désactiver une fois que tu auras tes templates.

Je voulais juste rajouter que si tu édites un node-ton-type-de-contenu.tpl.php, tu vas pas pouvoir dispatcher les éléments selon les régions, mais selon la région occupée normalement par le contenu. D'ailleurs mes soluces ne modifient également que le $content.

Si tu voulais vraiment avoir la soluce qui réponde parfaitement à ton idée (utiliser toutes les régions), il faudrait voir plutôt du côté du page.tpl.php. C'est pas infaisable.

Si tu voulais exploiter la soluce avec Views et le champ header et/ou footer, tu dois pouvoir dire en php :

  • si tu es sur tel terme du vocabulaire x, tu affiches ce texte

  • si tu es sur tel autre terme de vocabulaire x, tu affiches cet autre texte.

Je suis une bille en php, je peux pas bcp t'aider (voir du côté de case, je pense).

Si tu voulais vraiment avoir la soluce qui réponde parfaitement à ton idée (utiliser toutes les régions), il faudrait voir plutôt du côté du page.tpl.php. >>> c'est ce que je fais, je créer mes tpl.php en fonction du nom du type de contenu via du php dans template.php...

pour ce qui est de mon probleme,si j'arrive à splitter le $content en différentes variables,alors je pourrais les assigner à une div particulière de mon TDC.tpl.php

si view ne propose que le footer ou le header, ca m'avance pas car moi je cherche à dispatcher uniquement dans la DIV content.

maintenant à toi de voir ce qui te convient le mieux et les avantages et inconvénients de chaque méthode.

J'ai jeté un oeil à ton lien, pense à entourer le print_r de la balise < pre> pour formater les données.

En fait ça te retourne un objet.

bon courage

en effet la balise n'est pas très bien écrite, ca marche mieux la.je pense aller au bout de ta méthode.je ne suis pas assez a l'aise avec views pour l'instant.
donc mon souci est de trouver ce fameux objet afin de le dispatcher (cad le texte, la galerie..)

EDIT: j'ai tenté ca

<?php
   
print $node->ganame;      
?>

mais sans succés, que se soit avec ou sans le ;

contemplate me donne ce que j'ai mis en 1er comme valeur...mais l'affichage ne change pas, toujours identique comme si $content était toujours dans le code...bizarre,j'ai vide les caches..rien a faire,je comprends plus la.

je suis dans page-TdC.tpl.php , je ne touche pas à node...par contre puis je créer node-TdC.tpl avec le même nom de TdC ? par contre je l'ai supprimé dans page-XXX ; mais si cela veut dire qu'il faut intervenir sur node-XXX alors ca va compliquer l'affaire au niveau de la page non ?

explication :

ton fichier page.tpl.php va générer ta page avec toutes les balises d'une page html :
html, head, body ainsi que les différentes régions de ton thème.

Le fichier node.tpl.php va générer uniquement les informations de tes différents type de contenu.

Dans ton fichier page.tpl.php tu vas trouver également une ligne

<?php
 
print $content
?>

qui va appeler le fichier node.tpl.php

Donc si pour tous tes types de contenu ta mise en page globale (régions) ne change pas il ne faut pas toucher au page.tpl.php
Si jamais tu avais une mise en page complètement différente par exemple dans le cas de la page d'accueil tu auras 2 fichiers : page-front.tpl.php (pour la mise en page de la page d'accueil) et page.tpl.php pour toutes les autres pages.

Donc dans ton cas il faut uniquement avoir un fichier node-tdc.tpl.php dans lequel tu mettras du code du genre (exemple d'un de mes fichiers) en jouant avec tes div pour tes colonnes.

<div class="node <?php print $classes; ?>" id="node-<?php print $node->nid; ?>">
  <div class="node-inner">

    <?php if (!$page): ?>
      <h2 class="title"><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
    <?php endif; ?>

    <?php print $picture; ?>

    <?php if ($submitted): ?>
      <span class="submitted"><?php print $submitted; ?></span>
    <?php endif; ?>

    <div class="content">
     
      <div class="field field-type-text field-field-profil">
          <div class="field-items">
              <div class="field-item odd">
                  <div class="field-label-inline-first"><img src="/sites/all/themes/basic/css/images/puce_feuille.png" />&nbsp;Profil:&nbsp;</div>
                  <?php //affichage corps du texte
             
print $node->content['body']['#value'] ?>

              </div>
          </div>
      </div>
     
      <div class="field field-type-text field-field-job-ref-offre">
          <div class="field-items">
              <div class="field-item odd">
                  <div class="field-label-inline-first">R&eacute;f Offre:&nbsp;</div>
                  <?php print $node->field_job_ref_offre[0]['view'] ?>
              </div>
          </div>
      </div>
     
      <div class="field field-type-text field-field-job-type">
          <div class="field-items">
              <div class="field-item odd">
                  <div class="field-label-inline-first">Type de contrat:&nbsp;</div>
                  <?php print $node->field_job_type[0]['view'] ?>
              </div>
          </div>
      </div>
   </div>

    <?php if ($terms): ?>
      <div class="taxonomy"><?php print $terms; ?></div>
    <?php endif;?>

    <?php if ($links): ?>
      <div class="links"> <?php print $links; ?></div>
    <?php endif;

/<em>echo '<pre>';
print_r($node);
echo
'</pre>';</em>/?>

  </div> <!-- /node-inner -->
</div> <!-- /node-->

ok je comprends, j'ai actuellement créé 5 TdC auxquels correspondront 5 fichiers page-TdC.tpl.
La ou j'avais du mal ,c'est que je pensai que les éléments de node.tpl venez s'mbriquer dans page.tpl, alors qu'ils surpasse (override) le page.tpl..non ? si j'ai bon alors imaginons un layout 3 colonnes.

Je voudrais que mon node se repartisse sur 2 des 3. je dispatche alors dans node-TdC.tpl sur la colonne1 et 2. La 3eme sera celle par defaut donné par mon page-TdC.tpl... vrai ?

alors il ne me reste plus qu'a créer un node-TdC.tpl qui va surpasser les ID et les div du page-TdC.tpl avec le code vu précedemment

pour faire plus simple, ne touche pas ton page.tpl.php et dans ton node-tdc.tpl.php tu crées 3 div dans lesquelles tu incorpores ton code

< div id="colonne_gauche">
tes champs de ta colonne gauche
< /div>
< div id="colonne_centrale">
tes champs de ta colonne centrale
< /div>
< div id="colonne_droite">
tes champs de ta colonne droite
< /div>

et pour que ça fonctionne bien tu ne mets rien dans les régions gauche et droite de ton thème ainsi ton node occupera tout l'espace.

Après tu n'as plus qu'à styler le tout en CSS

en terme de css sa fonctionne bien ,mais je ne trouve pas la variable qui m'affcihe la galerie...
j'ai essayé avec plusieurs combinaisons sans succé :

<?php
 
print $node->gallitems['#nid']; 
?>

ou

<?php
 
print $node->ganame
?>

je ne suis plus très loin de réussir du coup..

bon j'ai trouvé un dossier template dans le module,avec ceci dans un tpl:

* Available variables:
* - $type: An string with the type of the node.
* - $pager: An string with contains the rendered pager for the Gallery Assist page view.
* - $boxes: An string with the rendered gallery item boxes.
* - $conf: An array with the necesary content to display the gallery item.

mais je ne sais pas trop quoi en faire

j'ai enfin réussi a splitter le contenu d'un node..mais il me reste un gros morceaux, celui de récupérer un terme de taxonomie associé et de l'afficher dans un endroit défini de mon node.tpl custom...
je pense que la bonne notation est

<?php
 
print $node->taxonomy[7]->name
?>

mais le chiffre représentant le tid, c'est pas du tout dynamique ,alors il va me falloir passer par une fonction du template.php...et la c'est pas gagné car je ne sais pas faire, avez une telle fonction qui permette de récupérer un terme ou un vocabulaire défini ?

merci de votre aide