ノードにカスタムコンテンツを追加するモジュールを作成しました。このカスタムコンテンツをノードビューに表示したいと思います。 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;
}
誰か助けてもらえますか?
TL; DR:フックは正しいですが、_$node->content['mymodule']['#items'][0]
_には少なくともこれらの配列インデックス/プロパティの1つが含まれている必要があります: " #markup "または" #theme ";それらのいずれかを使用しない場合、Drupalは何も出力しません。
使用する配列インデックスがテーマ関数によって処理されるプロパティ用である場合、最初に#を使用する必要があります。たとえば、「format」は「#format」になります(他のプロパティについても同じことが言えます)。
とにかく、あなたがするように「フォーマット」を使う必要はありません(それが何を意味していても) hook_node_view() の例に示されている例のように、関数はHTMLを出力するだけです。
_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が混乱し、その文字はプロパティにのみ使用されると予想されます。
実際、引数として渡された要素の子要素のリストを返す 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モジュール、検索モジュールによって実装されています):
_ $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
_を呼び出します。