我基本上希望能够在将结果发送到我的视图之前通过函数传递值...
public function listing() {
$this->set('posts', $this->paginate('Post'));
}
所以我想在那里说些什么,例如:
foreach($posts as $post){
$post["Post"]["timestamp"] = $this->timeago($post["Post"]["timestamp"]);
}
然后我想用这个字段对结果进行分页,并将'posts'设置为我发送给视图的整个数组 - 用'timeago'函数更新了时间戳。这样做的最佳方式是什么?
答案 0 :(得分:1)
这是基本的php。要修改数组,您需要使用$ key,如下所示:
foreach ($posts as $key => $post) {
$posts[$key]["Post"]["timestamp"] = $this->timeago($post["Post"]["timestamp"]);
}
但你真正想要的是在实际输出之前修改时间戳:
// in your view ctp
foreach ($posts as $post) {
...
$formattedTimestamp = $this->Time->timeAgoInWords($post["Post"]["timestamp"]);
echo '<span>' . $formattedTimestamp . '</span>';
...
}
在我看来,输出格式不应该在模型层中完成 - 特别是不使用回调。如果您没有碰巧使用漂亮的格式化字段,那么您的模型会在您的记录中循环播放。这就是为什么我更喜欢“按需”这样做。
答案 1 :(得分:1)
您可以考虑在AfterFind()的模型行为中实现这些方法 有关详细信息,请参阅:http://book.cakephp.org/2.0/en/models/callback-methods.html
答案 2 :(得分:1)
另一种可能性:使用参考文献。
// Note the "&"
foreach($posts as &$post){
$post["Post"]["timestamp"] = $this->timeago($post["Post"]["timestamp"]);
}
这将在访问每个$posts
时实际修改$post
数组。