2012-07-12 17 views
7

मैं, JQuery का उपयोग कर किसी वेब पृष्ठ से JSON डेटा भेजने के लिए कोशिश कर रहा हूँ इस तरह में json डेटा पुनः प्राप्त:CakePHP 2.2 नियंत्रक

$.ajax({ 
    type: "post",  // Request method: post, get 
    url: "http://localhost/ajax/login", 
    data: '{username: "wiiNinja", password: "isAnub"}', 
    dataType: "json", // Expected response type 
    contentType: "application/json", 
    cache: false, 
    success: function(response, status) { 
     alert ("Success"); 
    }, 
    error: function(response, status) { 
     alert('Error! response=' + response + " status=" + status); 
    } 
}); 

cake2.2 में, मैं अजाक्स नाम के एक नियंत्रक के लिए एक विधि है कि है "प्रवेश" का नाम दिया, इस तरह:

public function login($id = null) 
{ 
    if ($this->RequestHandler->isAjax()) 
    { 
     $this->layout = 'ajax'; // Or $this->RequestHandler->ajaxLayout, Only use for HTML 
     $this->autoLayout = false; 
     $this->autoRender = false; 

     $response = array('success' => false); 

     $data = $this->request->input(); // MY QUESTION IS WITH THIS LINE 
     debug($data, $showHTML = false, $showFrom = true); 
    } 
    return; 
} 

मैं सिर्फ अगर मैं नियंत्रक करने के लिए सही डेटा में गुजर रहा हूँ देखना चाहते हैं। अगर मैं इस लाइन का उपयोग करें:

$data = $this->request->input(); 

मैं डिबग प्रिंटआउट देख सकते हैं:

{username: "wiiNinja", password: "isCool"} 

मैं CakePHP मैनुअल 2.x में पढ़ा है, के तहत "को एक्सेस करना XML या JSON डेटा", यह इस कॉल का सुझाव

$data = $this->request->input('json_decode'); 

जब मैं प्रिंट $ डेटा डिबग, मैं "अशक्त" मिलती है: डेटा को डिकोड करने के। मैं क्या गलत कर रहा हूं? क्या मेरा डेटा जावास्क्रिप्ट से गलत है? या मैं डीकोड सही ढंग से नहीं बुला रहा हूँ?

किसी भी सुझाव के लिए धन्यवाद।

============= मेरा अपना संपादित ========

प्रयोगों के माध्यम से अपने खुद के गलती मिला:

जब बजाय जावास्क्रिप्ट के माध्यम से पोस्ट करते समय, इस लाइन:

data: '{"username": "wiiNinja", "password": "isAnub"}', 

और

+०१२३५१६४१०६१:

data: '{username: "wiiNinja", password: "isAnub"}', 

इसे करने के लिए बदलें

$data = $this->request->input('json_decode'); 

करने के लिए::

$data = $this->request->input('json_decode', 'true'); 

यह काम करता है

नियंत्रक कोड में, इस लाइन बदल जाते हैं।

array(
    'plugin' => null, 
    'controller' => 'ajax', 
    'action' => 'login', 
    'named' => array(), 
    'pass' => array(), 
    'isAjax' => true 
) 

:


Dunhamzzz,

जब मैं अपने सुझाव का पालन किया, और मेरे नियंत्रक कोड में "$ this-> अनुरोध> पैरामीटर" सरणी की जांच, यह निम्न शामिल जैसा कि आप देख सकते हैं, मैं जो डेटा ढूंढ रहा हूं वह वहां नहीं है। मुझे पहले से ही उचित मार्ग कोड मिल गया है। यह वही है 2.x के लिए प्रलेखन यहाँ का कहना है के साथ संगत है:

http://book.cakephp.org/2.0/en/controllers/request-response.html

अब तक, एक ही रास्ता है कि मैं यह काम करने के लिए मिल गया है, के रूप में "मेरा अपना संपादित करें" में ऊपर कहा गया है है। लेकिन अगर सर्वर पर जेएसओएन स्ट्रिंग भेजना सही नहीं है, तो मैं इसे ठीक करना चाहता हूं, क्योंकि आखिरकार, मुझे तीसरे पक्ष कोड को संभालना होगा जो जेएसओएन ऑब्जेक्ट्स भेज देगा।

उत्तर

1

कारण आप बुद्धिमानी से संघर्ष कर रहे हैं क्योंकि आप jQuery के साथ एक स्ट्रिंग भेज रहे हैं, उचित जावास्क्रिप्ट ऑब्जेक्ट (JSON) नहीं।

$.ajax({ 
    type: "post",  // Request method: post, get 
    url: "http://localhost/ajax/login", 
    data: {username: "wiiNinja", password: "isAnub"}, // outer quotes removed 
    dataType: "json", // Expected response type 
    contentType: "application/json", 
    cache: false, 
    success: function(response, status) { 
     alert ("Success"); 
    }, 
    error: function(response, status) { 
     alert('Error! response=' + response + " status=" + status); 
    } 
}); 

अब डेटा $this->request->params में एक PHP सरणी के रूप में उपलब्ध होगा।

इसके अलावा JSON प्रतिक्रिया भेजने के लिए, please see this manual page। आपके अधिकांश कोड को केवल 2 लाइनों तक घटाया जा सकता है ...

//routes.php 
Router::parseExtensions('json'); 

//Controller that sends JSON 
$this->set('_serialize', array('data'));