我的控制器中有以下代码:
function index()
{
$posts = $this->set('posts', $this->Portfolio->find('all'));
if (isset($this->params['requested']))
{
return $posts;
}
else
{
$this->set('posts', $this->Portfolio->find('all'));
}
}
以及我希望它做的是a)显示索引的投资组合项目列表,例如/portfolio/
和b)显示元素内的投资组合项列表,以便用户可以从我的侧边栏访问整个网站中的投资组合项。
这是侧边栏的元素:
<?php $posts = $this->requestAction('portfolio/index'); ?>
<ul>
<?php foreach ($posts as $post): ?>
<li><?php echo $this->Html->link($post['Portfolio']['title'], array('action' => 'view', $post['Portfolio']['id']));?></li>
<?php endforeach; ?>
</ul>
然后我在我的布局中这样称呼它:
<?php $this->element('portfolio-nav', array('posts' => $posts) ); ?>
但是它会出现以下错误:
Notice (8): Undefined variable: posts [APP/controllers/portfolio_controller.php, line 16]
并且不显示侧栏中的项目列表。
我很确定我在我的控制器中写的是垃圾,所以如果有人能帮助我让它工作,那就太棒了。
由于
答案 0 :(得分:27)
function index() {
$this->set('posts', $this->Portfolio->find('all'));
// Make sure the model Portfolio is accessible from here, i.e. place this
// action in PortfoliosController or load it using
// ClassRegistry::init('Portfolio')->find...
}
然后,在index.ctp视图中:
<?php echo $this->element('foobar', array('posts' => $posts)); ?>
如果您希望能够从您网站的每个页面(侧边栏或其他内容)请求此功能,您可以使用requestAction
,或将$this->set...
放在AppController中。如果您在元素中使用requestAction
,则无需在array('posts' => ...)
来电中传递$this->element
。
好的,很明显你需要更多方向。让我一步一步解释。首先,我们需要在beforeFilter
上创建AppController
,以便可以从应用程序的任何位置访问$posts
变量。
/app/app_controller.php
:
<?php
class AppController extends Controller {
function beforeFilter() {
parent::beforeFilter();
$this->set('posts', ClassRegistry::init('Portfolio')->find('all'));
}
}
接下来,我们在app/views/elements/foobar.ctp
:
<?php debug($items); ?>
最后,我们从视图中的某个位置调用元素:
<?php echo $this->element('foobar', array('items' => $posts)); ?>
我们正在为items
键分配$ posts(我们已在AppController中定义)变量,因为我们的元素需要一个$items
变量。
答案 1 :(得分:7)
答案 2 :(得分:4)
带参数的元素
$this->element('elementname', array('var_name'=>$var));
答案 3 :(得分:2)
我认为有一件事情没有被提及,你的错误信息是:
Notice (8): Undefined variable: posts [APP/controllers/portfolio_controller.php, line 16]
在控制器中。您发布的内容看起来还不错(虽然稍微冗长的代码),所以我会问PortfolioController中的第16行在哪里以及为什么$ posts没有定义?
从控制器返回一个值以便在元素中使用,因此没有问题。
答案 4 :(得分:1)
您要在元素中设置$ posts var并尝试将其从布局传递到元素o.o
您的代码按此顺序
render layout
include element passing variable
set var with requestAction
的foreach
你应该做的
render layout
include element (dont pass anything)
set var with requesAction (you get the data here so why are you trying to pass it in)
答案 5 :(得分:1)
试试这个并告诉我它是否有效..
我对你的Controller :: index()函数进行了一些更改:
function index () {
// this is the problem
// $posts = $this->set('posts', $this->Portfolio->find('all'));
$posts = $this->Portfolio->find ( 'all' );
if (isset($this->params['requested']))
{
return $posts;
}
else
{
// you already have the posts
//$this->set('posts', $this->Portfolio->find('all'));
$this->set ( 'posts', $posts );
}
}
您的元素portfolio-nav
..
将布局中的调用更改为:
<?php $this->element ( 'portfolio-nav' ); ?>
我希望这对你有帮助.. 祝你的发展好运..
答案 6 :(得分:1)
你也可以这样做。
class AppController extends Controller {
public $var;
public function beforeFilter()
{
$this->var = ClassRegistry::init('Portfolio')->find('all');
}
}
class YourController extends AppController {
public function index() {
debug($this->var);
}
}
答案 7 :(得分:0)
这就是我解决这个问题的方法:
<强>控制器:强>
function birdsTwo() {
return $this->Bird->find('all', array('order' => 'Bird.name ASC', 'limit' => 2));
}
<强>布局:强>
<?php echo $this->element('quick_5_birds'); ?>
<强>元素:强>
$birds = $this->requestAction('/birds/birdsTwo/');
foreach($birds as $bird) {
echo $this->Html->link(__($bird['Bird']['name'], true),
array('controller' =>'bird','action' => 'view', $bird['Bird']['id'])) . "<br />";
}
答案 8 :(得分:0)
查看Cakephp文档 http://book.cakephp.org/2.0/en/views.html
echo $this->element('helpbox', array(
"helptext" => "Oh, this text is very helpful."
));
如果您需要在每个视图中使用变量,则应在会话中进行设置。
答案 9 :(得分:0)
//Controller users
public function getUsers(){
$users= $this->User->find("all");
return $users;
}
//Element name users
$this->requestAction(array('controller'=>'users','action'=>'getUsers'))
//vista name view
print_r( $this->element('users')); ?>