Thêm nội dung của riêng bạn vào nút


8

Tôi đã tạo một mô-đun thêm nội dung tùy chỉnh vào một nút; Tôi muốn hiển thị nội dung tùy chỉnh này trong chế độ xem nút. Tôi nghĩ hook_node_view()là móc đúng để sử dụng, nhưng nội dung của tôi không được hiển thị.

những gì tôi nhận được cho đến nay là mã sau đây:

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

Ai có thể giúp đỡ?

Câu trả lời:


19

TL; DR: Hook là chính xác, nhưng $node->content['mymodule']['#items'][0]ít nhất nên chứa một trong các chỉ mục / thuộc tính mảng này: " #markup " hoặc " #theme "; nếu bạn không sử dụng một trong số chúng, Drupal sẽ không xuất ra bất cứ thứ gì.

Nếu các chỉ mục mảng bạn sử dụng là cho các thuộc tính được xử lý bởi chức năng chủ đề của bạn, thì bạn nên sử dụng # ở đầu; ví dụ "định dạng" sẽ trở thành "#format" (điều này cũng đúng với các thuộc tính khác).

Dù sao, không cần phải sử dụng "định dạng" như bạn làm (bất kể ý nghĩa của nó là gì); hàm chỉ xuất HTML, như được thực hiện trong ví dụ được hiển thị trong ví dụ 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',
  );
}

Nếu bạn muốn có một số ví dụ cụ thể hơn về điều đó triển khai móc, bạn có thể nhìn vào book_node_view () , statistics_node_view () , và 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);
  }
}

Như một lưu ý phụ, tôi sẽ thêm rằng bạn chỉ nên sử dụng ký tự # cho các thuộc tính hoặc bạn sẽ nhầm lẫn Drupal, hy vọng rằng ký tự đó chỉ được sử dụng cho các thuộc tính.
Trong thực tế, Element_children () , trả về danh sách các phần tử con của phần tử được truyền dưới dạng đối số, sử dụng mã sau:

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

Như bạn thấy, các phần tử có giá trị khóa bắt đầu bằng # không được coi là phần tử con; khác nhau, Drupal sẽ không thể xử lý trường hợp như thế này (mã được thực hiện bởi mô-đun Drupal, mô-đun Tìm kiếm):

  $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']yếu tố con?

Như một lưu ý phụ khác, tôi sẽ thêm rằng hook_view()được Drupal gọi ra chỉ dành cho các mô-đun triển khai một loại nội dung. Trong thực tế, việc triển khai hook đó được gọi bởi node_build_content () bằng mã sau:

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

Mã cho node_invoke () là mã sau:

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

Mã gọi $hookcho mô-đun thực hiện kiểu nội dung của nút được truyền dưới dạng đối số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.