KENT-WEB サポートコーナー 過去ログ [ 0496 ]


記事No: 13399
投稿日: 2014/10/22(Wed) 11:56:01
タイトル必須入力項目の条件付き入力
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/blogn267/clipmail/postmail-before-3.html

Clipmail V4.1を設置させてたいただいております。過去ログを参考に、必須入力項目を条件付きで入力できるようにしました。

会員だけが、登録番号と所属支部の入力が必須になるように設定しました。設定にあたって、オリジナルの部分を下記のようにコメントアウトし、

#my ($check,@err);
#if ($$in{need} || @$need > 0) {
#
## needフィールドの値を必須配列に加える
#my @tmp = split(/\s+/,$$in{need});
#push(@$need,@tmp);
#
## 必須配列の重複要素を排除
#my %count;
#@$need = grep {!$count{$_}++} @$need;
#
## 必須項目の入力値をチェックする
#foreach (@$need) {
#
## フィールドの値が投げられてこないもの(ラジオボタン等)
#if (!defined($$in{$_})) {
#$check++;
#push(@$key,$_);
#push(@err,$_);
#
## 入力なしの場合
#} elsif ($$in{$_} eq "") {
#$check++;
#push(@err,$_);
#}
#}
#}

下記の部分を書き加えました。

my ($check,@err);
if ($$in{need} && $$in{'申し込み種別'} eq "臨床発達心理士会会員"){

# needフィールドの値を必須配列に加える
my @tmp = split(/\s+/, $$in{need});
push(@$need,@tmp);

# 必須配列の重複要素を排除する
my (@uniq,%seen);
foreach (@$need) {
push(@uniq,$_) unless $seen{$_}++;
}

# 必須項目の入力値をチェックする
foreach (@uniq) {

# フィールドの値が投げられてこないもの(ラジオボタン等)
if (!defined($$in{$_})) {
$check++;
push(@$key,$_);
push(@err,$_);

# 入力なしの場合
} elsif ($$in{$_} eq "") {
$check++;
push(@err,$_);
}
}
}

#(NEW)
if ($$in{need} && $$in{'申し込み種別'} eq "一般参加"){
$$in{'会員登録番号'}=" ";
$$in{'所属支部'}=" ";
}
if ($$in{need} || @$need > 0) {

# needフィールドの値を必須配列に加える
my @tmp = split(/\s+/, $$in{need});
push(@$need,@tmp);

# 必須配列の重複要素を排除する
my (@uniq,%seen);
foreach (@$need) {
push(@uniq,$_) unless $seen{$_}++;
}

# 必須項目の入力値をチェックする
foreach (@uniq) {

# フィールドの値が投げられてこないもの(ラジオボタン等)
if (!defined($$in{$_})) {
$check++;
push(@$key,$_);
push(@err,$_);

# 入力なしの場合
} elsif ($$in{$_} eq "") {
$check++;
push(@err,$_);
}
}
}

「申し込み種別」が一般参加の時、必須入力でなくするのに、
「登録番号」と「所属支部」にスペースを入れることで入力済みの設定にして、必須入力を回避しています。

お聞きしたいのは、もっとスマートな方法があるように思うのですが、ご教示願えればありがたいです。


記事No: 13405
投稿日: 2014/10/24(Fri) 08:45:04
タイトル必須入力項目の条件付き入力と電話番号チェック
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/blogn267/clipmail/postmail-before-3.html

別スレの方がいいのかもしれませんが、上記の変更と関係あるのかもしないので、こちらに記入します。

下記の項目をメールの書式設定のところに入れて、電話番号のチェックをすると、書式通りの番号を入力しても、エラーになります。

エラー画面から、「戻る」でもどると、確認画面にもどって、入力訂正するには、さらに戻るで戻らないとだめです。

if ($$in{'ご所属先電話'} =~ /\-/) {
&error("電話番号はハイフン( - )なしの10桁または11桁でご記入ください");
}
if ($$in{'ご所属先電話'} !~ /^0(?(?=[1-9]0)\d{10}|\d{9})$/) {
&error("電話番号はハイフン( - )なしの市外局番からご記入ください");
}

エラー処理の方法が分かりません。よろしお願いします


記事No: 13412
投稿日: 2014/10/24(Fri) 16:09:18
タイトルRe: 必須入力項目の条件付き入力と電話番号チェック
ID情報: hirayama
投稿者: hirayama
URLhttp://shade-search.com/sts/fsw/wiki.cgi

>エラー画面から、「戻る」でもどると、確認画面にもどって、入力訂正するには、さらに戻るで戻らないとだめです。
エラー処理はどこに書いていますか?
sub send_mail内にでも書かない限り、2段階戻ることはないと思いますが。

>if ($$in{'ご所属先電話'} =~ /\-/) {
>&error("電話番号はハイフン( - )なしの10桁または11桁でご記入ください");
>}
>if ($$in{'ご所属先電話'} !~ /^0(?(?=[1-9]0)\d{10}|\d{9})$/) {
>&error("電話番号はハイフン( - )なしの市外局番からご記入ください");
>}
どのように入力したら、どういうエラーが出るか教えてください。

それと、余計なお世話ですが、ハイフン入りの投稿をはじくインターフェイスというのはどうなんでしょう。
入れられると、後で処理に困るということなら、

$$in{'ご所属先電話'} =~ s/-//g;

で消せばいいし。


記事No: 13414
投稿日: 2014/10/24(Fri) 21:31:25
タイトルRe^2: 必須入力項目の条件付き入力と電話番号チェック
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/blogn267/clipmail/postmail-before-3.html

hirayamaさん、レスありがとうございます。

> >エラー画面から、「戻る」でもどると、確認画面にもどって、入力訂正するには、さらに戻るで戻らないとだめです。
> エラー処理はどこに書いていますか?
> sub send_mail内にでも書かない限り、2段階戻ることはないと思いますが。

メールの書式チェックのところに書いてあります。書いてる場所も関係してるのかと思い、必須入力チェックの後あたりに書いても同じ結果でした。もしかして、通常では、ありえないのかもしれませんが、このスレの冒頭(13399)に書いたように、独自の書き加えをしているせいかもしれません。

>
> >if ($$in{'ご所属先電話'} =~ /\-/) {
> >&error("電話番号はハイフン( - )なしの10桁または11桁でご記入ください");
> >}
> >if ($$in{'ご所属先電話'} !~ /^0(?(?=[1-9]0)\d{10}|\d{9})$/) {
> >&error("電話番号はハイフン( - )なしの市外局番からご記入ください");
> >}
> どのように入力したら、どういうエラーが出るか教えてください。
>

エラーと書きましたが、遷移がうまくいきません。わざと、桁数の足りない入力や半角数字以外の入力をして、エラー表示の画面を出した後、正しい10桁の数字を入力すると、確認画面にはいきますが、「送信」をすると、「電話番号はハイフン( - )なしの市外局番からご記入ください」の表示のエラー画面になり、ここから、入力の画面にするには、さらに、戻らなければなりません。

正規表現が間違ってるのかと思い別な方法でもやりました。こんな風に、遷移がうまくいかないのは、どうも、桁数のチェックをしする時だけのようで、その部分をは外すとうまくいきます。


> それと、余計なお世話ですが、ハイフン入りの投稿をはじくインターフェイスというのはどうなんでしょう。
> 入れられると、後で処理に困るということなら、
>
> $$in{'ご所属先電話'} =~ s/-//g;
>
> で消せばいいし。

ハイフンは入っても入らなくてもいいのですが、入力の間違いをできるだけ防ぐために、入力の段階で、0から始まる半角の数字で10桁か11桁に制限したいためです。ハイフンを除外しないと、ハイフンの入力だけで、通ってしまいます。半角の数字にしても、同じ数字の繰り返しを入力されれば通ることになりますが、最低限の書式設定ができればと思ってます。

よろしくお願いいたします。


記事No: 13415
投稿日: 2014/10/24(Fri) 21:45:53
タイトルRe^3: 必須入力項目の条件付き入力と電話番号チェック
ID情報: hirayama
投稿者: hirayama
URLhttp://shade-search.com/sts/fsw/wiki.cgi

> メールの書式チェックのところに書いてあります。書いてる場所も関係してるのかと思い、必須入力チェックの後あたりに書いても同じ結果でした。もしかして、通常では、ありえないのかもしれませんが、このスレの冒頭(13399)に書いたように、独自の書き加えをしているせいかもしれません。

それが原因となると、ちょっと難しいですね。
変更したclipmail.cgiをtxtファイルに変更してアップできませんか?


記事No: 13417
投稿日: 2014/10/24(Fri) 23:29:43
タイトルRe^4: 必須入力項目の条件付き入力と電話番号チェック
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/blogn267/clipmail/postmail-before-3.html

引き続きありがとうごじます。

> > メールの書式チェックのところに書いてあります。書いてる場所も関係してるのかと思い、必須入力チェックの後あたりに書いても同じ結果でした。もしかして、通常では、ありえないのかもしれませんが、このスレの冒頭(13399)に書いたように、独自の書き加えをしているせいかもしれません。

>
> それが原因となると、ちょっと難しいですね。
> 変更したclipmail.cgiをtxtファイルに変更してアップできませんか?

変更したのは、オリジナルの部分をコメントアウトし、その後に、多少変更を加えたものを書き加えました。

その部分は、はじめのスレにアップしてあります。

他の変更は、メールアドレスチェックのサブル−チンに、電話番号のチェックと、フリーメール、携帯アドレスをチェックするIF文をっくわえただけです。

そのほかの細かい部分いじっておりません。もし、他の方法で、必須項目の条件付き入力ができるのなら、変更したいのですが。


記事No: 13418
投稿日: 2014/10/25(Sat) 02:47:57
タイトルRe^5: 必須入力項目の条件付き入力と電話番号チェック
ID情報: hirayama
投稿者: hirayama
URLhttp://shade-search.com/sts/fsw/wiki.cgi

基本的にここでのサポートはオリジナルのCGIのみです。
オリジナルなら、どこがどうなっているのかある程度わかりますが、
個人で修正されたもの、特に今回のケースのように複数箇所変更されたとなると、
第三者にはわかりようがありません。

大した変更のつもりでなくても、それが思わぬところに影響することもあるということは
maboさんもご承知だと思います。
そのようなブラックボックス化された内容のやりとりで二度手間、三度手間
かけたくないので、txtで見せてくださいといっています。


記事No: 13419
投稿日: 2014/10/25(Sat) 08:02:09
タイトルRe^6: 必須入力項目の条件付き入力と電話番号チェック
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/tyousei/clipmail.txt

hirayamaさん、たびたびありがとうございます。基本的にコメントアウトと、加筆だけですが、上記URLに掲載しました。

> 基本的にここでのサポートはオリジナルのCGIのみです。
> オリジナルなら、どこがどうなっているのかある程度わかりますが、
> 個人で修正されたもの、特に今回のケースのように複数箇所変更されたとなると、
> 第三者にはわかりようがありません。
>
> 大した変更のつもりでなくても、それが思わぬところに影響することもあるということは
> maboさんもご承知だと思います。
> そのようなブラックボックス化された内容のやりとりで二度手間、三度手間
> かけたくないので、txtで見せてくださいといっています。

よろしくお願いいたします。


記事No: 13422
投稿日: 2014/10/25(Sat) 11:43:38
タイトルRe^7: 必須入力項目の条件付き入力と電話番号チェック
ID情報: hirayama
投稿者: hirayama
URLhttp://shade-search.com/sts/fsw/wiki.cgi

電話番号のチェックがsub check_emailに書いてありますね。
このcheck_emailはプレビュー時とメール送信時に呼び出されているので、
それぞれで電話番号チェックが行われていることになります。
そして、メール送信時には$$in{'ご所属先電話'}の内容が16進数に変換されているので、
桁数が合わないなどの理由で引っかかってしまうようです。

対策としては、メール送信時のチェックでは、その時だけ16進数から元に戻してやれば良さそうです。
電話番号チェック部分を以下のように変更してみてください。

#電話番号チェック
my $phone = $$in{'ご所属先電話'};
if ($job eq 'send') { $phone = hex_decode($phone); }
if ($phone =~ /\-/) {
&error("電話番号はハイフン( - )なしの10桁または11桁でご記入ください");
}
if ($phone !~ /^0(?(?=[1-9]0)\d{10}|\d{9})$/) {
&error("電話番号はハイフン( - )なしの市外局番からご記入ください");
}


記事No: 13423
投稿日: 2014/10/26(Sun) 00:39:40
タイトルRe^8:【解決】 必須入力項目の条件付き入力と電話番号
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/tyousei/clipmail.txt

hirayamaさん、ありがとうございます。思った通りの動作になりました。
同じようなやり方をすれば、会員番号のチェックもできそうです。

今回、必須項目の条件付き入力で、強制的に必須項目に空白を入力して実現しましたが、「need」の属性を変えるなどの方法があるんでしょうね。

> 電話番号のチェックがsub check_emailに書いてありますね。
> このcheck_emailはプレビュー時とメール送信時に呼び出されているので、
> それぞれで電話番号チェックが行われていることになります。
> そして、メール送信時には$$in{'ご所属先電話'}の内容が16進数に変換されているので、
> 桁数が合わないなどの理由で引っかかってしまうようです。
>
> 対策としては、メール送信時のチェックでは、その時だけ16進数から元に戻してやれば良さそうです。
> 電話番号チェック部分を以下のように変更してみてください。
>
> #電話番号チェック
> my $phone = $$in{'ご所属先電話'};
> if ($job eq 'send') { $phone = hex_decode($phone); }
> if ($phone =~ /\-/) {
> &error("電話番号はハイフン( - )なしの10桁または11桁でご記入ください");
> }
> if ($phone !~ /^0(?(?=[1-9]0)\d{10}|\d{9})$/) {
> &error("電話番号はハイフン( - )なしの市外局番からご記入ください");
> }


記事No: 13424
投稿日: 2014/10/27(Mon) 01:59:05
タイトルRe^9:【解決】 必須入力項目の条件付き入力と電話番号
ID情報: hirayama
投稿者: hirayama
URLhttp://shade-search.com/sts/fsw/wiki.cgi

>今回、必須項目の条件付き入力で、強制的に必須項目に空白を入力して実現しましたが、「need」の属性を変えるなどの方法があるんでしょうね。

clipmailの場合、テンプレートのフォームを編集するだけで
簡単に入力項目、必須入力を変更できるというのが特徴なので、
他の入力項目が変わることによって必須入力が変わるというような複雑なケースには
もともと向いていないような気がします。
maboさんがやってらっしゃるような対応が現実的だと思います。

さらに複雑な条件になればneedの属性を変えるということも考えられますが、
そうするとけっこうCGIもいじらなければならず、
結局最初からCGIで必須項目を決めたほうが早いということになるかもしれません。

・・・といいながら、なるべく少ない修正でできないか、ちょっと考えてみました。

フォームのneedに「登録番号_所属_会員」のような値を追加します。
これは、所属が会員の場合、登録番号を必須にするという意味です。
そして、clipmeil.cgiの50行目辺り(オリジナルのclipmail.cgiベースです)

# 必須項目の入力値をチェックする
foreach (@$need) {

の下に

my @tmp = split(/_/);
if ($$in{$tmp[0]} || $$in{$tmp[1]} ne $tmp[2]) {
next;
}

を追加します。
これは登録番号が入力済みか、所属が会員でない場合、必須チェックをスキップする処理です。

これでOKだと思いますが、エラー表示で
「会員番号_所属_会員は入力必須です」と表示されるので、
err_input関数内の

# 入力なし:エラー表示
if ($erflg) {
$tmp =~ s/!val!/<span class="msg">$key_nameは入力必須です.<\/span>/;
部分を

if ($erflg) {
if ($key_name =~ /_/) {
my @tmp= split(/_/,$key_name);
$key_name = qq($tmp[1]が$tmp[2]の方は$tmp[0]);
}
$tmp =~ s/!val!/<span class="msg">$key_nameは入力必須です.<\/span>/;

とでもするといいかもしれません。


記事No: 13425
投稿日: 2014/10/27(Mon) 09:17:59
タイトルRe^10:【解決】 必須入力項目の条件付き入力と電話番号
ID情報: cxj01715
投稿者: mabo
URLhttp://www.ibarakisibu.jp/tyousei/clipmail.txt

hirayamaさん、適切なアドバイスありがとうございます。やはり、スマートなやり方はあるんですね。

別なフォーマットの入力に,postmailを使わせてもらってますが、これも入れ替える予定ですので、そのときに、hirayamaさんのやり方に変更させていただきます。

今回相談にのっていただいたclipmailは、はじめポスト,postmailで処理していましたが、掲示板で散見する、通知メールの不着(私もかのサクラさんです。)で、急遽入れ替えたものです。

私の場合、10件ほど、不着がありました。受信側の迷惑メールの設定も関係あるのかなと思い、受信制限解除したり、結構ばたばたしました。

入れ替えたclipmailで、必ず必要な返信をだす処理をいたしました。すると、記入アドレスそのものの間違いで、返信を出せない事例があり、これも急遽、電話番号の欄を設けたところです。
さらに、所属がない方の事例があり、当然電話も「無し」の記入で通ってしまう事例がありで、半角数字の制限を付け加えた訳です。

運用してみないと、いろいろ分からないですね。

今回、変更に当たって、昔かじったCが頼りで、エラーフラグがあるはずだと探しましたが、見つかられませんでした。Cの配列のイメージがあったので、CGIのスタックに積むようなやり方?が理解できませんでした。

おかげさまで、ちょっとだけ、CGIやら正規表現について、知識が深まりました。

本当にありがとうございました。

> >今回、必須項目の条件付き入力で、強制的に必須項目に空白を入力して実現しましたが、「need」の属性を変えるなどの方法があるんでしょうね。
>
> clipmailの場合、テンプレートのフォームを編集するだけで
> 簡単に入力項目、必須入力を変更できるというのが特徴なので、
> 他の入力項目が変わることによって必須入力が変わるというような複雑なケースには
> もともと向いていないような気がします。
> maboさんがやってらっしゃるような対応が現実的だと思います。
>
> さらに複雑な条件になればneedの属性を変えるということも考えられますが、
> そうするとけっこうCGIもいじらなければならず、
> 結局最初からCGIで必須項目を決めたほうが早いということになるかもしれません。
>
> ・・・といいながら、なるべく少ない修正でできないか、ちょっと考えてみました。
>
> フォームのneedに「登録番号_所属_会員」のような値を追加します。
> これは、所属が会員の場合、登録番号を必須にするという意味です。
> そして、clipmeil.cgiの50行目辺り(オリジナルのclipmail.cgiベースです)
>
> # 必須項目の入力値をチェックする
> foreach (@$need) {
>
> の下に
>
> my @tmp = split(/_/);
> if ($$in{$tmp[0]} || $$in{$tmp[1]} ne $tmp[2]) {
> next;
> }
>
> を追加します。
> これは登録番号が入力済みか、所属が会員でない場合、必須チェックをスキップする処理です。
>
> これでOKだと思いますが、エラー表示で
> 「会員番号_所属_会員は入力必須です」と表示されるので、
> err_input関数内の
>
> # 入力なし:エラー表示
> if ($erflg) {
> $tmp =~ s/!val!/<span class="msg">$key_nameは入力必須です.<\/span>/;
> 部分を
>
> if ($erflg) {
> if ($key_name =~ /_/) {
> my @tmp= split(/_/,$key_name);
> $key_name = qq($tmp[1]が$tmp[2]の方は$tmp[0]);
> }
> $tmp =~ s/!val!/<span class="msg">$key_nameは入力必須です.<\/span>/;
>
> とでもするといいかもしれません。


[検索ページ] [掲示板]