2011-09-02 6 views
4

コントローラの動作で$this->layoutjsonと設定したいと思います。CakePHP - Just Layout?

jsonレイアウトでは、コントローラーによって与えられたデータを解析してjSONを出力する$this->Javascript>object();という行があります。

ただし、jSONリクエストごとに新しいビューファイルを作成してください。 recipe_viewingredient_viewは必要ありません。レイアウトが必要です。

悪意のある人がいなくても、ビューファイルを完全にバイパスしてレイアウトだけを持つ方法がありますか?不足しているビュー!はエラーがありますか?

答えて

3

に役立ちます。また、ajaxのレイアウトと表示を作成することもできます。

あなたのレイアウトは、このようなものになることができます。

<?php echo $content_for_layout;?> 

そしてあなたは、このようなAJAXビューを作成することができます

<?php echo $this->Js->object($result);?> 

そして、あなたのコントローラからの...

public function savecontent(){ 
    $this->autoRender = false; 
    $this->set('result', false); 

    if(!empty($this->data)){ 
     $data = $this->data; 

     //Do something with your data 

     //send results to view 
     $this->set('result', $myNewData); 
    } 

    $this->render(null, 'ajax','/ajax/ajax'); 
} 
2

うーん、それはこのようなものでなければなりません:(テストしていない)

function action(){ 
    $this->autoLayout = $this->autoRender = false; 

    // your code 

    $this->render('/layouts/json'); 
} 

希望pleasedontbelongのソリューションが動作する@これは

2

設定/ routes.php:

app_controller.phpでは
Router::parseExtensions('json'); 

:ビュー/レイアウト/ JSON/default.ctpには

<?php echo $this->Js->object(isset($data) ? $data : array()); ?> 

:で

<?php 
header('Cache-Control: no-store, no-cache, max-age=0, must-revalidate'); 
header('Content-Type: application/json'); 
echo $content_for_layout; 
?> 

ビュー/ json.ctpで

var $components = array('RequestHandler'); 
var $helpers = array('Js'); 

function render($action = null, $layout = null, $file = null) { 
    switch($this->RequestHandler->ext) { 
     case 'json': 
      Configure::write('debug', 0); 
      return parent::render(null, 'default', '/json'); 
     default: 
      return parent::render($action, $layout, $file); 
    } 
} 

コントローラアクションを出力するjson:

$this->set('data', array('foo' => 'bar')); 

.json拡張子(www.example.com/posts/view/12.json)を持つアクションを呼び出すたびに、各アクションでレンダリング関数を呼び出す必要なく、jsonオブジェクトが出力されます。

2

これはCakePHP 2.1でSUPER easyになっています。 See documentation here。あなたのAppControllerで

  1. 、クラスが宣言された後に次の行を追加します。

    公共$ viewClass = 'JSON';

  2. 次に、あなたはJSON形式で表示されたい任意のデータを含め、お使いのコントローラのアクションの最後に次の行を追加します。

    ます$ this->セット(コンパクト(配列(「DATASET1」、「DATASET2」 ))));

    $ this-> set( '_ serialize'、array( 'dataSet1'、 'dataSet2'));

それだけです!このためにビューを設定する必要はありません。そして、たとえあなたが設定していたとしても、CakePHPはそれを無視して、あなたが '_ serialize'配列で指定した変数を表示するだけです。