2012-09-16 18 views
20

अब तक, मैंने यह पता लगाया है कि ज़ेंड फ्रेमवर्क 2 में एक सामान्य JSON प्रतिक्रिया कैसे वापस करनी है। सबसे पहले, मैंने ViewJsonStrategystrategiesview_manager कॉन्फ़िगरेशन के अनुभाग में जोड़ा। फिर, नियंत्रक कार्रवाई से ViewModel उदाहरण लौटने की बजाय, मैं अपने सभी चर सेट के साथ JsonModel उदाहरण देता हूं।JSON प्रतिक्रिया के भीतर ZF2 व्यू कैसे प्रस्तुत करें?

अब जब मैंने यह टुकड़ा निकाला है, तो मुझे समझने की जरूरत है कि दृश्य को कैसे प्रस्तुत किया जाए और उसे JSON प्रतिक्रिया में वापस कर दें। ZF1 में, मैं $this->view->render($scriptName) का उपयोग करने में सक्षम था, जिसने HTML को एक स्ट्रिंग के रूप में वापस कर दिया। ZF2 में, Zend\View\View::render(...) विधि void लौटाती है।

तो ... मैं एक HTML व्यू स्क्रिप्ट कैसे प्रस्तुत कर सकता हूं और इसे एक अनुरोध में JSON प्रतिक्रिया में वापस कर सकता हूं?

यह वही है मैं अभी है: नियम क्यों सरल करता है, तो यहाँ जटिल हो सकता है निम्न

if ($this->getRequest()->isXmlHttpRequest()) { 
     $jsonModel = new JsonModel(...); 

     /* @todo Render HTML script into `$html` variable, and add to `JsonModel` */ 
     return $jsonModel; 
    } else { 
     return new ViewModel(...); 
    } 
+0

अरे मैं तो बस यह करने के लिए लौटने के बाद से i 'कर रहा हूँ के साथ एक ही परिणाम प्राप्त कर सकते हैं मैं भी इसमें हूँ। हालांकि आपकी समस्या वास्तव में क्या है? जब आप एक jsonModel (सरणी ($ डेटा) वापस करते हैं, तो प्रतिक्रिया जेसन है। आप जेसन ओओ – Sam

+0

लौटने पर किसी भी दृश्य या जो भी प्रस्तुत करना नहीं चाहते हैं, मुझे JSON प्रतिक्रिया के अंदर आंशिक दृश्य प्रस्तुत करने की आवश्यकता है। उदाहरण: '{" एचटीएमएल ":" मैं एक HTML प्रतिक्रिया "}' हूं। –

उत्तर

47

ठीक है, मुझे लगता है मैं अंत में समझ में आ आप क्या कर रहे है। मुझे एक समाधान मिला है जो मुझे लगता है कि आपके मानदंडों से मेल खाता है। हालांकि मुझे यकीन है कि कर रहा हूँ वहाँ सुधार की गुंजाइश, है कि वहाँ कुछ बुरा handwork किया जाना है के रूप में ...

public function indexAction() 
{ 
    if (!$this->getRequest()->isXmlHttpRequest()) { 
    return array(); 
    } 

    $htmlViewPart = new ViewModel(); 
    $htmlViewPart->setTerminal(true) 
       ->setTemplate('module/controller/action') 
       ->setVariables(array(
        'key' => 'value' 
       )); 

    $htmlOutput = $this->getServiceLocator() 
        ->get('viewrenderer') 
        ->render($htmlViewPart); 

    $jsonModel = new JsonModel(); 
    $jsonModel->setVariables(array(
    'html' => $htmlOutput, 
    'jsonVar1' => 'jsonVal2', 
    'jsonArray' => array(1,2,3,4,5,6) 
)); 

    return $jsonModel; 
} 

आप देख सकते हैं, templateMap मैं बनाने है ... बुरा ... यह कष्टप्रद है और मुझे यकीन है कि इसे काफी हद तक सुधार किया जा सकता है। यह एक कामकाजी समाधान है लेकिन सिर्फ एक साफ नहीं है। हो सकता है कि किसी भी तरह से, पहले से ही तत्काल, तुरंत phpRenderer को सर्विस लोकेटर से इसके टेम्पलेट- और पथ-मैपिंग के साथ पकड़ने में सक्षम हो जाएगा और फिर यह क्लीनर होना चाहिए।

टिप्पणी के लिए धन्यवाद @ डीआरबीज़ा को किए जाने वाले काम को उचित मात्रा में कम किया जा सकता है। अब, जैसा कि मैं शुरू में चाहता था, हम सभी टेम्पलेट मैपिंग के साथ व्यूअरेंडर को पकड़ लेंगे और सीधे व्यूमोडेल प्रस्तुत करेंगे। केवल महत्वपूर्ण कारक है कि आप रेंडर करने के लिए पूरी तरह से योग्य टेम्पलेट निर्दिष्ट करने की आवश्यकता है (उदाहरण के लिए: "$ मॉड्यूल/$ नियंत्रक/$ कार्रवाई")

मुझे आशा है कि यह मिल जाएगा आप हालांकि शुरू कर दिया;)

पुनश्च: प्रतिक्रिया इस तरह दिखता है:

Object: 
    html: "<h1>Hello World</h1>" 
    jsonArray: Array[6] 
    jsonVar1: "jsonVal2" 
+0

मैं प्रतिक्रिया की सराहना करता हूं, लेकिन मुझे एक टूटा हुआ रिकॉर्ड लगता है। यह सहायक है, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है। मुझे एक JSON प्रतिक्रिया में HTML को वापस करने की आवश्यकता है, जिसमें अन्य चर शामिल होंगे - संभावित रूप से एकाधिक विचार। –

+0

@ webjawns.com मैंने अपना जवाब संपादित कर लिया है, मुझे उम्मीद है कि यह आपको शुरू कर देगा। – Sam

+0

isXmlHttpRequest() को बीटीडब्लू को अनदेखा किया जा सकता है, सिर्फ मेरे टेम्पलेट को प्रस्तुत करने के लिए, जिसमें से मैं AJAX अनुरोध को कॉल करता हूं;) – Sam

-2

सामान्य रूपरेखा AJAX के बारे में डेवलपर गड़बड़ बात के रूप में नियंत्रक लिपि में सरल उपाय है

public function checkloginAction() 
{ 
    // some hosts need to this some not 
    //header ("Content-type: application/json"); // this work 
    // prepare json aray .... 
    $arr = $array("some" => .....); 
    echo json_encode($arr); // this works 
    exit; 
} 

यह ZF1 और ZF2 में भी काम करता है सभी

पर दृश्य स्क्रैप की आवश्यकता नहीं है

आप ZF2 निर्माता की सलाह का उपयोग करते हैं

use Zend\View\Model\JsonModel; 
.... 


$result = new JsonModel($arr); 
return $result; 

AJAX अशक्त प्रतिक्रिया के रूप में कम से कम जेडएफ में 2.0.0

+0

मुझे * अजाक्स प्रतिक्रिया के भीतर एक दृश्य स्क्रिप्ट प्रस्तुत करने की आवश्यकता है *। –

+0

इस तरह: '{" html ":" मैं एक HTML प्रतिक्रिया "}' हूं। –

6

आप अपने JSON प्रतिक्रिया के लिए दृश्य प्रस्तुत करने के लिए और अधिक आसान तरीका उपयोग कर सकते हैं।

public function indexAction() { 
    $partial = $this->getServiceLocator()->get('viewhelpermanager')->get('partial'); 
    $data = array(
      'html' => $partial('MyModule/MyPartView.phtml', array("key" => "value")), 
      'jsonVar1' => 'jsonVal2', 
      'jsonArray' => array(1, 2, 3, 4, 5, 6)); 
    $isAjax = $this->getRequest()->isXmlHttpRequest()); 
    return isAjax?new JsonModel($data):new ViewModel($data); 
} 

कृपया ध्यान दें उपयोग JsonModel वर्ग आप में module.config.php अपने मॉड्यूल के फ़ाइल देखें प्रबंधक विन्यास के लिए की जरूरत है इससे पहले कि।

'view_manager' => array(
     ................. 
     'strategies' => array(
      'ViewJsonStrategy', 
     ), 
     ................. 
    ), 

यह मेरे लिए काम करता है और उम्मीद है कि यह आपकी मदद करेगा।

1

जेडएफ 3 में आप इस कोड

MyControllerFactory.php

public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    $renderer = $container->get('ViewRenderer'); 

    return new MyController(
     $renderer 
    ); 
} 

MyController.php

private $renderer; 

public function __construct($renderer) { 
    $this->renderer = $renderer; 
} 

public function indexAction() { 

    $htmlViewPart = new ViewModel(); 
    $htmlViewPart 
      ->setTerminal(true) 
      ->setTemplate('module/controller/action') 
      ->setVariables(array('key' => 'value')); 

    $htmlOutput = $this->renderer->render($htmlViewPart); 

    $json = \Zend\Json\Json::encode(
     array(
      'html' => $htmlOutput, 
      'jsonVar1' => 'jsonVal2', 
      'jsonArray' => array(1, 2, 3, 4, 5, 6) 
     ) 
    ); 

    $response = $this->getResponse(); 
    $response->setContent($json); 

    $response->getHeaders()->addHeaders(array(
     'Content-Type' => 'application/json', 
    )); 
    return $this->response; 
} 
संबंधित मुद्दे