Поверніть JSON за допомогою Joomla Framework


11

Я почав створювати веб-додаток за допомогою Joomla Framework . Він складається з простої веб-сторінки, яка відображатиметься в iFrame разом з API, який буде використовуватися для оновлення вмісту за допомогою AJAX.

Я стежив за початком роботи з композитором та Джомлою! статті та створити та запустити додаток Framework . Я налаштував вихід HTML за замовчуванням, щоб він працював на моєму iFrame, і запустив API. Я використовував Новини як шаблон і створив контролер, модель, таблицю та подання для свого API, який все чудово працює. Потім я створив дуже простий шаблон Twig, який повертає JSON-представлення моїх даних так:

{{ items|json_encode|raw }}

Поки що добре, але я повертаю цей заголовок, який спричинить проблеми при використанні AJAX з jQuery:

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

Я думав, що це буде простий випадок додавання цього, але незалежно від того, куди я його помістив, він не змінює заголовка, який повертається:

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

Я знаю, що setHeader працює так, ніби я змінюю ім'я, я бачу, що новий заголовок повернувся, тому я припускаю, що він буде перезаписаний пізніше під час виконання.

Отже, моє запитання: чи я буду про це правильно? Мій погляд поширюється на DefaultHtmlView, але це не так, чи слід створити DefaultJsonView? Як я можу встановити правильний тип вмісту чи є кращий підхід до повернення JSON?

Будемо дуже вдячні за будь-яку пораду, яка може бути надана щодо найкращого способу використання рамки Joomla для створення API.

Відповіді:


6

Нарешті я знайшов те, що здається "правильним" способом цього зробити. Навіть якщо я використовував sendHeaders, був доданий додатковий тип вмісту, який повернувся так, як був доданий пізніше.

Я слідував за кодом, а AbstractWebApplication.php встановлює заголовки з цим рядком:

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

Тож я зміг визначити свій власний mimeType, використовуючи це у своєму коді:

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

Тепер правильний заголовок повертається, а jQuery розуміє вихід як JSON!


3

Трохи копав, але я бачу проблему

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

Якщо ви подивитеся на функцію setHeader, вона фактично ще не встановила заголовок, а лише отримає "готовий"

Отже, що вам потрібно зробити, це просто

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

Додаткова функція sendHeaders()може бути ланцюговою, щоб дозволити встановлювати заголовки, а не просто "готувати" їх.

Імовірно, використовуючи exit;для запобігання подальшому виконанню та виведенню JSON, функція sendHeaders, швидше за все, не працює.


Дякуємо за вашу пропозицію. На жаль, навіть якщо я використовував sendHeaders, тип вмісту все ще починався перезаписувати. Я спробував використовувати вихід, але тоді я не отримав вихід, оскільки шаблон не виводився. Я знайшов рішення, яке розмістив як відповідь.
Джо Р

Ну я додам ще одне рішення, так що моя працює також для тих, хто може знадобитися. Якщо ви користуєтесь exitним, ви повинні запобігти запусканню чогось іншого та просто вивести його таким, як є зараз. Ваша відповідь здається набагато кращою.
Йордан Рамстад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.