汎用お問い合わせフォームをPHPで設置する
出典: GeeklogJpWiki
高機能なお問い合わせフォームを,バリ島旅行ch,沖縄旅行chサイト構築を機に開発しました。
- 開発:ひろろん
- スポンサー:株式会社ホワイト・ベアーファミリー
- コーディネート:アデリープランニング株式会社/株式会社アイビー・ウィー
- ダウンロード:http://hiroron.com/filemgmt/index.php?id=165 画像認証対応阪
目次 |
機能
- 各種エンコードを指定してCSVに保存。
- 管理者送信先をお問い合わせ入力値に応じて振り分け。
- 全角を半角に自動変換する指定
- カタカナの半角をカタカナの全角に変換する指定
- ひらがなをカタカナに変換する指定
- 必須入力指定
- 入力エラーのメッセージ表示とともにフォーム表示とその際の項目のスタイルを変更
- 引数を受け取って初期値を設定する
使い方
静的ページPHP(returnあり)で記述します。
- 画像認証対応最新版は,http://hiroron.com/filemgmt/index.php?id=165 からダウンロードしてください。
// +---------------------------------------------------------------------------+
// | Geeklog FormMail Static Page |
// +---------------------------------------------------------------------------+
// | Copyright (C) 2008 by the following authors: |
// | |
// | Authors : Hiroshi Sakuramoto - hiro AT winkey DOT jp |
// | Sponser : White Bear Family CO., LTD |
// | Coordinate : Adeliae Planning CO., LTD - www.e-adeliae.com |
// | Coordinate : IVY WE CO., LTD - www.ivywe.co.jp |
// | Version: 1.0.7 |
// +---------------------------------------------------------------------------+
global $_CONF; // config.phpの変数を参照可能にする
if (!defined('XHTML')) define('XHTML', ' /');
// +---------------------------------------------------------------------------+
// | 初期設定 |
// +---------------------------------------------------------------------------+
# 入力フォームのURL
$pageurl = $_SERVER["REQUEST_URI"];
// $_SERVER["REQUEST_URI"] が使えず正しく動かない場合は以下へ、
// 静的ページPHPを作成する時に入力したIDを入れてください。
// (wikiドキュメントのサンプル例だと'formmail')
// ※IDを入力したら先頭の#を削除してください。(コメントをはずします)
#$pageid = 'formmail';
# 問合せを管理者へ通知の設定
# 複数のE-mailはカンマ(,)で区切りで指定する(スペース等はあけない)
# 例) 'info@hoge.com,admin@page.com'
# 特定の入力項目に応じて送り先を変える
# ※この方法を利用する時は必ず $owner_email_item_name を指定してください。
# 例) 'AAA=info@hoge.com,BBB=admin@page.com'
$owner_email=$_CONF['site_mail'];
# 管理者Emailを入力項目から選択する項目名
// ※送り先を変える指定をしたら先頭の#を削除してください。(コメントをはずします)
#$owner_email_item_name = 'q_mail_to';
# メール送信者E-mail
$email_from = $_CONF['site_mail'];
#Geeklog1.5から,noreplyを指定できます。
#$email_from = $_CONF['noreply_mail'];
# 問合せ者のメールアドレスの項目名
$email_input_name = 'q_mail';
# メール一致チェック項目指定
# メール確認でどちらも同じものを入力 というname属性を(=)で区切る(スペース等はあけない)
# 例) 'email=reemail'
$essential_email = 'q_mail=q_mail_re';
# メールアドレスチェック項目指定
# 入力された値がメールアドレスとして正しいかチェックをする
# INPUTタグの name属性の値をカンマ(,)区切りで指定する(スペース等はあけない)
# 例) 'email,reemail'
$propriety_email = 'q_mail,q_mail_re';
# CSVファイルに保存
# 指定方法 保存しない: 0 , 保存する(カンマ区切り): 1 , 保存する(タブ区切り): 2
$save_csv = 1;
# CSVファイル保存場所 (直接入力時は最後にスラッシュ必須)
$save_csv_path = $_CONF['path_data'];
# CSVファイル名
$save_csv_name = 'formmail.csv';
# CSVファイル保存の文字コード
# 文字コード変換をしない場合は '' と指定してください。
# 機能がOFFになります。(文字化けするようなら機能を''で
# OFFにして別途フリーの文字変換ツールなどをご利用ください)
# 注意) mb_convert_encodingで使える文字コードを指定してください
# 例) UTF-8, SJIS, EUC-JP, JIS, ASCII
$save_csv_lang = 'SJIS';
# 全角を半角に変換する項目名(英数字、スペース、カタカナ、ひらがな)
# 入力された値を自動で変換する項目を指定
# INPUTタグの name属性の値をカンマ(,)区切りで指定する(スペース等はあけない)
$zentohan_itemname = 'q_phone,q_code1_1,q_code2_1,q_code3_1,q_code1_2,q_code2_2,q_code3_2,q_code1_3,q_code2_3,q_code3_3';
# カタカナの半角をカタカナの全角に変換する項目名
# 入力された値を自動で変換する項目を指定
# INPUTタグの name属性の値をカンマ(,)区切りで指定する(スペース等はあけない)
$kana_hantozen_itemname = 'q_kana_1,q_kana_2';
# ひらがなをカタカナに変換する項目名
# 入力された値を自動で変換する項目を指定
# INPUTタグの name属性の値をカンマ(,)区切りで指定する(スペース等はあけない)
$kana_hiratokana_itemname = 'q_kana_1,q_kana_2';
# 遷移の項目名
$seni_items = array('input' => '情報入力', 'confirm' => '入力項目確認', 'finish' => '入力完了');
# 必須入力の文字列
$required_string = '<span class="must">*必須</span>';
# テーブルの項目名
$form_items = array(
// < テーブル
array('title' => 'お客様情報', 'table' => array(
// < テーブル1行
array('header' => '法人様名', 'data' =>
array(
array('input' => ''),
array('type' => 'text',
'name' => 'q_kaisha_1',
'size' => '40',
'class' => 'bginput'
),
array('input' => '<br'.XHTML.'>'),
),
),
// > テーブル1行
// < テーブル1行
array('header' => '氏名', 'valid_require' => $required_string, 'error_require' => '氏名が入力されていません', 'data' =>
array(
array('input' => '姓 :'),
array('type' => 'text',
'name' => 'q_name_1',
'class' => 'bginput'
),
array('input' => ' 名 :'),
array('type' => 'text',
'name' => 'q_name_2',
'class' => 'bginput'
),
array('string' => '<br'.XHTML.'>'),
array('input' => '※全角<br'.XHTML.'>セイ:'),
array('type' => 'text',
'name' => 'q_kana_1',
'class' => 'bginput'
),
array('input' => ' メイ:'),
array('type' => 'text',
'name' => 'q_kana_2',
'class' => 'bginput'
),
array('input' => '<br'.XHTML.'>※全角カタカナ'),
),
),
// > テーブル1行
// < テーブル1行
array('header' => 'メールアドレス',
'valid_require' => $required_string, 'error_require' => 'メールアドレスが入力されていません',
'valid_equal' => $essential_email, 'error_equal' => 'メールアドレスが一致しません',
'valid_email' => $propriety_email, 'error_email' => 'メールアドレスを正しく入力してください',
'data' =>
array(
array('type' => 'text',
'name' => 'q_mail',
'size' => '40',
'class' => 'bginput'
),
array('string' => '<br'.XHTML.'>'),
array('input' => ''),
array('type' => 'text',
'name' => 'q_mail_re',
'size' => '40',
'class' => 'bginput'
),
array('string' => '<br'.XHTML.'>'),
array('input' => '※確認のため、もう一度入力してください'),
),
),
// > テーブル1行
// < テーブル1行
array('header' => 'ご連絡方法', 'data' =>
array(
array('type' => 'radio',
'name' => 'q_answer_means',
'value' => 'メール',
'checked' => 'checked'
),
array('input' => 'メール '),
array('type' => 'radio',
'name' => 'q_answer_means',
'value' => '電話'
),
array('input' => '電話 '),
array('string' => '<br'.XHTML.'>'),
array('input' => '※お問い合わせ内容によって、メールをご希望の場合も電話連絡とさせて頂く場合があります。'),
),
),
// > テーブル1行
// < テーブル1行
array('header' => '電話番号', 'valid_require' => $required_string, 'error_require' => '電話番号が入力されていません', 'data' =>
array(
array('type' => 'text',
'name' => 'q_phone',
'class' => 'bginput'
),
array('string' => '<br'.XHTML.'>'),
array('input' => '※半角(例 03-1111-1111)<br'.XHTML.'>'),
array('type' => 'radio',
'name' => 'q_phone_kind',
'value' => '自宅',
'checked' => 'checked'
),
array('input' => '自宅 '),
array('type' => 'radio',
'name' => 'q_phone_kind',
'value' => '勤務先'
),
array('input' => '勤務先 '),
array('type' => 'radio',
'name' => 'q_phone_kind',
'value' => '携帯'
),
array('input' => '携帯 '),
),
),
// > テーブル1行
// < テーブル1行
array('header' => '時間帯', 'data' =>
array(
array('type' => 'select',
'name' => 'q_access_time',
'style' => 'width: 15em;',
'class' => 'bginput',
'options' => array('selected' => '特に希望なし', 'values' => '特に希望なし,午前,午後 - 夕方まで,夕方以降'),
),
array('input' => '<br'.XHTML.'>※電話連絡の場合のご連絡を希望する時間帯。'),
),
),
// > テーブル1行
),
),
// > テーブル
// < テーブル
array('title' => 'お問い合わせ内容', 'table' => array(
// < テーブル1行
array('header' => 'お申し込みセミナー', 'data' =>
array(
array('type' => 'checkbox',
'name' => 'q_order_1',
'value' => 'セミナー1',
),
array('input' => ' '),
array('type' => 'checkbox',
'name' => 'q_order_2',
'value' => 'セミナー2',
),
array('input' => ' '),
array('type' => 'checkbox',
'name' => 'q_order_3',
'value' => 'セミナー3',
),
),
),
// > テーブル1行
// < テーブル1行
array('header' => '内容', 'data' =>
array(
array('type' => 'textarea',
'name' => 'q_other',
'class' => 'bginput',
'style' => 'width: 95%; height: 50px;',
),
array('input' => '<br'.XHTML.'>※お問い合わせ内容を入力してください。<br'.XHTML.'>'),
),
),
// > テーブル1行
),
),
// > テーブル
// < 送信ボタン - 入力画面
array('action' => 'input', 'data' =>
array(
array('string' => ' <div style="text-align: center;" class="text_center mt20 mb20">'),
array('type' => 'submit',
'name' => 'submit',
'class' => 'button_form_next',
'value' => '入力項目確認画面へ'
),
array('string' => '</div>'),
),
),
// > 送信ボタン - 入力画面
// < 送信ボタン - 確認画面
array('action' => 'confirm', 'data' =>
array(
array('string' => ' <div style="text-align: center;" class="text_center mt20 mb20">'),
array('type' => 'submit',
'name' => 'goback',
'class' => 'button_form_prev',
'value' => '戻る'
),
array('string' => ' '),
array('type' => 'submit',
'name' => 'submit',
'class' => 'button_form_next',
'value' => '送信する'
),
array('string' => '</div>'),
),
),
// > 送信ボタン - 確認画面
);
# 表示メッセージ
$lang = array(// { 完了HTML&メールのメッセージ
'receipt_admin' =>'管理者のみなさま'.LB.LB.$_CONF['site_name'].'サイトにおいて'.LB.'問い合わせがありました。'.LB.LB.'==========お問い合わせ =========='.LB.'受付日時:'.date("Y年m月d日H:i"),
'receipt_user' =>'※本メールは、'.$_CONF['site_name'].'サイトより自動的に配信しています。'.LB.'このメールは送信専用のため、このメールにご返信いただけません。'.LB.'============================='.LB.'お問い合わせありがとうございました。'.LB.LB.'========== お問い合わせ内容 =========='.LB.'受付日時:'.date("Y年m月d日H:i"),
'subject_admin'=> '['.$_CONF['site_name'].']お問い合わせ',
'subject_user'=> '['.$_CONF['site_name'].']お問い合わせを受け付けました',
'sign_admin' => '-----------------------------------------'.LB.$_CONF['site_name'].LB.$_CONF['site_url'].LB.'-----------------------------------------',
'sign_user' => '-----------------------------------------'.LB.$_CONF['site_name'].LB.'URL:' . $_CONF['site_url'].LB.'-----------------------------------------',
// } 完了HTML&メールのメッセージ
// { システムエラーのメッセージ
'ownertransmiterror'=>'オーナーメール処理中、一部のアドレスでエラーが発生しましたが、処理を続けました。',
'transmiterror'=>'処理中にエラーが発生しました。',
// } システムエラーのメッセージ
);
// +---------------------------------------------------------------------------+
// | 初期処理 |
// +---------------------------------------------------------------------------+
# POSTデータを直接変換 (全角から半角へ、カタカナ半角からカタカナ全角へ)
if (!empty($zentohan_itemname)) { foreach (explode(',',$zentohan_itemname) as $k) { if (!empty($_POST[$k])) $_POST[$k] = mb_convert_kana($_POST[$k], 'askh'); } }
if (!empty($kana_hantozen_itemname)) { foreach (explode(',',$kana_hantozen_itemname) as $k) { if (!empty($_POST[$k])) $_POST[$k] = mb_convert_kana($_POST[$k], 'K'); } }
if (!empty($kana_hiratokana_itemname)) { foreach (explode(',',$kana_hiratokana_itemname) as $k) { if (!empty($_POST[$k])) $_POST[$k] = mb_convert_kana($_POST[$k], 'C'); } }
# データを保存用に加工
foreach ($_POST as $k => $v) {
$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]);
}
# CSVファイルのフルパス
$save_csv_file = $save_csv_path . $save_csv_name;
# 多言語サポートONならマルチ言語でメッセージ変数を上書き
if( isset( $_CONF['languages'] ) && isset( $_CONF['language_files'] )) {
$overridables = array('frm_item', 'lang');
if( empty( $langId ) ) {
$langId = COM_getLanguageId();
}
foreach( $overridables as $option ) {
$override = $option . '_' . $langId;
if( isset( $$override ) ) {
$$option = $$override;
}
}
}
# pageidからpageurlを作成
if (!empty($pageid)) { $pageurl = COM_buildUrl($_CONF['site_url'].'/staticpages/index.php?page='.$pageid); }
// +---------------------------------------------------------------------------+
// | 関数群: |
// +---------------------------------------------------------------------------+
function getAction ($err) {
$buf = '';
$action = COM_applyFilter($_POST['action']);
if (!empty($action) && empty($err) && $action == 'input') { $buf = 'confirm'; }
elseif (!empty($action) && empty($err) && $action == 'confirm') { $buf = empty($_POST['goback']) ? 'finish' : 'input'; }
else { $buf = 'input'; }
return $buf;
}
function mkSeni ($items, $action) {
$buf = '<ul>'.LB;
foreach ($items as $key => $value) {
if ($action == $key) {
$buf .= ' <li class="on">'.$value.'</li>'.LB;
} else {
$buf .= ' <li>'.$value.'</li>'.LB;
}
}
$buf .= '</ul>'.LB;
return $buf;
}
function ChkValidate ($mode, $datas, $errmsg, $attributes = '') {
$msg = '';
foreach ($datas as $data) {
if (!empty($data['type'])) {
$name = $data['name'];
switch ($mode) {
// 必須チェック
case 'require':
if (empty($data['notrequire'])) {
if (empty($_POST[$name])) {
if ($_POST[$name] != "0") {
$msg = $errmsg;
}
}
}
break;
// 一致チェック
case 'equal':
if (!empty($attributes)) {
$es_emails = explode(',', $attributes);
foreach ($es_emails as $es_email) {
list($eq1,$eq2) = explode('=', $es_email);
// 最初のキー かつ チェックするキーが存在
if ($name == $eq1 && !empty($_POST[$eq2])) {
if ($_POST[$eq1] != $_POST[$eq2]) {
$msg = $errmsg;
}
}
}
}
break;
// メールチェック
case 'email':
if (!empty($attributes)) {
$pr_emails = explode(',', $attributes);
foreach ($pr_emails as $pr_email) {
if ($name == $pr_email) {
if (!COM_isemail($_POST[$name])) {
$msg = $errmsg;
}
}
}
}
break;
// 数値チェック - 足して0以上
case 'notzero':
if (!empty($attributes)) {
$values_key = explode(',', $attributes);
foreach ($values_key as $val_key) {
// 最初のキーのときにチェック
if ($name == $val_key) {
$sum_val = 0;
foreach ($values_key as $chk_key) {
if (!empty($_POST[$chk_key])) {
$sum_val += $_POST[$chk_key];
}
}
if ($sum_val <= 0) {
$msg = $errmsg;
break;
}
}
}
}
break;
}
}
}
return $msg;
}
function ChkFormValidateLines ($lines) {
$errmsg;
foreach (array('require','equal','email','notzero') as $chk) {
// 必須,一致,メール のチェック
if (!empty($lines['valid_'.$chk])) {
$errmsg = ChkValidate($chk, $lines['data'], $lines['error_'.$chk], $lines['valid_'.$chk]);
// エラーがあれば配列に格納
if ($errmsg) {
break;
}
}
}
return $errmsg;
}
function ChkFormValidate ($items) {
$errs;
foreach ($items as $item) {
// 各テーブル
foreach ($item as $key => $value) {
// 1テーブル
if ($key == 'table') {
foreach ($value as $key2 => $value2) {
// テーブル1行
$errmsg = ChkFormValidateLines($value2);
if ($errmsg) { $errs[] = $errmsg; }
}
}
}
}
return $errs;
}
function FormValidate ($items) {
$buf = '';
$errs = ChkFormValidate($items);
if (!empty($errs)) {
$errmsg = '';
foreach ($errs as $err) {
$errmsg .= ' <li>'.$err.'</li>'.LB;
}
$buf = <<<END
<p class="error">入力エラーがありました。下記について再度ご確認の上、ご記入ください。</p>
<ol class="errorList">
$errmsg
</ol>
END;
}
return $buf;
}
function mkTitle ($title) {
return <<<END
<h4>$title</h4>
<table cellspacing="0">
<colgroup><col width="130" /></colgroup>
<tbody>
END;
}
function mkForm_Value ($name, $value) {
return empty($_POST[$name]) ? $value : $_POST[$name];
}
function mkForm_Radio_Checked (&$attributes) {
$name = $attributes['name'];
if (!empty($_POST[$name])) {
if (!empty($attributes['checked'])) unset($attributes['checked']);
if ($_POST[$name] == $attributes['value']) {
$attributes['checked'] = 'checked';
}
}
}
function mkForm_Input ($attributes, $hidden = false) {
if ($hidden) {
if ($attributes['type'] == 'radio' || $attributes['type'] == 'checkbox') {
if ($attributes['value'] != $_POST[$attributes['name']]) return '';
}
$attributes['type'] = 'hidden';
}
if ($attributes['type'] == 'radio' || $attributes['type'] == 'checkbox') {
mkForm_Radio_Checked($attributes);
} else {
if ($attributes['type'] != 'submit') $attributes['value'] = mkForm_Value($attributes['name'], $attributes['value']);
}
$buf = '<input';
foreach ($attributes as $key => $value) {
$buf .= ' '.$key.'="'.$value.'"';
}
$buf .= XHTML.'>';
if ($hidden || $attributes['type'] == 'checkbox') $buf .= ' ' . $attributes['value'];
return $buf;
}
function mkForm_Select_Options ($name, $attributes) {
$buf = '';
$selected = mkForm_Value($name, $attributes['selected']);
$values = explode(',', $attributes['values']);
foreach ($values as $value) {
list($k,$v) = explode('=',$value);
if (empty($v)) $v = $k;
if ($selected == $k) {
$buf .= '<option selected="selected" value="'.$v.'">'.$k.'</option>';
} else {
$buf .= '<option value="'.$v.'">'.$k.'</option>';
}
}
return $buf;
}
function mkForm_Select ($attributes) {
$buf = '<select';
foreach ($attributes as $key => $value) {
if ($key != 'options') {
$buf .= ' '.$key.'="'.$value.'"';
}
}
$buf .= '>';
$buf .= mkForm_Select_Options($attributes['name'], $attributes['options']);
$buf .= '</select>';
return $buf;
}
function mkForm_Textarea ($attributes) {
$attributes['value'] = mkForm_Value($attributes['name'], $attributes['value']);
$buf = '<textarea';
foreach ($attributes as $key => $value) {
if ($key != 'value') $buf .= ' '.$key.'="'.$value.'"';
}
$buf .= '>'.$attributes['value'].'</textarea>';
return $buf;
}
function mkForm_Item ($items, $action) {
$buf = '';
if ($action != 'input' && $items['type'] != 'submit') {
$buf .= mkForm_Input($items, true);
} else {
switch ($items['type']) {
case 'text': $buf .= mkForm_Input($items); break;
case 'radio': $buf .= mkForm_Input($items); break;
case 'checkbox': $buf .= mkForm_Input($items); break;
case 'select': $buf .= mkForm_Select($items); break;
case 'textarea': $buf .= mkForm_Textarea($items); break;
case 'submit': $buf .= mkForm_Input($items); break;
}
}
return $buf;
}
function mkTable_Data ($datas, $action) {
$buf = '';
foreach ($datas as $data) {
// 1つのデータ
if (!empty($data['type'])) {
// フォーム
$buf .= mkForm_Item($data, $action);
}
else {
// 文字列
foreach ($data as $key => $value) {
if ($key == 'string') {
$buf .= $value;
} elseif ($key == $action) {
$buf .= $value;
}
}
}
}
return $buf;
}
function mkTable ($tables, $action) {
$buf = '';
foreach ($tables as $lines) {
$buf .= ' <tr>'.LB;
$buf .= ' <th>';
foreach ($lines as $key => $value) {
// エラーチェック
$errflg = '';
if (!empty($_POST)) $errflg = ChkFormValidateLines($lines);
switch ($key) {
case 'header':
$buf .= $value;
break;
case 'valid_require':
$buf .= $value;
break;
case 'data':
if ($errflg) {
$buf .= '</th>'.LB;
$buf .= ' <td class="warning_bgc">';
$buf .= mkTable_Data($value, $action).'</td>';
} else {
$buf .= '</th>'.LB;
$buf .= ' <td>';
$buf .= mkTable_Data($value, $action).'</td>';
}
break;
}
}
$buf .= ' </tr>'.LB;
}
return $buf;
}
function mkForm ($items, $action) {
$buf = '';
foreach ($items as $item) {
// 各テーブル
if (!empty($item['table'])) {
foreach ($item as $key => $value) {
// 1テーブル
switch ($key) {
case 'title': $buf .= mkTitle($value); break;
case 'table': $buf .= mkTable($value, $action); break;
}
}
$buf .= <<<END
</tbody>
</table>
END;
if (!empty($action)) {
}
} elseif (!empty($item['action'])) {
// 送信ボタン
if ($item['action'] == $action) {
$buf .= LB . ' <input type="hidden" name="action" value="' . $action . '"' . XHTML . '>';
$buf .= LB . mkTable_Data($item['data'], $action);
}
}
}
return $buf;
}
// エラーチェック
if (!empty($_POST)) {
$valid = FormValidate($form_items);
}
$action = getAction($valid);
// +---------------------------------------------------------------------------+
// | 第1ステップ: フォーム表示 |
// +---------------------------------------------------------------------------+
if ($action == 'input' || $action == 'confirm') {
/**
* フォーム画面HTML { ここから
*/
// 遷移
$seni = mkSeni($seni_items, $action);
// 入力フォーム
$form = mkForm($form_items, $action);
$retval = <<<END
<div id="form_step">
$seni
</div>
<div id="FORM">
$valid
<form name="subForm" method="post" action="{$pageurl}">
$form
</form>
</div>
END;
/**
* } ここまで フォーム画面HTML
*/
// +---------------------------------------------------------------------------+
// | 第2ステップ: 完了表示&メール送信 |
// +---------------------------------------------------------------------------+
} elseif ($action == 'finish') {
/**
* 完了画面HTML { ここから
*/
// 遷移
$seni = mkSeni($seni_items, $action);
$out_html = <<<END
<div id="form_step">
$seni
</div>
<div id="contact_thanks">
<p><strong>お問い合わせを受け付けました。</strong></p>
<p>※お問い合わせ確認のメールを自動送信しました。<br />
メールが届かない場合は、ご登録のメールアドレスが間違っている可能性があります。<br />
その際は、お手数ですが再度お問い合わせください。</p>
</div>
END;
/**
* } ここまで 完了画面HTML
*/
# <br /> を改行コードに変換
foreach ($fld_list as $k => $v) { $fld_list[$k] = ereg_replace("<br />", LB, $fld_list[$k]); }
$lang['sign_admin'] = ereg_replace("<br />", LB, $lang['sign_admin']);
$lang['sign_user'] = ereg_replace("<br />", LB, $lang['sign_user']);
// 入力内容
$input4mail=<<<END
会社名: {$fld_list['q_kaisha_1']}
お名前: {$fld_list['q_name_1']} {$fld_list['q_name_2']}
フリガナ: {$fld_list['q_kana_1']} {$fld_list['q_kana_2']}
メールアドレス: {$fld_list['q_mail']}
ご連絡方法: {$fld_list['q_answer_means']}
TEL: {$fld_list['q_phone']}
連絡先: {$fld_list['q_phone_kind']}
連絡ご希望時間帯: {$fld_list['q_access_time']}
お申し込み内容: {$fld_list['q_order_1']} {$fld_list['q_order_2']} {$fld_list['q_order_3']}
お問い合わせ内容: {$fld_list['q_other']}
END;
/**
* 送信メール内容 - 管理者 { ここから
*/
$out_mail_admin = <<<END
{$lang['receipt_admin']}
$input4mail
{$lang['sign_admin']}
END;
/**
* } ここまで 送信メール内容 - 管理者
*/
/**
* 送信メール内容 - 入力者 { ここから
*/
$out_mail_user = <<<END
{$lang['receipt_user']}
$input4mail
{$lang['sign_user']}
END;
/**
* } ここまで 送信メール内容 - 入力者
*/
# メール送信
$ownererr = false;
$ownersend = false;
$om_array = explode(',', $owner_email);
$owner_mails = array_unique($om_array); # 重複した値(メールアドレス)を削除
if (!empty($owner_email_item_name)) {
$selmail;
foreach ($owner_mails as $v) {
list($key, $mail) = explode('=', $v);
if ($_POST[$owner_email_item_name] == $key) {
$selmail = explode('|', $mail);
break;
}
}
$owner_mails = $selmail;
}
$owner_subject = $lang['subject_admin'];
foreach ($owner_mails as $v) {
$email1 = COM_mail( $v, "$owner_subject", $out_mail_admin, $email_from, 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 = $lang['subject_user'];
$email2 = COM_mail( $fld_list[$email_input_name], "$usr_subject", $out_mail_user, $email_from, 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 == '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 ($k == 'savecsvlang') { continue; }
if ($k == 'emailfrom') { continue; }
if ($k == 'langid') { continue; }
if ($k == 'usetheme') { continue; }
if ($k == 'PHPSESSID') { 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 = date("Y/m/d H:i") . $delimiter . substr($str,0,-1);
$str .= LB;
if( !empty( $save_csv_lang ) ) {
$str = mb_convert_encoding($str, $save_csv_lang);
}
fwrite($fp, $str); # CSV書き出し
fclose($fp);
}
$retval = $out_html;
} else {
$retval = $lang['transmiterror']; # メール送信が失敗したら
}
}
return $retval;
さらに,たとえばcustom.css に,以下のようにスタイルを追加します。
/*--------------------------------------
FORM Contents
---------------------------------------*/
#FORM {
font-size:100%;
width:530px;
}
#FORM form h4 {
background:#ccc url('/images/library/Image/buttons/bullet_01.png') no-repeat 3px;
color:#FFFFFF;
font-weight:bold;
padding: 0 8px 0 24px;
margin:10px 0px 0px 0px;
height: 19px;
line-height: 19px;
}
#FORM p.honbun {
margin-bottom:6px;
text-align:left;
}
#form_step ul {
margin: 0;
}
#form_step ul:after {
content: "";
display: block;
clear: both;
height: 1px;
overflow: hidden;
}
#form_step li {
float:left;
width:120px;
height:33px;
line-height:33px;
display:block;
background: url('/images/library/Image/buttons/form_status.png') no-repeat;
font-weight:bold;
color:#888888;
margin-left:0px;
padding-left:8px;
text-align:left;
}
#form_step li.on{
background: url('/images/library/Image/buttons/form_status_on.png') no-repeat;
color:#ccc;
}
.error{
background-color:#ffddcc;
border:2px #FF0000 solid;
padding:2px 3px 3px 3px;
font-size:109%;
color: #FF0000;
line-height:130%;
font-weight:bold;
}
.errorList{
background-color: #FFEADF;
padding: 2px 3px 3px 3px;
font-size: 100%;
line-height: 120%;
color: #FF0000;
padding-left: 25px;
margin-bottom: 5px;
}
.error2{
background-color:#FFEFEF;
border:1px #FF0000 solid;
padding:1px 4px 1px 4px;
font-size:12px;
line-height:130%;
margin:3px;
}
.must{
font-size:9px;
color:#CC0000;
}
.form_free{
font-size:9px;
color:#00CC44;
}
#FORM table {
border: 1px solid #888;
border-collapse: collapse;
width:530px;
}
#FORM th {
border: 1px solid #888;
background-color: #dddddd;
text-align: left;
padding:3px;
font-weight:bold;
font-size:small;
}
#FORM td {
border: 1px solid #888;
background-color: #f8f8f8;
padding:3px;
font-size:small;
}
#FORM td.warning_bgc {
background-color: #FF9999;
}
.idea{
width:98%;
background-color:#E6FFE9;
border:2px #008000 solid;
padding:5px;
font-size:11px;
line-height:140%;
margin-top:12px;
}
.bginput {
background-color: #FFFEEa;
}
.button1 {
background-color: #05959C;
color: #fff;
font-weight: bold;
}
.mb20 {
margin-bottom:20px;
}
.mt20 {
margin-top:20px;
}
利用する画像
- /images/library/Image/buttons/bullet_01.png
- /images/library/Image/buttons/form_status.png
- /images/library/Image/buttons/form_status_on.png
引数で初期値を指定
URLに引数を指定して初期値を設定することも可能です。
URLの指定
- /staticpages/index.php/formmail?変数=文字列
該当配列に追加指定します。
'value' => $_GET['変数']
事例:https://www.bali-ch.com/staticpages/index.php/formmail_hotel?hh=ABCホテル&bh=スイート
以下のように$_GETにて設定します。
'value' => $_GET['hh'],
'value' => $_GET['bh'],
プログラム補足
説明用テキストの挿入には,array('string' と array('input' の2種類があります。
- array('string' …入力フォームおよび確認画面で表示される文字列です。
- array('input' …入力フォームでのみ表示される文字列です。確認画面では表示されません。
必須ブロックのなかで,個別に必須条件をはずすことができます。はずしたい要素に以下の行を追加してください。
'notrequire' => '1'
Geeklog1.5, 1.6での注意点
本家(英語版)Geeklog1.5系から静的ページPHPの出力方法に若干の変更があり、1.4系とは最後の出力処理が変わりました。 静的ページPHPの「PHPを実行する(return)」の場合と、「PHPを実行する」の場合で、それぞれ対応方法が違います。 これらの対応をしない場合、まっしろなページが出力されることがありますので、中身が何も無い真っ白なページが出力されたら、この対応を行ってください。
※日本語版のGeeklog1.5.1、Geeklog1.5.2では日本版独自カスタマイズとして1.4のままでも動くようにしてあります。日本語版では、この対応を行う必要はありません。同じフォーム内容が2回出力されてしまう場合はPHPコードの末尾を確認して、この対応がされていないか確認してみてください。
Geeklog1.6からは日本語版でこの独自カスタマイズを廃止しました。かならずreturnまたはechoの対策をしてください。
「PHPを実行する」の場合
静的ページPHPのコードの末尾に
echo $retval;
を付加してください。
「PHPを実行する(return)」の場合
静的ページPHPのコードの末尾に
return $retval;
を付加してください。
更新履歴
2009/03/28 2.0.4
- metatagプラグインが入ってる場合の不具合に対応
2009/03/26 2.0.3
- 携帯で初回表示にエラーチェックしてしまうのを修正(携帯ハックがPOSTを作成してる)
2009/03/06 2.0.2
- CSVデータに出力しない機能を追加 ('not_csv')
- CSVのカラムがチェックボックスON/OFFでずれていたのを修正
2009/02/23 2.0.1
- 確認用の入力など確認画面に反映しない機能を追加 ('not_confirm')
2009/02/12 2.0.0
- 画像認証に対応




