1

我基本上希望能够在将结果发送到我的视图之前通过函数传递一个值......

public function listing() {
    $this->set('posts',  $this->paginate('Post'));
}

所以我想在里面说点什么,例如:

    foreach($posts as $post){
        $post["Post"]["timestamp"] = $this->timeago($post["Post"]["timestamp"]);
    }

然后我想用这个字段对结果进行分页,并将“posts”设置为我发送到视图的整体数组——用“timeago”函数更新了时间戳。这样做的最佳方法是什么?

4

3 回答 3

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>';
    ...
}

在我看来,输出格式不应该在模型层中完成——尤其是不使用回调。如果您没有碰巧使用格式精美的字段,那么您的模型就会对您的记录进行循环。这就是为什么我更喜欢“按需”做它。

于 2013-01-19T10:37:59.967 回答
1

您可以考虑在模型行为 afterFind() 中实现这些方法。
欲了解更多信息,请参阅:http ://book.cakephp.org/2.0/en/models/callback-methods.html

于 2013-01-19T10:57:38.180 回答
1

另一种可能性:使用参考。

// Note the "&"
foreach($posts as &$post){
    $post["Post"]["timestamp"] = $this->timeago($post["Post"]["timestamp"]);
}

这实际上会$posts在访问每个$post.

于 2013-01-19T20:14:22.967 回答