階層式のプルダウンセレクトを作成したい!どうすればいい?

このQ&Aのポイント
  • CGI初心者がデータベース検索をPerlで作成している段階で、階層式のプルダウンセレクトを作成したいです。第一のプルダウンメニューで県名を選択すると、次のプルダウンメニューには選択した県の市名や郡名のみが表示されるようにしたいです。さらに、その中から選択して検索できるようにしたいです。
  • 現在は直接検索させる方法を使用していますが、将来的にはユーザ数が増えることを考慮して、絞り込んで検索できるようにしたいです。
  • ユーザ名のジャンルを選択するプルダウンメニューを作成するため、大口市、春日市、筑後市、人吉市、宮田町、八女市、その他の項目を用意しました。今後データが増える予定です。
回答を見る
  • ベストアンサー

階層式のプルダウンセレクトを作成したいのですが・・・

CGI初心者です。データベース検索をPerlで作成というか、カスタマイズかけている段階なのですが、例えば、第一のプルダウンメニューで県名をセレクトしたら、次のブルダウンメニューには、セレクトされた県の市名や郡名のみが表示されていて、さらにそこからセレクトして検索ができるというのを作成したいのですが、どうしたらいいのか教えてください。 いまのところは、ダイレクトに検索させる方法をとっているのですが、このユーザが少なくとも100以上には増えるため、絞って検索できれば・・・と思っているのです。 # 第1ジャンル:ユーザ名 @part1 = ('大口市','春日市','筑後市','人吉市','宮田町','八女市','その他');(これからかなりデータは増えるのです。) sub html { # 表示開始 &header; print <<"EOM"; <form method="$method" action="$script"> <input type=hidden name=mode value="search"> <table border=0 cellpadding=15><tr> EOM # 配列1 $size1 = @part1 + 1; print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>ユーザ名</B><br>\n"; print "<select name=P1 >\n"; print "<option value=\"99\" selected>指定なし\n"; foreach (0 .. $#part1) { print "<option value=\"$_\">$part1[$_]\n"; } print "</select></td>\n"; よろしくお願いします。

  • bori
  • お礼率67% (40/59)
  • Perl
  • 回答数4
  • ありがとう数7

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

  • ベストアンサー
  • y_oku
  • ベストアンサー率62% (25/40)
回答No.4

なるほど、既存のデータのみを利用すればいいんですね。 それならそれほど難しくなさそうですね。 県名を指定したときに検索データ入力ページのcgiである自分自身を再び呼び出す方針が思いつきます。 そしてその検索cgiの呼ばれ方での分岐ですが、 県名が未指定のときには ・県名「指定なし」 ・市郡「指定なし」←すべての市郡リスト(全国のユーザデータから作成) と表示し、県名が指定されているときは、 ・県名「東京都」 ・市郡「指定なし」←東京都の市郡リスト(東京都のユーザデータから作成) になればいいんですね。 質問にある配列@part1はユーザファイルから読み込んで、 その都度生成するようにします。 どのように読み込んでも高々100レコードなら時間もかからないでしょう。 検索を絞り込む部分については、検索cgiをsearch.cgiとすると、 まず以下のJavaScriptを作っておきます。 function select_prevecture(){ document.forms[0].action="search.cgi" // 自分自身を呼び出す。 document.forms[0].submit } これはページのなかのformで実行するcgiを自分自身に変更してsubmitします。 必要なJavaScriptはこれだけでよいでしょう。 次に、県名の選択リストのタグにonChangeオプションをつけておいて、 先ほどのJavaScriptの関数を呼び出すと、 県名を変更したときには、もう一度自分自身を呼び出すようにできます。 <form action="report.cgi" method="POST"> <select name="prefecture" onChange="select_prefecture()"> ... </form> JavaScript経由でcgiが呼び出されたときは県名が指定されているので、 それにあわせて市郡の選択リストを出力すればよいかと。 いったん画面を書き直すようなってしまうけれど、 ほかの検索条件(業務内容)も引き渡されるので、 defaultの値をそれにしておけば 同一画面で検索しているように振舞うことはできると思います。 ぼくも説明下手なので、わからないところ補足してくださいね。

bori
質問者

お礼

いろいろ丁寧に教えてくださってありがとうございました。 おかげで、どうにかできそうな目処がたちました。ヾ(@^▽^@)

その他の回答 (3)

  • y_oku
  • ベストアンサー率62% (25/40)
回答No.3

補足を見てわたしが想像した仕様では、 「ユーザに関係するデータをひっぱってくるだけ」てのをどう実現するかの 見積もりが甘い気がします。 ●1.県と市のデータベース構築について。 県←→市の関係は初回はユーザの入力に頼るんですよね。これ。 そうすると未入力の市は市のプルダウンメニューに入っているかどうかわからず、 わざわざ数十のなかから探してみたあとでなかったら、さらに入力? そしてその入力が正しいかどうかは保証されないですよね。 ●2.県を選んだあとデータベースから市を絞り込むところ。 CGIでデータベースから県と市に対応した配列をガーっとhtmlに出力しておいて、 県を選んだ後その市の配列に手を加えるようなJavaScriptを書くのでしょう。 がんばればできる「かも」。 結論としては、1の不確実さと、 1、2の手間(システム構築側の手間、そのときのユーザの入力の手間)を考えると、 どのくらいユーザの手間が効果的に軽減されるかかなり疑問です。 わたしのお奨めは、県名だけプルダウンから選んでもらって、 それ以降の住所はテキストボックスに自分で入力してもらう、 というあたりでしょうか。 県は一度選べばいいし、初回だけ市の名前を入力するって、 そんなに難しいことではないと思います。 あ、ユーザが入力するのって当然最初の1回だけですよね。 あらかじめ郵便番号の「150-0043→東京都渋谷区」のような データベースがあるのなら、もうちょっと頑張ってもいいけれど。 なにか勘違いしていたらまた補足をしてください。

bori
質問者

補足

すいません。説明が悪すぎて・・・ これは、社内でのユーザのデータを社員がみやすくするためのものなのです。ですので、そのデータを入力するのは管理側でしかできないようにしていますし(パスワードかけて)、利用する側は、自分がみたいユーザのデータをのぞければそれでよいのです。で、そのユーザが九州だけとはいえ、数があるので、せめて検索しやすければ・・・と考えているのです。今のままでは、なが~いプルダウンメニューの中から(一応あいうえお表示にはならべていますが)さがさなければなりません。しかも、ユーザ名だけで検索するわけでもなく、いくつかのキーワード(例えば業務内容など)をもたせているので、同じ検索条件のひとつとして考えています。なので、同一画面で、簡単にユーザが絞り込めるような状態にしたいのです。 なにか手がかりがありましたら、アドバイスお願いします。

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.2

データベースを利用しましょう。  上記のやり方ですと、出来たとしても遅くて回線状況によっては、タイムアウトエラーになります。 y_oku様がかかれている通り、ソースよりももっと具体的にやりたい事を書いて下さい。  県を選んだ画面で、市を表示したいのか?  全部同じ画面で表示したいのか?  全部違う画面で表示して、前の選択情報は画面に表示するだけでよいのか?  全部同じ画面でやるとすると、凄く手間ですし、時間もかかると思います。  違う画面に表示する場合には、そんなに難しくなく出来ますが、インターフェースがちょっと複雑になりますので、ユーザがいる場合には先にそちらの説得が必要になります。

bori
質問者

補足

すいません、要領がわるくて・・・ やりたいことは、質問gooで、質問をするときに時々表示されている、 カテゴリーで、「コンピュータ」って選んだら、次のプルダウンメニューボックスには、プログラムやOSといったものが選べるようになっていて、その次のボックスで、cgiやperlといった項目を選らんでいけるような感じのものを県名から、その関係地域の市や郡といった感じで表示したいのです。 ですので、同一画面でしたいし、ユーザは直接関係なくて、ユーザに関係するデータをひっぱってくるだけなので、それを元に検索できればいいなぁと思っているんですけど・・・

  • y_oku
  • ベストアンサー率62% (25/40)
回答No.1

まず最初に。 例えば熊本県を選んだらcgiプログラムかJavaScriptかで 熊本市や人吉市は次のselect項目に残すんですよね。 県名→市郡名のデータベースは存在してるんでしょーか。 あらかじめ各県の市や郡を入力するのかなりの手間だと思うんですが。 あらかじめ入力しないで、そのときの入力を保存しておくとか 素敵なことをしようと思うと当社比3倍は難しくなりますが。 んで次に。 県を選ぶところと、市を選ぶところは同じ画面内がいいのか、 別の違う画面でもいいのかってこと。 違う画面っていうのは、最初のCGIの画面では県を選んでsubmitしたら 別のCGIに飛んでそこで市を選ぶという意味です。 同じ画面の中ならば、 JavaScriptのプログラムをhtmlに出力してやらないといけないので、 CGIというよりJavaScriptのプログラムを頑張る感じになるよ。

bori
質問者

補足

なんだか質問の仕方がへたっぴですいませんでした。 例えば、福岡県と選んだら、次のプルダウンの中には、そもそも全国の市や郡名が入っている部分の福岡県域の部分のみ表示されて、そこから、セレクトできるものを作成したいのです。 もちろん同一画面がいいのですが・・・ それは、他にも検索条件が表示されているからです。 JavaScriptで、かんがえたほうがいいのでしょうか?

関連するQ&A

  • セレクトBOXをプルダウン形式にしたいのですが・・・

    CGI初心者です。セレクトボックスで表示しているものをプルダウン形式にしたいのですが、どこを直したらいいのか教えてください。 ちなみに、いまのスクリプトは $size1 = @part1 + 1; print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>ユーザ名</B><br>\n"; print "<select name=P1 size=\"$size1\">\n"; print "<option value=\"99\" selected>指定なし\n"; foreach (0 .. $#part1) { print "<option value=\"$_\">$part1[$_]\n"; } print "</select></td>\n"; です。

    • ベストアンサー
    • CGI
  • セレクト表示方法について

    DBのトップ画面で選択画面の表示項目を1つだけ表示表示して矢印で開けるようにしたいのですが書き換え方がわかりません。 一応、表示部分の↓に書いて見ました sub html { # 表示開始 &header; print <<"EOM"; <table bgcolor="#B5B5B5" cellpadding=4 cellspacing=0 border=0 width="45"> <tr><td align="center"> <A HREF="$homepage" STYLE="text-decoration:none;color:black">戻る</A> </td></tr> </table> <center> <hr width="400" noshade> <font color="$t_color" size="$t_size" face="$t_face"><b>$title</b></font> <hr width="400" noshade> <P> <table><tr><td> $TopMessage </td></tr></table> <form method="POST" action="$script"> <input type=hidden name=mode value="search"> <table border=0 cellpadding=15><tr> EOM # 配列1 $size1 = @part1 + 1; print "<td valign=top><font color=\"$t_color\">■</font> <B>テス</B><br>\n"; print"<select name=P1 size=\"$size1\">\n"; print "<option value=\"99\" selected>指定なし\n"; foreach (0 .. $#part1) { print"<option value=\"$_\">$part1[$_]\n"; } print "</select></td>\n"; print "</tr></table>\n"; print "<font color=\"$t_color\">■</font> <b>キーワード</b> (任意)<br>\n";

    • 締切済み
    • CGI
  • プルダウンの初期値に関して2

    前の質問と同じ内容となってしまいますが、プルダウンの前回値が どうしても取得できません。。。 ソースは以下のように記述し、selected属性を用いて初期値に前回値 を指定しているような格好をとっています。 何か記述が間違っているのでしょうか。。。。 print("<TR>\n"); print("<TD NOWRAP><FONT SIZE='3'><B>【行  先】</B></FONT></TD>\n"); print("<TD NOWRAP SIZE='30'><input name='text1' VALUE=$out></input>\n"); print("</TD>\n"); print("<TD><select name='am_note' ONCHANGE='ChangeSelection(this.form, this)'> <option value=' '                      <?php if('$out_goto'==' '){ echo' selected=?'selected?''; } ?>   <option value='自席' style='background-color:#FFFFFF; color:#3366FF' <?php if('$out_goto'=='自席'){ echo' selected=?'selected?''; } ?> 自席 </select>\n"); print("</TD>\n"); print("</TR>\n"); 教えて下さい。

    • ベストアンサー
    • PHP
  • プルダウンの初期値に関して

    教えて下さい。 PHPとJavascript、DBはMySWLを使用してプルダウンにて選択した 内容を、別のテキストエリアに表示させるような事をしようとしています。 javascriptで選択されたものを別エリアに表示させ、さらには前回値をテキストエリアに再表示させる事は可能ですが、次に登録しようとした際に、プルダウンを選択していないとせっかく登録した内容がプルダウンの初期値で上書きさせれてしまいます。 何か、テキストにデータが存在した場合には、プルダウンの情報で上書きしないか、そもそもプルダウンの内容を覚えておくような事はできないでしょうか。。。 現在作成している記述です。 print("<TR>\n"); print("<TD NOWRAP><FONT SIZE='3'><B>【行  先】</B></FONT></TD>\n"); print("<TD NOWRAP SIZE='30'><input name='text1' VALUE=$out></input>\n"); print("</TD>\n"); print("<TD><select name='am_note' ONCHANGE='ChangeSelection(this.form, this)'> <option value=' '>                      <option value='自席' style='background-color:#FFFFFF; color:#3366FF'>自席 </select>\n"); print("</TD>\n"); print("</TR>\n"); よろしくお願いします。

    • ベストアンサー
    • PHP
  • プルダウン選択後の手入力優先に関して

    教えて下さい。 プルダウンを選択し、選ばれたものを別テキストに表示するような事を したいと考えています。 現在、下記のように記述をしており、上記の内容は実現できていますが、 その際に、表示される側のエリアに手入力を可とし、入力があった場合は、 javasriptの選択項目を無効(手入力を優先)としたいと考えています。 どのような方法があるでしょうか。。。 <SCRIPT LANGUAGE="JavaScript"> function ChangeSelection(form, selection) { v = selection.value; form.text_note.value = v; } </SCRIPT> print("<TD NOWRAP><FONT SIZE='3'><B>【行  先】</B></FONT></TD>\n"); print("<TD NOWRAP SIZE='30'><input name='text_note' VALUE=$out_goto></input>\n"); //$out_gotoにはphpにてテーブルから読み込まれた情報が初期値として格納されています。 print("</TD>\n"); print("<TD><select name='am_note' ONCHANGE='ChangeSelection(this.form, this)'>\n"); print("<option value=' '></option>\n"); print("<option value='自席' >自席</option>\n"); print("<option value='離席' >離席</option>\n"); print("</select>\n"); print("</TD>\n"); よろしくお願いします。

  • ユーザ入力が表示されない原因を教えてください。

    CGI初心者です。基礎を勉強しただけなのでまだまだ理解が足りないせいかもしれません。現在データ検索のカスタマイズをしています。 ユーザが入力したものを検索条件の一部にと考えているのですが、なかなかできません。どこがいけないのかおしえていただけないでしょうか? インプット print "<P>● 業 務 <input type=text name=P2 size=30>\n"; アウトプット print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>業 務</B><br>\n"; print "<select name=P2 >\n"; print "<option value=\"99\" selected>指定なし\n"; $i =99; foreach $line (@lines) { ($name,$value) = split(/\,/,$line); chop; if ($name ne '') { $i++; $names{($name)[0]}++; $n++; } } foreach (keys %names) { print "<option value=\"$_\">[$_]\n"; } print "</select></td>\n"; と表記してます。クッキーを利用して反映できるようにはしていて、 入力したものを、登録内容の確認や、削除するときやメンテするときにはちゃんと表示されています。

  • フォントサイズを変えるには?

    print "<table width=600 border=0 align=center> <tr> <td align=center>\n"; print "<br><br><font size='2' color=$t_color><small>*** 編集・削除用 ***</small></font><br>\n"; print "<select name=mode>\n"; print "<option value=usr_edt>編集\n"; print "<option value=usr_del>削除</select>\n"; print "パスワード <input type=password name=pwd size=4 maxlength=8>\n"; print "<input type=submit value=\"送信\"> </form> </td> </tr> </table>\n"; 上の、「編集」と「削除」という文字のサイズを変えたいのですが、 どうすればいいのですか? <font size='2'>とか入れたけど、変わりませんでした。 (入れた場所が悪かったのかな??) お願いします。

    • ベストアンサー
    • CGI
  • プルダウン選択によるボタンの表示/非表示に関して

    教えて下さい。 下のように、ONCHANGEイベントで、プルダウンにて選択された内容を、別のテキスト ('text')エリアに表示させる記述をしましたが、今度は選択された内容によって、 ボタンの表示/非表示をコントロールしたいと考えています。 実際には、下の記述で、'BBB'が選択された場合のみ、***よりしたの"日"ボタンを 表示させたいと考えています。 どのように記述すれば良いでしょうか。。。 教えて頂きたいと思います。 <SCRIPT LANGUAGE="JavaScript"> function ChangeSelection(form, selection,num) { v = selection.value; form.text.value = v; } <FORM NAME="fm_a" print("<TD><input name='text'></input>\n"); print("</TD>\n"); print("<TD><select name='am_note' ONCHANGE='ChangeSelection(this.form, this)'>\n"); print("<option value=''></option>\n"); print("<option value='AAA'>AAA</option>\n"); print("<option value='BBB'>BBB</option>\n"); print("<option value='CCC'>CCC</option>\n"); print("</select>\n"); print("</TD>\n"); ************************************************************** print("<TD>\n"); print("<input name='Cal' type='button' value='日'\n"); print("</TD>\n");

  • select ループ

    セレクトBOXの中をループさせて表示したいのですが? 上手く表示されません。 エラーメッセージ ・webサイトがメンテナンス中 ・webサイトにプログラム上の問題が  あると出ます。 下記ソースでおかしいところあれば お教え願えませんでしょうか? <html> <head><title>session.html</title></head> <body> <?php print"<table border="1"><tr>"; print"<td>"; print"<select name=kosu>\n"; for ($i=0; $i<5; $i++){ print"<option value=$i>$i\n"; } print"</select>"; print"</td>"; print"<td><input type=submit value="登録"></td>"; print"</tr>"; print"</table>"; ?> </body> </html>

    • 締切済み
    • PHP
  • テキストエリアの入力に関して

    テキストエリアの入力に関して 教えて下さい。 部分的な抜粋で申し訳ありませんが、以下のようにテキストエリアをダブルクリックで 時間を表示させるような"javascript"を記述しましたが、その際に、テキストにカーソル を合わせても、そもそもの入力できなくなってしまいました。 エリアは表示されるものの、カーソルを合わせても入力モードに変わらない。。 《内容》 print("<TR>\n"); print("<TD NOWRAP><FONT SIZE='2.5'><B>【備  考】</B></FONT></TD>\n"); print("<TD colspan='2'>\n"); print("<div id='target'>\n"); print("<select onchange='test(1)' onblur='test(1)'> <option value=' ' style='background-color:#3366FF; color:#FFFFFF'>  <option value=' ~ 09:30' style='background-color:#FFFFFF; color:#3366FF'>~ 09:30 <option value=' ~ 10:00' style='background-color:#3366FF; color:#FFFFFF'>~ 10:00 <option value=' ~ 10:30' style='background-color:#FFFFFF; color:#3366FF'>~ 10:30 <option value=' ~ 11:00' style='background-color:#3366FF; color:#FFFFFF'>~ 11:00 <option value=' ~ 11:30' style='background-color:#FFFFFF; color:#3366FF'>~ 11:30 <option value=' ~ 12:00' style='background-color:#3366FF; color:#FFFFFF'>~ 12:00 </select>\n"); print("<input size='20' type='text' name='pm_note' id='pm_note' value='$out_time' ondblClick='test(0)' style='width:100%;'> \n"); print("</div>\n"); print("</TD>\n"); print("<TD></TD>\n"); print("<TD></TD>\n"); print("</TR>\n");

    • ベストアンサー
    • HTML