2016-02-25 25 views
6

Mam stosunkowo prostą konfigurację, działającą przy użyciu SilverStripe 3.2.1 z restfulserver addon i przy użyciu różnych widżetów powiązanych z jedną stroną przy użyciu the elemental addon.Łącznie z powiązanymi danymi modelu w żądaniu interfejsu API strony

Kiedy uczynić żądanie GET za pośrednictwem interfejsu API, aby pobrać niektóre strony danych nr 1, można widzę powiązanych ElementAreaID:

# GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,ElementArea 
{ 
    "Title": "Welcome", 
    "URLSegment": "home", 
    "Content": "A bunch of HTML here from all the widgets in the page...", 
    "ElementArea": { 
    "className": "ElementalArea", 
    "href": "http://ss.local:3000/api/v1/ElementalArea/11.json", 
    "id": "11" 
    } 
} 

Gdybym się linki za pośrednictwem interfejsu API ElementalArea połączeń będzie się lista wszystkie elementy w mojej strony:

# GET /api/v1/ElementalArea/11.json 
{ 
    "ID": "11", 
    "Widgets": [ 
    { 
     "className": "Widget", 
     "href": "http://ss.local:3000/api/v1/Widget/9.json", 
     "id": 9 
    }, 
    { 
     "className": "Widget", 
     "href": "http://ss.local:3000/api/v1/Widget/8.json", 
     "id": 8 
    }, 
    ... 
    ] 
} 

A jeśli śledzę tych ścieżek API będzie służyć do zawartości najnowszej wersji każdego z widżetów.

Moje pytanie brzmi: Jak mogę dołączyć pewne pola z Widget DataObjects w obrębie oryginalnej listy pól Strona?

Chciałbym idealnie mieć pole treści z każdego widgetu być zwrócone w tablicy z pierwotnego wniosku Page API.


Dla porównania:

  • strona zawiera jeden ElementArea
  • ElementArea ma wiele Widget s
  • Widget zawiera treści, które chcę dla mojej Page
+0

Co zawiera ta dodatkowa tablica? Tylko zawartość? Lub obiekty, z widżetem-identyfikatorem, href i treścią pola? – bummzack

+0

Niezbyt zafascynowany. Ostatecznie potrzebuję treści z widżetów na stronie za pośrednictwem tabeli przestawnej ElementalArea do zwrócenia wraz ze stroną. –

Odpowiedz

2

Preamble: Wygląda na to, że obecnie nie ma sposobu na wyprowadzanie danych przypominających tablicę z modułem serwera RESTful (z wyjątkiem oczywiście relacji). Proponowane rozwiązanie to hack, który nadużywa formatów wyjściowych.

Ponieważ używa do renderowania pola przed przekształceniem go w JSON, możemy stworzyć własny renderer obiektów, który zwraca tablicę zamiast ciągu znaków przez forTemplate. Może to wyglądać tak:

class FlatJSONDataList extends ViewableData 
{ 
    protected $list; 

    public function __construct(array $list) 
    { 
     parent::__construct(); 
     $this->list = $list; 
    } 

    public function forTemplate() 
    { 
     return $this->list; 
    } 
} 

Następnie na swojej stronie, powinna być wystarczająca, aby mieć dodatkowy sposób, jak w przykładzie:

public function getWidgetContents() 
{ 
    return FlatJSONDataList::create(
     $this->ElementArea()->Widgets()->column('Content') 
    ); 
} 

Następnie można dołączyć WidgetContents w pola listy, aby uzyskać wszystkie pola widżetu Content w tablicy:

GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,WidgetContents 
+0

Dzięki - oddam to dzisiaj. Zakładam, że ponieważ sam widżet nie jest relacją strony (ElementalArea jest zamiast tego), że nie jest on domyślnie dostępny na liście pól dla strony? –

+0

@RobbieAverill Tak, wydaje się, że relacje głębokości większe niż jeden poziom nie są jeszcze zaimplementowane, w przeciwnym razie coś takiego prawdopodobnie byłby poprawną nazwą pola: 'ElementArea.Widgets'.Na razie myślę, że utknąłeś z hackowaniem lub możesz zaimplementować własną podklasę 'DataFormatter'. To ostatnie oznacza, że ​​będziesz musiał napisać więcej kodu, ale prawdopodobnie będzie mniej podatny na zerwanie z przyszłą aktualizacją. – bummzack

+0

Dzięki - Twoja odpowiedź była niezwykle pomocna. Niestety, jak się okazało, Elemental Addon używa różnych nazw pól dla różnych typów danych, więc musiałem dodać właściwość statyczną, aby zdefiniować, które pola powrócić i zapętlić elementy pobierające każde pole przed jego sformatowaniem. Działa jednak uroczo - bardzo pomocna odpowiedź! –