2015-12-25 29 views
5

È necessario utilizzare un formato personalizzato per una data (ad esempio dddd dd MMMM yyyy). È possibile passare questo formato a Sitecore().Field()? Mi piacerebbe fare qualcosa di simile:Formato Sitecore Data utilizzando Sitecore(). Field()?

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

Tuttavia, dopo un po 'Googling, ho scoperto che ho sia necessario creare un campo personalizzato di supporto per fare questo o un modello personalizzato. Non c'è davvero alcun modo per farlo usando Sitecore di base? È importante farlo tramite lo Sitecore().Field() poiché è necessario che l'editor di contenuti sia in grado di modificare il valore.

Siamo sulla Sitecore 7.5

+3

Penso che è stata introdotta nelle versioni successive perché questo funziona perfettamente per me in SXP8.2 @ Html.Sitecore(). Campo ("Data inizio", nuovo {formato = "gg MM MM aaaa"}) – Zooking

+0

Ricordo che questa era un'opzione mentre partecipavo all'elearning dello sviluppatore Sitecore. Modulo 4 se non sbaglio. Il corso è Sitecore 8. –

risposta

4

Per quanto so Sitecore non dispone di un tale funzionalità out of the box. È possibile utilizzare un helper per questa funzionalità, si prega di controllare sotto il codice. Ho usato questo codice e funziona perfettamente. Puoi modificare il campo della data anche dall'editor di pagine perché il campo è modificato tramite pipeline 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); 
    } 
} 

Nel vostro cshtml si avrà:

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

John West scrivere su come estendere aiutanti Sitecore qui: risposta @SitecoreClimber 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

Grazie, funziona. Inoltre, voglio solo confermare che i metodi TagField non sono necessari per tutto ciò che riguarda la mia domanda originale, corretto? – MrSnappingTurtle

+0

@MrSnappingTurtle hai ragione il tag non è usato. Se la risposta è corretta, contrassegnarla correttamente. Altri useranno questa risposta in futuro. –

+1

@SitecoreClimber, ho usato ma modificato il codice, poiché avevo bisogno di usarlo per i bambini del corrente elemento di contesto. Risposta modificata qui sotto. – Juri

0

ho modificato, in quanto non lavoro per il rendering di articoli per bambini poiché utilizza l'impostazione predefinita RenderingContext.Current

Così ho aggiornato la vigilia Metodo ry argomenti e ha aggiunto Item item e utilizzate tale elemento per il rendering campo base, in questo modo:

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

Quindi, a mio avviso MVC ora posso avere:

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