2011-06-27 14 views
6

Escribo un tema de Orchard y me gustaría poder localizar algunos de los recursos que se incluyen con el tema (images/swfs, etc.).Cómo encontrar recursos en Orchard

¿Cuál es la mejor manera de hacerlo?

He echado un vistazo a los archivos de ResourceManifest, utilizando builder.Add.DefineResource, pero parece que no puedo encontrarlo en la vista. ¿O acabo de poner la ruta completa?

¿Alguna pista?

Saludos Carl

+0

lo que tengo entendido que sólo se utilizaría builder.Add.DefineResource si quería hacer que los recursos disponibles a otros módulos. ¿Simplemente hace referencia al contenido de su tema o intenta que el contenido esté disponible para otros temas/módulos? – mdm

+0

Solo estoy buscando referencia en el tema/módulo actual. – Carl

Respuesta

2

En hojas de estilo, se debe utilizar rutas relativas (de la trayectoria de hoja de estilo).

En las vistas, debe usar Url.Content.

6

Si es necesario definir el nuevo recurso (secuencia de comandos u hoja de estilo):

  1. crear una clase que hereda IResourceManifestProvider
  2. Proporcionar los BuildManifests void (ResourceManifestBuilder constructor) método y
  3. Agregar todos los recursos necesarios a través de builder.Add(). DefineStyle ("") o builder.Add(). DefineScript (...), tal como lo anotó en su pregunta.

Por ejemplo:

public class ResourceManifest : IResourceManifestProvider { 
    public void BuildManifests(ResourceManifestBuilder builder) { 
     var manifest = builder.Add(); 
     manifest.DefineStyle("MyStyle").SetUrl("mystyle.css"); 
     manifest.DefineScript("MyScript").SetUrl("myscript.js").SetDependencies("jQuery"); 
    } 
} 

Esto define un estilo y la escritura se puede reutilizar en sus puntos de vista. Las URL son relativas a/Estilos (o/Scripts) carpetas en su tema/módulo donde se encuentra la clase.

Si desea volver a utilizar algunos de los recursos ya definidos (en todos los módulos y temas habilitados), es tan fácil como escribir por ejemplo .:

... 
@{ 
    Style.Require("MyStyle").AtHead(); 
    Script.Require("MyScript").AtFoot(); 
} 
... 

dentro de su archivo de vista .cshtml. El ejemplo anterior inyectaría mystyle.css y myscript.js en las ubicaciones apropiadas (encabezado/pie de página final).

+0

Hola, gracias por esto. Lamentablemente, estaba buscando recursos que no fueran styles o scripts :) y poder colocarlos arbitrariamente en la vista. – Carl

5

me dio una palmada en conjunto un método de extensión para un problema similar:

public static string ResourceUrl(this HtmlHelper helper, string resourceType, string resourceName) 
{ 
    var manager = helper.Resolve<IResourceManager>(); 
    var settings = new RequireSettings { Type = resourceType, Name = resourceName, BasePath = resourceType }; 
    var resource = manager.FindResource(settings); 
    var context = new ResourceRequiredContext { Resource = resource, Settings = settings }; 

    var url = context.GetResourceUrl(settings, "/"); 

    return url; 
} 

Recursos Manifiesto Definición:

manifest.DefineResource("Content", "MyImage").SetUrl("Content/myimage.png"); 

Ver uso:

@Html.ResourceUrl("Content", "MyImage") 

No está bien probado, y podría probablemente use algún tipo de manejo de errores, pero funciona para mí.

3

Para que quede claro, hay algunos métodos que dependen de su situación. Esbozaré el más común que sé.

En primer lugar, está la inclusión de un script externo o una hoja de estilo en su pieza o tema en particular. La sintaxis estándar dentro de una plantilla de afeitar es la siguiente:

@Style.Include("YourPartEdit") 
@Script.Require("jQuery") 
@Script.Include("YourPartEdit") 

los archivos de inclusión buscarán ese recurso específico de la carpeta Style o Scripts correspondiente: para @Script.Include("YourPartEdit"), que se verá en la carpeta de guiones para YourPartEdit.js.

Es posible que haya notado que con Script.Require puede registrar una biblioteca con Orchard (en este caso, la registrada es jQuery), y hacer que un módulo requiera esa secuencia de comandos en particular.

Para ello, crea su propia implementación de la interfaz IResourceManifestProvider, e implementa el método BuildManifests(ResourceManifestBuilder builder) y crea un recurso con nombre. Puede usar .AtFoot() o .AtHead() para apuntar donde va a ir.

Ahora diga que quiere hacer referencia a una imagen en particular, y quiere usar Razor para apuntar siempre a la imagen correcta Url. Ante todo recomiendo colocar la imagen en la carpeta de Content para su tema (suponiendo que se trata de un tema relacionado con la imagen), y que va a hacer algo en este sentido:

<img [email protected](Html.ThemePath(WorkContext.CurrentTheme, "/Content/your-logo.png")) /> 

Ahora, decir que esto es en su Layout.cshtml página: ahora servirá con éxito la imagen en cualquier parte del sitio.

Estas técnicas particulares deberían dar cuenta de una multitud de situaciones.

Cuestiones relacionadas