2012-04-07 70 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); 
相关问题