2012-09-10 13 views
7

Antecedentes: quiero evitar crear un diseño alternativo para mi página de inicio y me gustaría mantener el "The Theme" Machine "zonas y diseño junto a intacto, y en realidad" tema "la mayoría de todo usando CSS puro. Por lo tanto, debo dirigir selectivamente CSS a "páginas" específicas, incluida, y lo más importante, la página de inicio. La forma más sencilla de hacer eso sería agregar una clase al "div" del envoltorio de diseño que envuelve todo el diseño. Podría agregar una clase al elemento "cuerpo" anulando el archivo Document.cshtml, pero realmente creo que es más sencillo trabajar dentro del archivo Layout.chstml y aprovechar las Model.Classes para agregar las clases CSS necesarias al etiqueta de "apertura".Cómo agregar una clase a layout-wrapper en Orchard CMS basado en la página actual y/o página de inicio

estoy actualmente haciendo algo como esto:

string area = Model.DesignatedAreaField; 
Model.Classes.Add(string.IsNullOrWhiteSpace(area) ? "home" : area); 

Model.Id = "layout-wrapper"; 
var tag = Tag(Model, "div"); // using Tag so the layout div gets the classes, id and other attributes added to the Model 

Sé que el Area no se corte, debido a que la página de inicio y otras páginas están todos en la misma área, y Model.DesignatedAreaField realidad devuelve un vacío cadena para la página de inicio u otras páginas. Así que, al final, el código anterior generará SIEMPRE el siguiente marcado (que estoy mostrando los 3 tripels en la página principal):

<div class="home tripel-123" id="layout-wrapper"> 

Me gustaría ser capaz de añadir la "casa" única clase CSS cuando se muestra la página de inicio. Algunos pseudo-código sería el siguiente:

string wrapperCss = IsHomepage ? 'home' : Model.GetUrlPathOrSomethingUniqueForThePath(); 
Model.Classes.Add(wrapperCss); 

Esto me permitirá, por ejemplo, hacer que el contenido principal de reducir el tamaño y flotan hacia la derecha, y la puso a los tripels a su izquierda (que es la forma en que el diseño de la página de inicio debería parecer, pero no quiero escribir un diseño completamente diferente para el hogar si pudiera hacer lo mismo con CSS simple y específico).

ACTUALIZACIÓN: El cableado hasta la respuesta de Bertrand

respuesta de Bertrand me permitió añadir una clase a la DIV envoltura dependiendo de la URL. No mencionó que (ya Orchard es una segunda naturaleza para él :-) pero tendrá que añadir un incluirse en el archivo Layout.cshtml y cambiar "mi" código en consecuencia:

@using Orchard.Utility.Extensions; 
{ 
/* omitted for brevity, everything in between is the same as in the Theme's Machine layout file */ 

string area = WorkContext.HttpContext.Request.Path.HtmlClassify(); 
area = string.IsNullOrWhiteSpace(area) ? "home" : area; 
Model.Classes.Add("url-" + area); 

El resultado es la siguiente clase se añade a la div que encierra:

1) Cuando la página se muestra:

<div class="url-orchard-local- tripel-123" id="layout-wrapper"> 

2) Cuando una página llamada, recibirá los productos mostrados:

<div class="url-orchard-local-products" id="layout-wrapper"> 

Mi URL se lee como esto en mi máquina dev, se ejecuta dentro de servidor web de Visual Studio:

http://localhost:30320/OrchardLocal/ or 
http://localhost:30320/OrchardLocal/Products 

no estoy apostando mi vida, pero creo firmemente que la parte "OrchardLocal" va a cambiar en la producción una vez que se se publica, permítanme decir, a los servidores de Azure ...Así que he preemptivelly cambiar el código para esto:

string area = WorkContext.HttpContext.Request.Path.HtmlClassify(); 
if (area.LastOrDefault() == '-') { 
    area = "home"; 
} 
Model.Classes.Add("url-" + area); 

lo que se traduce en esta clase cuando la "página de inicio" se muestra:

<div class="url-home tripel-123" id="layout-wrapper"> 

(En realidad, yo he hecho el código por encima de un uno liner abusing algunos ternarios mezclados con operadores lambda :-)

Estoy inferir que la única vez que HtmlClassify devolverá una "clase" que termina con '-' es cuando es la página de inicio ... O la "raíz" para el sitio ... ¡Puedo estar equivocado! :-)

(De todos modos yo soy amante de la huerta más que cualquier cosa que he usado en el último par de años que no sean NHibernate, pero, bueno, Orchard utiliza también! Perfecto!)

+1

Cambié la primera línea a string area = WorkContext.HttpContext.Request.Path.Substring (1) .HtmlClassify(); Creo que puede haber incluido el corte inicial, así que fue obtener una doble carrera después de la url – George

Respuesta

7

Algo como esto debe hacer el truco:

Model.Classes.Add("url-" + WorkContext.HttpContext.Request.Path.HtmlClassify()) 
+0

Hola Bertrand, esto funcionó, gracias! Como uso Orchard solo hace 2 días, sé muy poco de él, así que tuve que buscar Find in files para buscar HtmlClassify y ver qué contenido era necesario (@utilizando Orchard.Utility.Extensions;). Aparte de eso, el resultado fue este para la página de inicio: class = "url-orchard-local-tripel-123" y esto para una página llamada Produtos: class = "url-orchard-local-". Mi URL, que se ejecuta en VS WebServer lee/OrchardLocal ... Estoy infiriendo que va a cambiar en la producción, voy a actualizar mi pregunta con lo que estoy haciendo hasta ahora para tratar de determinar si es la página de inicio, o no. .. – Loudenvier

+1

Es por eso que siempre recomiendo que su servidor de desarrollo local esté en la misma configuración que su servidor de producción. Esto puede ser pirateado utilizando la configuración del sitio que configura la url base, pero hay otros problemas para tener una configuración diferente en el desarrollador, por ejemplo, enlaces y URL multimedia en contenido enriquecido. –

+0

El otro día he pasado 22 horas trabajando directamente en una demostración para ventas usando ASP.NET MVC. Comenzó el domingo, y para el lunes, 3 PM, el sitio se subió solo para tener todas las imágenes (y algunas secuencias de comandos) desaparecidas ... El vendedor (y el dueño de la empresa) estaba frente al cliente esperando mi llamada a present the demo ... y no estaba trabajando en producción ... Estaba completamente somnoliento en este momento, y me tomó unos pocos minutos desesperados para descubrir y cambiar todo para usar Url.Content (era uno de mis primero ASP.NET MVC funciona ...). Configuración de producción = ¡La configuración del desarrollador es SABIDURÍA! :-) – Loudenvier

0

Aquí está una manera de hacer esto con los métodos de extensión:

public static string GetPageCssClass(this WorkContext workContext) 
{ 
    string pageUrl = workContext.HttpContext.Request.Url.ToString(); 
    string baseUrl = workContext.CurrentSite.BaseUrl; //use BaseUrl to later get app relative page path 

    string pageClass = workContext.IsHomePage() 
     ? "home" 
     : pageUrl.Substring(baseUrl.Length).HtmlClassify(); 

    return string.Format("{0}-page", pageClass); 
} 

public static bool IsHomePage(this WorkContext workContext) 
{ 
    string pageUrl = workContext.HttpContext.Request.Url.ToString().TrimEnd('/'); 
    string baseUrl = workContext.CurrentSite.BaseUrl.TrimEnd('/'); 

    return pageUrl == baseUrl; 
} 

Tenga en cuenta que esta base los nombres de las clases relativas a su BaseUrl establecido en la configuración del sitio de manera sho Uld trabaja localmente o en producción siempre que su BaseUrl esté configurado para su entorno actual.

A continuación, sólo tiene que añadir una declaración utilizando a la vista para el espacio de nombres de la clase de método de extensión y luego:

Model.Classes.Add(WorkContext.GetPageCssClass()); 

Otra opción aquí es añadir una clase css para cada capa que se encuentra actualmente active el siguiente método de extensión agregará una lista de clases {xxx} -layer css a su página. Aquí hay otra pregunta relacionada: Orchard CMS: Conditional CSS Class based on Layer

Cuestiones relacionadas