【问题标题】:Silverstripe currentUser()->DateFormatSilverstripe currentUser()->DateFormat
【发布时间】:2017-07-02 07:04:43
【问题描述】:

我想知道如何使用 Member::currentUser()->DateFormat 将模型中的日期格式化为字符串。我的用例在一个 GridField 列中,前面带有对象标题:

return $this->Title . " (" . $this->Date . ")";

我希望 GridField 字符串使用 CMS 用户选择的日期格式。

我试过了:

return $this->Title . " (" . date(Member::currentUser()->DateFormat, $this->Date) . ")";

但由于 CMS 以不同于 PHP 日期格式的格式存储用户日期,因此它会返回一些不可靠的结果。

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    Date 上有一个辅助方法,正是为此目的,Date->FormatFromSettings

    如果您的 DataObject 有一个名为 Date 的字段,您可以使用类似的方法将日期格式化为字符串(基于当前成员设置):

    $this->dbObject('Date')->FormatFromSettings()
    

    在模板中,你应该可以使用:

    $Date.FormatFromSettings
    

    如果您只想在 GridField 中格式化日期,指定 DataObject 的 summary_fields 可能就足够了,例如:

    private static $summary_fields = [
        'Title' => 'Title',
        'Date.FormatFromSettings' => 'Date'
    ];
    

    在 CMS 上下文中使用它不是问题。将其用于前端代码时,您必须考虑没有成员登录的情况。在这些情况下,FormatFromSettings 将返回 false... 所以您可能必须为日期编写自己的 getter,这将返回某人登录时的用户格式化日期,以及其他情况的后备格式。

    【讨论】:

    • 太棒了! FormatFromSettings() 正是我需要的。我不能使用 summary_fields 的方式,因为我需要在标题前加上,但这很有效。
    • 有没有办法使用 Time 数据类型进行这项工作?
    • @Chris 您可以查看SS_Datetime 中的FormatFromSettings 实现,我想您必须从那里提取仅格式化时间的部分
    • 调查一下,好像有点乱。除非你知道一种干净的方法。否则,是否值得 PR 将 FormatFromSettings 添加到 Time 数据类型?
    • 这就是我在此期间所做的,我将整理一个 PR 以将 FormatFromSettings() 添加到 Time 数据类型。谢谢老兄!
    【解决方案2】:

    确保 $this->Date 是时间戳值,而不是格式化的日期/日期时间值。

    【讨论】:

    • 我已尝试使用“日期”和“SS_Datetime”数据类型并获得相同的结果
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2017-12-06
    • 2018-12-06
    • 2010-10-18
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多