私は、コンテンツタイプを2ページに分割するカスタムモジュールを作成しており、カスタムフィールドはタブからアクセスできます。簡単にするために、新しいd7インストールでテストケースを作成し、定義済みの記事コンテンツタイプを使用しました。
私のモジュールフォルダには次のファイルがあります:
これで、テンプレートファイルはbartikテーマのnode.tpl.phpファイルのコピーにすぎませんが、何らかの理由でモジュールがロードしません。私はhook_theme()ページを読み、開発者theming_exampleの例を使用しましたが、それを機能させることができません。
どんな助けでも大歓迎です。
--------更新されたコード----------------
<?php
/**
* Implements hook_menu().
*/
function article_page_menu() {
$items['node/%/info'] = array(
'title' => 'Info',
'page callback' => 'article_page_page_callback',
'page arguments' => array(1),
'access callback' => 'article_page_access_callback',
'access arguments' => array(1),
'type' => MENU_LOCAL_TASK, // tab instead of MENU_CALLBACK
'weight' => '1000', // last tab item
);
return $items;
}
/**
* Page Callback
*/
function article_page_page_callback($nid) {
if (is_numeric($nid)) {
$node = node_load($nid);
if($node->type == 'article') {
return theme('article_page_template', array('node' => $node));
}
drupal_not_found();
return;
}
return FALSE;
}
/**
* Create the access callback
*/
function article_page_access_callback($nid) {
if (is_numeric($nid)) {
$node = node_load($nid);
// only show for article types
if($node->type != 'article'){
return FALSE;
} else {
return TRUE;
}
}
return FALSE;
}
/**
* Implements hook_theme().
*/
function article_page_theme($existing, $type, $theme, $path) {
return array(
'article_page_template' => array(
'template' => 'article_page_template',
),
);
}
function theme_article_page_template($variables) {
$node = $variables['node'];
$build = node_view($node);
$output = drupal_render($build);
return $output;
}
------------ END UPDATED CODE -----------
---------以下IS THE OLD CODE ---------------------
モジュールファイルのコードは次のとおりです。
<?php
/**
* Implements hook_menu().
*/
function article_page_menu() {
$items['node/%/info'] = array(
'title' => 'Info',
'page callback' => 'article_page_load',
'page arguments' => array(1),
'access callback' => 'article_page_access',
'access arguments' => array(1),
'type' => MENU_LOCAL_TASK, // tab instead of MENU_CALLBACK
'weight' => '1000', // last tab item
);
return $items;
}
/**
* Constructs a descriptive page.
*/
function article_page_load($nid) {
if (is_numeric($nid)) {
$node = node_load($nid);
if($node->type == 'article') {
// convert object to array
// else we get an error
$build = node_view($node);
$render = drupal_render($build);
return $render;
}
drupal_not_found();
return;
}
return FALSE;
}
/**
* Create the access callback
*/
function article_page_access($nid) {
if (is_numeric($nid)) {
$node = node_load($nid);
// only show for article types
if($node->type != 'article'){
return FALSE;
} else {
return TRUE;
}
}
return FALSE;
}
/**
* Implements hook_theme().
*/
function article_page_theme($existing, $type, $theme, $path) {
return array(
'article_page_template' => array(
'template' => 'article_page_template',
),
);
}
モジュールコードに誤って使用されている要素がかなりあるようです。たとえば、ページコールバックはフックであってはならず( hook_load() を使用しています)、コールバックは theme() を呼び出してカスタムテーマ関数を呼び出す必要があります。さらに、あなたの hook_theme() の実装は正しくなく、テーマシステムにテンプレートファイルについて知らせるために、モジュールに hook_theme_registry_alter() を実装する必要もあります。
これに基づいてコードをベースにすることができるすべての良い例があります フックのテーマのAPIのコメント
また、「ノード」と「ページ」という用語が混在しているようですので、用語を正しく使用しているかどうかはわかりません(つまり、ノードテンプレートを誤ってベースとして使用しているかどうかはわかりません。本当にページテンプレートを使いたいなど)
必要に応じて、ここにD8のhook_themeのクイックチュートリアルがあります: http://westweb-solutions.com/blog/drupal-8-how-use-hooktheme 。少しトリッキーですが、D8は急速に地位を獲得しています。