将自己的内容添加到节点


8

我创建了一个模块,该模块将自定义内容添加到节点。我想在节点视图中显示此自定义内容。我认为使用起来hook_node_view()很合适,但是我的内容无法显示。

到目前为止,我得到的是以下代码:

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; 
}

有人可以帮忙吗?

Answers:


19

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为模块调用实现作为参数传递的节点的内容类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.