Форматировать дату Sitecore с помощью Sitecore (). Field ()?

Мне нужно использовать произвольный формат даты (например, dddd dd MMMM yyyy). Можно ли передать этот формат в Sitecore().Field()? Я бы хотел сделать что-то вроде этого:

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

Однако после некоторого поиска в Google я обнаружил, что для этого мне нужно либо создать вспомогательное поле для настраиваемого поля, либо создать настраиваемую модель. Неужели нет возможности сделать это с помощью базового Sitecore? Это важно сделать через Sitecore().Field(), так как мне нужно, чтобы редактор содержимого мог редактировать значение.

Мы на Sitecore 7.5


person Dennis Subachev    schedule 25.12.2015    source источник
comment
Я думаю, что он был представлен в более поздних версиях, потому что он отлично работает для меня в SXP8.2 @ Html.Sitecore (). Field (Start Date, new {format = dd MMMM yyyy})   -  person Zooking    schedule 24.11.2016
comment
Я помню, что это был вариант, когда я посещал электронное обучение для разработчиков Sitecore. Модуль 4, если не ошибаюсь. Курс - Sitecore 8.   -  person Noldy    schedule 10.11.2017


Ответы (4)


Насколько я знаю, 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")

Джон Уэст пишет о том, как расширить помощников Sitecore здесь: http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2012/06/sitecore-mvc-plays-part-4-extends-the-sitecorehelper-class.aspx

person Vlad Iobagiu    schedule 26.12.2015
comment
Спасибо, работает. Кроме того, я просто хочу подтвердить, что методы TagField не нужны ни для чего, связанного с моим исходным вопросом, верно? - person Dennis Subachev; 30.12.2015
comment
@MrSnappingTurtle вы правы tagfield не используется. Если ответ правильный, отметьте его правильным. Другие будут использовать этот ответ в будущем. - person Vlad Iobagiu; 30.12.2015
comment
@SitecoreClimber, я использовал, но изменил ваш код, так как мне нужно было использовать его для дочерних элементов текущего элемента контекста. Измененный ответ ниже. - person Juri; 25.02.2016
comment
Хорошо, но почему вы даете другой ответ? :) - person Vlad Iobagiu; 25.02.2016
comment
Я не думаю, что это необходимо в Sitecore 8 - person Noldy; 10.11.2017

Вы можете отформатировать дату, используя приведенный ниже синтаксис рендеринга поля, который легко и нестандартно.

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

Вот и все. Значение формата использует спецификации стандартного формата даты.

person Akif Irfan    schedule 22.02.2019

Для тех, у кого возникла проблема при работе с пробелами, просто замените все пробелы на «\ n».

Пример здесь:

@Html.Sitecore().Field(datefield, new {format="MMM\ndd,\nyyyy"})
person Bhawna Jain    schedule 17.03.2020

Я изменил ответ @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>
}
person Juri    schedule 25.02.2016