TL; DR:该挂钩是正确的,但$node->content['mymodule']['#items'][0]
至少应包含以下数组索引/属性之一:“ #markup ”或“ #theme ”; 如果您不使用其中之一,Drupal将不会输出任何内容。
如果您使用的数组索引用于主题函数处理的属性,则应在开头使用#;例如,“格式”将变为“#格式”(其他属性也是如此)。
无论如何,没有必要像使用“格式”那样使用(无论其含义如何);该函数仅输出HTML,如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',
);
}
如果需要有关该钩子实现的一些更具体的示例,可以查看book_node_view(),statistics_node_view()和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);
}
}
作为旁注,我要补充一点,您应该仅将#字符用于属性,否则您将使Drupal感到困惑,Drupal希望该字符仅用于属性。
实际上,element_children()返回使用参数传递的元素的子元素列表,它使用以下代码:
foreach ($elements as $key => $value) {
if ($key === '' || $key[0] !== '#') {
$children[$key] = $value;
if (is_array($value) && isset($value['#weight'])) {
$sortable = TRUE;
}
}
}
如您所见,键值以#开头的元素不会被视为子元素。以不同的方式,Drupal将无法处理这种情况(代码实际上是由Drupal模块,Search模块实现的):
$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'),
);
是$form['#action']
和$form['basic']['submit']
子元素?
作为另一点说明,我将添加hook_view()
Drupal仅针对实现内容类型的模块调用该函数。实际上,该钩子的实现由node_build_content()使用以下代码调用:
// 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);
}
node_invoke()的代码如下:
if (node_hook($node, $hook)) {
$base = node_type_get_base($node);
$function = $base . '_' . $hook;
return ($function($node, $a2, $a3, $a4));
}
该代码$hook
为模块调用实现作为参数传递的节点的内容类型。