2010-06-01 6 views
18

सिम्फनी में, मैं एक एक्शन कॉल करता हूं और मैं चाहता हूं कि यह जेसन को jQuery फ्रंटेंड पर वापस कर दे।सिमफोनी में AJAX को AJAX लौटाना?

जॉबेट ट्यूटोरियल सिखाता है कि आंशिक कैसे लौटाया जाए, लेकिन मैं आंशिक नहीं, बल्कि जेसन वापस करना चाहता हूं।

उत्तर

38

यदि यह सिर्फ एक सामान्य AJAX कार्रवाई करने की यह वापस लौट रहे हैं है, मुझे लगता है कि मैं का उपयोग किया है अतीत में कहीं निम्नलिखित:

return $this->renderText(json_encode($something)); 
+8

यदि आपके पास देव मोड में सक्रिय वेब डिबगिंग बार सक्रिय है, तो आपको "sfConfig :: set ('sf_web_debug', false) पंक्ति जोड़नी होगी;" – chiborg

+6

यह प्रतिक्रिया शरीर में जेसन वापस कर देगा, लेकिन सामग्री का प्रकार टेक्स्ट/एचटीएमएल होगा। '$ This-> getResponse() -> setContentType (' application/json '); ' – ilanco

17

सस्ता तरीका:

function executeSomethingThatReturnsJson(){ 
    $M = new Model(); 
    $stuff = $M->getStuff(); 
    echo json_encode($stuff); 
    die(); //don't do any view stuff 
} 

समझदारी भरा तरीका है:

एक समझदारी भरा तरीका है sfActions में मदद करता है कि json-सामान से निपटने का एक अच्छा उपवर्ग तैयार करना है।

एक परियोजना मैं हाल ही में किया था में, मैं एक आवेदन 'एपीआई' (./symfony generate:application api)

बुलाया बनाया और उसके बाद की तरह एक फ़ाइल बनाई:

API/lib/apiActions.class.php

<?PHP 
class apiActions extends sfActions { 
    public function returnJson($data){ 
    $this->data = $data; 
    if (sfConfig::get('sf_environment') == 'dev' && !$this->getRequest()->isXmlHttpRequest()){ 
     $this->setLayout('json_debug'); 
     $this->setTemplate('json_debug','main'); 
    }else{ 
     $this->getResponse()->setHttpHeader('Content-type','application/json'); 
     $this->setLayout('json'); 
     $this->setTemplate('json','main'); 
    } 
    } 
} 

ध्यान दें कि मैंने स्पष्ट रूप से वहां टेम्पलेट सेट किया है।

तो मेरी jsonSuccess.php टेम्पलेट बस है:

<?PHP echo json_encode($data); 

json_debugSuccess.php चीजों को खूबसूरत जबकि:

<?PHP var_dump($data); ?> 

तो फिर तुम एक नियंत्रक कि apiActions (सामान्य sfActions के बजाय फैली हो सकता है) ऐसा लगता है:

<?php 
class myActions extends apiAction { 
    public function executeList(sfWebRequest $request) 
    { 
    $params = array(); 
    if ($request->hasParameter('id')){ 
     $id = $request->getParameter('id'); 
     if (is_numeric($id)){ 
     $params['id'] = $id; 
     } 
    } 
    $data = Doctrine::getTable('SomeTable')->findAll(); 
    $this->returnJson($data); 
    } 
} 

अस्वीकरण: उपरोक्त कोड कॉपी/मेरे पास एक ऐप से चिपका हुआ है, लेकिन सरलीकृत है। यह केवल चित्रकारी उद्देश्यों के लिए है - लेकिन यह आपको सही दिशा में ले जाना चाहिए।

+0

यह वास्तव में मजाकिया था :) आपने बहुत सारे कोड पोस्ट किए हैं लेकिन पिछला उत्तर एक पंक्ति था और यह काम करता था :) 1+ अगर आप मदद करने के लिए उत्सुक हैं! :) –

+6

सही - वह दूसरा उत्तर एक अच्छा संस्करण है "सस्ता तरीका" का। मेरा बाकी का जवाब पर्यावरण के आधार पर चीजों को अलग-अलग संभालने के बारे में है, हालांकि मुझे यकीन है कि इसे बहुत साफ किया जा सकता है। – timdev

4

FYI करें: Symfony 2.x के मामले में "त्वरित और गंदा "तरीका इस तरह दिखता है:

return new Response(json_encode($data), 200, array('Content-Type', 'text/json')); 
+1

मुझे लगता है कि यदि आप अपना मार्ग अच्छा प्रारूप निर्दिष्ट करते हैं तो भी आप' प्रतिक्रिया (json_encode ($ डेटा)) डाल सकते हैं '' डिफ़ॉल्ट: {_ नियंत्रक: आपका: क्रिया, _format: json} ') –

0

नया जेसन रेस्पॉन्स (सरणी) लौटें;