モジュールの公開範囲内でのアクセス権限設定

2007/07/11 | XOOPS

Xoopsには標準でモジュールへのアクセス権限設定機能が用意されている。複雑でないアクセス権限(例えば管理機能と公開機能に単純に分けられるような)であれば、この機能で十分まかなえる。これはモジュールを作成する際のお作法として、管理者機能はadminというサブディレクトリ内にファイルを配置すればよいからだ(つまりadminディレクトリ内かどうかで判断しているだけだ・・・多分)。
上記以外の権限チェック、つまり管理者かどうかというチェックではなく、例えば登録ユーザか否かのようなチェックや、あらかじめ許可されたグループに登録されたユーザか否か、というようなチェックが必要な場合は、スクリプト毎にアクセス権のチェックをしてやる必要がある。
地道にデータベースにSQLを発行してチェックしてもいいわけだが、諸々用意されているものを使うほうが簡単でいい。ここではその便利な方法を、既存モジュールから列挙してみた(既存モジュールの「フォーラム」を参照した)。

bool $xoopsUser->isAdmin($xoopsModule->mid())

$xoopsModule->mid()はモジュール管理番号を返し、それを引数としている$xoospUser->isAdmin()はアクセスしてきたユーザが、当該番号のモジュールに対して管理者権限をもっているかどうか、をチェックしてくれる。

bool check_priv_forum_auth($xoopsUser->uid(), $_POST[‘forum’], true)
bool is_moderator($forum, $xoopsUser->uid())

上記はそれぞれ専用の関数を用意し、それらの関数内ではデータベースに対してSQLを発行しているようだ。

つまり結局アクセス権のチェックは以下の二つの関数、モジュールの一般設定で設定する$xoopsModuleConfig(設定されていれば)、およびとデータベースへのSQLの発行などでチェックするということになりそうだ。
$xoopsModule->mid()
$xoospUser->isAdmin()

XoopsといえどもプログラムはPHPだから難しいわけではない。基本的にXoopsのお作法に則ったアクセス権の管理さえ出来れば、モジュールを作成するのは何も難しいことはない、ということになる。

ここまでくればハックが必要なモジュール(白扇など)をのぞけば大抵の機能を作ることが出来るようになるだろう。

HTML_QuickForm suspended

2007/07/10 | HTML_QuickForm

とうとうHTML_QuickFormのメンテナンスが終了してしまった(正確に言うと追加開発が終わっただけでバグフィックスは継続しておこなわれる模様)。
DBパッケージと同様に、代替モジュールの利用を促すメッセージがpear.php.netに記述されている。
まぁ、当然といえば当然だ。PHP5で使うと、エラーが頻発するような現状で、老い先短いだろうということはよくわかっていたから。しかしひどいのは、代替モジュールである「HTML_QuickForm2」は、まだアルファ版(バージョン0.1.0)ということだ。「アルファ版を原稿バージョンの代わりに使え」というタコなメッセージには閉口してしまう・・・。

HTML_QuickForm2は、HTML_QuickFormをPHP5で使用した際にエラーが頻発したのを解決するために書き直されたパッケージである、とのこと。ちなみにドキュメントはまだまだ・・・エンドユーザ向けのドキュメントはまだ提供されていない。
APIドキュメントを少し確認してみたところ、ちょっと気になっていた「ファイル操作」の部分はまだ残っているようだ。HTML_QuickFormでは「将来的になくなるかも・・・」ということだったので、どうなることかと思っていたが、どうも引き継がれていくようだ。

ドキュメントが充実して、ベータ版でも出ない限りは、当面HTML_QuickForm2を使うことはないだろうけど、注目しておく必要があるパッケージであることには間違いない。このパッケージが正式リリースされたら、PHP5への乗換え時だ、と思う(個人的に)。

しかしこの先、新しい仕様が出てくるような気がする。現状ブラウザからはフォームからデータを送信して、フォーム専用の受け口(プログラム)を用意するわけだが、そのうち全てXML-RPCだけで全てまかなえそうな気もしてしまうのだ(もしくはSOAPでもいい)。

PHPで「select multiple」

2007/07/09 | PHPの基本

PHPでフォームを操作する際には、場合によってはいろいろ工夫が必要な場合がある。

例えばチェックボックス。複数項目チェックOKな場合のチェックボックスを作成する場合、全てのチェックボックスのname属性を同じにしていると、正しくデータを受け取ることは出来ない。

<input type="checkbox" name="myCheckBox" value="1" />check1
<input type="checkbox" name="myCheckBox" value="2" />check2
<input type="checkbox" name="myCheckBox" value="3" />check3
<input type="checkbox" name="myCheckBox" value="4" />check4

このように書いて、複数チェックしても、一番最後のチェックしかデータを拾ってくれない(IISのASPなどはこれでも正しく受け取れる)。
これを回避するには以下のいずれかの方法がある。

○name属性をそれぞれ個別に設定してやる
○name属性の値に「[]」をつける

前者での場合の記述は以下のようになる。

<input type="checkbox" name="myCheckBox1" value="1" />check1
<input type="checkbox" name="myCheckBox2" value="2" />check2
<input type="checkbox" name="myCheckBox3" value="3" />check3
<input type="checkbox" name="myCheckBox4" value="4" />check4

上記のように記述すれば、それぞれ個々に値が渡される。
後者の場合は、以下のように記述することになる。

<input type="checkbox" name="myCheckBox[]" value="1" />check1
<input type="checkbox" name="myCheckBox[]" value="2" />check2
<input type="checkbox" name="myCheckBox[]" value="3" />check3
<input type="checkbox" name="myCheckBox[]" value="4" />check4

このように記述するとPHP側では、選択されたデータが配列として格納される。つまり以下のように取得できる(例)。

$_REQUEST[‘myCheckBox’]=array(‘1′,’3′);

一工夫必要なわけだ。
これはチェックボックスだけではなく「select multi」なフォームエレメントでも同様だ。ただし、こちらの場合はname属性で指定できるのは一つだけなので、上記のうち後者の方法(配列で受け取る方法)のみ利用できることになる。

初心者にはわかりにくいかもしれない。
「select multiple」などはQuickFormでもサポートされていなかったりするので、なおさらだ。

minihakuの拡張その5

2007/07/08 | XOOPS

さて、edituserhook.phpを読んでいく。
$allowed_requests、$stop_reason_extrasの記述はregisterhook.phpと同じ。
次にuidの取得。ここでは「編集」なので、この画面を使用する人は当然ログインしているわけだからuidを取得できるわけだ。

設定ファイルを読み込んだ後、$xxxxxx_optionsの設定はフォームで使用される選択式設問用のオプション値の準備だ。
次は処理振り分け用の設定($op)。$opが設定されていなければ’editprofile’を設定する(フォームを表示するため)。
それから各種設定を変数へ格納する。

ここからが本格的な処理になる。
最初のif節はpostで送られてきた情報を、あらかじめ設定された$allowed_requestsと比較して変数に格納していく。

そして次のif節。実際の保存処理に移るわけだが、if節の中の最初の処理はエラーチェック。エラーがあったらもう一度フォームを表示することになる。
実際の保存処理はきわめて簡単だ。あらかじめ用意された関数を使えばよい。具体的には以下の記述。

$edituser =& $member_handler->getUser($uid);
$edituser->setVar(‘url’,$allowed_requests[‘url’],true);



$member_handler->insertUser($edituser);

これでOK。後付で追加した項目は都度UPDATE構文で処理する。
最後の部分はフォームの表示だけ、となる。

minihakuはこれで全てだ。ユーザ情報の表示(userinfohook.php)はプログラムこそ用意されて入るが中身は空。つまり一度はhookをかけるが、何もせずXoop標準の処理に戻して、デフォルトの表示方法をとっているようだ。

もちろん自分でプログラムを作成して、userinfohook.phpに記述しておけば独自の表示処理をかませることが出来る。無論テンプレートも別途用意してやる必要があるわけだが・・・。

minihakuを読んでみて、Xoopsのことがずいぶん理解できたような気がする。以降の新規モジュール作成の際にはきっと役立つだろう。
これから仕様決め。今月中に形を作りたいものだ。

minihakuの拡張その4

2007/07/07 | XOOPS

ユーザ情報の編集は以下のファイルから構成される
・include/config.php
・include/edituserhook.php
・templates/minihaku_edituser.html

設定ファイルとテンプレートはよしとして、プログラム本体「edituserhook.php」を見ていく。
ここでまず最初に知っておく必要がある事項についてメモすることにする。
Xoopsでは初回登録時の入力項目と、編集時の項目とは違う。違うというのは正しくないが、編集時には情報を追加できるのだ(もともと登録しておける項目はたくさんあるが、初回登録時は必要最低限の部分のみ)。

変数名 登録時 編集時 適用
uname ユーザ名
name 本名
email メールアドレス
pass パスワード
vpass パスワード確認用
user_icq ICQアカウント
user_aim AOLメッセンジャーアカウント
user_yim Yahooメッセンジャーアカウント
user_msnm MSNメッセンジャーアカウント
user_from 居住地
user_occ 職業
user_interest 趣味
user_sig 署名
url ホームページ
timezone_offset タイムゾーン
user_viewmail メールアドレスの公開
umode コメント表示モード
uorder コメントの並び順
notify_method イベント更新通知メッセージの受け取り方法
notify_mode イベント通知のタイミング
user_mailok 新着情報の受け取り
bio その他
agree_disk 規約への同意

必要なものもあれば、必要ないものもあるし、決まりきっていて入力してもらう必要もないものもある。いずれにしても処理方法を検討する上で、このリストは重要だ。
ただし編集時に入力する「ユーザ名を1年間クッキーに保存する」という設定。これはDBに保存されない。単にクッキーに保存しておくだけ、ということだろう。

さて、プログラムの行数も多くない。がんばって読んでいくことにする。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net