Comment afficher un champ avant le titre du noeud?


41

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

Effectivement je veux aller de ceci à ceci .

Je l' ai regardé dans la mise à jour du node.tpl.php mais je remarque qu'il sépare $titlede $contentsorte que je ne suis pas sûr comment aborder ce sujet . Après quelques recherches, j'ai constaté que certaines personnes avaient suggéré d'utiliser les modules CCK et ConTemplate pour résoudre ce problème dans Drupal-6, mais je me demande s'il existe une solution plus Drupal-7.

Aucune suggestion?


En dehors de toutes les solutions de modèles basées sur php, vous pouvez également faire beaucoup de chemin avec CSS uniquement. Les marges négatives peuvent faire beaucoup. Dans votre exemple jsfiddle, cela ressemblerait à ceci .
Marcvangend

J'avais envisagé cela, mais qu'advient-il des titres longs ?
irishbuzz

Vous avez absolument raison, cela ne fonctionne que si le titre a une hauteur fixe. Comme toute solution, elle a ses points faibles. Personnellement, je pense que (quel que soit le design et la technologie que vous utilisez), les titres longs devraient être évités en éduquant les rédacteurs en chef, mais je réalise que ce n'est pas toujours une option.
marcvangend

Réponses:


53

C'est vraiment très simple avec Drupal 7.

Avec renderet hidevous savez avoir la possibilité de contrôler le placement d’un seul élément $contentsans avoir à imprimer tous les éléments vous-même comme il était nécessaire 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 astucieux que de simplement imprimer des choses, dans la mesure où Drupal gardera trace de ce qui a été rendu, pour éviter que la même chose soit imprimée deux fois à la place. Lors du rendu du champ au-dessus du titre, vous supprimez également ce qui est rendu quand $contentest rendu.


2
Très agréable. Dans un monde idéal, il serait peut-être préférable de simplement dire à Drupal de traiter le champ du titre comme n'importe quel autre champ, mais au moins dans Drupal 7, nous avons des solutions simples comme celle-ci. Félicitations @googletorp!
irishbuzz

Pour mémoire: ceci n’est guère différent de Drupal6, contrairement à ce que pourrait laisser supposer le commentaire ci-dessus.
Berkes

1
@berkes: Si vous imprimez des champs individuellement dans D6, vous devez gérer le modèle de noeud et modifier le code pour pouvoir ajouter de nouveaux champs. C'est une grande différence par rapport à D7 où vous pouvez continuer à ajouter des champs et à utiliser l'interface utilisateur pour les trier également.
googletorp

le rendu est vraiment nouveau. Mais son concept n'est pas. Il y a plusieurs astuces pour atteindre le même objectif. Je ne voulais pas dire que dans Drupal6, cela est aussi simple, propre et agréable. Simplement que c'est possible aussi.
Berkes

@googletorp est-il possible d'imprimer un champ dans page.tpl.php?
CocoSkin

9

Display Suite est également très cool.

Display Suite vous permet de contrôler totalement l'affichage de votre contenu à l'aide d'une interface glisser-déposer. Organisez vos nœuds, vues, commentaires, données utilisateur, etc. comme bon vous semble sans avoir à vous frayer un chemin parmi des dizaines de fichiers modèles. Une liste prédéfinie de mises en page (D7 uniquement) est disponible pour encore plus de plaisir grâce au glisser-déposer!


C'est un module cool, mais malheureusement, il ne semble offrir que le contrôle des champs sans titre, donc aucune aide ici. Merci tout de même.
irishbuzz

En fait, ce n'est pas vrai, il vous suffit d'installer tous les modules requis: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Decipher le

@Decipher: Installation de 3 modules pour déplacer une balise image au-dessus de la balise h2? Vous plaisantez, non :)
berkes

@berkes - Installer Drupal pour afficher une seule page Web, vous plaisantez? Mon point est que, avec ces modules installés, vous pouvez faire beaucoup, tout comme Drupal, mais vous pouvez aussi l'utiliser pour résoudre une tâche subalterne.
Déchiffrer

@Decipher: Bien sûr, l'installation de modules génériques apporte de nouvelles opportunités à votre site. Mais il est mal conseillé d'installer des vues, view-gallery, cck, filefiend et image-field pour afficher simplement une rangée d'images. Il serait bon de conseiller si vues, cck et le reste seront utilisés pour plus que seulement cette liste d'images. Mais le PO n'a pas mentionné cela du tout.
Berkes

8

Consultez le 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 au vôtre, et il a semblé donner de la souplesse quant à la manière de placer le champ de titre.

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


5

Ceci est une solution bidon 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 ferait ...

Vous pouvez utiliser page.tpl.phppour supprimer $titlecomplètement l'impression et ajouter un nouveau champ personnalisé appelé Titre avec le nom d'ordinateur $ new_title ou quelque chose du genre. Puis , le modifier node, cacher la zone Titre original, et sur le noeud Enregistrer utilisation calculée sur le terrain ou un peu 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 auparavant et vous devriez pouvoir placer les champs dans l'ordre de votre choix, simplement en les faisant glisser dans l'écran de gestion des champs. Parce que vous avez copié $new_titleà $title, le titre de la page dans la barre du navigateur devrait fonctionner et rien ne devrait se plaindre de manquer titres de nœud.

Comme je l'ai dit, c'est un bidouillage - mais cela fonctionnerait. Tenez-moi au courant si vous avez besoin de plus d'informations


1
Merci pour la suggestion Frederik. Comme vous l'indiquez, c'est loin d'être idéal, mais cela ressemble à l'une des rares solutions de contournement possibles. J'ajouterai à votre solution en suggérant que le module auto_nodetitle soit utilisé si vous utilisez cette approche. Je vais laisser la question ouverte pour le moment, car j’espère vraiment qu’il existe une meilleure solution et que je pourrai commencer à obtenir une prime. +1 pour votre effort tout de même.
irishbuzz

4

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';
  }
}

Je ne suis pas sûr de suivre ce qui se passe ici, car le premier extrait de code donne peu d'indications sur ce qui est nouveau et ce qui existe. J'utilise également le thème Zen plutôt que Garland, bien que les modifications requises devraient être similaires. Dans le deuxième extrait de code, appelez-vous un hook_preprocess_page ()? Pouvez-vous développer avec un exemple plus concret?
irishbuzz

Dans le second code, nous avons défini une nouvelle variable 'custom_block'. Regardez la partie du premier code où nous imprimons 'custom_block'. <? php if ($ custom_block): affiche '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</ div>'; fin si; ?> juste définir des règles pour générer cette variable. Alors? :)
dobeerman

4

Ceci ne s’applique pas à la question Teaser du message original, mais pour les personnes qui tombent sur cela et veulent simplement que cela se produise dans la vue complète, voici une option sans code: affichez le champ dans un bloc (en utilisant vues, par exemple) et placez ce bloc au-dessus de votre bloc de contenu mais dans la même région.


Je suis toujours un Drupal N00B, pourriez-vous expliquer ce que vous voulez dire?
Kenny Wyland

3

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 tout ce que vous voulez. ajouter / supprimer / mettre à jour.


1
Ces fonctions ne modifient pas l'ordre dans lequel le titre et les autres champs de nœud sont affichés. Pour cela, vous devez modifier le fichier de modèle.
kiamlaluno

Je vois. Je pensais que vous voudriez ajouter une valeur de champ à title.
Dobeerman

3

J'ai résolu ce problème en utilisant une solution sans code à l'aide de Display Suite et de sa fonctionnalité supplémentaire «Région à bloquer». J'aime cette solution surtout pour sa flexibilité.

Fondamentalement, activez la partie extras "Région à bloquer", activez l'affichage du "Contenu Fulltext" dans Display Suite. (en supposant que vous souhaitiez 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, à l' exception du mode Par défaut). Maintenant, dans "Gérer l'affichage" de la partie "Contenu du texte intégral", en bas de l'écran, l'onglet "Bloquer les régions" devrait apparaître. Entrez le nouveau nom du bloc ici, sauvegardez et glissez-déposez les champs désirés dans ce bloc. Enfin, déplacez le bloc nouvellement créé dans l'écran Blocs quelque part au - dessus du 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 dans la barre latérale gauche) à la fin.


2

Pour les modèles zen, le code ci-dessous 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;
}
?>

Pour finir, vous pouvez facilement imprimer votre champ dans page.tpl.php;

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

En ce qui concerne le page.tpl.php, je recevais un avertissement de variable non défini avec celui de Business Responsive Theme, mais lorsque j'ai supprimé le conditionnel, cela fonctionnait bien. En d'autres termes, j'ai changé <? Php if ($ my_image_field): print render ($ my_image_field); fin si; ?> to <? php print render ($ my_image_field); ?> Ce qui semble ne lancer aucun avertissement sur toutes mes pages.
Amy Niebel

2

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 qui construisent un thème sur Drupal 7 consisteraient à utiliser: modules Omega theme + Context et Delta. Cela donne une base très solide pour votre mise en page.

Et flexibilité pour organiser les régions, les blocs et les champs.


1

Vous pouvez faire ist avec le module panneaux


Ancienne réponse ici, mais cela a attiré un drapeau. Il vaudrait mieux expliquer un peu comment les panneaux peuvent être utilisés dans cette situation.
mpdonadio

Les panneaux représentent une surcharge considérable pour déplacer un champ dans une position différente.
Akko
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.