我试图在没有运气的情况下在Cakephp 2.0中使用Elements。我有一个名为Post的模型,一个名为Posts的控制器和各种视图。在布局中,我想包括(对于每个页面/视图)一个包含最新消息的框(比如说2)。
所以我创建了元素 dok-posts.ctp
<?php $posts = $this->requestAction('posts/recentnews'); ?>
<?php foreach($posts as $post): ?>
<div class="Post">
....
在我的 PostsController 中添加了 recentnews()
功能public function recentnews(){
$posts = $this->Post->find('all',array('order' => 'Post.created DESC','limit' => 2));
if ($this->request->is('requested')) {
return $posts;
} else {
$this->set('posts', $posts);
}
}
在我的布局中, default.ctp 我调用了我的元素
<?php echo $this->element('dok-posts'); ?>
问题是我收到了这条消息
Invalid argument supplied for foreach() [APP\View\Elements\dok-posts.ctp, line 9]
在 dok-posts.php 中调试,在$this->requestAction
之后,给我一个空行。似乎recentnews
函数没有返回任何内容(函数中的调试返回一个包含找到的帖子的数组)。谁能告诉我我做错了什么?
答案 0 :(得分:3)
由于您发现该动作实际上已被调用,
$posts = $this->requestAction('posts/recentnews');
工作正常。在这里,为了清晰和扩展配置选项(以后的代码更改),我建议你使用路由器数组而不是URL
$posts = $this -> requestAction(array(
'controller' => 'posts',
'action' => 'recentnews'
));
现在你的实际问题...... 既然你说,它总是进入else分支,
$this->request->is('requested')
可能无法按预期工作。试试这个(它对我来说很完美):
if (!empty($this -> request -> params['requested'])) {
return $posts;
}
答案 1 :(得分:1)
在app控制器中创建beforefilter和getNewsElement函数。
public function beforeFilter() {
parent::beforeFilter();
$data = $this->getNewsElement();
$this->set('posts',$data);
}
function getNewsElement(){
# Put Post model in uses
$posts = $this->Post->find('all',array('order' => 'Post.created DESC','limit' => 2));
return $posts;
}
dok-posts.ctp
#Remove <?php $posts = $this->requestAction('posts/recentnews'); ?>
<?php foreach($posts as $post): ?>
<div class="Post">
....
In PostsController
public function recentnews(){
$posts = $this->getNewsElement();
$this->set('posts', $posts);
}
这将解决您的问题!
答案 2 :(得分:0)
尝试
<?php $posts = $this->requestAction('/posts/recentnews'); ?>
(注意前锋斜线)
答案 3 :(得分:0)
我已经按照Cakephp指南中的示例进行了操作。从它没有通过if语句的那一刻起,似乎控件存在问题。
$this->request->is('requested')
所以我删除了
is->('requested')
添加
->params['requested']
它有效。
感谢大家的帮助(尤其是解决方案的 wnstnsmth )。
答案 4 :(得分:0)
Try this
<?php $this->requestAction('/controllerName/functionName');?>