Logo Umbraco

Dziś post nieco bardziej techniczny. Wyjaśnię pokrótce wybór Umbraco oraz mojej modyfikacji.

Dlaczego Umbraco?

Od jakiegoś czasu mam przyjemność pracować z tym cms-em w biurze. Jest jednak kilka rzeczy, które zawsze chciałem zrobić nieco inaczej, z wykorzystaniem innych technik. Stąd zrodził się pomysł, by stworzyć bloga w oparciu o tą platformę. Mogę przetestować moje pomysły w praktyce. W Umbraco bardzo łatwo zarządza się zawartością strony z poziomu „Back Office”, a także pod względem implementacji, ten CMS pozostawia bardzo wiele swobody.  Nie chciałem wykorzystywać jakiegoś wielkiego kombajnu, który ma już wszystko, tylko stworzyć system „szyty na miarę”. Umbraco sprawdza się w tej kwestii bardzo dobrze.

Niestety Umbraco „out of the box” nie wspiera silnie typowanych widoków, więc jeśli lubimy porządek w kodzie i widoki pozbawione logiki biznesowej to trzeba coś z tym zrobić. Jest kilka różnych sposobów na to, by mieć silnie typowane widoki w umbraco. Moje rozwiązanie tego problemu jest następujące.

Każdy Document Type, może mieć przypisany Template, który będzie renderował widok. Najprościej jest stworzyć Template (w moim przypadku „Page”) i przypisać do określonej grupy Document typów.

umbraco backoffice

Teraz wystarczy stworzyć Controller który dziedziczy po RenderMvcController i nazwać go [NazwaTemplatu]Contrller. Nadpisać należy metodę Index i za każdym razem gdy ten DocumentType będzie renderowany, Metoda Index będzie wywoływana.

  
    public class PageController : RenderMvcController
    {
        private readonly IPageModelExtender _pageModelExtender;
        private readonly ISectionsProvider _sectionsProvider;

        public PageController(ISectionsProvider sectionsProvider, IPageModelExtender pageModelExtender)
        {
            _pageModelExtender = pageModelExtender;
            _sectionsProvider = sectionsProvider;
        }

        public override ActionResult Index(RenderModel model)
        {
            var allSections = model.Content.Children.ToList();
            var listOfSectionsToRender = _sectionsProvider.GetListOfSectionsToRender(allSections);
            var pageViewModel = new PageViewModel {Sections = listOfSectionsToRender};
            return View("Page", _pageModelExtender.ApplyLayoutToModel(pageViewModel, model.Content));
        }
    }
  

Przy budowie strony, przechodzę przez wszystkie dzieci Tego Noda (konkretnych implementacji Document Typu).

Node tree

 

Dla każdego z nich, odpalany jest odpowiedni SectionBuilder, którego odpowiedzialnością jest pobranie modelu umbraco i zwróceniu View Modelu silnie typowanego oraz wskazanie, który z widoków powinien zostać wykorzystany do zbudowania danej sekcji.

Interfejs ISectionBuilder:

  
    public interface ISectionBuilder
    {
        string ViewName { get; }
        BaseViewModel CreateViewModel(IPublishedContent content);
        bool DeosApply(string documentAlias);

    }
  

Przykładowy Builder:

  
    public class HeaderBuilder : ISectionBuilder
    {
        public string ViewName => "HeaderView";
        public BaseViewModel CreateViewModel(IPublishedContent content)
        {
            return new HeaderViewModel
            {
                TestString = content.GetPropertyValue("testMessage")
            };
        }

        public bool DeosApply(string documentAlias)
        {
            return documentAlias == DocumentTypes.Header;
        }
    }
  

Dzięki temu przypisuję do określonego DocTypu określony builder, a Factory zwraca mi odpowiedni Builder dla danej sekcji strony. Jest to możliwe między innymi dzięki IoC kontenerowi zastosowanemu w projekcie, jednak o tym i o budowie mojej Factory opowiem w następnym poście.

Do zobaczenia wkrótce :)

Data publikacji: 06.03.2017 Ostatnie z kategorii: