2015-12-25 6 views
5

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

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

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

Мы на Sitecore 7,5

+3

Я думаю, что он был введен в более поздних версиях потому что это отлично работает для меня в SXP8.2. @ Html.Sitecore(). Поле («Дата начала», новое {format = "dd MMMM yyyy"}) – Zooking

+0

Я помню, что это вариант, когда вы посещаете сикэкоровский разработчик. Модуль 4, если я не ошибаюсь. Курс Sitecore 8. –

ответ

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-playground-part-4-extending-the-sitecorehelper-class.aspx

+0

Спасибо, что работает. Кроме того, я просто хочу подтвердить, что методы TagField не нужны ни для чего связанного с моим исходным вопросом, правильно? – MrSnappingTurtle

+0

@MrSnappingTurtle вы правы tagfield не используется. Если ответ правильный, отметьте его правильно. Другие будут использовать этот ответ в будущем. –

+1

@SitecoreClimber, я использовал, но модифицировал ваш код, так как мне нужно было использовать его для детей текущего контекстного элемента. Измененный ответ ниже. – Juri

0

Я модифицированную @SitecoreClimber ответ, потому что это не работа для рендеринга детских предметов, поскольку используется по умолчанию RenderingContext.Current

Так что я обновил eve аргументы метода чень и добавил 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> 
}