1

私は MVC と CakePHP を学ぶために最善を尽くしていますが、配列をビューに渡すことについて質問がありました。現在、以下の基本的なコードがあります。

class AwarenesscampaignsController は AppController を拡張します {

public function view($id = null) {
    $this->Awarenesscampaign->id = $id;
    $this->set('data', $this->Awarenesscampaign->read());
}

これが私が現在起こっている「と思う」ことです。

AwarenesscampaignsController がセットアップされます。ビュー パラメーターは ID を要求し、それをモデル、意識キャンペーンと一致させます。これはデータベースと一致し、変数「$data」に設定された配列を返し、ビューが読み込まれます。

私の最初の質問: 私の理解は正確ですか?

私がやりたいことは、別のモデルから別の配列を渡すことができるようにすることです。たとえば、テーブル Posts (Controller: PostsController/ Model: Post) をクエリしたいと思います。

たとえば、私の最初の試みは、関数内で次のことを行うことでした。

$this->Post->find('all');

しかし、これはエラーを引き起こします:

オーバーロードされたプロパティ AwarenesscampaignsController::$Post の間接的な変更は効果がありません [APP/Controller/AwarenesscampaignsController.php、20 行目]

さらに、両方の変数をビューに送信する方法がわかりません。

要点をまとめると:

  1. 私の理解は正確でしたか?
  2. 別のコントローラー/モデルから変数を照会するにはどうすればよいですか?
  3. この配列をそのコントローラーの適切なビューに送信するにはどうすればよいですか?

ありがとう、-M

4

2 に答える 2

2

1) あなたの理解は十分です。これが行っていることは、基本的にデータベース テーブルの行をオブジェクトにマッピングすることです。したがって、モデル id を設定した後、モデル$this->Awarenesscampaign->id = $idは、ビュー アクションに渡されたものと等しい id を持つデータベース テーブルの行を指しています。

2) その特定のモデルのメソッドを呼び出して、別のテーブルをクエリできます。モデルが何らかの形で現在のモデルに関連付けられている場合、チェーンを使用してそのモデルのアクションを呼び出すことができます。たとえば、投稿コントローラーと投稿モデルがコメントモデルに関連付けられている場合、チェーンできるデータを取得します。

    $comments = $this->Post->Comment->find();

ただし、対象のモデルが現在のモデルに関連付けられていない場合は、他のモデルの操作を実行する方法がいくつかあります。適切なオプションは、クラス レジストリを使用することです。たとえば、現在のモデルに関連していない顧客モデルを使用したいとします。あなたのコントローラーであなたはするでしょう

   $customer= ClassRegistry::init("Customer");
   $customers= $customer->find();

3)ビューに複数の変数を設定するには、compact関数または関連する行を使用して設定できます。

   $posts = $this->Post->find();
   $comments = $this->Post->Comment->find();

   $this->set(compact('posts', 'comments'));
   // or
   $this->set('posts' => $posts, 'comments' => $comments);
于 2012-04-07T21:13:56.063 に答える
2

あなたは正しい方向に進んでおり、それ自体が間違っているわけではありません。あなたの理解は初心者にとってはかなり良いと思います。

デフォルトでは、Cake はコントローラに直接関連していると思われるモデルを自動的にロードします。したがって、では、 (モデル) にAwarenesscampaignController自動的にアクセスできます。Awarenesscampaign

ただし、他のモデルについては知りません。これを解決する方法の 1 つは、コントローラーに次のプロパティを追加することです。

// This has to contain ALL models you intend to use in the controller
public $uses = array('Awarenesscampaign', 'Post');

これは、関数の宣言を開始する前に、クラスの先頭に配置されます。「デフォルト」以外のモデルを使用したいが、そのモデルも配列に追加する必要があることを Cake に伝えます。そうしないと、アクセスできなくなります。

loadModel1 回限りの場合は、アクション内で使用することもできます。次に、通常のモデルにアクセスするのと同じ方法でアクセスします。

public function view($id = null) {
    $this->loadModel('Post');
    $posts = $this->Post->find('all');
    ...
}

これをビューに送信するには、もう一度呼び出すことができますが、混乱を避けるために、より読みやすいものsetに変更することをお勧めします。data

public function view($id = null) {
    ...
    $this->set('campaign', $this->Awarenesscampaign->read());
    $this->set('posts', $this->Post->find('all'));
}

それらはそれぞれ$campaignおよびとしてアクセスできます$post

ただし、何かを編集するつもりがない限り、「読み取り」を使用しないようにすることをお勧めします。を使用findByColumnNameして同じデータを取得できます。を使用しているだけなのでid、次のように呼び出すことができますfindById

$campaign = $this->Awarenesscampaign->findById($id);

そこにはかなりの魔法がかかっています。これは、特定の値をより短い形式で検索できることを意味します。

http://book.cakephp.org/2.0/en/models/retriving-your-data.html

最後に、他のモデルにアクセスすることはできますが (実証されているように)、あるコントローラーから別のコントローラーにアクセスすることはできません。複数のコントローラーで使用したいが、モデルに入れられないコードがある場合は、 を作成できますComponents

http://book.cakephp.org/2.0/en/controllers/components.html#creating-a-component

マニュアルはかなり包括的です。ナビゲートするのが難しい場合もありますが、多くの場合、ほとんどの質問に対する答えがあります.

http://book.cakephp.org/2.0/en/

于 2012-04-07T21:08:29.000 に答える