CakePHP3系でModelなしのお問い合わせフォームを作る

DSC00978

2015年05月21日(木)

CakePHP3でやっぱりかなり変更されていて学習コストが結構かかりますね。ただ、作りはかなり好きなので今からCakePHPをやるなら3系で間違いないですね!ということで、今回はModelなし(DBテーブルなし)でお問い合わせフォームの実装方法のTipsを掲載いたします。

以前までは、テーブルがない場合でもModelに記述してtableにfalseとかしてやっていましたが、今回は専用のやり方があるようです!

いやー、かなり詰まりましたよ。ドキュメントが英語なので全然探せなかったけどジャストありましたねww

 

やり方

以下ファイルを作成します。

app/src/Form/ContactForm.php

// in src/Form/ContactForm.php
namespace App\Form;

use Cake\Form\Form;
use Cake\Form\Schema;
use Cake\Validation\Validator;

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' => 'A name is required'
 ])->add('email', 'format', [
 'rule' => 'email',
 'message' => 'A valid email address is required',
 ]);
 }

 protected function _execute(array $data)
 {
 // Send an email.
 return true;
 }
}

 

いままでは、テーブルがないのにModelに記述する必要があったと思いますが、3系からはこのように専用の記述方があるようです。

考えてみればテーブルがないのにModelっていうのもおかしな話でしたね。

この考えのままModelで実装しようとするとテーブルオブジェクトを初期化した際にテーブル参照ができないとエラーになりますね。

これでかなり詰まってしまいましたよ。きちんとやり方はドキュメントを見ましょうね。

 

使い方

それでは使い方のレクチャーです。Modelとほぼほぼ一緒ですね。

Controller

// In a controller
namespace App\Controller;

use App\Controller\AppController;
use App\Form\ContactForm;

class ContactController extends AppController
{
 public function index()
 {
  // フォームをロード
  $contact = new ContactForm();
  if ($this->request->is('post')) {
   // 実行
   if ($contact->execute($this->request->data)) {
    $this->Flash->success('We will get back to you soon.');
   } else {
   $this->Flash->error('There was a problem submitting your form.');
  }
 }
 $this->set('contact', $contact);
 }
}

 

これでPOSTからのバリデーションチェックとメール送信処理ができると思います。

View側はいつも通り作成することができます。エラーメッセージもきちんとバインドされます。

 

View

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

 

参考

ジャストですよね!w

Modelless Forms

http://book.cakephp.org/3.0/en/core-libraries/form.html

 

どうでしょうか。僕はこれでできました。

イヤー、一時はどうしようかと思いましたがやっぱり用意されていましたね。

これはお問い合わせだけではなく、テーブルがないフォームに対してできると思うのでドンドン使っていきましょう。

スポンサードリンク

運営サービスPR

スポンサードリンク

運営サービスPR