poniedziałek, 6 marca 2017

Dlaczego 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 Template


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).

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 :)

5 komentarzy:

  1. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  2. Cześć, super, że piszesz o Umbraco, trzymam kciuki :) Co do silnie typowanych widoków to już od jakiegoś czasu można w Umbraco korzsystać z wbudowanego ModelsBuildera, chociaż ja na przykład preferuję Ditto, rzuć okiem na ten artykuł http://blog.aabech.no/archive/comparing-modelsbuilder-and-ditto/

    OdpowiedzUsuń
    Odpowiedzi
    1. W sumie to zrobiłem moje model buildery w bardzo podobnym stylu co Dito :) Mam na myśli, ze na wejściu dostaję IPublishContent i wyciągam sobie z niego wszystko co potrzebuję by wypełnić model a do samego widoku przekazuję "czysty" model :) Dzięki za link, przeczytałem oba artykuły (na początku podlinkowanego był link go "ModelsBuilder"). Pozostanę jednak przy tej koncepcji co mam bo już tak jakby zaplanowałem sobie wszystko a jako że sam sposób tworzenia tych modeli jest bardzo podobny to pozostanę przy swoim. Dzięki za kciuki, mam nadzieję że wytrwam ;)

      Usuń
  3. Będę zaglądał co jakiś czas, żeby Cię motywować :) zapraszam również do siebie https://blog.polarbits.co/2017/03/06/pl-dsp-2017-projekt-aggregator-zaczynamy/

    OdpowiedzUsuń
    Odpowiedzi
    1. Zajrzałem, i też już zostawiłem ślad ;)

      Usuń