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()
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?
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 produira 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 devez utiliser le caractère # uniquement 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 renvoie 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 Drupal, le module de 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 enfants $form['#action']
Et $form['basic']['submit']
Sont-ils?
Comme autre remarque, j'ajouterai que hook_view()
est invoqué par Drupal uniquement pour 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 pour 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 $hook
Pour le module implémentant le type de contenu du nœud passé en argument.