7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP バリデーションメッセージの表示

Last updated at Posted at 2016-05-09

PHP 5.5.31
CakePHP 2.8.0

CakePHPでバリデーションメッセージを表示する方法をまとめます。この方法はCakePHPにおいてスタンダードなバリデーション表示方法です。
今回は例として、アカウント作成に失敗したらバリデーションメッセージを出力します。
ユーザ作成の入力項目は、名前、メールアドレス、パスワードとします。
ユーザ編集の入力項目は、名前、メールアドレスとします。
バリデーションの内容は、名前入力必須、メールアドレス必須、有効なメールアドレスか確認、メールアドレスの重複確認、パスワードの文字数6文字以上とします。

例で使用するコントローラー名など

新規作成画面、詳細画面

| 名前
--- | :-:
コントローラー | HogesController.php
追加画面のアクション | create()
追加処理のアクション | add()
成功時:create()にリダイレクト
失敗時:add()でエラー表示
詳細画面のアクション | show()
編集処理のアクション | update()
成功時:show()にリダイレクト
失敗時:update()でエラー表示
アカウント新規作成画面 | create.ctp
アカウント編集画面 | show.ctp
モデル | Hoge.php

Hogeモデルのカラム

| カラム名
--- | :-:
名前 | name
メールアドレス | mail
パスワード | password

バリデーション

Hoge.phpにバリデーション内容を書く。
公式ドキュメントを参考に記述した。
http://book.cakephp.org/2.0/ja/models/data-validation.html

Hoge.php
class Hoge extends AppModel {

	public $validate = [
		'name' => [
			[
				'rule' => 'notBlank',
				'message' => '名前は必須入力の項目です。',
			],
		],
		'mail' => [
			[
				'rule' => 'notBlank',
				'message' => 'メールアドレスは必須入力の項目です。',
			],
			[
				'rule' => ['email', true],
				'message' => '有効なメールアドレスを入力してください。',
			],
			[
				'rule' => 'isUnique',
				'message' => '入力されたメールアドレスは既に登録されています。',
			],
		],
		'password' => [
			[
				'rule' => ['minLength', 6],
				'message' => 'パスワードは6文字以上です。',
			],
		],
	];

}

アカウント新規作成画面

create()アクション

今回は引き渡すデータが特に無いので記述は特に無し。

HogesController.php
public function create() {

}

ビュー(create.ctp)

create.ctp
<?=$this->Form->create('Hoge', ['url' => ['action' => 'add']])?>
	<?=$this->Form->input('name', ['placeholder' => 'ユーザ名を入力してください', 'label' => 'ユーザ名'])?>
	<?=$this->Form->input('password', ['placeholder' => 'パスワードを入力してください', 'label' => 'パスワード'])?>
	<?=$this->Form->input('mail', ['placeholder' => 'メールアドレスを入力してください', 'label' => 'メールアドレス'])?>
	<?=$this->Form->submit('登録', ['onclick' => 'return confirm("登録してよろしいですか?");'])?>
<?=$this->Form->end()?>

表示例

スクリーンショット 2016-04-28 17.15.17.png

アカウント新規作成処理

コントローラー(HogesController.php)

HogesController.php
public function add() {

	$user = $this->request->data('Hoge');

	if ($this->Hoge->save($user) === false) {
		// 処理が失敗した時にcreateアクションを描画する
		return $this->render('create');
	}

	$this->setFlashInfo('ユーザーを新規登録しました');
	// 処理が成功した時にcreateアクションを描画する
	return $this->redirect(['action' => 'create']);

}

バリデーションメッセージの表示例

メールアドレスの形式が間違ってる場合
スクリーンショット 2016-04-28 17.19.45.png

パスワードの文字数が少ない場合
スクリーンショット 2016-04-28 17.20.59.png

アカウント詳細画面(編集)

編集するユーザの例

カラム
name HogeFuga
mail hoge@gmail.com

show()アクション

IDで登録されたユーザの詳細画面を見られるものとする。
showは他でも利用するためprivateでメソッド化している。

HogesController.php
/**
 * 管理ユーザー編集画面
 */
public function show($id) {
	$this->_show($id);
}

private function _show($id) {
	// 選択されたユーザ情報
	$user = $this->Hoge->findById($id)['Hoge'];
	// ユーザーが見つからなかった時のエラー処理
	if (empty($user)) {
		if (empty($this->referer())) {
			return $this->redirect('/');
		}
		return $this->redirect($this->refere());
	}

	$this->set([
		'name' => $user['name'],
		'mail' => $user['mail'],
	]);
	// 編集処理を行った後にshowアクションを描画する
	$this->render('show');
}

ビュー(show.ctp)

HogesController.php
<?=$this->Form->create('Hoge', ['url' => ['action' => 'update', $id]])?>

	<?=$this->Form->input('name', ['default' => $name, 'label' => 'ユーザ名'])?>
	<?=$this->Form->input('mail', ['default' => $mail, 'label' => 'メールアドレス'])?>
	<?=$this->Form->submit('更新', ['onclick' => 'return confirm("変更してよろしいですか?");'])?>

<?=$this->Form->end()?>

表示例

スクリーンショット 2016-04-29 11.47.14.png

アカウント編集処理

HogesController.php
public function update($id) {

	$user = $this->request->data('Hoge');
	$user['id'] = $id;

	if ($this->Hoge->save($user) === false) {
		$this->setFlashWarning('ユーザーの編集に失敗しました');
		// 処理が失敗した時に_showアクションを描画する
		return $this->_show($id);
	}
	$this->setFlashInfo('ユーザーを編集しました');
	// 処理が成功した時にshowアクションを描画する
	return $this->redirect(['action' => 'show']);

}

バリデーションメッセージの表示例

メールアドレスの形式が間違っている場合
スクリーンショット 2016-05-02 21.48.49.png

メリット

CakePHPが勝手にフォームの入力情報をバリデーションチェック後も埋めてくれ、かつバリデーションメッセージの追加表示してくれる。
バリデーションの結果にかかわらず、画面遷移が1回だけなので通信回数も1回である。

デメリット

バリデーションの結果によって描画するビューファイルを変えているので、場合によってはそのビューに合わせてコントローラーからビューに必要な値を渡す必要がある。本記事の場合、updateアクションが該当する。
本記事中では、その処理を_show()というメソッドに切り出すことで、同じ処理を何度も書かないようにしている。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?