[PHP-users 26680] Re: (無題)
Tadashi Jokagi
ml @ elf.no-ip.org
2005年 8月 29日 (月) 16:29:12 JST
ぢょ〜@よくきたなです.
さて.そもそもなのですが,
Shinichi Yoshimuraさんの「[PHP-users 26666] (無題)」から
>Form1.php → Form2.php → Form3.php
>
>一つのブラウザで、Form3を確認中に、
>もうひとつのブラウザで、Form1を表示すると
>情報が、混ざってしまいます。
この1回目に表示する Form1.php と2回目に表示する Form1.php のデフォ
ルトというかターゲットデータ(仮に以後「ターゲットデータ」とする)
ですが,
1)ターゲットデータは同一(「山田」さんを編集中に「山田」さんを編集
しようとする
2)ターゲットデータは異なる(「山田」さんを編集中に「田中」さんを編
集する
のどちらでしょうか? 1)ですとページ毎にターゲットデータを書き換え
ない限りフォーム推移中のデフォルト同一の内容になるでしょう.2)の
場合はデフォルトは同一にはならないですね(なってたらそもそものロジッ
クがだめ
また,次にセッションを使うかどうかですが,Form1.php に来るなど
「トランザクションの先頭」が識別できるなら(いくつかやり方はありま
す)そこでトランザクション ID(チケットということが多いかな)を作成
し,セッションに付加するといいでしょう.
<?php
// 適当なForm1.php
$ticket = md5( time());
$_SESSION[ "form"][ $ticket"] = array();
echo <<<EOD
<form ...>
<!-- チケット*だけ*を使いまわす -->
<input type="hidden" name="ticket" value="$ticket" />
<!-- いろいろ -->
</form>
EOD;
#盗まれても大丈夫な自信があるなら必要ならチケットは GET でもいいかもし
れない
?>
<?php
// 適当なForm2.php
// 必要分セッションに入れる
foreach ( array( "name1", "name2", ...) as $name) {
$_SESSION[ "form"][ $ticket"][ $name] =
isset( $_POST[ $name]) == TRUE? $_POST[ $name]: NULL;
}
?>
かなり適当なので実際に使用するには適切に修正する必要があるでしょ
う(validate もなにもしてないし)
ちなみに1)で複数ウィンドウに分岐したときにフォーム編集時が別々に
なることは本質ではなく,最終的な submit が保存されることが本質のひ
とつなのではないかと思います.なので,仮に hidden まわしでやると,
1 つのトランザクションから派生したフォーム処理を複数回処理する可能
性があります(セッションだとチケットと関連するセッションを破棄する
だけで簡単に回避できます)
tommyさんの「[PHP-users 26678] Re: (無題)」から
>・入力チェックブロック
> 画面IDが一番最初の時だけパス。それ以外の時全部で入力項目が規則に
> 合ってるかチェック。エラーがあればエラーフラグを立てて画面IDを入力画面
> に戻す
仮に 3 ページあると,最初に 1 ページ目から 2 ページ目に移動した
ときに 3 ページ目の validate をしないでしょう.3 ページ目まで行っ
て 2 ページ目に移動したときは 3 ページ目の validate をしなければな
りません.つまり同じ 2 ページ目でも validate するべき要素をしっか
り区別しなければなりません.など考えると hidden 回しで全要素を確認っ
てかなり面倒くさいと思うんですがいかがでしょうか?
#個人的にある程度コーディングやクライアント環境に制限がないならチケッ
トを付加した HTML_QuickForm_Controller が妥協点のひとつです.
--
----.----1----.----2----.----3----.----4----.----5----.----6----.----7
Tadashi Jokagi/Shibuya city mailto:elf @ elf.no-ip.org
YokukitanaII http://elf.no-ip.org/
Yokukita blog http://blog.poyo.jp/
Yokukita wiki http://wiki.poyo.jp/
PHP-users メーリングリストの案内