StaticPagesFormmail14
出典: GeeklogJpWiki
[3]管理方法 > 管理者が導入後すぐ試せる簡単カスタマイズ > 静的ページPHPでページを作成する > 汎用フォームメール(お問合せなどに使え確認画面にも対応)を設置する
- このフォームPHPは旧版です。最新フォームPHPの汎用お問い合わせフォームをPHPで設置するができましたので,そちらをどうぞご利用ください。
目次 |
汎用フォームメール(お問合せフォーム)を設置する
- 作者 hiro
はじめに
これまでの静的ページPHPによるフォームメールでは,入力項目の設定やデザインまでも静的ページPHPで記述しなければなりませんでした。
今回の汎用フォームメールでは,入力項目の設定やデザインは静的ページで作成し,formタグからこの汎用フォームメールのURLを呼ぶだけで作成できます。これで,ひとつ汎用フォームメール(formmail)をサイトに設置することで,静的ページを追加するだけでいくらでもお問合せフォームを作成できるようになりました。つまり,開発者が初期にformmailを設置しておくだけで,HTMLがわかる運営者であれば,あとからいくらでもお問合せフォームを追加・変更できる仕組みになったわけです。
機能
汎用フォームメールは、確認画面がなく、いきなり送信されてしまう問合せフォームページを設置するに確認画面の機能を付加するだけの予定でしたが、以下のような機能をあれこれ付加しているうちに現在の形となりました。(hiro)
* 入力フォームを静的ページHTMLで作成(静的ページPHPとデザインを切り離す) * 静的ページPHP(formmail)単独でも実行可能 * 必須項目の指定が可能(ラジオボタン,チェックボックス,ドロップダウンリスト等も可) * AとBどちらともに入力がないときにエラーにすることが可能(名前orHNや電話or携帯等) * AとBが同じ内容ではないときにエラーにすることが可能(確認入力等) * 各ページのデザインを変更しやすいようHTML部分をわかりやすく埋め込み * 送信するメールの内容を変更しやすいようにわかりやすく埋め込み * 確認画面の表示/非表示が切替えられる * 管理者メールアドレスを複数指定可能 * 静的ページHTMLごとにメールの件名や署名の指定が可能
使い方
静的ページHTMLでのフォーム記述方法
入力フォームを静的ページHTMLで作成します。
1.formタグのactionの引数にformmailのURLを指定します。
- 例)<form action='/staticpages/index.php?page=formmail' method='POST' class='basic'>
2.必ずメールアドレスの項目は name='email' で指定してください。
- 例)<input type='text' name='email' size='20'>
3.各種初期設定は<input type='hidden'・・・>で行います。
- name='action' … 「確 認」とすると確認画面を表示するし、「送 信」とするとすぐに完了画面となります。
- 静的ページPHPにて $lang['confirm'] と $lang['transmit'] を編集することで変更可能
- name='essential' … 必須項目にしたい項目のnameをカンマ(,)区切りで指定します。
- AとBどちらともに入力がないときにエラーにする場合は, | で区切ります。
- AとBが同じ内容ではないときにエラーにする場合は, = で区切ります。
- name='proprietyemail' … メールアドレス形式のチェックをする項目のnameをカンマ(,)区切りで指定します。
- name='erremailname' … name='email'の項目名を指定します。
- name='subject' … フォーム入力した方へ送るメールの件名を指定します。
- name='ownersubject' … オーナーへ送るメールの件名を指定します。
- name='sign' … 送られるメールの署名を指定します。署名の中での改行は'<br />'で指定します。
- name='title' … 確認画面でのタイトルを指定します。
- formmailをブロックで囲まないときにタイトルが表示できます
- name='endmessage' … 送信完了画面の上部、メール本文の先頭のメッセージを指定します。
- name='savecsv' … CSVで保存するかを指定します。
- 「0」(半角ゼロ)なら保存しません
- 「1」(半角イチ)ならCSVをカンマ区切りで保存します
- 「2」(半角ニ)ならCSVをタブ区切りで保存します。
- name='savecsvname' … CSVのファイル名を指定します。
- 非公開領域のdata以下へ指定ファイル名で作成されます
静的ページHTMLの作成サンプル(お問合せフォーム)
お問合せフォームサンプルを参考にしてください。
<form action='/staticpages/index.php?page=formmail' method='POST'> <p>当サービスをご利用くださいまして、まことにありがとうございます。弊社では、お客様のプライバシー保護を重要と考えており,お送りいただいた情報は厳重に管理いたします。</p> <input type='hidden' name='action' value='確 認'> <!-- 必須項目にしたい項目のnameをカンマ(,)区切りで指定 --> <input type='hidden' name='essential' value='お名前,email=メール確認,性別'> <!-- メールアドレス形式のチェックをする項目のnameをカンマ(,)区切りで指定 --> <input type='hidden' name='proprietyemail' value='email,メール確認'> <!-- Eメールの呼び名( name='email'の項目名 ) --> <input type='hidden' name='erremailname' value='Eメール'> <!-- 問合せ者へのメール件名 --> <input type='hidden' name='subject' value='お問合せ'> <!-- サイト管理者へのメール件名 --> <input type='hidden' name='ownersubject' value='お問合せ'> <!-- 署名 --> <input type='hidden' name='sign' value='---------------------------<br />株式会社○○○○○<br />http://www.○○○○'> <!-- 確認画面タイトル --> <input type='hidden' name='title' value='お問合せ'> <!-- 終了画面の先頭&メールの先頭メッセージ --> <input type='hidden' name='endmessage' value='お問合せ、ありがとうございました。'> <!-- csv保存 (0:保存しない, 1:カンマ区切りで保存, 2:タブ区切りで保存 ) --> <input type='hidden' name='savecsv' value='1'> <!-- csvファイル名 (非公開領域のdataの中に指定ファイル名で作成) --> <input type='hidden' name='savecsvname' value='contact.csv'> <table style='text-align:left'> <tr><th style='text-align:right'>お名前<font color='#FF010E'>(必須)</font>:</th><td><input type='text' name='お名前' size='20'></td></tr> <tr><th style='text-align:right'>Eメール<font color='#FF010E'>(必須)</font>:</th><td><input type='text' name='email' size='20'></td></tr> <tr><th style='text-align:right'>メール確認<font color='#FF010E'>(必須)</font>:</th><td><input type='text' name='メール確認' size='20'></td></tr> <tr><th style='text-align:right'>性別<font color='#FF010E'>(必須)</font>:</th><td><label><input type='radio' name='性別' value='男'>男</label> <label><input type='radio' name='性別' value='女'>女</label></td></tr> <tr><th style='text-align:right'>郵便番号:</th><td><input type='text' name='郵便番号' size='10'>例)123-4567</td></tr> <tr><th style='text-align:right'>都道府県:</th><td><input type='text' name='都道府県' size='20'></td></tr> <tr><th style='text-align:right'>住所:</th><td><input type='text' name='住所' size='40'></td></tr> <tr><th style='text-align:right'>電話番号:</th><td><input type='text' name='電話番号' size='20'>例)01-2345-6789</td></tr> <tr><th style='text-align:right'>職業<font color='#FF010E'>(必須)</font>:</th><td><select name='職業'> <option value=''>職業を選択してください</option> <option value='技術系'>技術系</option> <option value='事務系'>事務系</option> <option value='営業・企画系'>営業・企画系</option> <option value='販売・サービス業'>販売・サービス業</option> <option value='学生'>学生</option> <option value='主婦'>主婦</option> <option value='その他'>その他</option> </select></td></tr> <tr><th style='text-align:right'>会社名:</th><td><input type='text' name='会社名' size='40'></td></tr> <tr><th style='text-align:right'>会社URL:</th><td><input type='text' name='会社URL' size='40'></td></tr> <tr><th style='text-align:right'>お問合せ内容:</th><td><textarea rows='10' name='お問合せ内容' cols='40'></textarea></td></tr> </table> <input type='submit' name='submit' value='この内容で確認する'></form>
汎用フォームメールの静的ページPHP(formmail)を作成する
静的ページPHPのidをformmailとして,あらかじめ作成します。
○部をあらかじめ置き換えて,ページを作成してください。
※この静的ページPHPformmailは,単独でも動作します。
// +---------------------------------------------------------------------------+
// | Geeklog FormMail Static Page |
// +---------------------------------------------------------------------------+
// | Copyright (C) 2000-2007 by the following authors: |
// | |
// | Authors: Hiroshi Sakuramoto - hiro AT winkey DOT jp |
// | Version: 0.9.8 |
// +---------------------------------------------------------------------------+
global $_CONF; // config.phpの変数を参照可能にする
// +---------------------------------------------------------------------------+
// | 初期設定 |
// +---------------------------------------------------------------------------+
# 入力フォームのURL
$pageurl = $_SERVER["REQUEST_URI"];
// $_SERVER["REQUEST_URI"] が使えず正しく動かない場合は以下へ、
// 静的ページPHPを作成する時に入力したIDを入れてください。
// (wikiドキュメントのサンプル例だと'formmail')
// ※IDを入力したら先頭の#を削除してください。(コメントをはずします)
#$pageid = 'formmail';
# 管理者E-mail 複数指定はカンマ(,)で区切る
$owner_email=$_CONF['site_mail'];
# 必須入力チェック項目指定
# 必須にする INPUTタグの name属性の値をカンマ(,)区切りで指定する(スペース等はあけない)
# 例) 'email,name,message'
# A と B どちらかに必ず入力(両方入力も可) という場合はそれらname属性を(|)で区切る(スペース等はあけない)
# 例) 'email,realname|nickname,message'
# A と B どちらにも同じものを入力 という場合はそれらname属性を(=)で区切る(スペース等はあけない)
# 例) 'email=reemail,name,message'
$essential = 'email=reemail,seibetu,name,zip|city';
# メールアドレスチェック項目指定
# 入力された値がメールアドレスとして正しいかチェックをする
# INPUTタグの name属性の値をカンマ(,)区切りで指定する(スペース等はあけない)
# 例) 'email,reemail'
$propriety_email = 'email,reemail';
# 確認画面の表示/非表示の指定
# 指定方法 表示: true , 非表示: false
$disp_confirm = true;
# CSVファイルに保存
# 指定方法 保存しない: 0 , 保存する(カンマ区切り): 1 , 保存する(タブ区切り): 2
$save_csv = 1;
# CSVファイル保存場所 (直接入力時は最後にスラッシュ必須)
$save_csv_path = $_CONF['path_data'];
# CSVファイル名
$save_csv_name = 'formmail.csv';
# フォームの項目名
$frm_item = array('name' => 'お名前',
'email' => 'Eメール',
'reemail' => '確認用Eメール',
'seibetu' => '性別',
'zip' => '郵便番号',
'city' => '住所1',
'street' => '住所2',
'phone' => '電話番号',
'companyname' => '会社名',
'url' => '会社URL',
'message' => 'お問合せ内容',
);
# 表示メッセージ
$lang = array(// 入力フォームのタイトルやメッセージ
'title' => 'お問い合せフォーム',
'welcome' => '当サービスをご利用くださいまして、まことにありがとうございます。弊社では、お客様のプライバシー保護を重要と考えており,お送りいただいた情報は厳重に管理いたします。',
'smallmsg' => '*は必須入力です。',
// { フォームのsubmitボタンのメッセージ
'zipsearch'=>'〒=>住所', # 郵便番号から住所を表示するボタン
'confirm'=>'確 認', # 確認ボタン
'transmit'=>'送 信', # 送信ボタン
// } フォームのsubmitボタンのメッセージ
// { 必須エラー時のメッセージ
'essentialmessage' => '以下の必須項目に入力がありませんでした。<br />ブラウザの「戻る」ボタンをクリックして,再入力してください。',
'oressential' => 'または',
'eqessentialjoin' => 'と',
'eqessential' => 'は、同じ値を入力してください',
// } 必須エラー時のメッセージ
// { メールアドレス形式エラー時のメッセージ
'proprietyemailmessage' => '以下の項目がメールアドレスとして正しくありませんでした。',
// } メールアドレス形式エラー時のメッセージ
// { 完了HTML&メールのメッセージ
'receipt' => 'ありがとうございました。',
'subject1'=> 'お問合せがきました',
'subject2'=> 'お問合せありがとうございます',
'sign1' => '---------------------------<br />株式会社○○○○○<br />○○○ http://www.○○○○.co.jp',
// } 完了HTML&メールのメッセージ
// { システムエラーのメッセージ
'ownertransmiterror'=>'オーナーメール処理中、一部のアドレスでエラーが発生しましたが、処理を続けました。',
'transmiterror'=>'処理中にエラーが発生しました。',
// } システムエラーのメッセージ
);
// +---------------------------------------------------------------------------+
// | 初期処理 |
// +---------------------------------------------------------------------------+
# フォームから変数を設定
$action = COM_applyFilter($_POST['action']);
foreach ($_POST as $k => $v) {
# COM_applyFileterでカンマ(,)が消されるので別処理
if (($k == 'essential' || $k == 'proprietyemail') && !empty($_POST[$k])) {
$es = explode(",", $_POST[$k]);
$esv = array();
foreach ($es as $e) {
$esv[] = COM_applyFilter($e);
}
$fld_list[$k] = implode(",", $esv);
# COM_applyFileterでBR(改行)が消されるので別処理
} elseif ($k == 'sign' && !empty($_POST[$k])) {
$es = preg_split('/<br[ '.preg_quote('/','/').']*>/', $_POST[$k]);
$esv = array();
foreach ($es as $e) {
$esv[] = COM_applyFilter($e);
}
$fld_list[$k] = implode("<br />", $esv);
} else {
$fld_list[$k] = preg_replace('/,/', ',', $_POST[$k]);
$fld_list[$k] = preg_replace('/"/', '”', $fld_list[$k]);
$fld_list[$k] = preg_replace("/'/", "’", $fld_list[$k]);
$fld_list[$k] = preg_replace('/`/', '‘', $fld_list[$k]);
$fld_list[$k] = preg_replace('/;/', ';', $fld_list[$k]);
$fld_list[$k] = preg_replace(preg_quote('#'.chr(92).'#'), '¥', $fld_list[$k]);
$fld_list[$k] = COM_applyFilter($fld_list[$k]);
}
}
# フォーム入力値で初期変数を上書き
if (!empty($fld_list['essential'])) { $essential = $fld_list['essential']; }
if (!empty($fld_list['proprietyemail'])) { $propriety_email = $fld_list['proprietyemail']; }
if (!empty($fld_list['title'])) { $lang['title'] = $fld_list['title']; }
if (!empty($fld_list['endmessage'])) { $lang['receipt'] = $fld_list['endmessage']; }
if (!empty($fld_list['savecsv'])) { $save_csv = $fld_list['savecsv']; }
if (!empty($fld_list['savecsvname'])) { $save_csv_name = $fld_list['savecsvname']; }
# CSVファイルのフルパス
$save_csv_file = $save_csv_path . $save_csv_name;
# 確認画面表示/非表示処理
if ($disp_confirm) { $lang['submit'] = $lang['confirm']; } else { $lang['submit'] = $lang['transmit']; }
# フォーム項目一致
# 送信された項目すべてが $frm_item と同一かチェック
# 同一でなければ静的ページHTMLからの不特定のname属性を持ったものとして処理
$agree_frmitem = true;
foreach ($_POST as $k => $v) {
if ($k == 'action') { continue; }
if ($k == 'submit') { continue; }
if ($k == 'essential') { continue; }
if ($k == 'proprietyemail') { continue; }
if ($k == 'erremailname') { continue; }
if ($k == 'subject') { continue; }
if ($k == 'ownersubject') { continue; }
if ($k == 'sign') { continue; }
if ($k == 'title') { continue; }
if ($k == 'endmessage') { continue; }
if ($k == 'savecsv') { continue; }
if ($k == 'savecsvname') { continue; }
if (!array_key_exists($k, $frm_item)) { $agree_frmitem = false; }
}
# pageidからpageurlを作成
if (!empty($pageid)) { $pageurl = COM_buildUrl($_CONF['site_url'].'/staticpages/index.php?page='.$pageid); }
// +---------------------------------------------------------------------------+
// | 第1ステップ: フォーム表示 |
// +---------------------------------------------------------------------------+
if (empty($action) || (!empty($action) && $_POST['submit'] == $lang['zipsearch'])) {
/**
* フォーム画面HTML(サンプル){ ここから
*/
$jusho = '';
$otoko = '';
$onna = '';
if (!empty($action) && $_POST['submit'] == $lang['zipsearch']) {
require_once ('XML/RPC.php');
$zip = $fld_list['zip'];
$msg = new XML_RPC_Message('yubin.fetchAddressByPostcode', array(new XML_RPC_Value($zip, 'string')));
$cli = new XML_RPC_Client('/service/xmlrpc/', 'yubin.senmon.net', 80);
$resp = $cli->send( $msg );
COM_errorLog("zip search: faultCode=".$resp->faultCode(),1);
if ($resp && ! $resp->faultCode() ) {
$val = $resp->value();
$res = XML_RPC_decode($val);
$jusho = $res[0]['pref'] . $res[0]['city'] . $res[0]['town'];
}
$otoko = $fld_list['seibetu'] == '男' ? ' checked' : '';
$onna = $fld_list['seibetu'] == '女' ? ' checked' : '';
}
$retval = <<<END
<div id='mailform'>
<form action='$pageurl' method='POST' class='basic'>
<b>{$lang['title']}</b><br /><br />
<p class='message'>{$lang['welcome']}<br /><font color='#FF010E'>{$lang['smallmsg']}</font><br /></p>
<input type='hidden' name='action' value='{$lang['confirm']}'>
<input type='hidden' name='essential' value='{$essential}'>
<input type='hidden' name='proprietyemail' value='{$propriety_email}'>
<table style='text-align:left'>
<tr><th style='text-align:right'>*{$frm_item['name']}:</th><td><input type='text' name='name' size='20' value='{$fld_list['name']}'></td></tr>
<tr><th style='text-align:right'>*{$frm_item['email']}:</th><td><input type='text' name='email' size='20' value='{$fld_list['email']}'></td></tr>
<tr><th style='text-align:right'>*{$frm_item['reemail']}:</th><td><input type='text' name='reemail' size='20' value='{$fld_list['reemail']}'></td></tr>
<tr><th style='text-align:right'>*{$frm_item['seibetu']}:</th><td><label><input type='radio' name='seibetu' value='男'$otoko>男</label> <label><input type='radio' name='seibetu' value='女'$onna>女</label></td></tr>
<tr><th style='text-align:right'>{$frm_item['zip']}:</th><td><input type='text' name='zip' size='10' value='{$fld_list['zip']}'>例)1234567<input type='submit' name='submit' value='{$lang['zipsearch']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['city']}:</th><td><input type='text' name='city' size='40' value="{$jusho}"></td></tr>
<tr><th style='text-align:right'>{$frm_item['street']}:</th><td><input type='text' name='street' size='40' value='{$fld_list['street']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['phone']}:</th><td><input type='text' name='phone' size='20' value='{$fld_list['phone']}'>例)01-2345-6789</td></tr>
<tr><th style='text-align:right'>{$frm_item['companyname']}:</th><td><input type='text' name='companyname' size='40' value='{$fld_list['companyname']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['url']}:</th><td><input type='text' name='url' size='40' value='{$fld_list['url']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['message']}:</th><td><textarea rows='10' name='message' cols='40'>{$fld_list['message']}</textarea></td></tr>
</table>
<input type='submit' name='submit' value='{$lang['submit']}'></form>
</div>
END;
/**
* } ここまで フォーム画面HTML(サンプル)
*/
// +---------------------------------------------------------------------------+
// | 第2ステップ: 入力チェック |
// +---------------------------------------------------------------------------+
} elseif (!empty($action)) {
# 必須チェック
$errmsg = '';
$errkey = array();
if (!empty($essential)) {
$es1 = explode(",", $essential);
foreach ($es1 as $v) {
# or 処理
if ( strpos($v, '|') !== false ) {
$or_es = explode("|", $v);
$or_err = true;
$or_errkey = array();
foreach ($or_es as $or_v) {
if (empty($fld_list[$or_v])) {
if ($agree_frmitem) { $or_errkey[] = $frm_item[$or_v]; }
else { if (!empty($fld_list['erremailname']) && $or_v == 'email') { $or_errkey[] = $fld_list['erremailname']; } else { $or_errkey[] = $or_v; } }
} else {
$or_err = false;
}
}
if ($or_err) {
$errkey[] = implode(' '.$lang['oressential'].' ', $or_errkey);
}
# equal 処理
} elseif ( strpos($v, '=') !== false ) {
$eq_es = explode("=", $v);
$eq_err = false;
$chk = array();
foreach ($eq_es as $eq_v) {
if (empty($fld_list[$eq_v])) {
if ($agree_frmitem) { $errkey[] = $frm_item[$eq_v]; }
else { if (!empty($fld_list['erremailname']) && $eq_v == 'email') { $errkey[] = $fld_list['erremailname']; } else { $errkey[] = $eq_v; } }
} else {
$chk[] = $fld_list[$eq_v];
}
}
if (count($eq_es) == count($chk)) {
$bk_val= $chkval;
$chkval = array_shift($chk);
foreach ($chk as $eq_v) {
if ($chkval != $eq_v) { $eq_err = true; }
}
if ($eq_err) {
$frm_name = array();
foreach ($eq_es as $eq_v2) {
if ($agree_frmitem) { $frm_name[] = $frm_item[$eq_v2]; }
else { if (!empty($fld_list['erremailname']) && $eq_v2 == 'email') { $frm_name[] = $fld_list['erremailname']; } else { $frm_name[] = $eq_v2; } }
}
$errkey[] = implode(' '.$lang['eqessentialjoin'].' ', $frm_name).$lang['eqessential'];
}
}
# 普通に必須処理
} else {
if (empty($fld_list[$v])) {
if ($agree_frmitem) { $errkey[] = $frm_item[$v]; }
else { if (!empty($fld_list['erremailname']) && $v == 'email') { $errkey[] = $fld_list['erremailname']; } else { $errkey[] = $v; } }
}
}
}
}
# エラーがあれば画面に表示
if (!empty($errkey)) {
$msg = "<p class='essential'>".$lang['essentialmessage']."</p><ul>";
foreach ($errkey as $v) { $msg .= "<li>".$v."</li>"; }
$msg .= "</ul>";
//$msg .= "<hr> fldlist:".print_r($fld_list, true).", post: ".print_r($_POST, true);
$retval = COM_errorLog($msg, 2);
}
# E-mailチェック
if (empty($errkey)) {
if (!empty($propriety_email)) {
$pr1 = explode(",", $propriety_email);
foreach ($pr1 as $v) {
if (!COM_isemail($fld_list[$v])) {
if ($agree_frmitem) { $errkey[] = $frm_item[$v]; }
else { if (!empty($fld_list['erremailname']) && $v == 'email') { $errkey[] = $fld_list['erremailname']; } else { $errkey[] = $v; } }
}
}
}
if (!empty($errkey)) {
$msg = "<p class='proprietyemail'>".$lang['proprietyemailmessage']."</p><ul>";
foreach ($errkey as $v) { $msg .= "<li>".$v."</li>"; }
$msg .= "</ul>";
//$msg .= "<hr> fldlist:".print_r($fld_list, true).", post: ".print_r($_POST, true);
$retval = COM_errorLog($msg, 2);
}
}
}
// +---------------------------------------------------------------------------+
// | 第3ステップ: 確認画面表示 |
// +---------------------------------------------------------------------------+
if (empty($errkey) && $action == $lang['confirm'] && $_POST['submit'] != $lang['zipsearch']) {
# 改行コードを<br />に変換
foreach ($fld_list as $k => $v) { $fld_list[$k] = nl2br($fld_list[$k]); }
/**
* 確認画面HTML(サンプル){ ここから
*/
# フォーム項目が上部の初期設定と同じなら自由なレイアウトのHTML作成
if ($agree_frmitem) {
$retval = <<<END
<div id='mailform'>
<form action='$pageurl' method='POST' class='basic'>
<b>{$lang['title']}</b><br /><br />
<p class='message'>{$lang['welcome']}<br /><font color='#FF010E'>{$lang['smallmsg']}</font><br /></p>
<input type='hidden' name='action' value='{$lang['transmit']}'>
<input type='hidden' name='essential' value='{$essential}'>
<input type='hidden' name='proprietyemail' value='{$propriety_email}'>
<table style='text-align:left'>
<tr><th style='text-align:right'>{$frm_item['name']}:</th><td>{$fld_list['name']}<input type='hidden' name='name' value='{$fld_list['name']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['email']}:</th><td>{$fld_list['email']}<input type='hidden' name='email' value='{$fld_list['email']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['reemail']}:</th><td>{$fld_list['reemail']}<input type='hidden' name='reemail' value='{$fld_list['reemail']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['seibetu']}:</th><td>{$fld_list['seibetu']}<input type='hidden' name='seibetu' value='{$fld_list['seibetu']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['zip']}:</th><td>{$fld_list['zip']}<input type='hidden' name='zip' value='{$fld_list['zip']}'</td></tr>
<tr><th style='text-align:right'>{$frm_item['city']}:</th><td>{$fld_list['city']}<input type='hidden' name='city' value='{$fld_list['city']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['street']}:</th><td>{$fld_list['street']}<input type='hidden' name='street' value='{$fld_list['street']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['phone']}:</th><td>{$fld_list['phone']}<input type='hidden' name='phone' value='{$fld_list['phone']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['companyname']}:</th><td>{$fld_list['companyname']}<input type='hidden' name='companyname' value='{$fld_list['companyname']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['url']}:</th><td>{$fld_list['url']}<input type='hidden' name='url' value='{$fld_list['url']}'></td></tr>
<tr><th style='text-align:right'>{$frm_item['message']}:</th><td>{$fld_list['message']}<input type='hidden' name='message' value='{$fld_list['message']}'></td></tr>
</table>
<input type='submit' name='submit' value='{$lang['transmit']}'></form>
</div>
END;
# フォーム項目が上部の初期設定と違う場合はほぼ自動処理でHTML作成
} else {
$retval = <<<END
<div id='mailform'>
<form action='$pageurl' method='POST' class='basic'>
<b>{$lang['title']}</b><br /><br />
<p class='message'>{$lang['welcome']}<br /><font color='#FF010E'>{$lang['smallmsg']}</font><br /></p>
<input type='hidden' name='action' value='{$lang['transmit']}'>
<input type='hidden' name='essential' value='{$essential}'>
<input type='hidden' name='proprietyemail' value='{$propriety_email}'>
END;
foreach (array("subject","ownersubject","sign","title","endmessage","savecsv","savecsvname") as $v) {
if (!empty($fld_list[$v])) { $retval .= <<<END
<input type='hidden' name='$v' value='{$fld_list[$v]}'>
END;
}
}
$retval .= <<<END
<table style='text-align:left'>
END;
foreach ($fld_list as $k => $v) {
if ($k == 'action') { continue; }
if ($k == 'submit') { continue; }
if ($k == 'essential') { continue; }
if ($k == 'proprietyemail') { continue; }
if ($k == 'erremailname') { continue; }
if ($k == 'subject') { continue; }
if ($k == 'ownersubject') { continue; }
if ($k == 'sign') { continue; }
if ($k == 'title') { continue; }
if ($k == 'endmessage') { continue; }
if ($k == 'savecsv') { continue; }
if ($k == 'savecsvname') { continue; }
$retval .= "<tr><th style='text-align:right'>$k:</th><td>$v<input type='hidden' name='$k' value='$v'></td></tr>";
}
$retval .= <<<END
</table>
<input type='submit' name='submit' value='{$lang['transmit']}'></form>
</div>
END;
}
/**
* } ここまで 確認画面HTML(サンプル)
*/
// +---------------------------------------------------------------------------+
// | 第4ステップ: 完了表示&メール送信 |
// +---------------------------------------------------------------------------+
} elseif (empty($errkey) && $action == $lang['transmit'] && $_POST['submit'] != $lang['zipsearch']) {
$msg .= ""; # write confirm order
/**
* 完了画面HTML(サンプル){ ここから
*/
# フォーム項目が上部の初期設定と同じなら自由なレイアウトのHTML作成
if ($agree_frmitem) {
$out_html = <<<END
{$lang['receipt']}<br />
<br />
{$fld_list['name']}様 ({$fld_list['seibetu']})<br />
E-mail:{$fld_list['email']} Tel: {$fld_list['phone']}<br />
{$fld_list['zip']} {$fld_list['city']} {$fld_list['street']}<br />
{$frm_item['companyname']}:{$fld_list['companyname']}<br />
{$frm_item['url']}:{$fld_list['url']}<br />
{$frm_item['message']}:<br />
{$fld_list['message']}<br />
<br />
{$lang['sign']}
END;
# フォーム項目が上部の初期設定と違う場合はほぼ自動処理でHTML作成
} else {
$out_html = <<<END
{$lang['receipt']}<br />
<br />
END;
foreach ($fld_list as $k => $v) {
if ($k == 'action') { continue; }
if ($k == 'submit') { continue; }
if ($k == 'essential') { continue; }
if ($k == 'proprietyemail') { continue; }
if ($k == 'erremailname') { continue; }
if ($k == 'subject') { continue; }
if ($k == 'ownersubject') { continue; }
if ($k == 'sign') { continue; }
if ($k == 'title') { continue; }
if ($k == 'endmessage') { continue; }
if ($k == 'savecsv') { continue; }
if ($k == 'savecsvname') { continue; }
$out_html .= "$k: $v<br />";
}
$oh_sign = empty($fld_list['sign']) ? $lang['sign'] : $fld_list['sign'];
$out_html .= <<<END
<br />
$oh_sign
END;
}
/**
* } ここまで 完了画面HTML(サンプル)
*/
# <br /> を改行コードに変換
foreach ($fld_list as $k => $v) { $fld_list[$k] = ereg_replace("<br />", LB, $fld_list[$k]); }
$lang['sign1'] = ereg_replace("<br />", LB, $lang['sign1']);
/**
* 送信メール内容(サンプル){ ここから
*/
# フォーム項目が上部の初期設定と同じなら自由なレイアウトのHTML作成
if ($agree_frmitem) {
$out_mail = <<<END
{$lang['receipt']}
{$fld_list['name']}様
E-mail:{$fld_list['email']} Tel: {$fld_list['phone']}
{$fld_list['zip']} {$fld_list['city']} {$fld_list['street']}
{$frm_item['companyname']}:{$fld_list['companyname']}
{$frm_item['url']}:{$fld_list['url']}
{$frm_item['message']}:
{$fld_list['message']}
{$lang['sign1']}
END;
# フォーム項目が上部の初期設定と違う場合はほぼ自動処理でHTML作成
} else {
$out_mail = <<<END
{$lang['receipt']}
END;
foreach ($fld_list as $k => $v) {
if ($k == 'action') { continue; }
if ($k == 'submit') { continue; }
if ($k == 'essential') { continue; }
if ($k == 'proprietyemail') { continue; }
if ($k == 'erremailname') { continue; }
if ($k == 'subject') { continue; }
if ($k == 'ownersubject') { continue; }
if ($k == 'sign') { continue; }
if ($k == 'title') { continue; }
if ($k == 'endmessage') { continue; }
if ($k == 'savecsv') { continue; }
if ($k == 'savecsvname') { continue; }
$out_mail .= "$k: $v".LB;
}
$om_sign = empty($fld_list['sign']) ? $lang['sign1'] : $fld_list['sign'];
$out_mail .= <<<END
$om_sign
END;
}
/**
* } ここまで 送信メール内容(サンプル)
*/
# メール送信
$ownererr = false;
$ownersend = false;
$om_array = explode(',', $owner_email);
$owner_mails = array_unique($om_array); # 重複した値(メールアドレス)を削除
$owner_subject = empty($fld_list['ownersubject']) ? $lang['subject1'] : $fld_list['ownersubject'];
foreach ($owner_mails as $v) {
$email1 = COM_mail( $v, "$owner_subject", $out_mail, '', false); # オーナーあてメール
if (!$email1) { $ownererr = true; } else { $ownersend = true; } # 送信/エラーのフラグをセット
}
# オーナーメール送信でエラーがあった場合
if ($ownererr) {
# 一部に送信できている場合
if ($ownersend) {
# エラーをログへ出力(一部へは配送されているのでユーザにエラー画面を出さない)
COM_errorLog($lang['ownertransmiterror'], 1);
$email1 = true;
# 全員がエラーの場合
} elseif (!$ownersend) {
# 処理エラーとし、ユーザへのメールは送らない
$email1 = false;
}
}
if ($email1) {
$usr_subject = empty($fld_list['subject']) ? $lang['subject2'] : $fld_list['subject'];
$email2 = COM_mail( $fld_list['email'], "$usr_subject", $out_mail, '', false); # 購入者へメール
}
if ($email1 && $email2) { # どちらの送信も成功したら
# csv出力する
if ($save_csv > 0) {
$delimiter = ',';
if ($save_csv > 1) { $delimiter = chr(9); }
$enclosure = '"';
# CSV出力
$fp = fopen($save_csv_file, 'a');
$str = '';
$escape_char = chr(92);
foreach ($fld_list as $k => $v) {
if ($k == 'action') { continue; }
if ($k == 'submit') { continue; }
if ($k == 'essential') { continue; }
if ($k == 'proprietyemail') { continue; }
if ($k == 'erremailname') { continue; }
if ($k == 'subject') { continue; }
if ($k == 'ownersubject') { continue; }
if ($k == 'sign') { continue; }
if ($k == 'title') { continue; }
if ($k == 'endmessage') { continue; }
if ($k == 'savecsv') { continue; }
if ($k == 'savecsvname') { continue; }
if (strpos($v, $delimiter) !== false ||
strpos($v, $enclosure) !== false ||
strpos($v, chr(10)) !== false ||
strpos($v, chr(13)) !== false ||
strpos($v, chr(9)) !== false ||
strpos($v, ' ') !== false) {
$str2 = $enclosure;
$escaped = 0;
$len = strlen($v);
for ($i=0;$i<$len;$i++) {
if ($v[$i] == $escape_char) {
$escaped = 1;
} else if (!$escaped && $v[$i] == $enclosure) {
$str2 .= $enclosure;
} else {
$escaped = 0;
}
$str2 .= $v[$i];
}
$str2 .= $enclosure;
$str .= $str2.$delimiter;
} else {
$str .= $v.$delimiter;
}
}
$str = substr($str,0,-1);
$str .= "\\n";
fwrite($fp, $str);
fclose($fp);
}
$retval = $msg . $out_html;
} else {
$retval = $lang['transmiterror']; # メール送信が失敗したら
}
}
送信メールの内容(フォーマット)を指定する
この方法は静的ページPHPを直接編集するため十分注意して行ってください。
- PHPの構文としておかしい場合は画面にエラーが表示されフォームが表示されなくなりますので、ご注意ください。
このメール内容の指定は性質上、複数の静的ページHTMLからの送信には対応できません
- 特定(1つのみ)の静的ページHTMLから送信されるメールの内容をもっと細かく指定したい場合には有効です。
- この指定を行っても、その他の静的ページHTMLは今まで同様に動きます。
静的ページHTMLを使わないで静的ページPHPのみで入力フォームが作れます
- この場合には静的ページPHPの131行目あたりから160行目あたりにあるコメント「フォーム画面HTML(サンプル)」の「ここから」「ここまで」の範囲内にあるHTMLを編集することで可能となります。
- アクセス方法は直接静的ページPHPのアドレスすれば入力フォームの画面が表示されます。
/**
* フォーム画面HTML(サンプル){ ここから
*/
$retval = <<<END
<div id='mailform'>
<form action='$pageurl' method='POST' class='basic'>
<b>{$lang['title']}</b><br /><br />
<p class='message'>{$lang['welcome']}<br /><font color='#FF010E'>{$lang['smallmsg']}</font><br /></p>
<input type='hidden' name='action' value='{$lang['confirm']}'>
<input type='hidden' name='essential' value='{$essential}'>
<input type='hidden' name='proprietyemail' value='{$propriety_email}'>
<table style='text-align:left'>
<tr><th style='text-align:right'>*{$frm_item['name']}:</th><td><input type='text' name='name' size='20'></td></tr>
<tr><th style='text-align:right'>*{$frm_item['email']}:</th><td><input type='text' name='email' size='20'></td></tr>
<tr><th style='text-align:right'>*{$frm_item['reemail']}:</th><td><input type='text' name='reemail' size='20'></td></tr>
<tr><th style='text-align:right'>*{$frm_item['sex']}:</th><td><label><input type='radio' name='sex' value='男'>男</label> <label><input type='radio' name='sex' value='女'>女</label></td></tr>
<tr><th style='text-align:right'>{$frm_item['zip']}:</th><td><input type='text' name='zip' size='10'>例)123-4567</td></tr>
<tr><th style='text-align:right'>{$frm_item['city']}:</th><td><input type='text' name='city' size='20'></td></tr>
<tr><th style='text-align:right'>{$frm_item['street']}:</th><td><input type='text' name='street' size='40'></td></tr>
<tr><th style='text-align:right'>{$frm_item['phone']}:</th><td><input type='text' name='phone' size='20'>例)01-2345-6789</td></tr>
<tr><th style='text-align:right'>{$frm_item['companyname']}:</th><td><input type='text' name='companyname' size='40'></td></tr>
<tr><th style='text-align:right'>{$frm_item['url']}:</th><td><input type='text' name='url' size='40'></td></tr>
<tr><th style='text-align:right'>{$frm_item['message']}:</th><td><textarea rows='10' name='message' cols='40'></textarea></td></tr>
</table>
<input type='submit' name='submit' value='{$lang['submit']}'></form>
</div>
END;
/**
* } ここまで フォーム画面HTML(サンプル)
*/
静的ページPHPの設定
入力項目の指定
- 46行目の$frm_itemへ指定します。ここへ指定した項目と入力フォームの項目が一致すれば指定したメール内容で送信が可能になります。
- 入力フォームが「メールアドレス」、「名前」、「郵便番号」、「都道府県」、「住所」、「お問合せ内容」の場合は以下のように指定します。
$frm_item = array('email' => 'メールアドレス',
'name' => '名前',
'zip' => '郵便番号',
'ken' => '都道府県',
'jusho' => '住所',
'message' => 'お問合せ内容',
);
メール内容の指定
- 387行目から399行目で指定します。
$out_mail = <<<END
{$lang['receipt']}
{$fld_list['name']}様
■御入力の内容■
・メールアドレス: {$fld_list['email']}
・住所: {$fld_list['zip']} {$fld_list['ken']} {$fld_list['jusho']}
・お問合せの内容:
{$fld_list['message']}
{$lang['sign1']}
END;
この指定でのメール内容はこうなります。
ご連絡ありがとうございました。 ○○様 ■御入力の内容■ ・メールアドレス: ○○@○○ ・住所: 999-9999 ○○県 ○○ ・お問合せの内容: ○○○○ ○○○○ --------------------------- 株式会社○○○○○ ○○○ http://www.○○○○.co.jp
Geeklog1.5での注意点
Geeklog1.5系から静的ページPHPの出力方法に若干の変更があり、1.4系とは最後の出力処理が変わりました。 「PHPを実行する(return)」の場合と、「PHPを実行する」の場合で、それぞれ対応方法が違います。 これらの対応をしない場合、まっしろなページが出力されることがありますので、中身が何も無い真っ白なページが出力されたら、この対応を行ってください。
※日本語版のGeeklog1.5.1、Geeklog1.5.2では日本版独自カスタマイズとして1.4のままでも動くようにしてあります。
「PHPを実行する」の場合
静的ページPHPのコードの末尾に
echo $retval;
を付加してください。
「PHPを実行する(return)」の場合
静的ページPHPのコードの末尾に
return $retval;
を付加してください。





