#!/usr/bin/perl
#*******************************************************************************
#
# メールフォームCGI
#
#*******************************************************************************
#_______________________________________________________________________________
# モジュール、ライブラリの呼び出し
require 'lib/epl.cgi'; # eoeo Perl Library
#*******************************************************************************
# 定数
#*******************************************************************************
#======================================
# 設定
#======================================
%chCONF =
(
MAIL =>
{ # メール関連
to => 'eizen@jasmine.ocn.ne.jp', # 送信先(管理者)
from => 'eizen@jasmine.ocn.ne.jp', # 送信元
},
finish_url => 'finish.html', # メール送信後リダイレクトURL
);
#======================================
# フォーム関連
#======================================
%chFORM =
(
items =>
[ # 入力項目設定
# name フォームのname値
# input 必須入力 1:必須入力項目 0:任意入力項目
# input_err_msg 未入力時のエラーメッセージ
# input_err_id 未入力時のエラーリンク先ID
# multi_line 改行制御 1:改行制御有 0:改行制御無
# cnvert_num 数値の全角→半角変換
# option_list プルダウンリストボックスの項目(表示名)
# option_value プルダウンリストボックスの項目(値)
# option_default プルダウンリストボックスのデフォルト選択項目
# radio_list ラジオボタンの項目
# radio_default ラジオボタンのデフォルト選択項目
# check_list チェックボックスの項目
{
name => 'name_kana',
},
{
name => 'name',
input => 1,
input_err_msg => 'お名前が未入力です。',
input_err_id => 'name',
},
{
name => 'email',
input => 1,
input_err_msg => 'メールアドレスが未入力です。',
input_err_id => 'email',
},
{
name => 'email_confirm',
input => 1,
input_err_msg => 'メールアドレス(確認用)が未入力です。',
input_err_id => 'email_confirm',
},
{
name => 'inq',
input => 1,
input_err_msg => 'お問い合わせ内容が未入力です。',
input_err_id => 'inq',
multi_line => 1,
},
],
);
#======================================
# プログラム関連
#======================================
%chPGM =
(
CGI =>
{ # CGIスクリプト関連
form => 'index.cgi', # フォームCGI
},
PATH =>
{ # パス関連
sendmail => '/usr/sbin/sendmail', # sendmailへのパス
# sendmail => 'C:\sendm\sendmane.exe', # sendmaneへのパス(local)
},
);
#======================================
# テンプレート関連
#======================================
%chTMPL =
(
Input => '_tmpl_form.html', # ログイン
Conf => '_tmpl_form.html', # メニュー
Send => '_tmpl_form.html', # クーポン誌管理
PutError => '_tmpl_form.html', # システムエラー
);
#*******************************************************************************
# グローバル変数
#*******************************************************************************
# システム関連
%ghSys = ();
%ghForm = ();
#*******************************************************************************
# フレームワーク
#*******************************************************************************
# 初期処理
&Initialize();
# メイン処理
eval( '&' . $ghSys{'MODE'} . '()' );
exit;
#*******************************************************************************
# 初期処理
# Initialize 初期処理
#*******************************************************************************
#_______________________________________________________________________________
# 初期処理
sub Initialize
{
# フォームデータを読み込み
&eoForm::Get( \%ghForm, $eoChr::csUTF8 );
# 改行、記号制御
foreach my $sKey( keys( %ghForm ) )
{
if( ref($ghForm{$sKey}) ne 'ARRAY' )
{
$ghForm{$sKey} = &eoStr::RetToBr( &eoStr::TextToHtml( $ghForm{$sKey} ) );
}
else
{ # チェックボックスで複数選択された場合
foreach my $sItem( @$ghForm{$sKey} )
{
$sItem = &eoStr::RetToBr( &eoStr::TextToHtml( $sItem ) );
}
}
}
# 入力補完チェック
foreach my $rhItem( @{$chFORM{items}} )
{
if( $$rhItem{convert_num} )
{ # 数値の半角変換
$ghForm{$$rhItem{name}} = &CnvNum( $ghForm{$$rhItem{name}} );
}
}
# 入力内容チェック
$ghSys{ERR} = &checkInput();
# モードの取得(デフォルト:Input)
if( $ghForm{MODE} eq '' )
{ # 旧モードが未指定の場合はエラー情報を消去
$ghSys{MODE} = 'Input';
$ghSys{ERR} = '';
}
elsif( $ghSys{ERR} )
{ # モード指定があるが、入力エラーの場合は再入力へ
$ghSys{MODE} = 'Input';
}
else
{ # モード指定があり、入力エラーがない場合
$ghSys{MODE} = $ghForm{MODE};
}
} # Initialize End
#*******************************************************************************
# メイン処理
# Input 入力
#*******************************************************************************
#_______________________________________________________________________________
# 入力
sub Input
{
my( $sTmpl ) = HTML::Template->new( filename => $chTMPL{$ghSys{MODE}}, die_on_bad_params => 0 );
# 固定テンプレート値をセット
$sTmpl->param( CGI_FORM => $chPGM{CGI}{form} );
# 条件セット
$sTmpl->param( CND_ . $ghSys{MODE} => 1 );
if( $ghForm{MODE} eq '' )
{ # 初回表示時
$sTmpl->param( CND_First => 1 );
}
# エラー値セット
if( $ghSys{ERR} )
{
$sTmpl->param( Err => $ghSys{ERR} );
}
# 入力値セット
&setTemplate( \$sTmpl, \%ghForm );
# 表示
&eoHtml::Put( $sTmpl->output, $eoChr::csUTF8 );
} # Input End
#_______________________________________________________________________________
# 確認
sub Conf
{
my( $sTmpl ) = HTML::Template->new( filename => $chTMPL{$ghSys{MODE}}, die_on_bad_params => 0 );
# 固定テンプレート値をセット
$sTmpl->param( CGI_FORM => $chPGM{CGI}{form} );
# 条件セット
$sTmpl->param( CND_ . $ghSys{MODE} => 1 );
# 入力値セット
&setTemplate( \$sTmpl, \%ghForm );
# 表示
&eoHtml::Put( $sTmpl->output, $eoChr::csUTF8 );
} # Conf End
#_______________________________________________________________________________
# 送信
sub Send
{
my( $sErr );
# 記号制御
foreach my $rhItem( @{$chFORM{items}} )
{
if( ref($ghForm{$$rhItem{name}}) ne 'ARRAY' )
{
$ghForm{$$rhItem{name}} = &eoStr::BrToRet( &eoStr::HtmlToText( $ghForm{$$rhItem{name}} ) );
}
else
{ # チェックボックスで複数選択された場合
foreach my $sItem( @$ghForm{$$rhItem{name}} )
{
$sItem = &eoStr::BrToRet( &eoStr::HtmlToText( $sItem ) );
}
}
}
# 管理者宛にメール送信
&MailSend( $chCONF{MAIL}{to}, \%ghForm, 'txt_admin.cgi' );
# ユーザへの返信確認
# if( $ghForm{Mail} ne '' )
# {
# &MailSend( $ghForm{Mail}, \%ghForm, 'txt_user.cgi' );
# }
# 完了画面へリダイレクト
&eoHtml::Jump( $chCONF{finish_url} );
} # Send End
#*******************************************************************************
# 入力内容処理
# setTemplate 入力値をテンプレートにセット
# checkInput 入力内容をチェック
#*******************************************************************************
#_______________________________________________________________________________
# 入力値をテンプレートにセット
sub setTemplate
{
my( $rsTmpl, $rhForm ) = @_;
# セット
foreach my $rhItem( @{$chFORM{items}} )
{
if( ref($$rhForm{$$rhItem{name}}) ne 'ARRAY' )
{
$$rsTmpl->param( $$rhItem{name} => $$rhForm{$$rhItem{name}} );
}
else
{ # チェックボックスで複数選択された場合
my( @aParam ) = ();
foreach my $sItem( @{$$rhForm{$$rhItem{name}}} )
{
push( @aParam, $sItem );
}
$$rsTmpl->param( $$rhItem{name} => join( '、', @aParam ) );
}
}
# 各種制御
foreach my $rhItem( @{$chFORM{items}} )
{
# チェックボックスソースを取得
if( $$rhItem{check_list} )
{
$$rsTmpl->param( $$rhItem{name}.'_CHECK_LIST' => &GetCheckSrc( $$rhForm{$$rhItem{name}}, $rhItem ) );
$$rsTmpl->param( $$rhItem{name}.'_CHECK_LIST_HIDDEN' => &GetCheckHiddenSrc( $$rhForm{$$rhItem{name}}, $rhItem ) );
}
# ラジオボタンソースを取得
if( $$rhItem{radio_list} )
{
$$rsTmpl->param( $$rhItem{name}.'_RADIO_LIST' => &GetRadioSrc( $$rhForm{$$rhItem{name}}, $rhItem ) );
}
# プルダウンリストボックスソースを取得
if( $$rhItem{option_list} )
{
$$rsTmpl->param( $$rhItem{name}.'_OPTION_LIST' => &GetOptionSrc( $$rhForm{$$rhItem{name}}, $rhItem ) );
}
# 改行制御
if( $$rhItem{multi_line} )
{
$$rsTmpl->param( $$rhItem{name}.'_RET' => &eoStr::BrToRet( $$rhForm{$$rhItem{name}} ) );
}
}
} # setTemplate End
#_______________________________________________________________________________
# 入力内容チェック
sub checkInput
{
my( @aErr ) = ();
# スパム対策チェック
if( $ghForm{'eoAntiSpam'} eq '' )
{
push( @aErr, { ID => '', Msg => 'Javascriptが無効になっている可能性があります。' } );
return \@aErr;
}
# 必須入力エラーチェック
foreach my $rhItem( @{$chFORM{items}} )
{
if( $$rhItem{input} )
{
if( $ghForm{$$rhItem{name}} eq '' )
{ # エラーメッセージをストック
push( @aErr, { ID => $$rhItem{input_err_id}, Msg => $$rhItem{input_err_msg} } );
}
}
}
# その他のエラーチェック
if( $ghForm{email} ne '' )
{
if( $ghForm{email} !~ /.+\@.+\..+/ ) { push( @aErr, { ID => 'email', Msg => 'メールアドレスの形式を確認してください。' } ); }
}
if( $ghForm{email_confirm} ne '' )
{
if( $ghForm{email_confirm} !~ /.+\@.+\..+/ ) { push( @aErr, { ID => 'email_confirm', Msg => 'メールアドレス(確認用)の形式を確認してください。' } ); }
}
if( ( $ghForm{email} ne '' && $ghForm{email_confirm} ne '' ) && $ghForm{email} ne $ghForm{email_confirm} )
{
push( @aErr, { ID => 'email', Msg => 'メールアドレスが確認用と一致しません。' } );
}
if( @aErr )
{
return \@aErr;
}
else
{
return '';
}
} # checkInput End
#*******************************************************************************
# その他
# MailSend メール送信
# GetListSrc プルダウンリストボックスソースを取得
# PutError エラー表示
#*******************************************************************************
#_______________________________________________________________________________
# メール送信
sub MailSend
{
my( $sMailTo, $rhForm, $sTxtSrc ) = @_;
my( $sTmpl );
# メール雛形を読み込み
require $sTxtSrc;
# ソースコード変換
$sTmpl = HTML::Template->new( scalarref => \$gsMAIL_BODY, die_on_bad_params => 0 );
# 入力値セット
&setTemplate( \$sTmpl, $rhForm );
# メールの送信
if( $sErr = &eoMail::Send( $sMailTo, $chCONF{MAIL}{from}, $gsMAIL_SBJ, $sTmpl->output, '', $chPGM{PATH}{sendmail} ) )
{ # 送信エラー
&PutError( $sErr );
}
} # MailSend End
#_______________________________________________________________________________
# SJIS全角数字→半角数字変換
sub CnvNum
{
my( $sNum ) = @_;
$sNum =~ s/(?:[\x82]([\x4F-\x58]))/pack(H2,sprintf("%X",ord($1)-31))/eg;
return $sNum;
} # CnvNum End
#_______________________________________________________________________________
# チェックボックスソースを取得
sub GetCheckSrc
{
my( $sSel, $rhItem ) = @_;
my( @aSel ) = ();
my( $sSrc ) = '';
# 選択配列を生成
if( ref($sSel) ne 'ARRAY' )
{
push( @aSel, $sSel );
}
else
{
@aSel = @$sSel;
}
# 一覧ソースを生成
for( my $i=0; $i<@{$$rhItem{check_list}}; $i++ )
{
my( $sFlgSel ) = '';
# 選択判定
foreach my $sSelItem( @aSel )
{
if( $$rhItem{check_list}[$i] eq $sSelItem )
{
$sFlgSel = 1;
last;
}
}
if( $sFlgSel )
{
$sSrc .= qq( );
}
else
{
$sSrc .= qq( );
}
}
return $sSrc;
} # GetCheckSrc End
#_______________________________________________________________________________
# チェックボックスソース(hidden用)を取得
sub GetCheckHiddenSrc
{
my( $sSel, $rhItem ) = @_;
my( @aSel ) = ();
my( $sSrc ) = '';
# 選択配列を生成
if( ref($sSel) ne 'ARRAY' )
{
push( @aSel, $sSel );
}
else
{
@aSel = @$sSel;
}
# 一覧ソースを生成
for( my $i=0; $i<@{$$rhItem{check_list}}; $i++ )
{
# 選択判定
foreach my $sSelItem( @aSel )
{
if( $$rhItem{check_list}[$i] eq $sSelItem )
{
$sSrc .= qq();
}
}
}
return $sSrc;
} # GetCheckHiddenSrc End
#_______________________________________________________________________________
# ラジオボタンソースを取得
sub GetRadioSrc
{
my( $sSel, $rhItem ) = @_;
my( $sSrc ) = '';
# 選択判定
if( $sSel eq '' )
{
$sSel = $$rhItem{radio_default};
}
# 一覧ソースを生成
for( my $i=0; $i<@{$$rhItem{radio_list}}; $i++ )
{
if( $$rhItem{radio_list}[$i] eq $sSel )
{
$sSrc .= qq( );
}
else
{
$sSrc .= qq( );
}
}
return $sSrc;
} # GetRadioSrc End
#_______________________________________________________________________________
# プルダウンリストボックスソースを取得
sub GetOptionSrc
{
my( $sSel, $rhItem ) = @_;
my( $sSrc ) = '';
# 選択判定
if( $sSel eq '' )
{
$sSel = $$rhItem{option_default};
}
# 一覧ソースを生成
for( my $i=0; $i<@{$$rhItem{option_list}}; $i++ )
{
if( $$rhItem{option_list}[$i] eq $sSel )
{
$sSrc .= qq();
}
else
{
$sSrc .= qq();
}
}
return $sSrc;
} # GetOptionSrc End
#_______________________________________________________________________________
# エラー表示
sub PutError
{
my( $sMsg ) = @_;
my( $sTmpl ) = HTML::Template->new( filename => $chTMPL{PutError}, die_on_bad_params => 0 );
# 条件セット
$sTmpl->param( CND_PutError => 1 );
# エラーメッセージセット
$sTmpl->param( Msg => $sMsg );
# 表示
&eoHtml::Put( $sTmpl->output, $eoChr::csUTF8 );
# 終了
exit;
} # PutError End