Ajoutez votre propre contenu au nœud


8

J'ai créé un module qui ajoute du contenu personnalisé à un nœud; Je voudrais afficher ce contenu personnalisé dans la vue du nœud. Je pense que hook_node_view()c'est le bon crochet à utiliser, mais mon contenu ne s'affiche pas.

ce que j'ai obtenu jusqu'à présent est le code suivant:

function mymodule_node_view($node, $view_mode = 'full', $langcode = NULL) {
$node->content['mymodule']['#items'][0] = array(
    'value' => theme('mymodule_output', array('mymodule_cid' => $node->mymodule_cid)),
    'summary' => '',
    'format' => 'full_html',
    'safe_value' => theme('mymodule_output', array('mymodule_cid' => $node->mymodule_cid)),
    'safe_summary' => '',
);
$node->content['mymodule']['#weight'] = 12; 
}

Quelqu'un peut-il aider?

Réponses:


19

TL; DR: le hook est correct, mais $node->content['mymodule']['#items'][0]doit au moins contenir l'un de ces index / propriétés de tableau: " #markup " ou " #theme "; si vous n'en utilisez pas, Drupal ne sortira rien.

Si les index de tableau que vous utilisez sont des propriétés gérées par votre fonction de thème, vous devez utiliser # au début; par exemple, "format" deviendrait "#format" (il en va de même pour les autres propriétés).

Quoi qu'il en soit, il n'est pas nécessaire d'utiliser le "format" comme vous le faites (quelle que soit sa signification); la fonction vient de sortir du HTML, comme dans l'exemple montré dans l' exemple hook_node_view () .

function hook_node_view($node, $view_mode, $langcode) {
  $node->content['my_additional_field'] = array(
    '#markup' => $additional_field, 
    '#weight' => 10, 
    '#theme' => 'mymodule_my_additional_field',
  );
}

Si vous voulez des exemples plus concrets de ces implémentations de hook, vous pouvez regarder book_node_view () , statistics_node_view () et translation_node_view () .

function book_node_view($node, $view_mode) {
  if ($view_mode == 'full') {
    if (!empty($node->book['bid']) && empty($node->in_preview)) {
      $node->content['book_navigation'] = array(
        '#markup' => theme('book_navigation', array('book_link' => $node->book)), 
        '#weight' => 100,
      );
    }
  }

  if ($view_mode != 'rss') {
    book_node_view_link($node, $view_mode);
  }
}

En remarque, j'ajouterai que vous ne devez utiliser le caractère # que pour les propriétés, ou vous allez confondre Drupal, qui s'attend à ce que ce caractère soit utilisé uniquement pour les propriétés.
En fait, element_children () , qui retourne la liste des éléments enfants de l'élément passé en argument, utilise le code suivant:

  foreach ($elements as $key => $value) {
    if ($key === '' || $key[0] !== '#') {
      $children[$key] = $value;
      if (is_array($value) && isset($value['#weight'])) {
        $sortable = TRUE;
      }
    }
  }

Comme vous le voyez, les éléments dont la valeur de clé commence par # ne sont pas considérés comme des éléments enfants; autrement, Drupal ne serait pas capable de gérer un cas comme celui-ci (le code est vraiment implémenté par un module Drupal, le module Recherche):

  $form['#action'] = url($action);
  // Record the $action for later use in redirecting.
  $form_state['action'] = $action;
  $form['#attributes']['class'][] = 'search-form';
  $form['module'] = array(
    '#type' => 'value',
    '#value' => $module,
  );
  $form['basic'] = array(
    '#type' => 'container',
    '#attributes' => array('class' => array('container-inline')),
  );
  $form['basic']['keys'] = array(
    '#type' => 'textfield', 
    '#title' => $prompt, 
    '#default_value' => $keys, 
    '#size' => $prompt ? 40 : 20, 
    '#maxlength' => 255,
  );
  // processed_keys is used to coordinate keyword passing between other forms
  // that hook into the basic search form.
  $form['basic']['processed_keys'] = array(
    '#type' => 'value',
    '#value' => '',
  );
  $form['basic']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Search'),
  );

Les éléments sont $form['#action']et $form['basic']['submit']enfants?

Comme autre note latérale, j'ajouterai que hook_view()Drupal invoque uniquement les modules qui implémentent un type de contenu. En fait, les implémentations de ce hook sont invoquées par node_build_content () en utilisant le code suivant:

  // The 'view' hook can be implemented to overwrite the default function
  // to display nodes.
  if (node_hook($node, 'view')) {
    $node = node_invoke($node, 'view', $view_mode, $langcode);
  }

Le code de node_invoke () est le suivant:

  if (node_hook($node, $hook)) {
    $base = node_type_get_base($node);
    $function = $base . '_' . $hook;
    return ($function($node, $a2, $a3, $a4));
  }

Le code invoque $hookpour le module implémentant le type de contenu du nœud passé en argument.

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.