web-dev-qa-db-fra.com

Comment afficher un champ avant le titre du nœud?

Je cherche à rendre un certain champ avant le titre du nœud lors de l'affichage d'un teaser en D7.

En fait, je veux passer de this à this .

J'ai cherché à mettre à jour le node.tpl.php mais je remarque qu'il sépare $title de $content donc je ne sais pas comment aborder cela. Après quelques recherches, j'ai découvert que les gens ont suggéré d'utiliser CCK et ConTemplate modules pour contourner ce problème dans Drupal-6 mais je ' Je me demande s'il existe une solution plus Drupal-7.

Aucune suggestion?

39
irishbuzz

C'est vraiment assez simple avec Drupal 7.

Avec render et hide vous savez avoir la possibilité de contrôler le placement d'un seul élément dans $content sans avoir à imprimer tous les éléments vous-même comme il fallait dans Drupal 6.

Un modèle de nœud simplifié ressemble à ceci:

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Une petite modification répondrait à vos besoins:

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

En utilisant render, vous pouvez sortir un élément. C'est plus intelligent que d'imprimer simplement des trucs, car Drupal gardera une trace de ce qui a été rendu, pour éviter que la même chose ne soit imprimée deux fois sur le site. Lors du rendu du champ au-dessus du titre, vous êtes supprimant également ce qui est rendu lorsque $content est rendu.

51
googletorp

Display Suite est également assez cool.

Display Suite vous permet de prendre le contrôle total de la façon dont votre contenu est affiché à l'aide d'une interface glisser-déposer. Organisez vos nœuds, vues, commentaires, données utilisateur, etc. comme vous le souhaitez sans avoir à vous frayer un chemin à travers des dizaines de fichiers modèles. Une liste prédéfinie de mises en page (D7 uniquement) est disponible pour encore plus de plaisir par glisser-déposer!

8
stevepurkiss

Jetez un œil au module Titre - http://drupal.org/project/title . Cela pourrait s'avérer utile pour votre scénario. Je l'ai installé/activé pour une raison quelconque, probablement similaire à la vôtre, et cela semblait donner de la flexibilité sur la façon de placer le champ de titre.

Je l'ai depuis désactivé (et j'utilise Display Suite), donc mon rappel pourrait être un peu sommaire.

7
Greta

C'est une solution hackeuse et je suis sûr que quelqu'un trouvera quelque chose de plus élégant, mais au cas où vous seriez coincé, et personne ne le fait ...

Vous pouvez utiliser page.tpl.php pour supprimer l'impression de $title au total, et ajoutez un nouveau champ personnalisé appelé Titre avec le nom de machine $ new_title ou quelque chose comme ça. Ensuite, lors de la modification du nœud, masquez la zone de titre d'origine, et sur le nœud Enregistrer, utilisez le champ calculé ou un php personnalisé pour copier le $new_title à $title.

Après tout cela, écrivez quelques css pour que $ new_title ressemble au titre de la page avant et vous devriez pouvoir placer les champs dans l'ordre que vous voulez, juste en faisant glisser et en déposant dans l'écran de gestion des champs. Parce que vous avez copié $new_title à $title, le titre de la page dans la barre de navigation devrait toujours fonctionner et rien ne devrait se plaindre des titres de noeud manquants.

Comme je l'ai dit, c'est un hack - mais ça marcherait. Tenez-moi au courant si vous avez besoin de plus d'informations

4
Frederik

page.tpl.php (guirlande)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}
3
dobeerman

Cela ne s'applique pas à la question Teaser dans le post d'origine, mais pour les personnes qui tombent dessus et veulent simplement que cela se produise en mode plein écran, voici une option sans code: affichez le champ dans un bloc (en utilisant les vues, par exemple) et placez ce bloc au-dessus de votre bloc de contenu mais dans la même région.

3
brad

Je pense que vous devriez utiliser des fonctions de prétraitement dans votre template.php

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

Et en plus

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

vider les variables et faire ce que vous voulez. ajouter/supprimer/mettre à jour.

2
dobeerman

J'ai résolu ce problème en utilisant une solution sans code en utilisant Display Suite et sa fonction supplémentaire "Région à bloquer". J'aime le plus cette solution pour sa flexibilité.

Fondamentalement, activez la partie supplémentaire "Région à bloquer", activez l'affichage "Contenu en texte intégral" dans Display Suite. (en supposant que vous souhaitez afficher le contenu au-dessus du titre dans l'affichage du nœud complet, vous pouvez également l'utiliser pour tout autre mode d'affichage sauf Par défaut). Maintenant, dans la partie "Gérer l'affichage" du "Contenu en texte intégral", en bas de l'écran, l'onglet "Bloquer les régions" devrait apparaître. Saisissez un nouveau nom de bloc, enregistrez et faites glisser et déposez les champs souhaités sur ce bloc. Enfin, déplacez le bloc nouvellement créé dans l'écran Blocs quelque part ci-dessus le titre du nœud.

Vous pouvez voir la vidéo de la même approche ici: http://www.youtube.com/watch?v=y4wyjxyhbNA , bien sûr, vous devez placer le bloc au-dessus du titre (pas sur la barre latérale gauche) à la fin.

2
Mirsoft

Pour les modèles zen ci-dessous, le code fonctionne pour moi.

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

Donc, enfin, vous pouvez facilement imprimer votre champ dans page.tpl.php;

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>
1
user991554

Je sais que vous auriez déjà utilisé un thème pour créer et que vous essayez maintenant d'ajouter les champs en haut du titre.

Mes suggestions à tous les développeurs construisant un thème sur Drupal 7 serait d'utiliser: Thème Omega + Context et modules Delta. Cela donne une base très solide pour votre mise en page.

Et la flexibilité dans l'organisation des régions, des blocs et des champs.

1
AnAnD

Vous pouvez faire ist avec le module de panneaux

0
houmem