2014-05-05 13 views
7

Mam problemy z CakePHP 2.4 w momencie pracy z AJAX i JSON.Renderuj widok na łańcuch, a następnie json wyjściowy w cakephp

Chcę renderować dane z widoku, ale zapisać wynikowy html jako ciąg w zmiennej. Po tym chciałbym ustawić tablicę, zawierającą ten ciąg html wśród innych danych, aby powrócić jako obiekt JSON. Niestety nie znalazłem jeszcze właściwej drogi.

Moje kod kontrolera do tej pory korzysta z CakePHP json Magic:

//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')); 

    } 

ten wyprowadza idealny json w konsoli JavaScript, oprócz faktu, że dane w $ data jest zwykły danych.

Czy jest jakoś możliwe przekazywanie danych do widoku, renderowanie, zapisywanie danych wyjściowych do zmiennej łańcuchowej $ html i przekazywanie $ html do zadań w jsonResponse zamiast danych $?

+0

Czy to znaczy, że chcą twoja odpowiedź jsona jest serializowanym wynikiem html? Jeśli masz zamiar to zrobić, dlaczego po prostu nie zwrócisz html. Jaki jest (rzeczywisty) przykład wyjścia, które chcesz zobaczyć? – AD7six

+0

Dzięki za odpowiedź! Chcę użyć nieskończonego skryptu przewijania stron z Cake, gdzie dołączam dane przez JavaScript, ale nie chcę formatować danych za pomocą javascript, ale pobrać dane z serwera jako html. Poza tym potrzebuję pewnych liczb surowych do aktualizacji innych elementów na stronie. – zinky

Odpowiedz

21

Tak! Możesz renderować widok do zmiennej. Musisz tylko utworzyć obiekt widoku. Wewnątrz kontrolera Spróbuj to:

$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

to powinno być zaakceptowane jako odpowiedź –

1

Funkcja Controller::render() faktycznie ustawia ciało odpowiedzi dzwoniąc CakeResponse::body() a następnie powrocie aktualny CakeResponse obiekt. Oznacza to, że można wywołać metodę render() w działaniu kontrolera, przechwycić jego wartość zwracaną, a następnie ponownie wywołać CakeResponse::body(), a tym samym zastąpić treść odpowiedzi żądanym wynikiem.

Przykładowy kod:

$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

Dla tych z Was, używając 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'); 

Nie zapomnij dodać to w przestrzeni nazw

use Cake\View\View; 
Powiązane problemy