Drupal で、ノード(node)とは?
「最初からそういっくれればわかりやすいのに!」ということが、Drupal にはたくさんある。その Drupal で一番重要な要素は「ノード(node)」であろう。
「最初からそういっくれればわかりやすいのに!」ということが、Drupal にはたくさんある。その Drupal で一番重要な要素は「ノード(node)」であろう。
Drupal でのクリーン URL とは、 http://yourdomain.com/index.php?q=x のような形式を指す。これだとパーマリンクの中にクエリー文字列が入るから、SEO 上は好ましくない。Google などのロボットはパラメータを含んでいる URL 中を嫌う。なぜならその URL は動的ページを構成することが多いからである。Drupal はデフォルトだとすべての URL がパラメータ付のものになるから、クリーン URL の機能を使って http://yourdomain.com/node/x のような形式にする。
2007/03/22〜03/23 に Yahoo! の本社にて行われた OSCMS Summit 2007 コンファレンス。OSCMS とは Open Source CMS の略で、このコンファレンスのセッションの 9割以上は Drupal についてであり、Drupal の他に Joomla! と Plone のセッションが1つか2つ、ゆえに実質 Drupal のためのコンファレンスであった。そもそも、今回 Yahoo! の本社でこのコンファレンスが開催された理由は、Yahoo! 自身がイントラネットで Drupal を使っているからにほかならない。
このコンファレンスで一番興味深かったのはやはり Drupal のオリジナルの作者である Dries Buytaert 氏(というか、Dries Buytaert 君)だ。彼のセッション「The State of Drupal」で彼は云うのだ、
この方法は Drupal においてすべてのセッションを閉じ、強制ログアウトの効果を持つ。hook_cron で自動処理したい場合などに有効だと思う。なぜなら、複数または1つのブラウザで複数のウィンドウを開いたりしているケースがあるからだ。
要はデータベース中のセッションテーブル {sessions} からあるユーザー(uid を指定)のセッションをすべて削除するだけである。
ユーザーがログインしたときに何か処理を加えたいケースを考える。たとえばある決められた時刻の間はログインを許して、そうでない場合はログインを許可しない、といったシナリオである。
まず Drupal には hook_auth というのがあるのでこれにあたりをつけた。しかし、この hook_auth という hook は、ユーザー名@サーバ名のときに機能し、単にユーザー名だけ入力された場合にはスルーされてしまうとここに書いてある。2005年のアーティクルなんだけれども、http://drupal.org/node/29147 には延々と議論が続いているが、ユーザー名だけのときの場合はスルーというルールは変わらないらしい。実際に私も試してみたが、そういう仕様になっている。
http://drupal.org/node/114992 のアーティクルが役にたつと思う(コードは以下)。
<?php
function my_user_logout() {
watchdog('user', t('Session closed for %name.', array('%name' => $user->name)));
// Destroy the current session:
session_destroy();
module_invoke_all('user', 'logout', NULL, $user);
// Load the anonymous user
$user = drupal_anonymous_user();
drupal_goto('node');
}
?>
これを実現するダイレクトな API は用意されていない(と思う)ので、sessions テーブルから一覧を得ればよい。
<?php
...
function _get_logged_in_users() {
$result = db_query("SELECT uid FROM {sessions}");
while ($uid = db_fetch_object($result)) {
<pre>$account = user_load(array('uid' => $uid)); // $account に user オブジェクトが入る。
// do something
}
}
...
?>
Drupal で、「ログから、あるタイプだけのデータから最新のデータを取得する」には、どうしたらいいだろうか?これをソースコード的に言い換えると、「ログ=『watchdog』 テーブルから、カラム 『type』 を絞り込んで、カラム 『timestamp』 の最大値を得る」ということになる。
Drupal を他のサイトやアプリケーション、プログラムと連携させるには、XMLRPC で連携させるという方法がある。Drupal は XMLRPC サーバになれるから、自身の作製したモジュールから XMLRPC サーバのハンドラ(XMLRPCクライアントから呼ばれるメソッドのこと)を書いてあげればよい。サーバ側はロジックを書くことに専念できるので、これだけでも Drupal を使うメリットでもあるはずだ。
すべては hook_xmlrpc がヒントとなる。セオリーに従って api.drupal.org を調べてみるのではあるが、説明されているようで私には理解不能だった^^;ドキュメントが整えられているようで中身がよくわからないのが現状の Drupal である。まぁここのサンプルでスラスラ理解できる人は、よほど優秀なプログラマーだろうからこのサイトには訪れて来るまい(笑)
Drupal のドキュメントは、すっごく整備されているようでいて内容を見ると実はよくわからないのがほとんどである。この hook_cron についても、http://drupal.org の過去ログからやっと探し出したものだ。
ポイントは、node_delete を呼び出す前に必ず
<?php
global $user;
$user = user_load(array('uid' => $node->uid));
?>
と、global $user を $node のもの($node が持つ uid)にしてあげるということである。
Win32 プログラミングで CreateProcessAsUser の前に hTokenImpersonateUser が必要なのと同じようなノリなのだろう。以下の例は、30日以上前のノードを hook_cron (この例では example_cron) で処理する方法。