Форматирование даты 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
2 ответа
Насколько я знаю, у 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
Вы можете отформатировать дату, используя ниже поле Синтаксис рендеринга, который прост и из коробки.
@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>
}