Pobieranie Contentu z Umbraco część 1
Ten post będzie pierwszym postem z cyklu jak pobierać
content, który dodaliśmy w Back Office w naszym kodzie C#. Dziś opiszę jak znaleźć
interesujący nas node w contencie umbraco.
Jedną z opcji, którą bardzo często wykorzystuję, jest
pobieranie contentu za pomocą Controllerów. Całą operację przedstawię za pomocą
podstrony, która wyświetla wszystkie posty otagowane danym tekstem. Aby móc
skorzystać z tej metody, musimy stworzyć dowolny Document Type i zapamiętać
jego alias.
Teraz przechodzimy do kodu i tworzymy Controller
dziedziczący po RenderMvcController i nazywamy go [Nasz alias doc typu]Controller
i overridujemy metodę Index
public class TagController : RenderMvcController
{
public override ActionResult Index(RenderModel model)
{
var content = model.Content;
}
}
W parametrze metody, możemy sięgnąć po IPublishedContent
poprzez property o nazwie Content. Z kolei z niego, możemy wyciągnąć wszelkie
inne teksty, bądź dzieci w drzewku contentu, więcej o tym będzie w części
drugiej.
Innym sposobem na dojście do interesującego nas noda w
drzewku, jest pobranie jego rodziców, którzy znajdują się w „korzeniu” i
znalezienie interesujących nas rzeczy np. poprzez Linq. Ja w ten sposób
pobieram wszystkie posty. Przejdźmy więc do kodu. W projekcie umbraco, mamy
możliwość skorzystania z UmbracoHelper-a, który zawiera mnóstwo przydatnych
rzeczy, a także zcachowaną zawartość naszego contentu. Myślę, że dobrym pomysłem będzie stworzenie
klasy, która zawiera statyczną property pobierającą ten Helper z kontekstu
umbraco. To przykład mojej klasy:
public class NodeHelper
{
private static UmbracoHelper _umbracoHelper;
public static UmbracoHelper Umbraco => _umbracoHelper ?? (_umbracoHelper = new UmbracoHelper(UmbracoContext.Current));
}
Po stworzeniu takiej klasy, możemy pobrać Root Node naszego
contentu.
var rootNodes = NodeHelper.Umbraco.TypedContentAtRoot();
Korzystając z metody TypedContentAtRoot, otrzymujemy listę
wszystkich „korzeni” w naszej aplikacji.
Struktura postów w moim projekcie wygląda następująco: Posty
-> Kategoria -> Post
Aby pobrać wszystkie nody zawierające posty, muszę najpierw
w Roocie wybrać te Posty, a z nich wziąć wszystkie dzieci ich dzieci. Spłaszczymy
tym nieco strukturę, pomijając kategorie, a wybierając same artykuły. W kodzie
można to załatwić następująco:
var articlesRootNode = rootNodes.First(x => x.DocumentTypeAlias == "articlesRoot");
var allArticles = articlesRootNode.Children.SelectMany(x => x.Children).ToList();
W zmiennej allArticles, mam listę typu IPublishedContent, z
której mogę wyciągnąć interesujące mnie dane na temat postów. Do pobierania
contenu możemy także wykorzystać ContentService. Nie jest to jednak zalecane,
jeśli chcemy jedynie czytać dane, ponieważ ContentService odpytuje bezpośrednio
bazę danych, a UmbracoHelper, jak już wspomniałem na początku, nie.
To już koniec części pierwszej. W kolejnej opiszę, w jaki
sposób możemy wyciągać teksty i inne properties, które mamy w umbraco, a możemy
je dodać do Document typ-ów.