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

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

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

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

Q&A

解決済

2回答

12525閲覧

CakePHPでコントローラーから別のコントローラーのアクションを表示させたい

imohead

総合スコア15

CakePHP

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

0グッド

0クリップ

投稿2016/03/01 05:23

編集2016/03/02 01:33

CakePHPで顧客情報を管理するシステムを作成しています。
顧客情報を入力するのは、ClientsController.phpで行っています。
顧客は、企業に属するので企業情報を入れるClientCompanies.phpという別のコントローラーで企業情報を入力する仕組みにしました。

Ajaxで顧客情報のaddアクション内からClientsCompaniesコントローラー内のaddアクションを呼び出したいのですが、画面は呼び出されますが、変数が未定義(undefined Companies)というエラーがでます。
変数を$this->set~してから、renderすれば良いと思いますが、ClientsCompaniesのaddアクション内に記載した記述をコピーするのはスマートではないと思いましたので、何か方法があればご教示ください。

以下ソースコードです。(企業情報の検索や、ページネーション、モデルに記載した関数などがオリジナルのコードに含まれており、混乱させてしまうのでコードは省略しています)
顧客情報 ClientsController.php

PHP

1class ClientsController extends AppController { 2 public function add(){ 3 if ($this->RequestHandler->isAjax()) { 4 $this->render('/ClientCompanies/add',"ajax"); 5 } 6 }

顧客情報 入力フォーム add.ctp

PHP

1<?php 2echo $this->Form->create(); 3echo $this->Js->submit('企業情報を入力', array( 4 'success'=>$this->Js->get('#sending')->effect('fadeOut'), 5 'update'=>'#success' 6)); 7echo $this->Form->end(); 8?> 9<div id="success"></div> 10<?php echo $this->Js->writeBuffer(); ?>

企業情報 ClientCompaniesController.php

PHP

1class ClientCompaniesController extends AppController { 2 public function add(){ 3 $Companies = $this->ClientCompany->find('list'); 4 $this->set('Companies ', $Companies); 5 } 6}

企業情報 入力フォーム add.ctp

PHP

1<?php foreach($Companies as $comp):?> 2 <p><?php echo $comp;?></p> 3<?php endforeach;?>

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

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

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

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

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

guest

回答2

0

ベストアンサー

コンポーネントを利用してみてはどうでしょうか。
アプリケーションフォルダ/Controller/Component/ 下に作成するクラスで、コントローラー間の共通処理を書くために使います。
例えば CompanyComponent に更新処理を書き、ClientsController::add() と ClientCompanies::add() の両方から呼び出すという感じです。

もしコントローラ間でコピーアンドペーストしたい箇所が あった場合、その機能を含むコンポーネントの作成を検討しましょう。

引用: http://book.cakephp.org/2.0/ja/controllers/components.html

投稿2016/03/19 16:25

tozjp

総合スコア790

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

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

imohead

2016/03/20 06:53

確かに一覧のリストを取得して表示などはそちらにまとめてしまえば横断的にできそうですね。 ありがとうございます。 試してみます
guest

0

少々わかりにくい内容になっている部分があります。いちど整理しましょう。

/ClientCompanies/add.ctp ※ここでユーザがSUBMITする
↓ AJAX
ClientsController add()

という顧客情報をAJAXで更新するものが既に存在していて、
この中で顧客情報だけではなく、企業情報も更新したいので、
ClientsController add() の中から、ClientCompaniesController add()を呼び出したいという意図であってますか?

ご提示してもらったソースコードは必要な処理が削られすぎていて意図が読み取りにくいので、
詳細な処理まで記載されたコードを掲載することをおすすめします!

投稿2016/03/01 07:09

supikid

総合スコア139

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

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

imohead

2016/03/01 07:28

ありがとうございます。 流れについては、正確には逆です。 /ClientCompanies/add.ctp ↑ AJAX ClientsController add() ※ここでユーザがSUBMITする 顧客情報だけではなく、企業情報も更新したいという意図はご理解頂いている通りです。 処理前のソースコードの掲載についてですが、 企業情報の検索や、ページネーション、モデルに記載した関数など、余計混乱させてしまうコードがあるので、上記の流れでお助け頂けると幸いです!
supikid

2016/03/02 00:58 編集

共有してもらっているソースを見る限りでは /ClientCompanies/add.ctp ※ここでユーザがSUBMITする ↓AJAXリクエスト ClientsController add() で合ってると思います。 そして、おそらく仰りたいのはレスポンスの話で、このadd()が返却する内容は、 /ClientCompanies/add.ctp内の div#success に表示される内容になるわけですね。 ここからは設計の話なんですが、 案1 「Client」を更新するコントローラーと「ClientCompanies」を更新するコントローラーという切り口で作成されているようですので、意味合い的にはJSから2個叩けば良いのではないかなと思ったりもします。 案2 しかしながら、そこは1回で済ませたいというのであれば、「Client」「ClientCompanies」とコントローラ分割している意味もとくにないので(結局、Clientリクエスト時にClientCompaniesを更新しようとしているので)、それならば、両方を更新するアクションとして記述するのが適切ではないかなと思います。 案3 そして、個人的には一番おすすめではありませんが、どうしても別アクションを呼び出したいのであれば、Client更新用のアクションとClientCompanies更新用のアクションを用意して、setActionで呼び出すなどはいかがでしょう。 もちろん必要なハンドリングはあるでしょうが、イメージとしては下記のような。 ただし、こうまでする必要性が全くない気がします。 // AJAXで呼び出すアクション public function index(){ $this->setAction("client"); $this->setAction("companies"); } // client更新用アクション public function client(){ // 更新処理 } // clientCompanies更新用アクション public function companies(){ // 更新処理 } ※場合にも寄りますが、このケースであれば、私は案2の形で作ると思います。
imohead

2016/03/20 06:55

ありがとうございます。 もともとは連携する予定はなかったのですが、やはり設計から見直した方が良さそうなんですね。 コンポーネントを使うご助言を他の方からもいただいたので、試してみます。
supikid

2016/03/22 06:21

コンポーネントは書き方の問題なので、実処理の構成としては、同時に両方を処理するコントローラにするという意味で案2の構成になりますね。検討を祈ります。 返信ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問