Orchard: il current menu item

13 lug 2012 14:29

In orcharditalia.net abbiamo deciso di mettere in risalto la pagina dedicata al concetto di CMS inserendone il link direttamente nella barra di menu. L’articolo dedicato al CMS si trova nella sezione WebMaster, anch’essa collegata al menu. L’attuale implementazione della barra di navigazione evidenziava pertanto come correnti due voci del menu contemporaneamente:

Problema current item

Tramite Shape Tracing abbiamo individuato il file che si occupa del rendering degli elementi del menu:

Shape tracing

Questo codice viene richiamato per ogni voce del menu e verifica se il percorso del link corrisponde a quello della pagina corrente:

if (!HasText(Model.Text)) {
     @DisplayChildren(Model)
} else {
     string requestUrl = Request.Path.Replace(Request.ApplicationPath, string.Empty).TrimEnd('/').ToUpperInvariant();
     string modelUrl = Model.Href.Replace(Request.ApplicationPath, string.Empty).TrimEnd('/').ToUpperInvariant();
     if ((!string.IsNullOrEmpty(modelUrl) && requestUrl.StartsWith(modelUrl)) || requestUrl == modelUrl) {
      Model.Classes.Add("current");
     }
     var tag = Tag(Model, "li");
     @tag.StartElement
     <a href="@Model.Href">@Model.Text</a>

     if (items.Any()) {
         <ul>
         @DisplayChildren(Model)
         </ul>
     }
     @tag.EndElement
}

Tra le possibili soluzioni quella che abbiamo scelto richiede il salvataggio di un flag in una variabile disponibile solo sulla richiesta in corso: il disegno della pagina e l’esecuzione della shape del menu avviene ovviamente all’interno della medesima richiesta. Ecco il risultato:

if (HttpContext.Current.Items["CurrentMenu"] == null)
{
      Model.Classes.Add("current");
      HttpContext.Current.Items["CurrentMenu"] = true;
}

Tag: Orchard