yii2 Как переопределить лейаут на модуль в целом?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

yii2 Как переопределить лейаут на модуль в целом?

Сообщение rkk » 2017.01.09, 17:41

Доброго времени суток всем.

Есть модуль, личный кабинет пользователя, не админка, его дизайн должен отличаться от дизайна сайта.
Для backend я прикручивал админку https://github.com/dmstr/yii2-adminlte-asset
в main.php прописывал

Код: Выделить всё

    'components' => [
        'view' => [
             'theme' => [
                 'pathMap' => [
                    //'@app/views' => '@vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app'
                    '@app/views' => '@backend/views/lte'
                 ],
             ],
        ],
    ],
Все замечательно работает.
Можно ли её (лайаут админки) каким то образом прикрутить к отдельному модулю во frontend части?
Создал модуль Account и в init() прописал $this->layout = '../lte/layouts/main.php'; //перенес во вьюхи модуля file:///var/www/cabinet/frontend/modules/account/views/lte/layouts/main.php

Код: Выделить всё

<?php

namespace frontend\modules\account;

use Yii;

class Account extends \yii\base\Module
{
    public function init()
    {
		$this->layout = '../lte/layouts/main.php'; //перенес во вьюхи модуля file:///var/www/cabinet/frontend/modules/account/views/lte/layouts/main.php
	
        parent::init();

        // custom initialization code goes here
    }
}
при обращение в дефолтовому контролеру http://cabinet.dev/account , лайаут подтягивается.
Создал для модуля Account контролер login

Код: Выделить всё

<?php

namespace frontend\modules\account\controllers;

use Yii;

class LoginController extends \yii\web\Controller
{
	
    public function actionIndex()
    {
        return $this->render('index');
    }

	public function actionLogin()
    {
        return $this->render('login');
    }

}
при вызове http://cabinet.dev/account/login/index лайаут подтягивается,
а при вызове actionLogin http://cabinet.dev/account/login/login лайаут не подтягивается.

Почему так происходит или что я делаю не правильно?

Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение Faenir » 2017.01.09, 20:58

Попробуйте $this->layout вызывать после parent::init(); Ну или прям во всех контроллерах модуля свойство $layout добавьте с нужным лэйаутом.

Аватара пользователя
Sereja3578
Сообщения: 192
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение Sereja3578 » 2017.01.09, 23:07

Я просто в контроллере указываю public $layout = 'other layout';

rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение rkk » 2017.01.10, 15:47

Попробовал так

Код: Выделить всё

class LoginController extends \yii\web\Controller
{
	//public $layout = '../lte/layouts/main.php';
	public $layout = '../lte/layouts/main';
	
	public function actionLogin()
    {
        $layout = '../lte/layouts/main.php';
        return $this->render('login');
    }
пробовал и вот так, и другую вьюху подсунуть

Код: Выделить всё

	public function actionLogin()
    {
        $this->layout = '../lte/layouts/main.php';
        return $this->render('index');
    }
тоже самое отображается страница без лайаута.
создал еще несколько контролеров

Код: Выделить всё

    public function actionStat()
    {
        return $this->render('login');
    }
	
	public function actionLogout()
    {
        return $this->render('index');
    }
здесь лайаута подхватывает.
Т.е. не нравиться именно actionLogin http://cabinet.dev/account/login/login.
А может фреймворк сам что-то переопределяет для login?

Еще вопрос как изменить путь к вьюхе views?
добавил $this->view = '@frontend/modules/account/views/lte/site';

Код: Выделить всё

	public function actionLogin()
    {
		$this->view = '@frontend/modules/account/views/lte/site';
        return $this->render('login');
    }
выдает ошибку
PHP Fatal Error – yii\base\ErrorException

Call to a member function render() on a non-object
1. in /var/www/cabinet/vendor/yiisoft/yii2/base/Controller.php at line 378
public function render($view, $params = [])
{
$content = $this->getView()->render($view, $params, $this);
return $this->renderContent($content);
}

Код: Выделить всё

	public function actionLogin()
    {
        return $this->render('../lte/site/login');
    }
а так работает.
Что с $this->view = '@frontend/modules/account/views/lte/site'; не верно?

Aleksey_ZX
Сообщения: 48
Зарегистрирован: 2015.08.07, 18:12

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение Aleksey_ZX » 2017.01.10, 19:51

Можно в конфиге перопределить
вот так

Код: Выделить всё


'admin' => [
        'class' => 'app\modules\admin\Module',
        'layout' => '@app/views/layouts/admin-main',

    ],


slavick-lg
Сообщения: 1
Зарегистрирован: 2017.01.11, 01:32

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение slavick-lg » 2017.01.11, 01:35

в классе модуля

Код: Выделить всё

public function init()
    {
        Yii::$app->setLayoutPath('path/to/custom/layout');
        Yii::$app->layout = 'custom_layout';
        parent::init();
    }

Аватара пользователя
Sereja3578
Сообщения: 192
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение Sereja3578 » 2017.01.11, 09:34

Я же написал:
Sereja3578 писал(а):
2017.01.09, 23:07
Я просто в контроллере указываю public $layout = 'other layout';
Просто в контроллере модуля задай свойство. Если в модуле много контроллеров, то, как писали в классе модуля.

rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение rkk » 2017.01.11, 12:50

slavick-lg писал(а):
2017.01.11, 01:35
в классе модуля

Код: Выделить всё

public function init()
    {
        Yii::$app->setLayoutPath('path/to/custom/layout');
        Yii::$app->layout = 'custom_layout';
        parent::init();
    }
я такое тоже делал.
Проблема оказалось только для actionLogin, т.е. Другие акшены работают и подтягивают указанный layout, хотя все идентичные.
т.е. Все выше указанные способы работают, но layout для actionLogin не применяется.

lgXenos
Сообщения: 241
Зарегистрирован: 2015.11.30, 15:42

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение lgXenos » 2017.01.11, 15:01

rkk писал(а):
2017.01.09, 17:41
а при вызове actionLogin http://cabinet.dev/account/login/login лайаут не подтягивается.
Обычно, при странностях, я пишу exit('правильный файл');
Если файл правильный(это бывает только в 50% случаев странностей), то необходимо дебажить построчно.

В данном случае, я бы предложил сделать вывод $this->layout в своем экшене логаута (exit, yii::info e.t.c.)
Потом попробовать написать file_exists
Просто есть вероятность, что в одном случае путь указан верно, а в другом - он выше или ниже на 1 каталог

rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

Re: yii2 Как переопределить лейаут на модуль в целом?

Сообщение rkk » 2017.01.11, 15:39

Так в том то и дело выводится моя view login.php, но без layout, нет никаких ошибок, подтягиваются все стили.
Я от рисовал login.php как надо и оставил так.
Спасибо, за помощь, комментарии...
Наверное действительно чтобы найти причину сего происшествия, надо построчно отлавливать.

Ответить