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.
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.GetPropertyValueDzię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.("testMessage") }; } public bool DeosApply(string documentAlias) { return documentAlias == DocumentTypes.Header; } }
Do zobaczenia wkrótce :)
Ten komentarz został usunięty przez autora.
OdpowiedzUsuń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ń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ń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ńZajrzałem, i też już zostawiłem ślad ;)
Usuń