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

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

ただいまの
回答率

90.35%

  • CakePHP

    2606questions

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

cakephp3 FriendsOfCake/search の設定について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,570

nerd

score 31

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 ($this->request->is(['patch', 'post', 'put'])) {             $user = $this->Users->patchEntity($user, $this->request->data);
の部分を修正すればいいのかなと思いますが、果たしてあっているのかがわからなくなってしまっております。

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

cakephp3

indexだけにプラグインを充てることは可能なのでしょうか?

現在コントローラーに
 public function initialize()     {         parent::initialize();         $this->loadComponent('Search.Prg');     } 
としてあるのですが、適応範囲をindexのみにしそのほかのアクションに対しては反応しないようにできれば一番いいのかなと思いますが可能なのでしょうか。

初歩的なご質問で大変恐縮ではありますが、何卒お教えいただけましたら幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

1点だけ確認です。

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/27 15: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() ?>

    キャンセル

  • 2016/04/27 15:57

    <?= $this->Form->create($user) ?>があることから見ると、POSTで送信する画面が生成されていると思われますね
    Editの画面をブラウザで表示して、右クリックメニューから「ソースを表示」でHTML形式のソースを表示させれば、POSTで送信していることがわかると思います

    だとすると、POSTからGETに変更してaddとdeleteが動くようになったというのは、今ひとつ理解に苦しみますね
    自分も、サンプル的に環境を作ってbakeしたコードで動かしてみましたが、問題なくPOSTで動いています

    ちなみに、上手く動かないときは、画面上にエラーメッセージは表示されるのでしょうか?

    キャンセル

  • 2016/04/28 21: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されて無事登録が確認できます。

    何がいけないのか全く分からなくなってしまっております。
    ヒントでもいただければ幸いです。

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/29 13:23

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

    キャンセル

  • 2016/05/02 18:45

    コメントありがとうございます。
    DIFFで検証してみたのですが、僕のスキルが足らず結果わかりませんでした。

    何も得るものがなく恐縮ではありますが、ご報告としてコメントさせていただきます。

    キャンセル

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

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

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

  • CakePHP

    2606questions

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