3

我正在尝试在 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函数似乎没有返回任何内容(在函数中进行调试会返回一个包含找到的帖子的数组)。谁能告诉我我做错了什么?

4

5 回答 5

3

由于您发现实际调用了该操作,

$posts = $this->requestAction('posts/recentnews');

工作正常。在这里,为了清晰和扩展配置选项(用于以后对代码的更改),我建议您使用 Router 数组而不是 URL

$posts = $this -> requestAction(array(
 'controller' => 'posts',
 'action' => 'recentnews'
));

现在到你的实际问题......既然你说,它总是进入 else 分支,

$this->request->is('requested')

可能无法按预期工作。试试这个(它对我来说很完美):

if (!empty($this -> request -> params['requested'])) {
   return $posts;
}
于 2012-07-02T13:38:52.013 回答
1

在您的应用控制器中创建 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);

}

这将解决您的问题!

于 2013-12-06T08:24:18.353 回答
0

我已经按照 Cakephp's guide 中的示例进行了操作。从它没有通过 if 语句的那一刻起,似乎控件存在问题。

$this->request->is('requested')

所以我删除了

is->('requested') 

添加

->params['requested']

它有效。

感谢大家的帮助(尤其是解决方案的wnstnsmth)。

于 2012-07-03T05:50:55.240 回答
0

尝试

<?php $posts = $this->requestAction('/posts/recentnews'); ?>

(注意前导斜杠)

于 2012-07-02T13:15:07.720 回答
0
Try this

 <?php $this->requestAction('/controllerName/functionName');?>
于 2013-12-06T06:33:53.380 回答