• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サーバーのフォルダ名をセレクトの値とする)

サーバーフォルダ検索フォームを作成する方法について

このQ&Aのポイント
  • クラインと用のサーバーフォルダ検索フォームを作成したいです。サーバーのデータ領域内のフォルダをそのままセレクトメニューの項目値にしたいのですが、何かいい方法はありますでしょうか?
  • クライアント側で頻繁にフォルダの登録・削除が行われるため、リアルタイムでフォルダ情報を取得したいと考えています。CGIを使用してフォルダ情報を取得する方法を考えていますが、セレクトメニューの項目値として紐付けたいフォルダの情報が複数ある場合にはどのようにすれば良いでしょうか?
  • クラインと用のサーバーフォルダ検索フォームを作成する際に、セレクトメニューの項目値を紐付けたいフォルダ情報が複数ある場合にはどうすれば良いでしょうか?情報を提供いただける方がいらっしゃいましたら、ご教授願いたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.3

サンプルです。 先頭行の「#!/~」と「$start_dir = ~」は適宜変更してください。 リストから選択するまで、次のリストは表示されないようになっています。 セキュリティ対策、たとえばユーザーから送信されたデータをそのまま使わない、などしてください。 ================================ #!/usr/bin/perl $start_dir = '/home/public_html'; # 受信データ デコード read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach (@pairs) { ($name, $value) = split(/=/); if (!$name) { next; } $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2', $1)/eg; $FORM{$name} = $value; } $dir_level = 0; $cur_dir = $start_dir; while (1) { $dir_level++; opendir(DIR, $cur_dir) or die; @entries = sort readdir DIR; closedir DIR; $next_dir = ''; foreach (@entries) { if (!(-d "$cur_dir/$_") || /^\.\.?$/) { next; } $selected = ''; if ($_ eq $FORM{"list_$dir_level"}) { $selected = ' SELECTED'; $next_dir = $_; } $options{"list_$dir_level"} .= qq|<OPTION VALUE="$_"$selected>$_\n|; } if (!$options{"list_$dir_level"}) { $dir_level--; last; } if (!$next_dir) { last; } $cur_dir .= "/$next_dir"; } #----------------------------------------- print <<"EOM"; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML LANG="ja"> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP"> <META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript"> <TITLE>DIR Test</TITLE> </HEAD> <BODY> $start_dir <FORM METHOD="post" ACTION="$ENV{'REQUEST_URI'}" ID="Form1"> EOM #----------------------------------------- foreach (1 .. $dir_level) { print '-' x $_ . qq|<SELECT NAME="list_$_" onChange="Form1.submit()">\n<OPTION VALUE="">---\n$options{"list_$_"}</SELECT><BR>|; } #----------------------------------------- print <<'EOM'; <INPUT TYPE="submit" VALUE="SELECT"> </FORM> </BODY> </HTML> EOM #-----------------------------------------

kal1119
質問者

お礼

サンプルありがとうございます。 少し難しいので解析に時間がかかりそう・・・ わからないところは質問させていただきますので、 その時はよろしくお願いいたします。 ということで、早速ですが、 フォルダ選択を途中で止めるにはどうしたらよいのでしょうか? セレクトメニュー4つ分でそれ以降はもう良いのですが。 以上、よろしくお願いいたします。

その他の回答 (3)

  • taseki
  • ベストアンサー率66% (155/233)
回答No.4

> フォルダ選択を途中で止めるにはどうしたらよいのでしょうか? > セレクトメニュー4つ分でそれ以降はもう良いのですが。 while (1) { という行がありますよね。 これはご存知かもしれませんが無限ループです。 で、下のディレクトリが存在する限り続け、ディレクトリが存在しなかったらループを抜けます。それをやっているのが、 if (!$options{"list_$dir_level"}) { $dir_level--; last; } という行です。 なので、その対象ディレクトリ自体、4階層しか作っておかなければ、そこで止まります。 ディレクトリの存在に関わらず、上限4つと決めてしまうなら、「無限ループ」を「4回繰り返すループ」に変えるだけです。 foreach (1 .. 4) { とか。 何かの条件、たとえば決められた何かを選択した時点でストップ、などというときは、上記if文あたりを変更して、条件によってループを抜けるようにすればいいと思います。 ところで、書き忘れましたが、このサンプルでは選択と同時に切り替わりますが、それはJavaScriptを使っているので、JavaScriptをオフにしている人のために、あえてボタンも付けてあります。このボタンがなければ、その人たちは何もすることができなくなってしまうので、付けておくことをおすすめします。

kal1119
質問者

お礼

ありがとうございます。 早速試してみたいと思います。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.2

ようするに、リストから選択するだけで自動的に次のリストの内容が変化していく、ということですね? 一般的によくあるのが、 1.初期画面は、リスト1のみ値が入っていてリスト2以降は空 2.リスト1をユーザーが変更すると、onchangeイベントでその内容を自動的にサーバーに送信 3.サーバー側で、受信した内容に応じてリスト2に値を入れた画面を生成、ブラウザに送る。この時点でリスト1とリスト2のみ値が入っていて、リスト1は選択済みの状態になっている(optionタグにselect属性が付いている)。 4.リスト2をユーザーが変更すると、onchangeイベントでその内容を自動的にサーバーに送信。リスト1をユーザーが変更した場合は2に戻る 5.サーバー側で、受信した内容に応じてリスト3に値を入れた画面を生成、ブラウザに送る。この時点でリスト1とリスト2とリスト3のみ値が入っていて、リスト1とリスト2は選択済みの状態になっている(optionタグにselect属性が付いている)。 以下同じ… というパターンです。 同じ1つのCGIスクリプトで可能です。 ようは、上記は遷移の流れであって、プログラムの処理の流れは単純です。 常にすべてのリストの選択状態が送られてくるので、 1.リスト1から順に… 2.選択されていれば、次のリスト内容を生成、選択されていなければ4へ 3.2で生成したリストに対して、2に戻る 4.残りのリストがあれば、空のリストを生成 というプログラムを1つ用意し、ユーザーがリストを変更するたびに、このプログラムに送信すればいいと思います。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.1

まずは、ご質問の内容は、カテゴリはココ(JavaScript)ではなくCGIなどですね。 で、セレクト1→セレクト2への遷移がわからない、と解釈していいでしょうか。 単純に、受け取った値(ディレクトリ)を$AREAに割り当てて、そしてまた繰り返していけばいいだけと思います。 それと、readdir(DIR)では全てのエントリを読み込んでしまうので、ディレクトリなのかファイルなのか区別する必要があるでしょう。「-f」、「-d」というファイルテスト演算子が使えます。 また余計なことかもしれませんが、「print <<"EOF";」という書き方(ヒアドキュメント)は一般的に長い内容の場合に便利なものですので、1行ぐらいだと逆に読みにくいかと。 素直に print "<option value ="$file">$file</option>"; と書いた方がスッキリすると思いますよ。

kal1119
質問者

補足

ご回答ありがとございます。 補足させていただくと、 やりたいことはセレクトメニューの紐付けかつ、セレクト項目が頻繁に変動されることからフォルダをセレクト項目として取得する、ということです。 セレクト2の内容は、セレクト1で選択したフォルダの下にあるフォルダを表示させるようにしたいです。 セレクト3・セレクト4も同じで階層的に処理したいです。 セレクト1/セレクト2/セレクト3/セレクト4 ですので、 セレクト3の内容が決まるまではセレクト4は選択できず、 セレクト2の内容が決まるまではセレクト3は選択できず、 セレクト1の内容が決まるまではセレクト2は選択できず、 というような具合です。 セレクト1を選択した時点でもう一度同じCGIを実行するか、もしくはセレクト2選択用のCGIを実行するか、という感じになるかと思うのですが・・・ 可能でしょうか? 以上、よろしくお願いいたします。

関連するQ&A