将控制器数据阵列传递给home.ctp的Element

时间:2011-02-03 22:22:08

标签: php arrays cakephp

根据手册和我的代码,这应该是完美的,但事实并非如此。我已经把这段代码搞得太久了,我想让任何人看看它是否有一些我看不到的东西。

我正在尝试调用计划控制器的index()动作,将数据数组传递给要显示的元素。有谁知道为什么这不起作用?

我遇到了常见的错误:

Notice (8): Undefined variable: 
plans [APP/views/elements/search_dental_plans_results.ctp,  line 12]
Warning (2): Invalid argument supplied for foreach()
[APP/views/elements/search_dental_plans_results.ctp, line 12]

这是我的代码:

home.ctp

<?php echo $this->element('search_dental_plans_results'); ?>

视图/元件/ search_dental_plans_results.ctp

<h2>Plans List</h2>
<?php $plans = $this->requestAction('plans/index'); ?>
<?php foreach($plans as $plan): ?>
<ol>
<li><?php echo $plan['Plan']['id']; ?></li>
</ol>
<?php endforeach; ?>

控制器/ plans_controller.php

function index() {
    //$plans = $this->paginate();
    if (isset($this->params['requested'])) {
        return $plans;
    } else {
        $this->set('plans', $plans);
    }
}

5 个答案:

答案 0 :(得分:1)

快速测试一下,看看它是否只是语法,但尝试在'requestAction'函数中添加正斜杠。

<?php $plans = $this->requestAction('/plans/index'); ?>
// @see - http://book.cakephp.org/view/434/requestAction

另外,只是评论使用requestAction的适当性,我个人喜欢用它来填充元素中的pulldowns和checkbox数组等。它通过分离出一些表示逻辑来保持控制器代码更清晰,并且它使HTML编码器更容易。

对于不经常更改的数据(例如计划列表),它的效果最好,但重要的是您缓存查询,否则它可能会破坏您的性能。

答案 1 :(得分:0)

为什么计划被注释掉了,为什么if中的isset()?试着出口;在返回之前看看会发生什么情况,默认情况下设置的请求可能是假的,而if应该是if($ this-&gt; params ['requested'])或if(isset($ this-&gt; params ['请求'])&amp;&amp; $ this-&gt; params ['requested'])

我也不明白你为什么要使用请求操作,你几乎不应该使用requestAction()

答案 2 :(得分:0)

根据您发布的代码,看起来您的问题不是由CakePHP中的任何内容引起的。

未定义的变量是在代码之前未设置的变量。但是如果你的元素有这个:

<?php $plans = $this->requestAction('plans/index'); ?>
<?php foreach($plans as $plan): ?>

这意味着正在制定$计划。

示例中的

$ this-&gt; requestAction()可以返回任何内容,甚至根本不返回任何内容,$ plans变量仍将被视为已定义,您将不会获得未定义的变量通知。

所以我会尝试在其他地方找问题。也许尝试改变这一行:

<?php $plans = $this->requestAction('plans/index'); ?>

为:

<?php $plans = array(1,2,3); ?>

看看是否有效。还要尝试检查语法。也许你错过了某个地方的开场或结束标签。

答案 3 :(得分:0)

我以“意外”的方式解决了这个问题(至少根据手册没有注意到这种方法):

元素

...

$planDetails = $this->requestAction('/planDetails/pd_list');
foreach ($planDetails as $planDetail) :

...

控制器逻辑

function pd_list() {
return $this->PlanDetail->find('all');
}

像魅力一样工作:)虽然我在完成时会使用可包含的缓存控件,但至少它按预期工作。

不太神圣,问题解决了。)

答案 4 :(得分:-1)

视图或元素的目的不是向控制器请求数据。它是用数据提供视图的控制器。

现在,您的索引操作不会执行任何操作。没有任何东西被分配给$ plan,难怪你收到错误信息。