KENT-WEB の ClipMail (http://www.kent-web.com/data/clipmail.html)で

”送信”ボタンを押すと確認画面になります。
この現在の仕様から確認画面なしでダイレクトに送信できるボタンも追加したいのです。
(つまりユーザが選択できる)

CGIの知識がないので以下のような答えを望んでいます。

-------------------
#clipmail.cgi

何行目これを追加↓
なんちゃらかんちゃら・・
-------------------

まるなげですが満足する動作を答えてくれた方に500pt 差し上げます。
(はてなのルールが変わったようなので分配しかできなかったら申し訳りません)

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/04 02:33:55
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント500pt

ボタンの場合、以下のようにするといいです。

<button type="submit" name="mode" value="preview">確認する</button><button type="submit" name="mode" value="send">送信する</button>

※通常の「<input type="submit" ~>」は必要ありません。

※確認画面でmodeが表示されてしまうので、「clipmail.cgi」の206行目を次のように変更してください。

		if ($key eq "need" || $key eq "match" || ($$in{match} && $key eq $match2)) {


上記の行を次のように変更します。

		if ($key eq "mode" || $key eq "need" || $key eq "match" || ($$in{match} && $key eq $match2)) {



【追記】

「clipmail.cgi」の106行目でモードを判定して、送信モード(※フォームで「name="mode" value="send"」を指定した項目がある場合は送信モードと判定)ではない場合にpreviewの処理に移行します。

# プレビュー
if ($$in{mode} ne "send") {
	&preview;


※確認表示で「name="mode" value="preview"」としていますが、こちらのvalue値は何でも大丈夫ですが、送信は「name="mode" value="send"」のように必ずmodeをsendに指定する必要があります。(buttonタグのテキスト表示は任意で大丈夫です。)

> もしボタンが2つある場合はcheckboxをどこに置いても両方同じ動作をしてしまいますよね?

上記の理由(※モードの判定)から、コメントに記載したcheckboxにチェックを入れた場合は両方同じ動作になります。

他1件のコメントを見る
id:rouge_2008

テキストエディタで検索すればすぐ見つかりますが、「clipmail.cgi」にあります。
プレビュー処理「sub preview { ~ }」の部分で、modeにsendを指定した項目をhiddenで埋め込んでいます。
デフォルトでは、プレビュー表示の時のみ追加されている項目でしたので、プレビュー表示画面で送信ボタンを押した時にメールが送信される仕組みでした。

195行目

	# 引数
	my $hidden .= qq|<input type="hidden" name="mode" value="send" />\n|;


フォームデコード処理「sub parse_form { ~ }」の部分で、フォームから送信されてきたデータをハッシュに格納しています。
586行目以降

sub parse_form {
	my ($clip,@key,@need,%in);
	foreach my $key ( $cgi->param() ) {

(~略~)
			$val = join(" ", $cgi->param($key));

(~略~)

		# %inハッシュに代入
		$in{$key} = $val;

(~略~)

	# リファレンスで返す
	return (\@key,\@need,\%in);
}


CGI::Minimalのparamメソッドで、フォームから送信されたデータの項目名を取得し、param('項目名')メソッドで取得した項目名を使用して値を取得しています。
※作者さんのコメントもついているので、おそらく大体分かると思います。


http://search.cpan.org/~snowhare/CGI-Minimal-1.29/lib/CGI/Minimal.pod

param([$fieldname]);
Called as $cgi->param(); it returns the list of all defined form fields in the same order they appear in the data from the user agent.

Called as $cgi->param($fieldname); it returns the value (or array of values for multiple occurances of the same field name) assigned to that $fieldname. If there is more than one value, the values are returned in the same order they appeared in the data from user agent.

2012/02/04 05:41:11
id:tontonpokopoko

rouge_2008さん。
さらなる解説をありがとうございます。本当に参考になります。
解説画面から戻った時に内容が保持されない環境があることが1つの問題でした。
(クッキーで対策してましたが)
もう1つは簡単な改造でタグを埋め込み、今の延長で送られた時点で骨組みページを生成しようと考えてます。

ポイントの大半をポイント付きメール?で私にお返しくださったようで
なんだか悪いような気分になってしまいます(m_m)

今後もここで質問することもあると思いますがまたよろしくお願いします。

2012/02/05 16:53:45
  • id:rouge_2008
    送信フォームのテンプレートに以下を追加するだけで可能です。

    <input type="checkbox" name="mode" value="send" />

    ※チェックを入れた場合、確認表示しないで直接送信になります。
  • id:tontonpokopoko
    コメントをありがとうございます。
    できれば「ボタン」でユーザに選択させたいのですがとても参考になりました。
    もしボタンが2つある場合はcheckboxをどこに置いても両方同じ動作をしてしまいますよね?

    コメント欄で申し訳ありません。
  • id:rouge_2008
    回答させていただきましたのでよろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません