- 締切済み
複数FORMの一括実行について
通常であれば同一サイト内に下記のソース(フォーム)が入るのですが、 これを改良しサイト上で希望の送信先をチェックボックスで選択し一回の操作で複数のcgiを実行したく思います。 良いcgiがあれば教えてください。 又は改造ができるcgi、修正方法を分かりましたらお教え願います。 サイトA <form action="https://aaa.cgi" method="post"> <input type="hidden" name="名前" value="name"> <input type="hidden" name="メール" value="mail"> <input name="Submit" type="submit" value="送信"> </form> サイトB <form action="https://bbb.cgi" method="post"> <input type="hidden" name="名前" value="name"> <input type="hidden" name="メール" value="mail"> <input name="Submit" type="submit" value="送信"> </form> サイトC <form action="https://ccc.cgi" method="post"> <input type="hidden" name="名前" value="name"> <input type="hidden" name="メール" value="mail"> <input name="Submit" type="submit" value="送信"> </form>
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- moon_night
- ベストアンサー率32% (598/1831)
処理するCGIの内容を # 処理1 とかに置き換えてやればできると思いますよ。 つまり、 print qq|処理1が実行されました。\n|; をaaa.cgiの内容に置き換えて、 print qq|処理2が実行されました。\n|; をbbb.cgiの内容に置き換えて・・・ とやればチェックによって処理内容が変わります。 ただし、aaa.cgiをまるまるコピー&ペーストをするとエラーが出ます。(多分) ここはある程度の慣れか勘が必要になると思います。 これで分からない場合は、もうちょっと勉強してからでないと厳しいと思います。
- flowermaze
- ベストアンサー率56% (159/282)
cgiではなく、フォームを記載するページからjavascriptを使って複数のフォームを送信するというのはいかがですか? たとえば、 選択フォーム(動かすフォームを選ぶ): <form name="cgiselect" onclick="FormSubmit(this)"> <input type="checkbox" name="cginame" value="aaa">aaaに送る <input type="checkbox" name="cginame" value="aaa">aaaに送る <input type="checkbox" name="cginame" value="aaa">aaaに送る <input type="submit" value="送信"> </form> 隠しフォーム(送信用) <form name="aaa" action="https://aaa.cgi" method="post" target="a"> <input type="hidden" name="名前" value="name"> <input type="hidden" name="メール" value="mail"> </form> <form name="bbb" action="https://bbb.cgi" method="post" target="b"> <input type="hidden" name="名前" value="name"> <input type="hidden" name="メール" value="mail"> </form> <form name="ccc" action="https://ccc.cgi" method="post" target="c"> <input type="hidden" name="名前" value="name"> <input type="hidden" name="メール" value="mail"> </form> スクリプト: function FormSubmit(FORM) { // 「aaaに送る」にチェックがあったらフォームAを送信 if(FORM.cginame["aaa"].checked == true) { window.open("","a"); // aという名前の新規ウィンドウを作成 document.aaa.submit(); //フォームAを送信 window.a.close(); // ウィンドウaを閉じる } if(FORM.cginame["bbb"].checked == true) { window.open("","b"); document.aaa.submit(); window.b.close(); } if(FORM.cginame["ccc"].checked == true) { window.open("","c"); document.aaa.submit(); window.c.close(); } location.href = ok.html // 送信済みページに移動 } #それぞれのcgiの結果画面を表示するウィンドウが3つ開いてしまうので、自動的に閉じるスクリプトを追加してみました。 ポイントは各フォームのターゲットをそれぞれ別の名前のウィンドウにすることです。これでもとの画面を変更することなく次々にフォームを送信できます。 動作は検証してませんので、うまく動かなかったらすみません。
補足
丁寧なアドバイス有難うございます。 javascriptを試して見ましたが駄目でした。 しかし、ヒントを有難うございました。 もう少し勉強してみます。 現在、頭が混乱し何から手を付けて良いのかも判断がつかない状況です。 出来るまで挑戦します。
- moon_night
- ベストアンサー率32% (598/1831)
こんな感じでなんとなく感じがわかるでしょうか。 #!/usr/local/bin/perl $cgi = "a.cgi"; # データ処理 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #フォーム変数へ $in{$name} = $value; } print "Content-type: text/html\n\n"; print <<HTML; <html> <head> <title>IF</title> </head> <body> <form action="$cgi" method="POST"> <input type="radio" name="s" value="1">処理1<br> <input type="radio" name="s" value="2">処理2<br> <input type="radio" name="s" value="3">処理3<br> <input type="submit"> </form> <p> HTML if ($in{'s'}) { if ($in{'s'} == 1) { print qq|処理1が実行されました。\n|; } elsif ($in{'s'} == 2) { print qq|処理2が実行されました。\n|; } else { print qq|処理3が実行されました。\n|; } } print <<EOF; </p> </body> </html> EOF exit;
補足
親切な対応、有難うございます。 記載頂いた内容はイメージがつきます。 現在、選択した複数の<form action=".cgi" ・・・・ をどうすれば実効できるかで詰っている次第です。 何卒、アドバイスをお願いいたします。 (慣れないと気が変になりそうです。)
- moon_night
- ベストアンサー率32% (598/1831)
送信先をひとつのCGIにして、 チェックボックスで処理内容を変えればいいのですが、 CGIの動きを知らないと難しいと思われます。 たぶんそういう特殊なCGIは配布されてないので難しいかと・・ 具体的には <input type="radio" name="s" value="1"> <input type="radio" name="s" value="2"> <input type="radio" name="s" value="3"> として、CGI側で if ($in{'s'} == 1) { # 処理1 } elsif ($in{'s'} == 2) { # 処理2 } else { # 処理3 } とやればいいのですが。 わかるかな?
補足
有難うございました。 とても嬉しく思います。 現在、処理の部分がイメージがつかない状況です。 今回のようなcgiの動きを習得する場合、どのようなcgiを参考にしたり、学べばよいでしょうか?
補足
毎回、貴重なアドバイス有難うございます。 この部分が分からないところです。ハイ いろいろ文献を見てるのですが、今の疑問と照らし合わせるプログラム等が無い状況です。 似たようなcgiがあれば参考に出来るのですが・・ 何から手をつければ良いのでしょうか