ส่งคืน JSON โดยใช้ Joomla Framework


11

ฉันได้เริ่มต้นการสร้างโปรแกรมประยุกต์บนเว็บโดยใช้Joomla กรอบ ประกอบด้วยเว็บเพจที่เรียบง่ายซึ่งจะแสดงใน iFrame พร้อมกับ API ที่จะใช้ในการอัปเดตเนื้อหาด้วย AJAX

ฉันติดตามการเริ่มต้นใช้งานนักแต่งเพลงและ Joomla! บทความและให้แอป Frameworkทำงานและรันอยู่ ฉันได้ปรับแต่งการแสดงผล HTML เริ่มต้นให้ทำงานกับ iFrame ของฉันและได้เริ่มต้นกับ API แล้ว ฉันใช้ News เป็นเทมเพลตและสร้างคอนโทรลเลอร์โมเดลตารางและมุมมองสำหรับ 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 Framework เพื่อสร้าง 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/AbstractWebApplication.php

หากคุณดูที่ฟังก์ชั่น setHeader มันยังไม่ได้ตั้งค่าส่วนหัวจริง ๆ มันจะทำให้ "พร้อม" เท่านั้น

ดังนั้นสิ่งที่คุณต้องทำคือง่าย

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

ฟังก์ชั่นพิเศษsendHeaders()สามารถถูกล่ามโซ่เพื่อให้คุณสามารถตั้งค่าส่วนหัวไม่เพียงแค่ "เตรียม" พวกเขา

ด้วยความเป็นไปได้ที่จะใช้exit;เพื่อป้องกันการดำเนินการใด ๆ และส่งออกมากขึ้น JSON ฟังก์ชั่น sendHeaders มีแนวโน้มที่จะไม่ทำงาน


ขอบคุณสำหรับคำแนะนำของคุณ น่าเสียดายแม้ว่าฉันจะใช้ sendHeaders แต่ทำไม Content-Type ก็ยังคงถูกเขียนทับ ฉันพยายามใช้ exit แต่ไม่ได้ผลลัพธ์เนื่องจากเทมเพลตไม่ได้แสดงผล ฉันพบโซลูชันที่ฉันโพสต์เป็นคำตอบ
Joe P

ฉันจะเพิ่มวิธีแก้ไขปัญหาอื่นเพื่อให้งานของฉันดีขึ้นสำหรับใครก็ตามที่ต้องการมัน หากคุณใช้exitมันควรป้องกันสิ่งใด ๆ เพิ่มเติมจากการทำงานและเพียงแค่ออกมันตามที่เป็นอยู่ในปัจจุบัน คำตอบของคุณดูเหมือนจะดีกว่ามาก
Jordan Ramstad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.