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

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

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

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

Q&A

解決済

2回答

2749閲覧

cakephp3 FriendsOfCake/search の設定について

nerd

総合スコア37

CakePHP

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

0グッド

0クリップ

投稿2016/04/26 09:21

###FriendsOfCake/search を使用して検索を行いたい
現在、CAKEPHP3を習得するために勉強をしております。
CAKEPHPのチュートリアルはブログまで行いました。
そんな中で、様々な場所で検索をさせるのにFriendsOfCake/search
プラグインを使用して実装しようと考えております。
プラグインの導入はINDEX(一覧表示ページ)完了し、検索をかけたところ問題ありませんでした。

###発生している問題・エラーメッセージ
FriendsOfCake/searchプラグインを使用することにより
BAKEで作成したaddでは新規追加できない。
BAKEで作成したeditでは編集した値が更新されない。
BAKEで作成したdeleteでは削除できず。

###該当のソースコード

* Add method * * @return \Cake\Network\Response|void Redirects on successful add, renders view otherwise. */ public function add() { $user = $this->Users->newEntity(); if ($this->request->is('post')) { $user = $this->Users->patchEntity($user, $this->request->data); if ($this->Users->save($user)) { $this->Flash->success(__('The user has been saved.')); return $this->redirect(['action' => 'index']); } else { $this->Flash->error(__('The user could not be saved. Please, try again.')); } } $companies = $this->Users->Companies->find('list', ['limit' => 200]); $this->set(compact('user', 'companies')); $this->set('_serialize', ['user']); } /** * Edit method * * @param string|null $id User id. * @return \Cake\Network\Response|void Redirects on successful edit, renders view otherwise. * @throws \Cake\Network\Exception\NotFoundException When record not found. */ public function edit($id = null) { $user = $this->Users->get($id, [ 'contain' => [] ]); if ($this->request->is(['patch', 'post', 'put'])) { $user = $this->Users->patchEntity($user, $this->request->data); if ($this->Users->save($user)) { $this->Flash->success(__('The user has been saved.')); return $this->redirect(['action' => 'index']); } else { $this->Flash->error(__('The user could not be saved. Please, try again.')); } } $companies = $this->Users->Companies->find('list', ['limit' => 200]); $this->set(compact('user', 'companies')); $this->set('_serialize', ['user']); } /** * Delete method * * @param string|null $id User id. * @return \Cake\Network\Response|null Redirects to index. * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found. */ public function delete($id = null) { $this->request->allowMethod(['post', 'delete']); $user = $this->Users->get($id); if ($this->Users->delete($user)) { $this->Flash->success(__('The user has been deleted.')); } else { $this->Flash->error(__('The user could not be deleted. Please, try again.')); } return $this->redirect(['action' => 'index']); }

###試したこと
URLを見ると、パラメーターがわたっているのでpostではなくgetで飛ばしているのかなと推測し、各部位のコントローラーをpost からgetに変更したところ、add,deleteは動作したのですが、editのみ更新されない様子でした。
editの

if

1 $user = $this->Users->patchEntity($user, $this->request->data);

の部分を修正すればいいのかなと思いますが、果たしてあっているのかがわからなくなってしまっております。

###補足情報(言語/FW/ツール等のバージョンなど)
cakephp3

###indexだけにプラグインを充てることは可能なのでしょうか?
現在コントローラーに

public

1 { 2 parent::initialize(); 3 $this->loadComponent('Search.Prg'); 4 } ``` 5としてあるのですが、適応範囲をindexのみにしそのほかのアクションに対しては反応しないようにできれば一番いいのかなと思いますが可能なのでしょうか。 6 7 8 9 10初歩的なご質問で大変恐縮ではありますが、何卒お教えいただけましたら幸いです。

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

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

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

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

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

guest

回答2

0

最初からBAKEしなおして試したところ動くようになりました。
DIFFって検証したいと思います。

ありがとうございました。

投稿2016/04/29 00:57

nerd

総合スコア37

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

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

KatsumiTanaka

2016/04/29 04:23

ああ、環境に依存する問題だったのですね。 後学のために、差支えのない範囲で情報の追加をお願いします。
nerd

2016/05/02 09:45

コメントありがとうございます。 DIFFで検証してみたのですが、僕のスキルが足らず結果わかりませんでした。 何も得るものがなく恐縮ではありますが、ご報告としてコメントさせていただきます。
guest

0

ベストアンサー

1点だけ確認です。

URLを見ると、パラメーターがわたっているのでpostではなくgetで飛ばしているのかなと推測し、各部位のコントローラーをpost からgetに変更したところ、add,deleteは動作したのですが、editのみ更新されない様子でした。

としていますが、POSTかGETかは、ブラウザで画面のソースを確認すれば判断できます
Templateのコードが提示されていないので、どこに修正を入れたのかはわかりませんが、BakeしたTemplaeteに修正を加えて、POSTからGETに変更したということでしょうか?

投稿2016/04/27 05:52

KatsumiTanaka

総合スコア924

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

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

nerd

2016/04/27 06:47

コメントありがとうございます。 view側のコードに関しましては、見た目の部分は少し変更しているくらいですがフォーム回りではBakeした状態のままです。 マークダウン記法がまだわからないので読みにくくてすみません。 テンプレート側の add の部分は以下のようになっております。 <?= $this->Form->create($user) ?> <fieldset> <legend><?= __('Add User') ?></legend> <?php echo $this->Form->input('name'); echo $this->Form->input('email'); echo $this->Form->input('password'); echo $this->Form->input('company_id', ['options' => $companies]); echo $this->Form->input('role'); ?> </fieldset> <?= $this->Form->button(__('Submit')) ?> <?= $this->Form->end() ?>
KatsumiTanaka

2016/04/27 06:57

<?= $this->Form->create($user) ?>があることから見ると、POSTで送信する画面が生成されていると思われますね Editの画面をブラウザで表示して、右クリックメニューから「ソースを表示」でHTML形式のソースを表示させれば、POSTで送信していることがわかると思います だとすると、POSTからGETに変更してaddとdeleteが動くようになったというのは、今ひとつ理解に苦しみますね 自分も、サンプル的に環境を作ってbakeしたコードで動かしてみましたが、問題なくPOSTで動いています ちなみに、上手く動かないときは、画面上にエラーメッセージは表示されるのでしょうか?
nerd

2016/04/28 12:20

ご連絡遅くなり大変申し訳ございませんでした。 コメント投稿があった場合はメールで飛んでこないのですね。 設定でできるのかもしれないのですが、まだ使い慣れていなくて失礼いたしました。 firebugでformの要素を見るとPOST送信されているのですが、 SUBMITをクリックすると、画面遷移しない + FLASH文も表示されません。 変化している部分としては URLが ..../add から add?name=a&email=a%40a.com&password=aa&company_id=1&role=1 となるので、GETに変更されたのかと認識した次第です。 コントローラー直下に下記内容として記述しているのですが、これが間違っているのでしょうか? class UsersController extends AppController { public function initialize() { parent::initialize(); $this->loadComponent('Search.Prg'); } 試しにイニシャライズを全体でコメントアウトするとPOSTされて無事登録が確認できます。 何がいけないのか全く分からなくなってしまっております。 ヒントでもいただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問