Drupal7でカスタムページ作る!!オリジナル画面作成方法まとめ
D7においてのオリジナル画面の作成方法でぱっと思いつくものを、備忘も兼ねてまとめます。
ざっくりな内容なので、
「いやいやもっと簡単な方法あるじゃないか」
「ちょっとその記載内容間違ってますよ」
などありましたらご指摘頂けるとありがたいです。
Drupal上で 好きなURLで好きな内容の画面を1つ作りたい 場合、
下記のような方法があります。
①Basic pageで画面を作ってURLエイリアスを設定する
管理画面->コンテンツ->コンテンツの追加->基本ページ でBasic pageを新規追加して、
好きな内容を突っ込めばおk。
(全画面に適用しているブロックなどは表示されますのでご注意を)
単純なHTMLだけで、管理画面からも変更したい!という場合はこれで良いのではないでしょうか。
メリット
- 手っ取り早さNo.1。管理画面の上だけで完結。
- 管理画面から掲載・非掲載の切り替え可能
- URLエイリアスの変更なども手軽に行なえる
デメリット
- 管理画面から削除できてしまう
- 複雑なコードを記載するには向いていない
(視認性が非常に悪いのもあいまって、管理画面のテキストエリアに複雑な処理を書き込むのは事故の元。)
どうしてもBasic pageで画面を作りつつ、複雑な処理も書きたい場合や
特定のBasic pageだけ表示をカスタマイズしたい場合は、
下記の手法を併用すればソース上で表示に関してコントロールできる…とは思うんですが
Basic pageなど(Drupalの”コンテンツ”として扱うこと)にこだわる必要がなければ、
別にこのやり方でなくても良いんじゃないか…とは思います。苦笑
①の余談:page.tpl.php をオーバーライドして専用のtplファイルを作る
※Drupalが元から用意しているパスに対してtplファイルを適用する場合に使います
例:
http://yourdomain.com/sample/hogehoge
というURLで表示させたい場合、
Basic pageなどでコンテンツを登録し、URLエイリアスに sample/hogehoge を指定。
↓
page--sample--hogehoge.tpl.php
page--sample--%.tpl.php
page--sample.tpl.php
というようなtplファイルをpage.tpl.phpと同じ階層に置いていれば、page.tpl.phpよりも
これらを優先して読み込んでくれます。(上記3つは適用される優先度順に記載)
※ファイルの命名規則については↓下記サイトに詳しく書いてあります。
https://groups.drupal.org/node/238378
メリット
- 複雑な処理は(管理画面からの入力ではなく)ソース化できる
- 特定のBasic pageや、特定のユーザーページ(/user/n など)だけ処理や表示をカスタマイズしたい場合などには使えるはず
デメリット
- Drupal内で該当URLが存在していない場合は使えないので、コンテンツ登録などでURLを用意してあげる必要がある
- tplファイル名がURLに依存する
- 似たようなURLの画面が他にもある時に困る可能性がある
例:
page--sample.tpl.php
作った
↓
http://yourdomain.com/sample に上記tplファイルが適用される。やったね!
↓
http://yourdomain.com/sample/hogehoge にまで上記tplが適用されてしまった。
そこには適用しなくていいんだよ\(^o^)/
…など?
②任意のコンテンツタイプのnodeを作ってURLエイリアスを設定する
管理画面->サイト構築->コンテンツタイプ->コンテンツタイプの追加 からコンテンツタイプを追加し、
node.tpl.php と同じ階層に node--[コンテンツタイプのシステム内部名称].tpl.php
を設置します。
例:
コンテンツタイプ「ニュース」(システム内部名称:news)を作成した場合は
node--news.tpl.php
を作成して設置。(node.tpl.phpから複製するのが早い)
これで「ニュース」のコンテンツを表示する際は、node.tpl.phpではなく
node--news.tpl.php
の内容が適用されます。
コンテンツタイプの作成と専用tplファイルの設置が完了したら、そのコンテンツタイプに対して
コンテンツの追加をしましょう。
上の例で行くと、 管理画面->コンテンツ->コンテンツの追加->ニュース ですね。
コンテンツタイプ作成時に予め設定しておいた項目(フィールド)に、必要なデータを入力していきます。
メリット
- 管理画面から掲載・非掲載の切り替え可能
- URLエイリアスの変更なども手軽に行なえる
- 項目に設定した内容を管理画面から手軽に変更できる
- 他にも同様のコンテンツページを作成したい場合は適切
デメリット
- 管理画面から削除できてしまう
(専用tplファイルはあくまで”表示する際の枠組み”なので、肝心の中身はコンテンツ(node)としてDBに登録され管理されることになる) - そもそも、これは「ある種類のコンテンツ(複数)に対して共通のレイアウトや処理を適用したい」というような場合の方法なので、「好きなURLで好きな内容の画面を1つだけ作りたい」という場合には最適ではない。
上記のいずれも適さない…という場合は、
モジュールファイル上でテーマにhookしてカスタムページを作りましょうヾ(:3ノシヾ)ノシ
③カスタムページを作る
①モジュール上でテーマにhook
②tplファイルの設置
この2ステップで完了します!
下記に記載している箇所は、お使いのモジュール名・テーマ名・好きな関数名などに適宜書き換えてください。
モジュール名 | my_module |
---|---|
URL | sample |
hook用関数名 | sample_page |
適用するテーマ名 | my_theme |
設置するtplファイル名とそのパス | sites/all/themes/my_theme/templates/custom.tpl.php |
http://yourdomain.com/sample という画面を作成したい場合、
①自作モジュールファイル(my_module.module)に下記を記載
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function my_module_menu() { $items['sample'] = array( //URLを指定。行頭の/は除いて記載(/sample -> sample) 'page callback' => 'sample_page', 'page arguments' => array(n), //URLの一部の値をhook用関数に渡したい時は、その値を指定する。この指定は無くてもOK 'access callback' => TRUE, //ここを 'user_is_logged_in' にすると、ログイン中のユーザーにのみ表示される 'access arguments' => array('access content'), //全員に公開 'title' => t('ページタイトル') , 'description' => 'ページ説明文', ); return $items; } function sample_page () { return theme('my_theme'); } function my_module_theme($existing, $type, $theme, $path) { $template_path = drupal_get_path('theme', 'my_theme') . '/templates'; //tplファイルの場所を取得(my_theme ディレクトリ配下のパスを指定) return array( 'my_theme' => array( 'template' => 'custom', //tplファイル名を指定(.tpl.phpは不要) 'path' => $template_path, ), ); } |
②sites/all/themes/my_theme/templates/custom.tpl.php を設置
参考サイト:
http://websmiths.co/blog/very-quick-introduction-drupals-hookmenu-and-hooktheme
https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_menu/7
メリット
- ソース上で完結。管理画面からの操作は必要無し。
(※新規追加したモジュールで上記を行う場合は、モジュールの有効化が必要です) - URLをソース上で指定するので、管理画面での「うっかり変えてしまった」「うっかり削除してしまった」が起こらない
- tplファイル名やその置き場所も自由に決められる
- カスタマイズ性抜群?
デメリット
- 自作モジュールを有効化させることが前提
ちなみに、初めて上記コードを書いた直後、
ずっと「動かねえ…動かねえ。サイトに反映されない…何が悪いんだ…?」ってなってたんですが、
モジュールファイルを書き換えてからキャッシュクリアしたら全く問題無かったので
皆さんもキャッシュには気を付けましょう。。。orz