如何在预览模式下使用预览日期在Sitecore中显示特定于日期的内容?

时间:2013-05-10 19:02:54

标签: sitecore

在我正在处理的网站中,某些内容仅在达到特定日期后才会显示:

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

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

Sitecore版本:6.4.1 rev。 110720

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

5 个答案:

答案 0 :(得分:4)

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

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

如果启用了预览模式,则Sitecore.Configuration.State.Previewing属性为true,否则为false。 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;
        }
    }

它似乎没有副作用。

答案 1 :(得分:1)

处理这类事情的最佳方法是限制内容在特定日期之前发布。

在内容编辑器的发布标签上,点击限制按钮以限制何时发布内容。

如果您需要在特定日期和时间投放内容,可以使用Automated Publisher module

答案 2 :(得分:1)

您应该可以使用WebEditUtil.GetCurrentDate()来获取所选日期。

如果您不想参考,请查看Cookie" sc_date"。

答案 3 :(得分:1)

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

修改 如果AJAx调用同一页面/ Code Sitecore.Configuration.State将为null,所以请确保你处理它。

答案 4 :(得分:0)

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

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

现在,只要您找到DateTime.Now,它就会返回正确的日期。