使用Sitecore().Field()设置Sitecore日期格式

本文关键字:Sitecore 格式 日期 Field 使用 设置 | 更新日期: 2023-09-27 18:28:07

我需要为日期使用自定义格式(即dddd dd MMMM yyyy)。是否可以将此格式传递给Sitecore().Field()?我想做这样的事情:

@Html.Sitecore().Field("Day1", new { @format="dddd dd MMMM yyyy"})

然而,在谷歌上搜索了一番之后,我发现我要么必须创建一个自定义字段助手来完成这项工作,要么必须创建自定义模型。使用基本Sitecore真的没有办法做到这一点吗?重要的是通过Sitecore().Field()来完成,因为我需要内容编辑器来编辑值。

我们在Sitecore 7.5

使用Sitecore().Field()设置Sitecore日期格式

据我所知,Sitecore没有现成的功能。您可以使用助手来实现此功能,请检查以下代码。我使用了这个代码,并且运行良好。您也可以从页面编辑器编辑日期字段,因为该字段是通过Sitecore管道编辑的。

public static class Helper
{
    public static HtmlString RenderField(
      this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
      string fieldNameOrId,
      bool disableWebEdit = false,
      SC.Collections.SafeDictionary<string> parameters = null)
    {
        if (parameters == null)
        {
            parameters = new SC.Collections.SafeDictionary<string>();
        }
        return sitecoreHelper.Field(
          fieldNameOrId,
          new
            {
                DisableWebEdit = disableWebEdit,
                Parameters = parameters
            });
    }
    public static HtmlString RenderField(
      this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
      SC.Data.ID fieldId,
      bool disableWebEdit = false,
      SC.Collections.SafeDictionary<string> parameters = null)
    {
        return RenderField(
          sitecoreHelper,
          fieldId.ToString(),
          disableWebEdit,
          parameters);
    }
    public static HtmlString RenderDate(
      this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
      string fieldNameOrId,
      string format = "D",
      bool disableWebEdit = false,
      bool setCulture = true,
      SC.Collections.SafeDictionary<string> parameters = null)
    {
        if (setCulture)
        {
            Thread.CurrentThread.CurrentUICulture =
              new CultureInfo(SC.Context.Language.Name);
            Thread.CurrentThread.CurrentCulture =
              CultureInfo.CreateSpecificCulture(SC.Context.Language.Name);
        }
        if (parameters == null)
        {
            parameters = new SC.Collections.SafeDictionary<string>();
        }
        parameters["format"] = format;
        return RenderField(
          sitecoreHelper,
          fieldNameOrId,
          disableWebEdit,
          parameters);
    }
    public static HtmlString RenderDate(
      this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
      SC.Data.ID fieldId,
      string format = "D",
      bool disableWebEdit = false,
      bool setCulture = true,
      SC.Collections.SafeDictionary<string> parameters = null)
    {
        return RenderDate(
          sitecoreHelper,
          fieldId.ToString(),
          format,
          disableWebEdit,
          setCulture,
          parameters);
    }
    public static HtmlString TagField(
      this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
      string fieldNameOrId,
      string htmlElement,
      bool disableWebEdit = false,
      SC.Collections.SafeDictionary<string> parameters = null)
    {
        SC.Data.Items.Item item =
          SC.Mvc.Presentation.RenderingContext.Current.ContextItem;
        if (item == null || String.IsNullOrEmpty(item[fieldNameOrId]))
        {
            return new HtmlString(String.Empty);
        }
        string value = sitecoreHelper.RenderField(
          fieldNameOrId,
          disableWebEdit,
          parameters).ToString();
        return new HtmlString(String.Format(
          "<{0}>{1}</{0}>",
          htmlElement,
          value));
    }
    public static HtmlString TagField(
      this SC.Mvc.Helpers.SitecoreHelper sitecoreHelper,
      SC.Data.ID fieldId,
      string htmlElement,
      bool disableWebEdit = false,
      SC.Collections.SafeDictionary<string> parameters = null)
    {
        return TagField(
          sitecoreHelper,
          fieldId.ToString(),
          htmlElement,
          disableWebEdit,
          parameters);
    }
}

在您的cshtml中,您将拥有:

       @Html.Sitecore().RenderDate("Name of field or id", "your format")

John West在这里介绍如何扩展sitecore助手:http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2012/06/sitecore-mvc-playground-part-4-extending-the-sitecorehelper-class.aspx

您可以使用下面的字段渲染语法来格式化日期,这很简单,而且开箱即用。

@Html.Sitecore().Field("Date Field", new {format="MMM dd, yyyy"})

就是这样。格式值利用了标准日期格式规范。

对于那些在处理空格时遇到问题的人,只需将所有空格替换为"''n"即可。

这里有一个例子:

@Html.Sitecore().Field(datefield, new {format="MMM'ndd,'nyyyy"})

我修改了@SitecoreClimber的答案,因为它使用默认的RenderingContext.Current ,所以不适用于渲染子项

因此,我更新了每个方法参数,并添加了Item item,并将该项用于基本字段渲染,如下所示:

    public static HtmlString RenderField(this SitecoreHelper sitecoreHelper, string fieldNameOrId, Item item, bool disableWebEdit = false, SafeDictionary<string> parameters = null)
    {
        if (parameters == null)
        {
            parameters = new SafeDictionary<string>();
        }
        return sitecoreHelper.Field(fieldNameOrId, item,
            new
            {
                DisableWebEdit = disableWebEdit,
                Parameters = parameters
            });
    }

因此,在我的MVC视图中,我现在可以拥有:

@foreach (Item item in @Model.Item.Children)
{
    <div class="event-date">
        @Html.Sitecore().RenderDate("Date", item, "d MMM")
    </div>
}