2011-06-27 15 views
6

Piszę motyw Orchard, i chciałbym móc zlokalizować niektóre zasoby w komplecie z tematem (images/swfs itp.).Jak zlokalizować zasoby w Orchard

Jaki jest najlepszy sposób na zrobienie tego?

Przeglądam pliki ResourceManifest, używając builder.Add.DefineResource, ale nie mogę znaleźć tego odpowiednika w widoku. Czy mogę po prostu umieścić pełną ścieżkę?

Jakieś wskazówki?

zdrowie Carl

+0

Jak rozumiem byłoby użyć tylko builder.Add.DefineResource jeśli chce udostępnić zasoby do innych modułów. Czy odwołujesz się do treści w swoim motywie, czy próbujesz udostępnić treść innym tematom/modułom? – mdm

+0

Szukam tylko odniesienia do bieżącego tematu/modułu. – Carl

Odpowiedz

2

w arkuszach, należy stosować w stosunku ścieżki (od drogi arkusza stylów).

W widokach należy użyć Url.Content.

6

Jeśli trzeba zdefiniować nowy zasób (skrypt lub arkusz stylów):

  1. Tworzenie klasy dziedziczenie IResourceManifestProvider
  2. Podaj void BuildManifests (ResourceManifestBuilder producenta) sposób i
  3. Dodaj wszystkie niezbędne zasoby poprzez builder.Add(). DefineStyle ("") lub builder.Add(). DefineScript (...), tak jak zauważyłeś w swoim pytaniu.

Na przykład:

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

ta określa jeden styl i skrypt można ponownie wykorzystać w swoich poglądów. Adresy URL odnoszą się do folderów/Styles (lub/Scripts) w kompozycji/module, w którym znajduje się klasa.

Jeśli chcesz ponownie użyć niektórych zasobów już zdefiniowane (we wszystkich aktywnych modułów i tematów), jest to tak proste jak pisanie np .:

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

wewnątrz widoku plików .cshtml. Powyższy przykład wprowadziłby mystyle.css i myscript.js w odpowiednich lokalizacjach (nagłówek/stopka ostatniej strony).

+0

Cześć - dziękuję za to. Niestety byłem po zasobach, które nie były stylami lub skryptami :) i mogłem dowolnie je umieszczać w widoku. – Carl

5

I uderzył razem metodę rozszerzenia dla podobnego problemu:

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

zasobów Oczywisty definicja:

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

Zobacz Zastosowanie:

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

To nie jest dobrze przetestowany i może prawdopodobnie używam obsługi błędów, ale działa dla mnie.

3

Dla jasności, istnieje kilka metod w zależności od sytuacji. Przedstawię najczęstsze, jakie znam.

Przede wszystkim należy dołączyć zewnętrzny skrypt lub arkusz stylów do określonej części lub motywu. Standardowa składnia w szablonie Razor to:

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

include pliki będą wyglądać dla danego zasobu w odpowiedniej Style lub Scripts folderu: dla @Script.Include("YourPartEdit"), będzie to wyglądać w folderze skrypty dla YourPartEdit.js.

Być może zauważyłeś, że dzięki Script.Require możesz zarejestrować bibliotekę w Orchard (w tym przypadku zarejestrowana to jQuery) i spowodować, że moduł wymaga tego konkretnego skryptu.

W tym celu należy utworzyć własną implementację interfejsu IResourceManifestProvider i zaimplementować metodę BuildManifests(ResourceManifestBuilder builder) i utworzyć nazwany zasób. Możesz użyć .AtFoot() lub .AtHead(), aby nawet celować w to miejsce.

Teraz powiedz, że chcesz odwołać się do konkretnego obrazu, a chcesz używać Razor, aby zawsze wskazywał poprawny URL obrazu. Przede wszystkim polecam umieszczenie obrazu w folderze Content do tematu (zakładając, że jest to związane z tematem obrazu), i zrobisz coś wzdłuż tych linii:

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

teraz powiedzieć to na własną Layout.cshtml stronę - z powodzeniem wyświetlisz obraz w dowolnym miejscu na stronie.

Te szczególne techniki powinny uwzględniać wiele sytuacji.