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'),
);
Là $form['#action']
và $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 $hook
cho mô-đun thực hiện kiểu nội dung của nút được truyền dưới dạng đối số.