【问题标题】:How do I use the preview date in preview mode to show date-specific content in Sitecore?如何在预览模式下使用预览日期在 Sitecore 中显示特定日期的内容?
【发布时间】:2013-05-10 19:02:53
【问题描述】:

在我正在开发的网站中,某些内容只有在达到某个日期后才会出现:

public bool IsActive
{
    get { return System.DateTime.Now >= this.IssueDate.DateTime; }
}

我想使用预览模式功能和体验栏来测试这段代码。但是,System.DateTime.Now 始终返回实际的当前日期,无论预览模式如何。我该如何写才能保证体验栏中设置的日期得到尊重,但在正常模式下页面仍然使用System.DateTime.Now

Sitecore 版本:6.4.1 rev。 110720

更新:我不能使用发布限制,因为该项目的子项需要在此项目出现在此逻辑控制的菜单中之前发布并可见。

【问题讨论】:

  • 有人愿意评论他们为什么不赞成这个问题吗?我做错什么了?这是个坏问题吗?
  • 很可能是因为您提出了问题并立即回答了问题,如果您不需要帮助,那么问这个问题毫无意义。最好是问这个问题并说“这就是我目前的实施方式,有没有更好的方法”
  • @jammykam:这似乎是一个奇怪的反对理由。 Stackoverflow 明确允许并鼓励这种行为。 Jeff Atwood 甚至专门写了一篇关于这一点的博客:blog.stackoverflow.com/2011/07/…
  • 只是我的猜测。我没有投票。看不出问题本身有什么问题,这对以后可能需要它的其他人很有用。
  • @jammykam:感谢您的反馈!这就是我的意图。我不得不谷歌一段时间才能得到答案,所以我认为值得使用 Stackoverflow。

标签: sitecore


【解决方案1】:

Sitecore 提供了一对属性来帮助解决这种情况:

    bool Sitecore.Configuration.State.Previewing
    DateTime Sitecore.Configuration.State.PreviewDate

Sitecore.Configuration.State.Previewing 属性在预览模式开启时为真,否则为假。 Sitecore.Configuration.State.PreviewDate 属性返回Sitecore.Sites.SiteContext.DisplayDate,在预览模式下设置为体验栏中的日期。

这是我最终使用的代码:

    public bool IsActive
    {
        get
        {
            DateTime dateToUse;
            if (Sitecore.Configuration.State.Previewing)
            {
                dateToUse = Sitecore.Configuration.State.PreviewDate;
            }
            else
            {
                dateToUse = DateTime.Now;
            }
            return dateToUse >= this.IssueDate.DateTime;
        }
    }

它似乎工作正常,没有副作用。

【讨论】:

  • 您应该使用Sitecore Rules Eingine,而不是将其硬编码到您的子布局中,这将允许您在多个组件中重复使用此逻辑。
【解决方案2】:

处理此类问题的最佳方法是限制内容在特定日期之前发布。

在内容编辑器的发布选项卡上,单击限制按钮以限制何时可以发布内容。

如果您需要内容在特定日期和时间上线,您可以利用Automated Publisher module 来实现此目的。

【讨论】:

  • 我没有提到必须发布有问题的项目,因为它下面的项目需要在网站上可见,然后才会出现在菜单中,所以发布选项对我没有帮助。我会用那条笔记更新我的问题。
【解决方案3】:

您应该能够使用 WebEditUtil.GetCurrentDate() 获取所选日期。

如果您不想引用它,请检查 cookie “sc_date”。

【讨论】:

    【解决方案4】:

    我认为单独使用 Sitecore.Configuration.State.PreviewDate 不会导致任何问题,因为它总是返回 dateTime(发出请求的时间)。

    编辑: 如果 AJAx 调用同一页面/代码 Sitecore.Configuration.State 将为 null,因此请确保处理它。

    【讨论】:

      【解决方案5】:

      另一种方法是更新SystemTime.CurrentTime 方法。在 Global.asax.csApplication_BeginRequest 中,添加以下内容:

      SystemTime.CurrentTime = () =>
                      State.Previewing || State.WebEditing
                          ? State.PreviewDate
                          : DateTime.Now;
      

      现在,无论您在哪里寻找 DateTime.Now,它都会返回正确的日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多