Drupal で、ログイン時に独自の処理を加える方法

ユーザーがログインしたときに何か処理を加えたいケースを考える。たとえばある決められた時刻の間はログインを許して、そうでない場合はログインを許可しない、といったシナリオである。 まず Drupal には hook_auth というのがあるのでこれにあたりをつけた。しかし、この hook_auth という hook は、ユーザー名@サーバ名のときに機能し、単にユーザー名だけ入力された場合にはスルーされてしまうとここに書いてある。2005年のアーティクルなんだけれども、https://drupal.org/node/29147 には延々と議論が続いているが、ユーザー名だけのときの場合はスルーというルールは変わらないらしい。実際に私も試してみたが、そういう仕様になっている。
ユーザーがログインしたときに何か処理を加えたいケースを考える。たとえばある決められた時刻の間はログインを許して、そうでない場合はログインを許可しない、といったシナリオである。 まず Drupal には hook_auth というのがあるのでこれにあたりをつけた。しかし、この hook_auth という hook は、ユーザー名@サーバ名のときに機能し、単にユーザー名だけ入力された場合にはスルーされてしまうとここに書いてある。2005年のアーティクルなんだけれども、https://drupal.org/node/29147 には延々と議論が続いているが、ユーザー名だけのときの場合はスルーというルールは変わらないらしい。実際に私も試してみたが、そういう仕様になっている。

Drupal で、プログラム中からログアウトさせる方法

https://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');
}

?>
https://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');
}

?>

Drupal で、ログイン中のユーザー一覧を取得する方法

これを実現するダイレクトな API は用意されていない(と思う)ので、sessions テーブルから一覧を得ればよい。
<?php

...

function
_get_logged_in_users() {

 
$result = db_query("SELECT uid FROM {sessions}");
  while (
$uid = db_fetch_object($result)) {
   
$account user_load(array('uid' => $uid)); // $account に user オブジェクトが入る。
     // do something
 
}
}

...

?>
これを実現するダイレクトな API は用意されていない(と思う)ので、sessions テーブルから一覧を得ればよい。
<?php

...

function
_get_logged_in_users() {

 
$result = db_query("SELECT uid FROM {sessions}");
  while (
$uid = db_fetch_object($result)) {
   
$account user_load(array('uid' => $uid)); // $account に user オブジェクトが入る。
     // do something
 
}
}

...

?>

Drupal で、データベースから最大値を得る方法 (SELECT MAX...)

Drupal で、「ログから、あるタイプだけのデータから最新のデータを取得する」には、どうしたらいいだろうか?これをソースコード的に言い換えると、「ログ=『watchdog』 テーブルから、カラム 『type』 を絞り込んで、カラム 『timestamp』 の最大値を得る」ということになる。
Drupal で、「ログから、あるタイプだけのデータから最新のデータを取得する」には、どうしたらいいだろうか?これをソースコード的に言い換えると、「ログ=『watchdog』 テーブルから、カラム 『type』 を絞り込んで、カラム 『timestamp』 の最大値を得る」ということになる。