Search code examples
c#sitecoresitecore7sitecore7.5

Format Sitecore Date using Sitecore().Field()?


I need to use a custom format for a date (i.e. dddd dd MMMM yyyy). Is it possible to pass this format to Sitecore().Field()? I would like to do something like this:

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

However, after some Googling, I found that I either have to create a custom field helper to do this or a custom model. Is there really no way to do this using base Sitecore? It's important this be done through Sitecore().Field() as I need the content editor to be able to edit the value.

We're on Sitecore 7.5


Solution

  • As far I know Sitecore doesn't have such a functionality out of the box. You can use a helper for this functionality, please check below code. I used this code and is working fine. You can edit date field also from page editor because the field is edited through Sitecore pipelines.

    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);
        }
    }
    

    In your cshtml you will have:

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

    John West write about how to extend sitecore helpers here: 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