【问题标题】:How do I update an array value from the database before passing it to the view in CakePHP?在将数组值传递给 CakePHP 中的视图之前,如何从数据库中更新数组值?
【发布时间】:2013-01-19 10:26:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • TimeHelper in your view 也可能感兴趣
  • 确切地说,如果有的话,您应该修改视图中输出的时间戳 - 在回显之前“按需”。 afterFind() 回调应该(可能)不用于此,因为转换也可能应用视图范围相关标记等。
  • 谢谢罗斯,我需要改掉我做事艰难的习惯!

标签: php templates cakephp pagination


【解决方案1】:

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

【讨论】:

  • 完美,谢谢。我将其作为答案,因为它直接链接到我需要使用的示例 - 对于我指定的框架。
【解决方案2】:

这是基本的 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>';
    ...
}

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

【讨论】:

  • 我如何将它重构回 $posts 数组?
  • 我刚刚给了你所有的信息。正如我所说,它确实只是非常基本的 PHP 东西。
  • 很遗憾你在最初的帖子中没有那么有帮助和全面。还是谢谢。
  • 是的,对不起。我刚刚看到你在那里滥用 PHP 作为一种语言;)所以我完全专注于这一点,而不是看到你试图在那里解决的整个画面。
【解决方案3】:

另一种可能性:使用引用。

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

这实际上会在访问每个$post 时修改$posts 数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2018-08-20
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多