Posted by iwe on April 26, 2011 at 3:42pm
現在、Drupal6を使いサイトをつくっております。
自分でdbからデータを取得して表示するページを作る場合、現在はviewsで適当な最低限のクエリを発行し、一旦空にしたviews-view-◯◯◯.tpl.phpなどのテーマファイルに一から直接DBの処理から表示用のhtmlまでを全て書いて表示しており(つまりviewsは表示用のパスの定義とその表示時に使われるテーマファイルのみ使っています)viewsで発行したクエリは実際の表示には使用していません。
このままではあんまりなので、viewsは使用せずに、同様のことがしたいと思っています。
そのような場合、どういう方法がありますでしょうか?
お恥ずかしながら、「オリジナルのモジュールを作るんだろうな」程度の理解しかありません。
特に、
1.表示するページのパスを定義
2.それに使うテンプレート(テーマファイル?)
はどのようにすればいいのか全くわかりません。
Drupal本を購入しましたが上記のような事は記載が無いようで、
ネットでもいろいろ調べてみましたが行き詰ってしまいました(英語は苦手なのです)
「もう一回基礎からじっくり勉強しろ」と言われればそれまでなのですが・・・
簡単な解説でも構いませんので、教えていただけると助かります。
Comments
初めまして、U-Taroと申します。 仰る通り、オリジナル
初めまして、U-Taroと申します。
仰る通り、オリジナルのモジュールを作るのが一番良いかと思います。簡単にですが手順と説明用のモジュールを作ってみましたので、参考にしてみてください。
(Drupal Root)/sites/all/modules/mymodules の形でディレクトリを作り、そのフォルダにmymodule.info mymodule.module mymodule.tpl.php と言う名前のファイルを作り下記のコードを各ファイルに書いてください。
mymodule.info
; $Id$name = My Module
description = "モジュールの作り方"
core = 6.x
version = 6.x
mymodule.module
<?php
// $Id$
/**
* Drupalが モジュールの名前_menu の形で自動的に呼び出します。
*
* ここでパスやアクセス権限、ページタイトルなどを構成します。
*/
function mymodule_menu() {
// 連想配列名がそのままパスになります。
$items['mymodule'] = array(
'title' => 'My Module', // ページのタイトル
'page callback' => 'mymodule_page', // パスにアクセスした時に呼び出される関数名
//'access callback' => 'user_access', // これはデフォルトで指定されているので書かなくてOK
'access arguments' => array('access content'), // ユーザーパーミッションで「access content」を持っている人がアクセスできる
);
return $items;
}
/**
* Drupalが モジュールの名前_theme の形で自動的に呼び出します。
*
* テーマファイル等を定義します。
*/
function mymodule_theme() {
return array(
// この連想配列名が theme()関数によって呼び出される名前になります。
'mymodule_node_list' => array(
'arguments' => array('nodes' => NULL), // ここで使用する変数名を宣言します。
'template' => 'mymodule', // mymoduleディレクトリにの mymodule.tpl.php を使う指定です。.tpl.phpは自動で追加されます。
),
);
}
/**
* データ処理はここで行います。
*/
function mymodule_page() {
$result = db_query("SELECT * FROM {node} n WHERE status = 1");
$nodes = array();
while ($node = db_fetch_object($result)) {
$nodes[] = $node;
}
return theme('mymodule_node_list', $nodes); // mymodule_theme()に定義されているのでこの形で呼び出します。
}
?>
mymodule.tpl.php
<?php// $Id$
?>
<?php if (count($nodes) > 0): ?>
<ul>
<?php foreach ($nodes as $node): ?>
<li><?php print $node->title; ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>ノードがありません。</p>
<?php endif; ?>
本来ならば文字列のエスケープ処理など他にしなければならない工程がありますが、今回は解りやすくするため割愛させていただきました。構造さえ理解出来ればDrupal非常に強力なフレームワークとしても使えるので頑張ってください。
iweさん、こんにちは! パスの定義とページの作成にはオリ
iweさん、こんにちは!
パスの定義とページの作成にはオリジナルモジュールが必要ですが、モジュールを作成するのはとても簡単です!
以下のパスの作成とページを表示するサンプルモジュールを参考に作成してみてください!
#module名 = page_example
#put to DRUPALROOT/sites/all/module/
sample.info
<?phpname = page_example //モジュールの名称
description = Demonstrates how to define pages. //モジュールの説明文
core = 6.x //モジュールが対応しているDrupalのバージョン
package = Example modules //モジュールのカテゴリー
?>
sample.module
<?php
#モジュールのファンクション名は モジュール名_hook名() となる
/**
* Implementation of hook_theme()
* Drupalのテーマ関数を設定する。
* このHookでこのモジュールのテーマ関数を設定することにより、どの様な場所からもテーマ名と引数で一定のタグ構造の表示をさせることができます。
*/
function page_example_theme() { //hook:テーマ関数の設定
return array(
'page_example' => array( //theme名
'template' => 'page-example', //テンプレート名 この場合は page-example.tpl.phpが参照される
'arguments' => array('vars' => NULL), //引数のデフォルト値
),
);
}
/**
* Implementation of hook_perm(). //hook:権限の追加
* このモジュールで使用する権限を設定する。
* 例えば特定の役割を持ったユーザーしかアクセス出来ないページを作成するときには、以下の権限を追加してページの表示時に権限を評価する。
* 権限の評価にはuser_accessというファンクションを使用する。(後述
*/
function page_example_perm() {
return array(
'access simple page',
'access arguments page',
'over 80 years old', //権限名は英数字であればどのような文言でもよい。
);
}
/**
* Implementation of hook_menu(). //hook: メニュー、パスの設定
* これがメニュー及び、パスを定義するHookになります。
*/
function page_example_menu() {
$items = array();
// これが最小要件のメニュー指定になります、タイプを指定しない場合は標準のナビゲーションメニュー(Navigation menu)に追加されます。
$items['examples/page_example'] = array( //配列のkeyがpathになります
'title' => 'Page Example', //ページのタイトル
'page callback' => 'page_example_description', //このページにアクセスしたときに実行するファンクション
'access callback' => TRUE, //このページへのアクセス権限を調べるファンクションを指定する、TRUEの場合は無条件で表示
);
//もし、'access callback'が指定されてない場合は自動的に'access arugments'に指定した権限を'user_access'で評価します。
$items['examples/page_example/simple'] = array(
'title' => 'Simple - no arguments',
'page callback' => 'page_example_simple', //このページにアクセスしたときに実行するファンクション
'access arguments' => array('access simple page'), //このページへのアクセス権限を調べるファンクションへ渡す引数
);
// Only users with the 'access arguments page' permission have access.
$items['examples/page_example/arguments/%/%'] = array( //"%"で表記されているところは可変な引数になります。
'title' => 'Page example with arguments',
'page callback' => 'page_example_arguments', //このページにアクセスしたときに実行するファンクション
'page arguments' => array(3, 4), //このページにアクセスしたときに実行するファンクションに渡す引数です。3,4...等、数字で指定した場合は現在のパスから値が取得されます(最初のpath(examplesは0になります))
'access arguments' => array('access arguments page'),
'type' => MENU_CALLBACK, //このメニューのタイプです。
# 'type' => MENU_LOCAL_TASK, #=> ページにタブメニューとして登録する。(ノードページで表示される確認、編集等)
# 'type' => MENU_CALLBACK, #=> ファンクションを実行して返す、メニューには登録されない。
# 'type' => MENU_NORMAL_ITEM, #=> 通常のメニューアイテムとして登録する。
);
return $items;
}
function page_example_arguments($first, $second) {
// URL構造が常に正しいとは限らないので判定は必ず入れる
if (!is_numeric($first) || !is_numeric($second)) {
// もし引数がない場合はアクセス拒否をする
drupal_access_denied();
return;
}
$list[] = t("最初の数字は@numberです。", array('@number' => $first));
$list[] = t("二つ目の数字は@numberです。", array('@number' => $second));
$list[] = t('合計は@numberです。', array('@number' => $first + $second));
return theme('page_example', $list); //ページに表示するタグ
}
?>
page-page_example.tpl.php
<ul><?php foreach($vars as $var) : ?>
<li><?php print $var></li>
<?php endforeach; ?>
</ul>
Twitterやっています。
http://twitter.com/jun784
Drupalつながりでよろしければ、フォローお願いします。
ありがとうございます!
U-Taro様、jun784様
早速のご返答ありがとうございます!
教えていただいた方法でなんとかうまくいきそうです
こんなにご丁寧に詳しくご返答いただけるとは思ってなかったのですごく助かりました。
今までいくつかCMSを試しましたが、Drupalは少しハードルが高いように思いますが、その分理解すればするほど素晴らしいCMSですね!
まだまだ初心者ですが頑張って使いこなせるように頑張ります。
ありがとうございました。
iweさん、がんばってください! U-Taroさんとほぼ同
iweさん、がんばってください!
U-Taroさんとほぼ同じタイミングにご返信させて頂いたのですが、とってもコードが似ていてびっくりしました(笑
このように別の人が書いたプログラムも、
書き方が画一化されて他の人も見やすく、変更や修正がしやすいのもDrupalのいいところですね!
また、ご不明な点があればぜひ聞いてください!
>>U-Taroさん
日本にまだ数少ないDrupal Modulerとして、今後とも宜しくお願いします!
Twitterやっています。
http://twitter.com/jun784
Drupalつながりでよろしければ、フォローお願いします。
iweさん 読み返してみたら、ディレクトリとフォルダの表記
iweさん
読み返してみたら、ディレクトリとフォルダの表記が振れていましたが同じ意味です。すみません…。
私が書いたコードは最低限の動作をする物なので、機能面を考えていくと実際にはjun784さんが作ったコードの様になります。
jun784さん
私の方は明らかに手抜きですが、似てましたね(笑
日本のDrupalモジュール界隈を盛り上げていきましょう。こちらこそ宜しくお願いします!
ナイス!
U-Taroさん、jun784 さん、大変参考になりました。ありがとうございます!