Zwróć JSON za pomocą Joomla Framework

11

Zacząłem budować aplikację internetową przy użyciu Joomla Framework . Składa się z prostej strony internetowej, która będzie wyświetlana w ramce iFrame, wraz z interfejsem API, który będzie używany do aktualizacji treści za pomocą AJAX.

Śledziłem Pierwsze kroki z kompozytorem i Joomla! artykuł i uruchom aplikację Framework . Dostosowałem domyślne wyjście HTML do pracy z moją ramką iFrame i zacząłem od API. Użyłem Newsa jako szablonu i stworzyłem kontroler, model, tabelę i widok dla mojego API, które wszystko działa świetnie. Następnie utworzyłem bardzo prosty szablon Twig, który zwraca reprezentację JSON moich danych w następujący sposób:

{{ items|json_encode|raw }}

Jak dotąd tak dobrze, ale otrzymuję ten nagłówek, który spowoduje problemy podczas używania AJAX z jQuery:

Content-Type:text/html; charset=utf-8

Myślałem, że to prosty przypadek dodania tego, ale bez względu na to, gdzie go umieszczę, nie zmienia to zwracanego nagłówka:

$this->app->setHeader('Content-Type', 'application/json', true);

Wiem, że setHeader działa tak, jakbym zmienił nazwę, widzę, że nowy nagłówek został zwrócony, więc zakładam, że zostanie on nadpisany później w trakcie wykonywania.

Więc moje pytanie brzmi: czy zamierzam to zrobić we właściwy sposób? Mój widok rozszerza DefaultHtmlView, co wydaje się błędne, czy powinienem utworzyć DefaultJsonView? Jak ustawić poprawny typ zawartości lub czy istnieje lepsze podejście do zwracania JSON?

Będziemy wdzięczni za wszelkie porady dotyczące najlepszego sposobu wykorzystania Joomla Framework do budowy API.

Joe P.
źródło

Odpowiedzi:

6

W końcu znalazłem „właściwy” sposób na zrobienie tego. Nawet jeśli użyłem sendHeaders, dodawano dodatkowy typ zawartości, który został zwrócony w miarę dodawania później.

Postępowałem zgodnie z kodem, a AbstractWebApplication.php ustawia nagłówki w tej linii:

// Send the content-type header.
$this->setHeader('Content-Type', $this->mimeType . '; charset=' . $this->charSet);

Mogłem więc zdefiniować własny typ mimeType, używając tego w moim kodzie:

$this->app->mimeType = 'application/json';

Teraz zwracany jest prawidłowy nagłówek i jQuery rozumie dane wyjściowe jako JSON!

Joe P.
źródło
3

Trochę kopałem, ale widzę problem

https://github.com/joomla-framework/application/blob/master/src/AbstractWebApplication.php

Jeśli spojrzysz na funkcję setHeader, nie ustawia ona jeszcze nagłówka, tylko „jest gotowa”

To, co musisz zrobić, jest proste

$this->app->setHeader('Content-Type', 'application/json', true)->sendHeaders();

Dodatkową funkcję sendHeaders()można powiązać, aby umożliwić ustawianie nagłówków, a nie tylko ich „przygotowywanie”.

Przy najprawdopodobniej użyciu, exit;aby zapobiec dalszemu wykonaniu i wysłaniu JSON, funkcja sendHeaders najprawdopodobniej nie działa.

Jordan Ramstad
źródło
Dzięki za Twoją sugestię. Niestety, nawet dlaczego użyłem sendHeaders, Content-Type wciąż zaczął być nadpisywany. Próbowałem użyć wyjścia, ale potem nie otrzymałem danych wyjściowych, ponieważ szablon nie został zrenderowany. Znalazłem rozwiązanie, które opublikowałem jako odpowiedź.
Joe P
Cóż, dodam inne rozwiązanie, tak więc moje działa również dla każdego, kto może go potrzebować. Jeśli exitgo użyjesz , powinno to uniemożliwić dalsze działanie i po prostu wypisać go w obecnej postaci. Twoja odpowiedź wydaje się jednak znacznie lepsza.
Jordan Ramstad