Edited at

Cake3でお問い合わせフォームを作成する方法(DBを使わない)

More than 3 years have passed since last update.


Cake3でお問い合わせフォームを作成する方法(DBを使わない)


想定


  • お問い合わせフォームのようなものを作りたい


  • DBは利用せず内容をメール送信する


作り方


  • 対応するテーブルがないので Cake3からある TableEntity は使わない


  • 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();
?>