Cake3でお問い合わせフォームを作成する方法(DBを使わない)
想定
- お問い合わせフォームのようなものを作りたい
- DBは利用せず内容をメール送信する
作り方
- 対応するテーブルがないので Cake3からある
Table
やEntity
は使わない -
Cake\Form\Form
というクラスを利用する
コード
src/Form/ContactForm.php
<?php
namespace App\Form;
use Cake\Form\Form;
use Cake\Form\Schema;
use Cake\Validation\Validator;
use Cake\Network\Email\Email;
class ContactForm extends Form
{
// お問い合わせフォームのスキーマを定義する
protected function _buildSchema(Schema $schema)
{
return $schema->addField('name', 'string')
->addField('email', ['type' => 'string'])
->addField('body', ['type' => 'text']);
}
// バリデーション内容を定義する
protected function _buildValidator(Validator $validator)
{
return $validator->add('name', 'length', [
'rule' => ['minLength', 10],
'message' => '名前は10文字以上入力してください。'
])->add('email', 'format', [
'rule' => 'email',
'message' => 'メールアドレスを入力してください。',
]);
}
// バリデーション後に実行したい処理を記述する
protected function _execute(array $data)
{
// メールを送信する
$email = new Email('default');
$email->from(['test@example.com' => 'from名'])
->to('hoge@example.com')
->subject('タイトル')
->send('本文です。');
return true;
}
}
src/Controller/ContactsController.php
<?php
namespace App\Controller;
use App\Form\ContactForm;
class ContactsController extends AppController
{
public function index()
{
$contact = new ContactForm();
if ($this->request->is('post')) {
if ($contact->execute($this->request->data)) {
$this->Flash->success('メール送信しました');
} else {
$this->Flash->error('バリデーションに引っかかりました。');
}
}
$this->set('contact', $contact);
}
}
src/Template/Contacts/index.php
<?php
echo $this->Form->create($contact);
echo $this->Form->input('name');
echo $this->Form->input('email');
echo $this->Form->input('body');
echo $this->Form->button('Submit');
echo $this->Form->end();
?>