CocoaSpace

Drupalでウェブサイト構築

空ページの作成

Jun 29 2010
Drupalバージョン: 

空っぽのページにブロックやメニューだけを表示したい

Drupalでウェブサイトを構築する際、空っぽのページを作成したいなと思ったことはありませんか?「そんなこと考えたことないよ!」という方は、例えばフロントページや、各項目へのリンクを表示するのみのランディングページ(?)などを想像してください。ノードのようなコンテンツはいらないから、ブロックやメニューだけを表示したいということってありますよね?

CocoaSpaceでは、下記のページの方法でフロントページなどのために、空っぽのページを作成しています。

Generating a Dummy Front Page for Drupal | Geeks & God

ご覧のように、Drupal APIのhook_menu()を使用して、空っぽのフロントページを作成する方法です。ほんの数行のコードで実現できます。方法自体は簡単なのですが、英語のページなのでわかり難いかと思います。そこで、なぜこの方法にするのかという理由と具体的な方法を順を追ってご紹介したいと思います。

なぜこの方法を採用するのか?

CocoaSpaceでは以前、テンプレートを編集してフロントページをカスタマイズという記事で、page.tpl.phpに条件文を加えるだけのお手軽な方法で、フロントページのティーザーを表示しないようにする方法をご紹介しました。しかし、細かいことをいうとパフォーマンス的にはイマイチなので、おすすめの方法ではありません。というのも、実際には表示しないティーザーの情報がしっかりとロードされてしまっているからです。トラフィックが多いサイトでは特に気になるところですし、CocoaSpaceのようにトラフィックが少ないサイトでも(笑)、少しでもパフォーマンスに優れているほうがいいですよね。上記の参考ページの方法によって、その無駄な部分をなくすことができます。

空っぽのフロントページを作成してみよう

まずは空っぽのカスタムモジュールを作成

まずはモジュールを作成する必要があります。以前、シンプルなカスタムモジュールの作成という記事で、空っぽのモジュールを作成する方法を書きました。そちらの記事をご覧になって、空っぽのモジュールが出来たら、この記事に戻ってきてください。

hook_menu()でデフォルトの"node"ページを空っぽにする

MODULENAME.moduleファイルを開いて、上記のページのコードを参考に、下のようなコードを追加します。MODULENAMEという部分はご自身のモジュール名に置き換えてください

/**
  * Implementation of hook_menu().
  */
function MODULENAME_menu() {
  $items['node'] = array(
    'title' => 'Content',
    'page callback' => 'node_page_default_empty',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
  * Page Callback for 'node' front page item.
  */
function node_page_default_empty() {
  drupal_set_title('');
  return '';
}

これだけです!通常のモジュールと同じようにインストールし、有効化してください。

ただし、これだけですと通常フロントページに表示されるRSSフィードまでなくなってしまいます。デフォルトのRSSフィードを維持したい場合は、function node_page_default_empty()を以下のようにするとよいかと思います。

/**
  * Page Callback for 'node' front page item.
  */
function node_page_default_empty() {
  $feed_url = url('rss.xml', array('absolute' => TRUE));
  drupal_add_feed($feed_url, variable_get('site_name', 'Drupal') .' '. t('RSS'));

  drupal_set_title('');
  return '';
}

その他にも、フロントページに掲載するノードが一つもないときに表示される"Drupal ウェブサイトへようこそ!"みたいな表示もなくなってしまいます。が、稼動サイトでそのメッセージを表示させておくことはないと思いますので問題ないですよね。気になる場合はDrupal APIの下のページを見て、メッセージの部分を加えてください。

node_page_default | Drupal API

フロントページ以外も同様の方法で追加可能

$items['node']以外に空っぽのページを作成したい場合にも、同様の方法で追加できます。CocoaSpaceのすべてのタグを表示するページのようなものも作成したい場合は次のようになります。

/**
  * Implementation of hook_menu().
  */
function MODULENAME_menu() {
  $items = array();

  $items['node'] = array(
  //... 上記の通りなので省略 ...
  );

  $items['tags'] = array(
    'title' => 'Tags',
    'page callback' => 'MODULENAME_page_tags',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
  * Page Callback for 'node' front page item.
  */
function node_page_default_empty() {
  //... 上記の通りなので省略 ...
}

/**
 * Page callback for the 'tags' page.
 */
function MODULENAME_page_tags() {
  $output = '<div class="description">';
  $output .= 'Click a tag to see the associated posts.';
  $output .= '</div>';
  return $output;
}

メモ 1

hook_menu()の$items['tags']という部分がDrupalのパスになります。example.com/tagsというURLで表示されるようになります。既存のパスと衝突しない限り、好きなパスを作成出来ます。

メモ 2

page_callbackはMODULENAME_page_tagsなどのようにモジュール名を含める必要はありませんが、ユニークな名前にして、他のコールバックと衝突しないようにしてください。callbackの$outputの部分は好きなように作成してください。

コメントを追加

Powered by Drupal + Linux