ミニ白扇の使い方 (4)

Date 2006-09-03 06:23:15 | Category: XOOPS

in englishin japanese
今回は include/config.php の書き方です。
include/config.php は大きく分けて4つのパートに別れます。

(A) 設定パート
これは、(1)と(2)で説明しました。$auto_belong_groupsに最低でも1つのグループが与えられていないと、登録してもログインできない、なんて不具合につながりますので注意してください。

// preferences
$auto_belong_groups = array( XOOPS_GROUP_USERS ) ; // default (2)
$allow_blank_email = false ;
$allow_blank_vpass = false ;


(B) 追加フィールド設定パート

$extra_fields = array(
	'sex' => array(
		'initval' => -1 ,
		'options' => array( 0 => '男' , 1 => '女' ) ,
		) ,
	'birth' => array(
		'initval' => '1950-01-01' ,
		) ,
	) ;

$extra_fields という特別の変数名で、追加したいフィールドを配列で定義します。
配列のキーには、ALTER TABLE で追加したフィールド名を必ず指定します。今回の例では、sexとbirthになります。
ただし、minihakuコア部で利用するのは、その配列のキーだけであり、initvalもoptionsも、実は、このconfig.php内部で利用するだけです。

(C) 初期化・読み出しパート

if( empty( $minihaku_uid4whr ) ) {
	// 登録時の処理(追加フィールドをリクエスト可能変数として初期化)
	foreach( $extra_fields as $key => $attribs ) {
		$allowed_requests[$key] = $attribs['initval'] ;
	}
} else {
	// 編集時およびミニ白扇Smartyプラグインの処理
	// データベースから追加フィールドの読み出し
	$db =& Database::getInstance() ;
	list( $allowed_requests['sex'] , $allowed_requests['birth'] ) = $db->fetchRow( $db->query( "SELECT sex,birth FROM ".$db->prefix("users")." WHERE uid=$minihaku_uid4whr" ) ) ;

	// 整数型フィールドは、この時点でintval()をかけておく
	$allowed_requests['sex'] = intval( $allowed_requests['sex'] ) ;

	// ミニ白扇Smartyプラグインのための「表示用文字列」生成
	$fields4html['sex'] = $extra_fields['sex']['options'][ $allowed_requests['sex'] ] ;
	$fields4html['birth'] = str_replace( '-' , '/' , $allowed_requests['birth'] ) ;
}

ここで難しいのは、$allowed_requests という特別な変数の扱いです。これは、リクエスト可能な変数名を保持している配列です。配列のキーが変数名、値が現在の値です。そしてここがPHPらしくない部分でもあるのですが、現在の値に型情報も持たせています。int(1)とstring("1")はまったくの別物として扱うのです。(edituserhook.phpなどでは、その型情報に応じた処理を行います)

今回の例でのsexは整数型なので、常に整数型である必要があります。でも、DBから取り出した直後のデータは文字列型です。これだとうまくないので、DBから取り出した値を$allowed_requestsに格納する際には、intval()をかけます。

順番が前後しましたが、このパートの最初は、登録時の処理です。各追加フィールドについて、登録時にリクエストを許可して良いものについて、$allowed_requestsに初期値(型が重要!)と共に登録します。$allowed_requestsに登録されない追加フィールドは、当然、DBにおける当該フィールドの、DEFAULT設定が有効になります。

else以降は、編集および表示時の処理です。追加フィールドすべてをDBから読み出す有効なSQLを記述し、発行してください。そして、文字列型以外のフィールドについては、型変換することをお忘れなく。

最後の部分で、表示用の処理を施します。この$fields4htmlも特別な変数名です(ミニ白扇Smartyプラグインにとって)。ここでは、性別の0,1をそれぞれ男,女に変換しています。ついでに、年月日のデリミタを-から/に変更しています。

白扇にあったような、かっこよさ、なんてパラメータを画像で表現するのも、ここの書き方次第です。この場合も、DBには整数型で格納するべきです。

(D) 妥当性チェックパート

if( isset( $_POST['sex'] ) ) {
	if( $_POST['sex'] < 0 || $_POST['sex'] > 1 ) {
		die( "invalid sex value" ) ;
	}
}
if( ! empty( $_POST['Date_Year'] ) ) {
	$_POST['birth'] = intval( $_POST['Date_Year'] ) . '-' . intval( $_POST['Date_Month'] ) . '-' . intval( $_POST['Date_Day'] ) ;
}

最後がリクエストの妥当性チェックです。sexは、0と1しか値を取り得ないので、それ以外のPOSTデータが送られてきたら終了してしまいます(通常、あり得ないリクエストなので)。die()が嫌なら、範囲内の値に、$_POSTを書き換えても良いでしょう。

後半部分がやや難しいのですが、リクエストの年月日をドロップダウンで選択する場合、年月日がバラバラに3つのリクエスト変数として送られてきますので、それを$_POST['birth']にまとめてあげます。(日付としての妥当性チェックはさぼって、DBにお任せしちゃってます)


このあたり判りづらいかもしれませんが、edituserhook.phpを読んでいただければすぐに理解できるでしょう。$allowed_requestに指定されたキーと同じ$_POSTを探して、あれば上書きする。それだけですから。

唯一の例外がcheckboxですが(リクエストがemptyであることがON->OFFという指示になる)、そのためにbool型を特別扱いしています。checkboxの使い方も含め、他のパターンの導入例は今後書いていきます。




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=357