web-dev-qa-db-fra.com

Définir la disposition du contrôleur de module dans yii2

J'ai trois mises en page dans mon dossier Mises en page dans le dossier Vues principales. J'ai ajouté un module appelé subDomain. Dans mon module de sous-domaine, j'ai un contrôleur appelé HomeController. Dans HomeController, il existe une action appelée getDomain().

Dans l'action getDomain(), je souhaite modifier la présentation principale en getDomainLayout. Mais il y a une erreur quand j'utilise un code:

$this->layout = "getDomainLayout";

Yii2 lance:

Invalid Parameter – yii\base\InvalidParamException    
The view file does not exist: \myyii2\modules\subDomain\views\layouts\bersih.php
13
Maulana Yusuf

Il existe plusieurs options pour résoudre ce problème.

Créez un fichier de disposition dans le répertoire de module approprié

Un exemple ci-dessous montre une structure de répertoire canonique d'un module subDomain, comprenant ses dispositions (domain.php):

subDomain/
    Module.php                the module class file
    controllers/              containing controller class files
        HomeController.php    the home controller class file
    models/                   containing model class files
    views/                    containing controller view and layout files
        layouts/              containing layout view files
            domain.php        the domain layout file
        home/                 containing view files for HomeController
            index.php         the index view file

En suivant cette structure simple, vous pouvez définir n’importe quelle mise en page par son nom dans le contrôleur du module:

namespace myApp\modules\subDomain\controllers;

class HomeController extends Controller {
    public function actionGetDomain() {            
        $this->layout = 'domain'; // equals 'myApp/modules/subDomain/views/layouts/domain'
    }
}

C’est le moyen le plus préférable, car les modules sont des unités logicielles autonomes composées de ses propres modèles, présentations, contrôleurs, etc.

Spécifiez le chemin complet du répertoire contenant votre fichier de mise en page.

Dans certains cas, vous voudrez peut-être utiliser un fichier de mise en page situé en dehors du répertoire du module:

class HomeController extends Controller {
    public function actionGetDomain() {
        $this->layout = '@app/views/layouts/main';
    }
}

@app est le chemin de base de l'application en cours d'exécution, par exemple:

myApp/frontend

Dans ce cas, assurez-vous que le fichier de mise en forme main.php existe dans le répertoire suivant:

myApp/frontend/views/layouts/main.php
19
Oleksandr

Si j'ai besoin d'une disposition différente dans le contrôleur, j'ajoute simplement le code suivant

 public function beforeAction($action)
 {
    $this->layout = 'layout'; //your layout name
    return parent::beforeAction($action);
 }

assurez-vous que votre mise en page existe dans le dossier approprié

'@app/views/layouts/layout.php'
5
zhisme

Un autre moyen pratique d’utiliser différentes dispositions dans votre application consiste à créer une classe abstraite. Par exemple:

abstract class AdminBaseController extends Controller
{
    public function beforeAction($action)
    {
        $this->layout = '@app/views/admin/layouts/main.php';
        return parent::beforeAction($action);
    }
    ...
}

Et puis juste extends votre contrôleur.

class ArticlesController extends AdminBaseController { ... }
3
Russell Sk.

Vous pouvez définir la variable dans le contrôleur.

class DefaultController extends Controller
{
     public $layout = 'main.php';
}

Ou en passant le chemin complet

public $layout = '@frontend/modules/idModule/views/layouts/main.php';
3
rafaelvaloto

Vous pouvez ajouter $ this-> layout = 'main'; dans la méthode init module. Le fichier main.php doit être situé dans le dossier de la vue des modules, sous les modèles.

1
Opad

Si vous voulez le définir par défaut dans le module, vous pouvez le faire en écrivant 

$this->layout   =   '@frontend/modules/user/views/layouts/main';

dans la fonction init() de votre classe de module, votre code complet ressemblera à ce qui suit

 public function init() {

    parent::init();
    $this->layout = '@frontend/modules/user/views/layouts/main';
    // custom initialization code goes here
}
1
Muhammad Omer Aslam

Vous pouvez également définir la propriété layout dans construtor comme suit:

class ArticlesController extends Controller
{
  public function __construct($id, $module, $config = array()) {
    parent::__construct($id, $module, $config);
    $this->layout='main4articles';
  }
....
0
SaidbakR