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

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

ただいまの
回答率

90.52%

  • CakePHP

    2311questions

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

CakePHPのValidationが作動しない、error時の処理について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 147
退会済みユーザー

退会済みユーザー

タイトルにもある通りなのですが、ValidationのnotEmptyが作動せず、addしたメッセージも表示されず困っています。勉強中の身でわからないことも多いのでわかりやすく教えていただければ幸いです。
また、save時のifでfalseの際の、処理をmy_layout.ctpで表示させることはできますでしょうか?
作っているものとしては、ブログの記事一覧と同じ画面で記事の作成をできるものを作っています。
ここまで読んでいただきありがとうございました。

<?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;
}


}
<!DOCTYPE html>
<html lang="ja">
<head>
    <?= $this->Html->charset() ?>
    <title>
        <?= $this->fetch('title') ?>
    </title>
    <?= $this->Html->css('styles.css') ?>
</head>
<body>
    <?php $this->Flash->render(); ?>
    <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',['row'=>'3']);?>
    <?= $this->Form->button('Add');?>
    <?= $this->Form->end();?>



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

// /posts/index
// /posts
// /(controller)/(action)/(options)

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()
   {
     $this->viewBuilder()->layout('my_layout');
     $post = $this->Posts->newEntity();
     if ($this->request->is('post')) {
       $post = $this->Posts->patchEntity($post, $this->request->data);
       if ($this->Posts->save($post)) {
         $this->Flash->success('Add New!');
         return $this->redirect(['action'=>'index']);
       } else {
         $this->Flash->error('Error!');
         return $this->redirect(['action'=>'index']);
       }
     }
     $this->set(compact('post'));
   }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

<?= $this->Form->create('null', ['url' => ['action'=>'add']]);?>


こちらがNULLになっているので、validationが効かないのかと思います。

<?= $this->Form->create($newPost, ['url' => ['action'=>'add']]);?>


として、
PostsController.phpのindexアクションで、

$newPost = $this->Posts->newEntity();
$this->set('newPost', $newPost);


と記載してみてはいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/17 19:05

    ありがとうございます!無事、notEmptyが作動しました!
    しかしやはりaddのmessageとflashが表示されません。もしよろしければそちらについてもご教授いただけないでしょうか?厚かましくて申し訳ありません。

    キャンセル

  • 2017/09/17 19:18

    > addのmessageの件
    Modelの書き方も合っているような気がします。tmp/cache以下を削除しても変わりませんか?

    > Flashの件
    my_layout.ctpの中に<?php $this->Flash->render(); ?>は記載していますか?

    キャンセル

  • 2017/09/17 19:36 編集

    cacheを削除してみましたが、やはり表示されませんでした。
    またFlashも同様にrenderを記載していましたが、うんともすんとも動きません。
    my_layout.ctpなのですが、Template/Layout/でLayoutのctpを作っていて、Template内にまっさらのindex.ctpファイルを用意して、viewBuilderで上書き?をしているのですがなにか関係はありますでしょうか?

    キャンセル

  • 2017/09/17 19:52

    別ページにPOSTしてるのがいけないんですかね。
    index.ctp内にaddアクションの内容を書いて、Templateで
    <?= $this->Form->create($newPost]);?>
    とするのはいかがでしょうか?

    キャンセル

  • 2017/09/17 19:59

    試してみましたがやはりダメみたいですね。
    Layout内での記述は一旦諦めて通常通りのctpでやってみます。
    たくさんの質問に答えていただき、本当に感謝しています!
    ありがとうございました!

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • CakePHP

    2311questions

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