質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

306閲覧

CakePHPのValidationとModelについて

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/09/17 06:02

プログラミングはド素人のものですので、質問の意味などわからないことがあるかもしれませんが
お許しください。
今、CakePHPを使って練習用にブログサイトを作っています。
my_layout.ctpにPostsController.ctpのindexアクションとaddアクションを使用していて、
簡単にいうと、記事の一覧と記事の作成が同じ画面でできるようにしたいのです。
Validator無しではうまくFormヘルパーから入力された値が記事一覧に表示されるのですが、Validatorを組み込んだ際に、Formに打ち込み、Addボタンを押すと、add.ctpを作れというエラーが出てきてしまいます。
Validatorの使用に各アクションのViewを要求するシステムなのがあるのでしょうか?
またエラーを出さない方法、ヒントなどいただければ幸いです。
ここまで読んでいただいた方、ありがとうございました。

PostsController.php
<?php namespace App\Controller; class PostsController extends AppController { public function index() { $this->viewBuilder()->layout('my_layout'); $posts = $this->Posts->find('all'); // $this->set('posts', $posts); $this->set(compact('posts')); } public function view($id = null) { $post = $this->Posts->get($id); $this->set(compact('post')); } public function add() { $post = $this->Posts->newEntity(); if ($this->request->is('post')) { $post = $this->Posts->patchEntity($post, $this->request->data); if ($this->Posts->save($post)) { return $this->redirect(['action'=>'index']); } else { } } $this->set(compact('post')); } } ```ここに言語を入力 <?php namespace App\Model\Table; use Cake\ORM\Table; use Cake\Validation\Validator; class PostsTable extends Table { public function initialize(array $config) { $this->addBehavior('Timestamp'); } public function validationDefault(Validator $validator) { $validator ->notEmpty('title') ->requirePresence('title') ->notEmpty('body') ->requirePresence('body') ->add('body', [ 'length' => [ 'rule' => ['minLength', 10], 'message' => 'body length must be 10+' ] ]); return $validator; } } ```ここに言語を入力 my_layout.ctp(Template/Layout) ``` <!DOCTYPE html> <html lang="ja"> <head> <?= $this->Html->charset() ?>
<title> <?= $this->fetch('title') ?> </title> <?= $this->Html->css('styles.css') ?>
</head> <body> <h1>Blog Posts</h1>
<ul> <?php foreach ($posts as $post) : ?> <li><?= $this->Html->link($post->title,['action'=>'view',$post->id]); ?></li> <?php endforeach; ?> </ul> <?= $this->Form->create(null, [

'url' => ['action'=>'add']
]);?>
<?= $this->Form->input('title');?>
<?= $this->Form->input('body',['maxlength'=>'3']);?>
<?= $this->Form->button('Add');?>
<?= $this->Form->end();?>

<section class="container"> <?= $this->fetch('content') ?> </section>
</body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

variation でエラーになってるのでsave のところでfalse が返ってくるので、redirect にならないからです。
redirect されないコントローラのメソッドはview を表示しようとするのでview が必要になります。

バリデーションエラーが起きた時のビューを作るのがいいと思います

投稿2017/09/17 06:26

kero1209

総合スコア431

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/17 06:40

ありがとうございます! 無事、エラーを回避してmy_layout.ctpに戻れました! もしよろしければもう一つ教えていただきたいのですが、バリデーションエラーが起きた際のViewはやはり別で新たにctpファイルを作成しなければいけませんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問