web-dev-qa-db-fra.com

Comment afficher le résumé (teaser) sur le corps dans une vue de contenu complète

Je souhaite afficher un teaser en haut de chaque article sous le titre, comme dans la mise en page "contenu complet" suivante:

  1. Titre
  2. Teaser (résumé de l'article)
  3. Image
  4. Corps

De plus, le teaser doit avoir sa propre mise en forme (par exemple l'italique et une police plus grande)

Je n'ai trouvé aucun moyen de le faire sans modifier les fichiers tpl ou les fichiers core.

Une solution serait d'ajouter un nouveau champ "article_teaser" à mon type de contenu, puis de gérer l'affichage afin d'obtenir ma mise en page en vue "Contenu complet". Cela fonctionne, mais je n'aime pas avoir deux champs d'accroche dans mon formulaire de contenu d'entrée, car je devrais taper deux fois le même texte.

Il semble que je ne puisse pas diviser le corps du champ en ses parties "texte" et "résumé", mais je ne peux afficher que l'une ou l'autre, mais pas les deux!

Existe-t-il un moyen (un module?) De le faire?

(Mon environnement: Drupal 7 avec le sous-thème Zen.)

11
gingo

Vous pouvez le faire avec des vues. Créez une vue qui remplace les chemins de votre type de contenu. Réglez l'affichage sur Champs , puis ajoutez deux fois le champ corps; définissez la première instance pour afficher l'accroche et la deuxième instance pour afficher le corps. Vous pouvez ajouter les images entre les deux. Views vous permettra également de personnaliser facilement le CSS des champs d'accroche/corps (par défaut, Views fournit un certain nombre de classes, et vous pouvez ajouter des classes supplémentaires si nécessaire).

Pour référence: Node One series of screencasts video on using Views

10
Patrick Kenny

sur drupal 7:

Dans le champ Corps, vous pouvez utiliser "réécrire le résultat" et utiliser dans les "modèles de remplacement" ceci:

[body-summary]

et cela affichera le résumé complet.

3
javier eduardo

Les vues peuvent certainement faire le travail. Mais je pense que c'est un peu exagéré pour cette exigence.

Une autre façon d'y parvenir est d'implémenter hook_field_extra_fields () et hook_node_view () dans votre module personnalisé.

/**
 * Implements hook_field_extra_fields().
 */
function mymodule_field_extra_fields() {
  // Put the content type you want to display summary field here.
  $content_type = 'page';

  $extra['node'][$content_type]['display']['body_summary'] = array(
    'label' => t('Body summary'),
    'description' => t('Display body summary.'),
    'weight' => 0,
  );

  return $extra;
}

/**
 * Implements hook_node_view().
 */
function mymodule_node_view($node, $view_mode, $langcode) {
  // Put the content type you want to display summary field here.
  $content_type = 'page';

  if ($node->type == $content_type) {
    $summary = field_view_field('node', $node, 'body', array(
      'type' => 'text_summary_or_trimmed',
    ));

    $node->content['body_summary'] = array(
      '#markup' => $summary,
      '#weight' => 0,  
    );
  }
}

Vider le cache et vous pouvez accéder aux paramètres de type de contenu "Gérer l'affichage" pour faire glisser et déposer pour placer le champ "résumé du corps". Par exemple admin/structure/types/manage/page/display.

3
eric.chenchao

Si vous êtes intéressé par une solution sans code utilisant des vues et module Display Suite vous pouvez:

  1. Créez un bloc de vues avec un champ récapitulatif dessus. Sous l'option de filtre contextuel dans les paramètres avancés, vous pouvez définir l'option "Fournir la valeur par défaut" avec le type Content ID de l'URL.

  2. Sous Types de contenu -> [votre type de contenu] -> Gérer l'affichage, sélectionnez l'option Champs personnalisés (menu en bas) et créez un champ de bloc personnalisé à partir de la vue que vous avez créée à l'étape 1.

  3. Lors de l'enregistrement, le champ personnalisé apparaîtra dans la liste des champs de type de nœud où vous pourrez choisir dans quelle région il apparaîtra.

0
user1795440

Comme Arjan l'a remarqué, l'extrait de Cityreader produit le résultat, mais il ne s'affiche pas correctement.

Cette variation a fonctionné pour moi:

 /**
 * Implements hook_field_extra_fields().
 */
function mymodule_field_extra_fields() {
  // Put the content type you want to display summary field here.
  $content_type = 'page';

  $extra['node'][$content_type]['display']['body_summary'] = array(
    'label' => t('Body summary'),
    'description' => t('Display body summary.'),
    'weight' => 0,
  );

  return $extra;
}

/**
 * Implements hook_node_view().
 */
function mymodule_node_view($node, $view_mode, $langcode) {
  // Put the content type you want to display summary field here.
  $content_type = 'page';

  if ($node->type == $content_type) {
    $summary = field_view_field('node', $node, 'body', array(
      'type' => 'text_summary_or_trimmed',
    ));

    $node->content['body_summary'] = array(
      '#markup' => $summary['#items'][0]['safe_summary'],
      '#weight' => 0,  
    );
  }
}
0
Mike Juic3

Pour la redéfinition du type de contenu, vous devez regarder les panneaux car l'une des fonctions des panneaux est de redéfinir exactement l'apparence de base de certains types de contenu (ou des informations basées sur d'autres critères de sélection) Csaba

0
Csaba