2016-02-25 37 views
6

Ho una configurazione relativamente semplice in esecuzione utilizzando SilverStripe 3.2.1 con restfulserver addon e utilizzando una varietà di widget associati a una pagina utilizzando the elemental addon.Inclusione dei dati del modello correlato nella richiesta dell'API della pagina

Quando faccio una richiesta GET tramite l'API per recuperare alcuni dei Pagina dati # 1 di, posso vedere l'ElementAreaID associati:

# 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" 
    } 
} 

Se seguo i collegamenti attraverso l'API ElementalArea chiama elencherà tutti gli elementi della mia pagina:

# 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 
    }, 
    ... 
    ] 
} 

E se seguo quei sentieri API servirà i contenuti della versione più recente di ciascuno dei Widget.

La mia domanda è in che modo è possibile includere determinati campi dall'oggetto Widget DataObjects all'interno dell'elenco di campi Pagina originale?

Mi piacerebbe che il campo Contenuto di ogni Widget venga restituito in un array con la richiesta iniziale della pagina API.


Per riferimento:

  • una pagina ha un ElementArea
  • Un ElementArea ha molti Widget s
  • Un Widget contiene contenuti che voglio per il mio Page
+0

Cosa contiene quell'array aggiuntivo? Solo i contenuti? O oggetti, con campo ID Widget, href e Contenuto? – bummzack

+0

Non troppo affollato davvero. In definitiva ho bisogno del Contenuto dei widget nella pagina tramite la tabella pivot di ElementalArea da restituire con la Pagina. –

risposta

2

Preamble: Non sembra che esista attualmente un modo per generare strutture dati di tipo array con il modulo server RESTful (ad eccezione delle relazioni ovviamente). La soluzione proposta è un trucco che abusa dell'output dei formati JSONDataFormatter.

Poiché JSONDataFormatter utilizza forTemplate per eseguire il rendering di un campo prima di convertirlo in JSON, possiamo creare il nostro renderer Object che restituisce una matrice anziché una stringa tramite forTemplate. Questo potrebbe assomigliare a questo:

class FlatJSONDataList extends ViewableData 
{ 
    protected $list; 

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

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

Poi nella tua pagina, dovrebbe essere sufficiente per avere un ulteriore metodo, in questo modo:

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

Quindi è possibile includere WidgetContents nel vostro campo-list per ottenere tutti i widget Content campi in un array:

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

Grazie - Darò questo andare più tardi oggi. Presumo che poiché il Widget stesso non è una relazione di Page (ElementalArea è invece) che non è disponibile nella lista dei campi per Pagina di default? –

+0

@RobbieAverill Sì, sembra che le profondità delle relazioni superiori a un livello non siano ancora implementate, altrimenti qualcosa del genere sarebbe probabilmente un nome di campo valido: "ElementArea.Widgets".Per ora penso che tu sia bloccato con un hack o potresti implementare la tua sottoclasse di 'DataFormatter'. Quest'ultimo significherà che dovrete scrivere più codice, ma è probabilmente meno incline a rompere con un aggiornamento futuro. – bummzack

+0

Grazie - la tua risposta è stata incredibilmente utile. Purtroppo, come risulta che l'addon di Elemental utilizza nomi di campi diversi per diversi tipi di dati, quindi ho dovuto aggiungere una proprietà statica per definire quali campi restituire e fare il ciclo degli elementi recuperando ogni campo prima di formattarlo. Sta funzionando un fascino però - risposta molto utile! –

Problemi correlati