Kembalikan JSON menggunakan Kerangka Joomla

11

Saya sudah mulai membangun aplikasi web menggunakan Kerangka Joomla . Ini terdiri dari halaman web sederhana yang akan ditampilkan dalam iFrame bersama dengan API yang akan digunakan untuk memperbarui konten dengan AJAX.

Saya mengikuti Memulai dengan Komposer dan Joomla! artikel dan memiliki Aplikasi Kerangka dan berjalan. Saya telah mengubahsuaikan output HTML default agar berfungsi untuk iFrame saya dan telah memulai API. Saya menggunakan Berita sebagai templat dan membuat pengontrol, model, tabel, dan tampilan untuk API saya yang semuanya berfungsi dengan baik. Saya kemudian membuat templat ranting yang sangat sederhana yang mengembalikan representasi JSON dari data saya seperti ini:

{{ items|json_encode|raw }}

Sejauh ini bagus tapi saya mendapatkan header ini kembali yang akan menyebabkan masalah saat menggunakan AJAX dengan jQuery:

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

Saya pikir ini akan menjadi kasus sederhana untuk menambahkan ini tetapi di mana pun saya meletakkannya, itu tidak mengubah header yang dikembalikan:

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

Saya tahu bahwa setHeader berfungsi seolah-olah saya mengubah nama, saya melihat header baru kembali jadi saya berasumsi bahwa itu sedang ditimpa nanti dalam eksekusi.

Jadi pertanyaan saya adalah, apakah saya akan melakukan ini dengan cara yang benar? Tampilan saya memperluas DefaultHtmlView yang terasa salah, haruskah saya membuat DefaultJsonView? Bagaimana saya bisa menetapkan Tipe Konten yang benar atau apakah ada pendekatan yang lebih baik untuk mengembalikan JSON?

Setiap bantuan saran yang dapat diberikan tentang cara terbaik untuk menggunakan Kerangka Joomla untuk membangun API akan sangat dihargai.

Joe P.
sumber

Jawaban:

6

Saya akhirnya menemukan apa yang tampaknya menjadi cara yang "benar" untuk melakukan ini. Bahkan jika saya menggunakan sendHeaders, Content-Type tambahan sedang ditambahkan dan itu dikembalikan seperti yang ditambahkan kemudian.

Saya mengikuti kode dan AbstractWebApplication.php menetapkan header dengan baris ini:

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

Jadi saya bisa mendefinisikan mimeType saya sendiri dengan menggunakan ini dalam kode saya:

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

Sekarang header yang benar akan dikembalikan dan jQuery memahami output sebagai JSON!

Joe P.
sumber
3

Butuh sedikit menggali tetapi saya melihat masalah

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

Jika Anda melihat fungsi setHeader itu belum benar-benar mengatur header, itu hanya membuatnya "siap"

Jadi yang perlu Anda lakukan adalah sederhana

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

Fungsi ekstra sendHeaders()dapat dirantai untuk memungkinkan Anda mengatur tajuk, bukan hanya "mempersiapkan" mereka.

Dengan kemungkinan besar menggunakan exit;untuk mencegah eksekusi lebih lanjut dan output JSON fungsi sendHeaders kemungkinan besar tidak berjalan.

Jordan Ramstad
sumber
Terima kasih atas saran Anda. Sayangnya, bahkan mengapa saya menggunakan sendHeaders, Content-Type masih mulai ditimpa. Saya mencoba menggunakan exit tetapi kemudian saya tidak mendapatkan hasil karena template belum ditampilkan. Saya menemukan solusi yang saya posting sebagai jawaban.
Joe P
Yah saya akan menambahkan solusi lain, supaya milik saya bekerja juga untuk siapa pun yang membutuhkannya. Jika Anda menggunakannya exitharus mencegah hal lain dari berjalan dan hanya output seperti saat ini. Jawaban Anda tampaknya jauh lebih baik.
Jordan Ramstad