Cakephp 3 Jsonview и AdminLTE - PullRequest
       31

Cakephp 3 Jsonview и AdminLTE

0 голосов
/ 15 мая 2018

Я использую текущий Cakephp 3.6.3 и через композер дополнительно

composer require maiconpinto/cakephp-adminlte-theme 

В учебном пособии Майкона Пинто описано, как настроить контроллеры и представления.Пока все хорошо.Сейчас я пытаюсь использовать JSON через AJAX с моего сайта.Все расширения в route.php выполняются, как указано в https://book.cakephp.org/3.0/en/views/json-and-xml-views.html

В контроллере, который я использую,

$this->loadComponent('RequestHandler'); 

включен.

Проблема, с которой я столкнулся сейчасв том, что всегда выдается исключение MissingTemplateException:

Error: The view for NameController::action() was not found. 

Здесь часть вывода сайта отладки:

response => object(Cake\Http\Response) {

    'status' => (int) 200,
    'contentType' => 'application/json',
    'headers' => [
        [maximum depth reached]
    ],
    'file' => null,
    'fileRange' => [[maximum depth reached]],
    'cookies' => object(Cake\Http\Cookie\CookieCollection) {},
    'cacheDirectives' => [[maximum depth reached]],
    'body' => ''

}
paginate => []
components => []
View => object(AdminLTE\View\AdminLTEView) {
    Blocks => object(Cake\View\ViewBlock) {}
    plugin => null
    name => '<Modelname>'
    passedArgs => [
        [maximum depth reached]
    ]
    helpers => [[maximum depth reached]]
    templatePath => '<Modelname>'
    template => 'fill'
    layout => 'default'
    layoutPath => null
    autoLayout => true
    subDir => null
    theme => 'AdminLTE'
    hasRendered => false
    uuids => [[maximum depth reached]]
    request => object(Cake\Http\ServerRequest) {}
    response => object(Cake\Http\Response) {}
    elementCache => 'default'
    viewClass => null
    viewVars => [
        [maximum depth reached]
    ]
    Form => object(AdminLTE\View\Helper\FormHelper) {}
    [protected] _helpers => object(Cake\View\HelperRegistry) {}
    [protected] _ext => '.ctp'
    [protected] _passedVars => [
        [maximum depth reached]
    ]
    [protected] _paths => [
        [maximum depth reached]
    ]
    [protected] _pathsForPlugin => [[maximum depth reached]]
    [protected] _parents => [[maximum depth reached]]
    [protected] _current => null
    [protected] _currentType => ''
    [protected] _stack => [[maximum depth reached]]
    [protected] _viewBlockClass => 'Cake\View\ViewBlock'
    [protected] _eventManager => object(Cake\Event\EventManager) {}
    [protected] _eventClass => 'Cake\Event\Event'
    [protected] _viewBuilder => null
}

Так что отсутствует, что Cakephp не запрашивает шаблон, а используетнормальный JsonView, как предусмотрено в документации?Похоже, что фреймворк правильно обнаружил данные JSON и хочет также отправить ответ JSON.Я также попытался установить viewBuilder в своем действии на

$this->viewBuilder('Json');

без какого-либо успеха.

1 Ответ

0 голосов
/ 15 мая 2018

Я нашел решение, изменив имя класса в beforeRender:

public function beforeRender(\Cake\Event\Event $event) {
    parent::beforeRender($event);
    if ($this->getRequest()->is('ajax') || $this->getRequest()->is('json')){
        $this->viewBuilder()->setClassName('Json');
    }
}

Теперь я получил правильный формат.

...