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