cakephp3 フォーム お問い合わせ
■テーブル作成
create table if not exists contacts( id int not null auto_increment primary key, name varchar(255), email varchar(255), tel varchar(255), zip1 varchar(3), zip2 varchar(4), pref varchar(4), address varchar(255), note text, created date, modified date ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
■Bake
php cake.php bake controller contacts php cake.php bake model contacts php cake.php bake template contacts
■ContactsController.php
use Cake\Mailer\Email; use Cake\Core\Configure; // bootstrapに追加した設定ファイルを利用可に
/*メール送信
———————————–———————————–*/
$emailObj = new \Cake\Network\Email\Email();
// ジャーナル
$emailObj->transport('gmail')
->from('xxx@gmail.com')
->template('journalMail')
->viewVars(['postDatas'=>$contact])
->to('xxx@gmail.com')
->subject('お問い合わせ通知')
->send();
// サンクス
$emailObj->transport('gmail')
->from('xxx@gmail.com')
->template('thanksMail')
->viewVars(['postDatas'=>$contact])
->to($contact->email)
->subject('お問い合わせ内容の控え')
->send();
// bootstrap.php に記述した都道府県一覧ファイルの読み込み
$this->set('pref', Configure::read('codes'));
■bootstrap.php
Configure::config('default', new PhpConfig());
Configure::load('app', 'default', false);
Configure::load('pref', 'default', false); // 都道府県一覧
■journal_mail.ctp
下記問い合わせがありました。 <?php echo $postDatas->name. "\n"; echo $postDatas->email. "\n"; echo $postDatas->tel. "\n"; echo $postDatas->zip1. '-'. $postDatas->zip2. "\n"; echo $postDatas->pref. "\n"; echo $postDatas->address. "\n"; echo $postDatas->note. "\n"; ?> 以上
■thanks_mail.ctp
【問い合わせ内容の控え】 <?php echo $postDatas->name. "\n"; echo $postDatas->email. "\n"; echo $postDatas->tel. "\n"; echo $postDatas->zip1. '-'. $postDatas->zip2. "\n"; echo $postDatas->pref. "\n"; echo $postDatas->address. "\n"; echo $postDatas->note. "\n"; ?> 以上
■ContactsTable.php
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmpty('id', 'create');
$validator
->notEmpty('name', '必須項目です。');
$validator
->notEmpty('email', '必須項目です。')
//メール形式のチェック
->add('email', 'validFormat', [
'rule' => 'email',
'message' => 'メールアドレスの形式が正しくありません。'
]);
$validator
->notEmpty('email_confirm', '必須項目です。')
//メール形式のチェック
->add('email_confirm', [
'minLength' => [
'rule' => 'email',
'message' => 'メールアドレスの形式が正しくありません。'
],
'maxLength' => [
'rule' => ['compareWith', 'email_confirm'],
'message' => 'メールアドレスが一致しません。'
]
]);
$validator
->allowEmpty('pref');
$validator
->allowEmpty('address');
$validator
->allowEmpty('note')
->add('note', [
'minLength' => [
'rule' => ['minLength', 10],
'last' => true,
'message' => '10文字以上'
],
'maxLength' => [
'rule' => ['maxLength', 100],
'message' => '100文字以下'
]
]);
// カスタムバリデーションの読み込み
$validator->provider('custom', 'App\Model\Validation\CustomValidation');
$validator
->allowEmpty('zip1')
->add('zip1', 'custom', [
'rule' => 'zip1',
'provider' => 'custom',
'message' => '入力内容が正しくありません。例)123'
]);
$validator
->allowEmpty('zip2')
->add('zip2', 'custom', [
'rule' => 'zip2',
'provider' => 'custom',
'message' => '入力内容が正しくありません。例)4567'
]);
$validator
->allowEmpty('tel')
->add('tel', 'custom', [
'rule' => 'tel',
'provider' => 'custom',
'message' => '入力内容が正しくありません。例)03-1234-5678'
]);
return $validator;
}
■CustomValidation.php
\app\src\Model\Validation
<?php
namespace App\Model\Validation;
use Cake\Validation\Validation;
class CustomValidation extends Validation
{
public static function zip1($value, $context){
return (bool) preg_match('/^[0-9]{3}$/', $value);
}
public static function zip2($value, $context){
return (bool) preg_match('/^[0-9]{4}$/', $value);
}
public static function tel($value, $context){
// 「-(ハイフン)」 任意
// return (bool) preg_match('/^[0-9]{2,5}-?[0-9]{2,5}-?[0-9]{2,5}$/', $value);
return (bool) preg_match('/^[0-9]{2,5}-[0-9]{2,5}-[0-9]{2,5}$/', $value);
}
}
■add.ctp
<div class="contacts form large-9 medium-8 columns content">
<?= $this->Form->create($contact, ['novalidate' => true]) ?>
<fieldset>
<legend><?= __('Add Contact') ?></legend>
<?php
echo $this->Form->input('name', ['label'=>'名前']);
echo $this->Form->input('email', ['label'=>'メールアドレス']);
echo $this->Form->input('email_confirm', ['label'=>'メールアドレス(確認)']);
echo $this->Form->input('tel', ['label'=>'電話番号', 'placeholder'=>'例)03-1234-5678']);
echo $this->Form->input('zip1', ['label'=>'郵便番号1', 'id'=>'zip1']);
echo $this->Form->input('zip2', ['label'=>'郵便番号2', 'id'=>'zip2']);
$arr = $pref;
echo $this->Form->select('pref', $arr, ['label'=>'都道府県', 'id'=>'pref']);
echo $this->Form->input('address', ['label'=>'住所', 'placeholder'=>'○○市○○町1-1-1', 'id'=>'address']);
echo $this->Form->input('note', ['label'=>'備考', 'placeholder'=>'最大10文字']);
?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>
</div>
<script type='text/javascript' src='http://code.jquery.com/jquery-git2.js'></script>
<script type="text/javascript" src="http://jpostal.googlecode.com/svn/trunk/jquery.jpostal.js"></script>
<script>
$('#zip1').jpostal({
postcode : [
'#zip1',
'#zip2'
],
address : {
'#pref' : '%3',
'#address' : '%4%5'
}
});
</script>
■app.php
'EmailTransport' => [
'default' => [
'className' => 'Smtp',
// The following keys are used in SMTP transports
'host' => 'ssl://smtp.lolipop.jp',
'port' => 465,
'timeout' => 30,
'username' => 'XXX@XXX',
'password' => 'XXX',
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
'gmail' => [
'className' => 'Smtp',
// The following keys are used in SMTP transports
'host' => 'ssl://smtp.gmail.com',
'port' => 465,
'timeout' => 30,
'username' => 'XXX@gmail.com',
'password' => 'XXX',
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
],
■pref.php
\app\config
<?php return [ 'codes' => [ "" => "選択してください", "北海道" => "北海道", "青森県" => "青森県", "岩手県" => "岩手県", "宮城県" => "宮城県", "秋田県" => "秋田県", "山形県" => "山形県", "福島県" => "福島県", "茨城県" => "茨城県", "栃木県" => "栃木県", "群馬県" => "群馬県", "埼玉県" => "埼玉県", "千葉県" => "千葉県", "東京都" => "東京都", "神奈川県" => "神奈川県", "新潟県" => "新潟県", "富山県" => "富山県", "石川県" => "石川県", "福井県" => "福井県", "山梨県" => "山梨県", "長野県" => "長野県", "岐阜県" => "岐阜県", "静岡県" => "静岡県", "愛知県" => "愛知県", "三重県" => "三重県", "滋賀県" => "滋賀県", "京都府" => "京都府", "大阪府" => "大阪府", "兵庫県" => "兵庫県", "奈良県" => "奈良県", "和歌山県" => "和歌山県", "鳥取県" => "鳥取県", "島根県" => "島根県", "岡山県" => "岡山県", "広島県" => "広島県", "山口県" => "山口県", "徳島県" => "徳島県", "香川県" => "香川県", "愛媛県" => "愛媛県", "高知県" => "高知県", "福岡県" => "福岡県", "佐賀県" => "佐賀県", "長崎県" => "長崎県", "熊本県" => "熊本県", "大分県" => "大分県", "宮崎県" => "宮崎県", "鹿児島県" => "鹿児島県", "沖縄県" => "沖縄県", "海外" => "海外", ] ];