2014-05-05 9 views
7

In questo momento sto riscontrando alcuni problemi con CakePHP 2.4 mentre lavoro con AJAX e JSON.Visualizzazione rendering in stringa, quindi output json in cakephp

Voglio rendere i dati con una vista, ma salvare l'html risultante come una stringa in una variabile. Dopodiché, vorrei impostare un array, contenente questa stringa html tra gli altri dati da restituire come oggetto JSON. Purtroppo non ho ancora trovato la strada giusta.

Il mio codice di controllo fa finora l'uso della magia JSON CakePHP:

//Controller (just parts) 

$data = $this->paginate(); 

if($this->request->is('ajax')) { 

     $jsonResponse = array(

      'jobs' => $data, 

      'foci' => $foci, 

      'jobTypes' => $jobTypes, 

      'count_number'=> $count_number 

     ); 

     $this->set('jsonResponse', $jsonResponse); 

     $this->set('_serialize', 'jsonResponse'); 

    } else { 

     // render regular view 
     $this->set(compact('data', 'foci', 'jobTypes', 'count_number')); 

    } 

Emette il JSON perfetta nella console JavaScript, oltre al fatto, che i dati in $ data sono dati semplici.

È in qualche modo possibile passare dati $ a una vista, renderlo, salvare l'output in una variabile stringa $ html e passare $ html ai lavori in jsonResponse anziché $ data?

+0

Vuoi dire che vuoi la tua risposta JSON è il risultato serializzato dell'html? Se hai intenzione di farlo, perché non dovresti semplicemente restituire l'html. Che cos'è un esempio (reale) dell'output che vuoi vedere? – AD7six

+0

Grazie per la tua risposta! Voglio usare uno script di scorrimento pagina infinito con Cake, dove accludo dati tramite Javascript, ma non voglio formattare i dati con javascript, ma ottenere i dati come html dal server. Inoltre, ho bisogno di alcuni numeri grezzi per aggiornare altri elementi nella pagina. – zinky

risposta

21

Sì! È possibile eseguire il rendering di una vista in una variabile. Devi solo creare un oggetto vista. componenti interni del controller Try This:

$view = new View($this,false); 
$view->viewPath='Elements'; // Directory inside view directory to search for .ctp files 
$view->layout=false; // if you want to disable layout 
$view->set ('variable_name','variable_value'); // set your variables for view here 
$html=$view->render('view_name'); 

// then use this $html for json response 
+1

dovrebbe essere accettato come risposta –

1

La funzione Controller::render() realtà imposta il corpo della risposta chiamando CakeResponse::body() e poi tornare la corrente CakeResponse oggetto. Ciò significa che è possibile chiamare il metodo render() all'interno dell'azione del controller, catturarne il valore di ritorno e quindi chiamare di nuovo lo CakeResponse::body() e quindi sostituire il corpo della risposta con l'output desiderato.

codice

Esempio:

$data = $this->paginate(); 

// Pass the data that needs to be used in the view 
$this->set(compact('data', 'foci', 'jobTypes', 'count_number')); 

if($this->request->is('ajax')) { 

    // Disable the layout and change the view 
    // so that only the desired html is rendered 
    $this->layout = false; 
    $this->view = 'VIEW_PASSED_AS_JSON_STRING'; 

    // Call the render() method returns the current CakeResponse object 
    $response = $this->render(); 

    // Add any other data that needs to be returned in the response 
    // along with the generated html 
    $jsonResponse = array(
     'html'  => $response->body(), 
     'other_data' => array('foo' => 'bar'), 
     'bar'  => 'foo' 
    ); 

    // Replace the response body with the json encoded data 
    $response->body(json_encode($jsonResponse)); 

} 
6

Per quelli di voi che usano CakePhp3

$view = new View($this->request,$this->response,null); 
$view->viewPath='MyPath'; // Directory inside view directory to search for .ctp files 
$view->layout='ajax'; // layout to use or false to disable 
$html=$view->render('view_name'); 

Non dimenticare di aggiungere questo nello spazio dei nomi

use Cake\View\View; 
Problemi correlati