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

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ń