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に保存されない。単にクッキーに保存しておくだけ、ということだろう。

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

minihakuの拡張その3

2007/07/06 | XOOPS

registerhook.phpの登録処理ルーチン付近を見てみることにする(「REGISTER STAGE」から下あたり)。
まず最初のif節。登録フォームでsubmitされたときの処理だ。ここでは入力値のチェックがおこなわれている。チェックする項目はユーザ名とメールアドレス、それにパスワードだ。エラーがあると、そのエラーは変数$stop_reasonにセットされる(後で使う)。
次のif節。ここでは実際の登録処理をおこなう。このif節は登録フォームでsubmitされ、かつ上述の$stop_reasonに値がセットされていないときに処理をする(つまり入力内容にエラーがなかったとき)。ここでは$stop_reason_extrasという変数もチェックしているのだが、これはおそらく追加で設定した項目について、独自にエラーチェックルーチンを書け、ということのようだ。
そして粛々と登録処理があり、$member_handler->insertUser($newuser)で登録が完了する。この時点ではデフォルトの項目のみが登録される。
次に追加で設定した項目データの登録となる。上記登録完了でセットされたuidを取得し、データベースを更新、という形式で登録処理が実行される。
次は自動的に所属させるグループの設定。複数のグループに登録させることが出来る。ここの$auto_belong_groupsはconfig.phpで設定された変数だ。
次が$xoopsConfigUser[‘activation_type’]の設定次第で分岐処理。おそらく「0」は確認メールを送る通常処理、「1」は即時登録、「2」は管理者にアクくティベーションのためのメールを送信する処理だ。
そして最後はユーザ登録のnotifyメールの送信処理となる。

とりあえず全部読めた。次はedituserhook.phpを見ていくとしよう。

minihakuの拡張その2

2007/07/05 | XOOPS

minihakuの拡張、まず「登録」から。
基本的にこれは以下の3ファイルから構成されているようだ。
・include/config.php
・include/registerhook.php
・templates/minihaku_register.html

もちろん設定ファイルの読み込み等があるので、別ファイルも関連するがそれは割愛。上記のうちconfig.phpは、登録フォームで追加すべき項目を設定する(config.dist.phpからrenameして使用)。このファイルはもちろん編集でも使用することになる。
結局このファイルでは、入力項目の設定、入力値のチェック、編集時の初期値をDBから取得、なんて処理が書かれている。手動で作業する場合はこれを編集・追記するわけだ。目指すはここの自動化(もちろんテンプレートも自動的に変更されることを目指す)。
registerhook.phpはプログラムの主要部分。今回は最初ということでフォームの表示部分のみを見ることにする。最初のところは受け取りたい変数の初期化だ。ここも自動化する必要がある。途中の大部分は実際の登録処理なので、とりあえず省略(後日検討)。フォームの表示は最後のほうの「FORM STAGE」以下の部分だ。
最初にheaderを読み込む。次にフォームの情報をセットし、またconfig.phpで追加された情報もここでセットされる。そして最後にfooterの読み込み。それだけ。これをDB化すればいいということになる。まぁ、簡単ではあるが、実際作業するのは多少手間であることは間違いない。
あとはテンプレートminihaku_register.htmlを適宜修正する必要がある。ちなみにminihakuでは、項目名は既存の設定ファイルを流用する形になっている。これではまずいのでここもDB化していくことになる。

今回いろいろ試行錯誤していて覚えたXoopsのお作法。テンプレートファイルを編集しても、それでは直接反映されない。いったんXoopsの管理者権限を取得し、モジュールのアップデートを実行することでようやくテンプレートが反映される。これは、Xoopsのモジュールではテンプレートの内容はDBに書き込まれ、それがコンパイルされてtemplates_cディレクトリに保存されているからだ。なんでそんな面倒なことになっているのかわからないけれど・・・。まずは少しめどがついた。
次回は実際の登録ルーチンを見ていくことにする。


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