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
Il existe plusieurs options pour résoudre ce problème.
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.
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';
}
}
Où @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
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'
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 { ... }
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';
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.
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
}
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';
}
....