जूमला फ्रेमवर्क का उपयोग करके JSON लौटाएं


11

मैंने जूमला फ्रेमवर्क का उपयोग करके एक वेब एप्लिकेशन का निर्माण शुरू कर दिया है । इसमें एक साधारण वेब पेज होता है, जो कि iFrame में एपीआई के साथ प्रदर्शित होता है जिसका उपयोग AJAX के साथ सामग्री को अपडेट करने के लिए किया जाएगा।

मैंने संगीतकार और जुमला के साथ शुरुआत की! लेख और फ्रेमवर्क ऐप अप और रनिंग है। मैंने अपने iFrame के लिए काम करने के लिए डिफ़ॉल्ट HTML आउटपुट को अनुकूलित किया है और एपीआई पर एक शुरुआत की है। मैंने समाचार को एक टेम्पलेट के रूप में उपयोग किया और अपने एपीआई के लिए एक नियंत्रक, मॉडल, तालिका और दृश्य बनाया जो सभी महान काम करता है। मैंने तब एक बहुत ही सरल टहनी टेम्पलेट बनाया, जो इस तरह से मेरे डेटा का 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 को वापस करने के लिए एक बेहतर तरीका है?

सलाह की कोई भी मदद जो एपीआई बनाने के लिए जूमला फ्रेमवर्क का उपयोग करने के सर्वोत्तम तरीके के बारे में दी जा सकती है, की बहुत सराहना की जाएगी।

जवाबों:


6

मैंने अंत में पाया कि ऐसा करने का "सही" तरीका क्या है। यहां तक ​​कि अगर मैं सेंडहेडर्स का उपयोग करता था, तो अतिरिक्त सामग्री-प्रकार जोड़ा जा रहा था और जो बाद में जोड़ा गया था, वह वापस मिल गया।

मैंने कोड के माध्यम से पीछा किया और AbstractWebApplication.php इस लाइन के साथ हेडर सेट करता है:

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

इसलिए मैं अपने कोड में इसका उपयोग करके अपने स्वयं के माइम टाइप को परिभाषित करने में सक्षम था:

$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;किसी भी आगे निष्पादन को रोकने और जेएसएन सेंडहेडर्स फ़ंक्शन को आउटपुट करने की संभावना के साथ सबसे अधिक संभावना है कि यह नहीं चल रहा है।


तुम्हारे सुझाव के लिए धन्यवाद। दुर्भाग्य से, यहां तक ​​कि मैंने SendHeaders का उपयोग क्यों किया, सामग्री-प्रकार अभी भी ओवरराइट किया गया था। मैंने बाहर निकलने का उपयोग करने की कोशिश की, लेकिन फिर मुझे कोई आउटपुट नहीं मिला क्योंकि टेम्पलेट प्रदान नहीं किया गया था। मुझे एक समाधान मिला जो मैंने उत्तर के रूप में पोस्ट किया था।
जो पी

ठीक है, मैं एक और समाधान जोड़ूंगा, बस इतना मेरा काम करता है जो किसी को भी इसकी आवश्यकता हो सकती है। यदि आप इसका उपयोग करते हैं, तो exitइसे चलाने से अधिक कुछ भी रोकना चाहिए और वर्तमान में जैसा कि वर्तमान में है, इसे आउटपुट करें। आपका उत्तर हालांकि बहुत बेहतर लगता है।
जॉर्डन रामस्टाड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.