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' => [ "" => "選択してください", "北海道" => "北海道", "青森県" => "青森県", "岩手県" => "岩手県", "宮城県" => "宮城県", "秋田県" => "秋田県", "山形県" => "山形県", "福島県" => "福島県", "茨城県" => "茨城県", "栃木県" => "栃木県", "群馬県" => "群馬県", "埼玉県" => "埼玉県", "千葉県" => "千葉県", "東京都" => "東京都", "神奈川県" => "神奈川県", "新潟県" => "新潟県", "富山県" => "富山県", "石川県" => "石川県", "福井県" => "福井県", "山梨県" => "山梨県", "長野県" => "長野県", "岐阜県" => "岐阜県", "静岡県" => "静岡県", "愛知県" => "愛知県", "三重県" => "三重県", "滋賀県" => "滋賀県", "京都府" => "京都府", "大阪府" => "大阪府", "兵庫県" => "兵庫県", "奈良県" => "奈良県", "和歌山県" => "和歌山県", "鳥取県" => "鳥取県", "島根県" => "島根県", "岡山県" => "岡山県", "広島県" => "広島県", "山口県" => "山口県", "徳島県" => "徳島県", "香川県" => "香川県", "愛媛県" => "愛媛県", "高知県" => "高知県", "福岡県" => "福岡県", "佐賀県" => "佐賀県", "長崎県" => "長崎県", "熊本県" => "熊本県", "大分県" => "大分県", "宮崎県" => "宮崎県", "鹿児島県" => "鹿児島県", "沖縄県" => "沖縄県", "海外" => "海外", ] ];