CakePHP - просто макет? - PullRequest
       11

CakePHP - просто макет?

4 голосов
/ 02 сентября 2011

Я хочу установить $this->layout на json в действии контроллера.

В макете json будет строка с надписью $this->Javascript>object();, которая будет анализировать данные, данные ему контроллером, и выводить jSON.

Однако создание нового файла представления для каждого запроса jSON, например, recipe_view, ingredient_view не обязательно, мне просто нужен макет.

Есть ли способ вообще обойти файл представления и использовать только макет, без пресловутой ошибки Missing View! ?

Ответы [ 4 ]

3 голосов
/ 02 сентября 2011

@ решение приятно поработало. Вы также можете создать макет и представление для 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 голосов
/ 23 января 2014

Это стало супер легко с CakePHP 2.1. См. Документацию здесь .

  1. В вашем AppController добавьте эту строку после того, как класс был объявлен:

    public $ viewClass = 'Json';

  2. Затем добавьте эту строку в конец действия вашего контроллера, включая любые данные, которые вы хотите отобразить в формате json:

    $ this-> set (compact (массив ('dataSet1', 'dataSet2')));

    $ this-> set ('_ serialize', массив ('dataSet1', 'dataSet2'));

И это все!Вам не нужно настраивать вид для этого.И даже если бы вы его настроили, CakePHP проигнорирует его и просто отобразит переменные, которые вы указали в массиве _serialize.

2 голосов
/ 21 августа 2012

В config / rout.php:

Router::parseExtensions('json');

В app_controller.php:

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.ctp:

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

В view / layout / json / default.ctp:

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

В действии контроллера вы хотите вывести json:

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

Теперь каждый вызов действия с расширением .json (www.example.com/posts/view/12.json) будет выводить объект json без необходимости вызова функции рендеринга в каждом действии.

2 голосов
/ 02 сентября 2011

ммм это должно быть примерно так: (не проверено)

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

     // your code

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...