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

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

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

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

Q&A

2回答

5285閲覧

CakePHP3でページネーションを利用した中での複数のフォームを使った編集機能の実装

yajin

総合スコア75

CakePHP

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

0グッド

0クリップ

投稿2016/08/23 07:44

編集2016/08/23 09:34

ページネーションを利用した中での複数のフォームを使った編集機能の実装

2ページ目

input 「タイトル」 input「コメント」(更新ボタン)(削除ボタン)
input 「タイトル」 input「コメント」(更新ボタン)(削除ボタン)
input 「タイトル」 input「コメント」(更新ボタン)(削除ボタン)
input 「タイトル」 input「コメント」(更新ボタン)(削除ボタン)
input 「タイトル」 input「コメント」(更新ボタン)(削除ボタン)

というような感じの複数フォームがあったとします。

削除ボタンに関してはpostlinkで実装済なのですが、更新の機能がうまく実装できません。
postされた場合には、is('post')が使われることは確認できるのですが(echo "hoge"は確認済)、その中身の内容の書き方についてよくわかっていません。
おそらく、同一ページ内のidの引き渡し方と受け取り方がよくわかっていないと思っています。

エラーメッセージは
Record not found in table "articles" with primary key [NULL]

Method Not Allowed
が出てきます。

主にやりたいことは次の通りです。
・編集画面(別ページ)に飛ばさずに、すぐ編集できるようにしたい。
・バリテーションもかかるようにしたい。(たぶんこれはやってくれるから大丈夫?)
・リダイレクト先はページネーションのページ番号のページに飛ばしたい。

どのように実装したらいいのでしょうか。
現在のコード

controller

PHP

1editメソッド 2 3public function edit($id = null) 4 { 5 $this->ViewBuilder()->layout('auth'); 6 7 if($this->request->is(['post','patch','put'])){ 8 //ポストされた場合 9 //echo "hoge"; 10 $article = $this->Articles->get($id); 11 $this->request->allowMethod(['post','edit']); 12 $article = $this->Articles->patchEntity($article ,$this->request->data); 13 14 if($this->Articles->save($article)){ 15 $this->Flash->success('更新成功'); 16 $this->redirect(['action' => 'edit']);//ここにページネーションのページ番号をリダイレクト先にしたい。 17 18 }else{ 19 $this->Flash->error('更新エラー'); 20 return $this->redirect(['action' => 'edit']);//ここにページネーションのページ番号をリダイレクト先にしたい。もしくはバリテーションエラーを出すならこの一行は書かない方がよい? 21 } 22 } 23 24 25 $paginate = [ 26 'limit' => 10, 27 'order' => [ 28 'Articles.id' => 'desc' 29 ] 30 ]; 31 $user_id = $this->request->session()->read('Auth.User.id'); 32 $articles = $this->Articles->find('all')->where(['user_id' => $user_id])->order(['id' => 'desc']); 33 34 $this->set('articles', $this->paginate($articles)); 35 } 36 37

view

PHP

1edit.ctp 2 foreach($articles as $article){ 3 echo $this->Form->create($article); 4 echo $this->Form->hidden('id',['value' => h($article->id)]); 5 echo $this->Form->input('title',['label' => 'タイトル'],['value' => h($article->title)]); 6 echo $this->Form->input('comment',['label' => 'コメント'],['value' => h($article->comment)]); 7 echo $this->Form->button('更新'); 8 echo $this->Form->end(); 9 10 echo $this->Form->postlink( 11 '[削除]', 12 ['action' => 'delete' ,$article->id ], 13 ['confirm' => 'この記事を削除しますか?', 'class' => ''] 14 ); 15 16 } 17

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/08/23 07:52

ページネーション…ではないでしょうか。
yajin

2016/08/23 07:56

そうでした。。。 すみません。 直しておきます
kunai

2016/08/23 08:51

上手く実装できない、と言うのは、どういう事でしょうか。 1.動作はするが、記述がスマートではない 2.動作はするが、対象のデータ以外のデータも変更される 3.動作はするが、一部データだけ変更されない 4.更新ボタンが反応しない(クリックしてもページ遷移しない) 5.ページ遷移はするが、更新の処理に分岐するif文の中に入っていないように見える 6.エラーが発生している(エラーメッセージの内容は?) などなど。
yajin

2016/08/23 09:36

失礼しました。postされた場合に関しては確認できます。 6のエラーが発生している状態です。 idをどうやって渡してどうやって受け取っているのか、またその時にどんなことをallowmethodすればよいのかがわかりません。
guest

回答2

0

直接の回答ではないのですが、こういったものはajax使って画面遷移無しでやっちゃったほうが結果的に実装が簡単でわかりやすいかもしれません。
jquery使えば結構簡単ですよ?

投稿2016/08/24 23:08

CodeLab

総合スコア1939

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

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

yajin

2016/08/28 10:46

ご回答誠にありがとうございます。 数日間悩んでいたのですが、参考となるサイトをご紹介いただけますか? コードのイメージがなければ、ちょっと難しいです・・・
guest

0

あくまでも、【自分ならこう考えます】ということで回答します

  1. クライアント画面側に、送信する情報(id、タイトル、コメント、ページ番号、検索条件)をhiddenタグで格納できるFormを作っておく
  2. 情報ごとに設置した「更新」ボタンを押下すると、Javascriptで送信する情報を上記のhiddenタグにコピーしたのち、そのFormをsubmitする
  3. サーバ側で更新情報を受け取ったのち、modelクラスでバリデーションをチェックする
  4. バリデーションエラーがなければ情報を更新する
  5. 検索条件と、ページ番号をもとに更新後の情報でページネーションした情報を取得する
  6. 取得した情報を利用して、一覧画面のレンダリングを行う

投稿2016/08/24 22:04

KatsumiTanaka

総合スコア924

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

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

yajin

2016/08/28 10:47

ご回答誠にありがとうございます。 参考となるサイトがあればぜひご紹介いただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問