TL; DR: l'hook è corretto, ma $node->content['mymodule']['#items'][0]
dovrebbe almeno contenere uno di questi indici / proprietà dell'array: " #markup " o " #theme "; se non ne usi uno, Drupal non produrrà nulla.
Se gli indici di array che usi sono per proprietà gestite dalla tua funzione tema, allora dovresti usare # all'inizio; per esempio "format" diventerebbe "#format" (lo stesso vale per le altre proprietà).
In ogni caso, non è necessario utilizzare "format" come fai tu (qualunque significato abbia); la funzione ha appena generato l'HTML, come nell'esempio mostrato nell'esempio 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',
);
}
Se vuoi alcuni esempi più concreti di tali implementazioni hook, puoi guardare book_node_view () , statistics_node_view () e 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);
}
}
Come nota a margine, aggiungerò che dovresti usare il carattere # solo per le proprietà, o confonderai Drupal, che si aspetta che quel personaggio venga usato solo per le proprietà.
In effetti element_children () , che restituisce l'elenco di elementi figlio dell'elemento passato come argomento, utilizza il seguente codice:
foreach ($elements as $key => $value) {
if ($key === '' || $key[0] !== '#') {
$children[$key] = $value;
if (is_array($value) && isset($value['#weight'])) {
$sortable = TRUE;
}
}
}
Come vedi, gli elementi il cui valore chiave inizia con # non sono considerati elementi figlio; diversamente, Drupal non sarebbe in grado di gestire un caso come questo (il codice è realmente implementato da un modulo Drupal, il modulo di ricerca):
$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'),
);
Sono $form['#action']
e $form['basic']['submit']
elementi figlio?
Come altra nota a margine, aggiungerò che hook_view()
viene invocato da Drupal solo per i moduli che implementano un tipo di contenuto. In effetti, le implementazioni di quell'hook sono invocate da node_build_content () usando il seguente codice:
// 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);
}
Il codice per node_invoke () è il seguente:
if (node_hook($node, $hook)) {
$base = node_type_get_base($node);
$function = $base . '_' . $hook;
return ($function($node, $a2, $a3, $a4));
}
Il codice invoca $hook
per il modulo che implementa il tipo di contenuto del nodo passato come argomento.