根据手册和我的代码,这应该是完美的,但事实并非如此。我已经把这段代码搞得太久了,我想让任何人看看它是否有一些我看不到的东西。
我正在尝试调用计划控制器的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);
}
}
答案 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,难怪你收到错误信息。