2012-04-07 31 views
1

我正在盡我所能去學習MVC和cakePHP,並且有一個關於將數組傳遞給視圖的問題。目前,我有一些基本的代碼如下。從cakePHP中的控制器傳遞兩個數組

類AwarenesscampaignsController擴展的AppController {

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

這就是我 「認爲」 目前正在發生的事情。

AwarenesscampaignsController已設置。查看參數請求id並將其與Model,Awarenesscampaign進行匹配。這與數據庫相匹配,並返回一個設置爲變量「$ data」的數組,然後加載視圖。

我的第一個問題:我的理解是否準確?

我想要做的是與這是爲了能夠從另一個模型傳遞另一個數組。例如,我想查詢表格帖子(Controller:PostsController/Model:Post)。

例如,我的第一次嘗試是應該做的函數內部的以下內容:

$這個 - >後>找到(「所有」);

但是,這產生了錯誤:

超載財產AwarenesscampaignsController :: $後的間接修改沒有影響[APP /控制器/ AwarenesscampaignsController.php 20行]

另外,我不知道我如何將這兩個變量發送到視圖。

要回顧一下:

  1. 我的理解是否準確?
  2. 如何從另一個控制器/模型查詢變量?
  3. 如何將此數組發送到該控制器的相應視圖?

感謝, -M

回答

2

你是在正確的路線,而不是做錯了本身。我會說你的理解對初學者來說是相當不錯的。

默認情況下,Cake會自動加載一個它認爲與控制器直接相關的模型。所以在AwarenesscampaignController,你可以自動訪問Awarenesscampaign(模型)。不過,它並不知道任何其他型號。你可能會解決這個問題的一種方法是通過添加以下屬性到控制器:

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

這正好在類的頂部,你就開始宣稱的功能之前。它告訴Cake,你想使用其他模型,除了'默認'模型,但你必須將其添加到數組中,否則你將失去對它的訪問權限。

如果是一次性動作,您也可以在動作中使用loadModel。它然後訪問,你會進入正常的模型以同樣的方式:

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/retrieving-your-data.html

最後,儘管你可以訪問其他模型(如所示),你不能,否則一般不應該,試圖從另一個訪問一個控制器。如果您有要在多個控制器中使用的代碼,但無法進入模型中,則可以創建Components

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

該手冊是相當全面。雖然有時很難導航,但它通常會回答你的大部分問題。

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

+0

謝謝你花時間回答問題並給我跟進閱讀。我衷心感謝。 – user1319580 2012-04-07 22:39:28

2

1)你的理解是不夠好。這樣做基本上是將一行數據庫表與對象進行映射。因此,在設置模型ID $this->Awarenesscampaign->id = $id後,現在Model指向數據庫表的行,其id等於傳遞給查看操作的行。

2)你可以通過調用該特定模型的方法來查詢另一個表。如果您的模型以某種方式與您所在的當前模型相關聯,則可以使用鏈接調用該模型的操作。例如如果您在帖子控制器和發佈模型中與評論模型相關聯t獲取可以鏈接的數據。

$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); 
相關問題