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


記事No: 15820
投稿日: 2018/03/13(Tue) 16:24:45
タイトルメール項目連結モジュール
ID情報: teketen
投稿者: てけてん

項目の連結についてのご質問があったのですが、以下の文章をテキストエディタで打っているうちに、質問を消されたようです。
ですが、折角モジュールを作成したので、公開してみます。
どなたかのお役に立てれば光栄です。
以下、打っていた文章です^^;

項目の連結に関しては、何年か前に回答したことがあり、それ以降はノータッチを明言したのですが、今回気が変わって、バージョンが上がっても、簡単に利用出来るようにと、モジュールを作成してみました。
最後にモジュールを記述しますので、注意をよく読んで保存し、libディレクトリにアスキーモードでアップロードして下さい。
パーミッション(アクセス権)の設定の必要は特にありません。
KENTさんのフォームメールのスクリプト(以下、メールスクリプトと呼ぶ)全てに対応しています。
(clipmail v5.02、postmail v8.02、captmail v2.01以降なら、動作すると思います。
これより古いバージョンが手元にないので、動作確認はしていませんが、
my %cf = init();

my ($key,$need,$in) = parse_form();
の記述のあるバージョンならば、利用できます)


■入力フォームの記述方法■
モジュールを使う際の、制御タグです。

以下は、出来るだけ入力フォームの<form>タグの近くに記述して下さい。
<form action="xxxx.cgi" method="post">
の下の行に並べて記述していく感じ(xxxx.cgiはご利用のメールスクリプト)。

形式
<input type="hidden" name="join_xxx" value="項目1+項目2+項目3" />
(xxxと項目〜は、任意の文字)
連結する項目は、いくつでも可。

●name値には、必ず始めに「join_」が付きます。
(join_に続く名前は、他の入力欄のname値とかぶらないようにして下さい)
連結後の項目(name値)を、例えば、「予約日」とする場合、name値には
<input type="hidden" name="join_予約日" value="年+ / +月+ / +日" />
のように、必ず「join_」をつけて記述して下さい。
ブラウザの画面、メールやログには、「予約日」のみが表示及び記述されます。
例えば、メール本文なら
予約日=2018/3/13
のように。

また、join_nameとして、ブラウザやメール本文に「名前」として表示したい場合は、init.cgiの設定
$cf{replace} = {
}
にて指定して下さい。
「join_tel」を「電話番号」としたいなら、
$cf{replace} = {
'name' => 'お名前',
'email' => 'メールアドレス',
'tel' => '電話番号',
'tel1' => '市外局番',
'tel2' => '市内局番',
'tel3' => '番号',
};
のように。
連結する項目も、同様です。

●value値には、連結したい項目(<input>)のname値を半角の+(プラス)でつなぎます。

項目1+項目2+項目3

のように。
例:<input type="hidden" name="join_予約日" value="年+月+日" />
(この場合は、<input typ="text" name="年" /><input typ="text" name="月" /><input typ="text" name="日" />を連結する)
すると、年月日の順番で連結されます。
例でいうと、20180313のように

また、予約日のように、項目の間に、年、月、日などをはさみたい場合は、
例:<input type="hidden" name="join_予約日" value="年+ 年 +月+ 月 +日+ 日 +" />
(この場合は、<input typ="text" name="年" /><input typ="text" name="月" /><input typ="text" name="日" />を年、月、日を挟み連結する)

と記述すると、<input typ="text" name="年" />に2018と入力、<input typ="text" name="月" />に03を入力、<input typ="text" name="日" />に13を入力したら、

2018年03月13日

のように連結されます。
<input type="hidden" name="join_予約日" value="年+ / +月+ / +日" />
なら、2018/03/13
挟む文字(上の例でいうと、年や/など)は、前後に「半角スペース」を記述して下さい。
(半角スペースで挟むことにより、項目と区別していますので、連結される時は半角スペースは除かれます)
例えば、value="年+ / +月+ / +日"なら、/の前後に半角スペースがあります。
挟む文字が半角スペースの場合は、半角スペースを3つ記述して下さい。

以下に、いくつか例を上げます。

例1:
<input type="text" name="tel1" />-
<input type="text" name="tel2" />-
<input type="text" name="tel3" />
を電話番号として、連結(012-345-6789のように)する場合は、
<input type="hidden" name="join_電話番号" value="tel1+ - +tel2+ - +tel3" />

例2:
姓 <input type="text" name="姓" size="35" /> 名 <input type="text" name="名" size="35" />
を「name」として連結(山田 太郎のように)する場合は、
<input type="hidden" name="join_name" value="姓+   +名" />
----------------------------------------
●入力必須及びsortの記述方法。

<input type="hidden" name="need">に指定して下さい。
指定する際は、連結後の項目を記述します。
例えば、join_予約日なら、予約日を
<input type="hidden" name="need" value="name email 予約日" />
また、<input type="hidden" name="sort">
への記述も同様です。
<input type="hidden" name="sort" value="name email 電話 予約日 メッセージ" />
のように。
----------------------------------------
●エラー画面について。

連結後の項目が入力必須の場合、連結する項目で、一つでも入力漏れがあると、エラーになります。
エラー画面では、

お名前  姓未入力 名未入力
       ※未入力部分は下記参照
姓  姓は入力必須です.
名  名は入力必須です.
メールアドレス
電話  市外局番未入力-局番未入力-番号未入力
       ※未入力部分は下記参照
市外局番  市外局番は入力必須です.
局番  局番は入力必須です.
番号  番号は入力必須です.
問合せ種別
メッセージ
email2

のように表示されます(ご自分で動作テストして確かめて下さい)。
例えば、上の場合は、姓、名がお名前として連結されますが、どちらも未入力。
そのため、下に個別で姓、名ともに入力必須が書かれています。
姓は入力されて、名が未入力の場合は、

お名前  山田 名未入力
       ※未入力部分は下記参照
名  名は入力必須です.

となります。

■postmail.cgi、clipmail.cgi、captmail.cgiへの記述方法

ご利用のメールスクリプトをテキストエディタで開いて下さい。
始めの方に、

my ($key,$need,$in) = parse_form();

という記述があると思いますので、その次の行に

# 項目連結モジュールの呼び出し
use Join;
($in,$key,$need) = Join->new($in,$key,$need,$cf{replace})->run();

を記述して下さい。
スクリプトへの記述は、以上です。

■項目連結モジュール■

※※ 以下のスクリプトをコピーし、保存する際の注意。 ※※
コピーする際は、一行目に、必ずpackage Join;が来るように。
最後の行は、__END__
(__END__の後に改行しても良い)
また、メールスクリプトが、utf8版ならutf8(BOMなし)で、Shift_jis版ならShift_jisで、必ず

Join.pm

という名前をつけて保存して下さい。(Joinがファイル名で、拡張子が.pmです。Jは大文字で、他は小文字です。この通りにして下さい)。
※※※※※※※※
以下、package Join;から__END__までがJoin.pmモジュールです。

package Join;
use strict;

sub new {
my $class = shift;
my $self = {
query => shift,
key => shift,
need => shift,
replace => shift
};
bless($self,$class);
return $self;
}

sub run {
my $self = shift;
my (@key,$del,$need);
grep { $need->{$_}++ } split(/\s+/,$self->{query}->{need}) if($self->{query}->{need});
for my $key (@{$self->{key}}) {
if($key =~ /^join_/) {
my $j_key = $key;
$j_key =~ s/^join_//;
my $flg = '';
for my $j (split(/\+/,$self->{query}->{$key})) {
if($j =~ /^ (.*?) $/) {
$self->{query}->{$j_key} .= $1;
} else {
if($need->{$j_key} and !$self->{query}->{$j}){
my $tmp = $self->{replace}->{$j} ? $self->{replace}->{$j} : $j;
push(@{$self->{need}},$tmp);
$flg .= "$tmp ";
$self->{query}->{$j_key} .= qq|<span class="msg">$tmp未入力</span>|;
} else {
$self->{query}->{$j_key} .= $self->{query}->{$j};
}
$del->{$j} = $j;
undef $self->{query}->{$j};
undef $self->{query}->{$key};
}
}
$self->{query}->{$j_key} .= "<br> ※未入力部分は下記参照" if($self->{query}->{$j_key} =~ /未入力/);
$self->{query}->{sort} =~ s/($j_key)/$1 $flg/ if($flg);
push(@key,$j_key);
} else {
push(@key,$key) unless($del->{$key});
next;
}
}

@key = grep { !$del->{$_} } @key;
return($self->{query},\@key,$self->{need});
}

1;
__END__


[検索ページ]