Ich habe drei Layouts in meinem Layoutordner im Hauptansichtsordner. Ich habe ein Modul namens SubDomain hinzugefügt. In meinem SubDomain-Modul habe ich einen Controller namens HomeController. In HomeController gibt es eine Aktion namens getDomain()
.
In der getDomain()
-Aktion möchte ich das Hauptlayout in getDomainLayout
ändern. Es gibt jedoch einen Fehler, wenn ich einen Code verwende:
$this->layout = "getDomainLayout";
Yii2 wirft:
Invalid Parameter – yii\base\InvalidParamException
The view file does not exist: \myyii2\modules\subDomain\views\layouts\bersih.php
Es gibt mehrere Möglichkeiten, um dieses Problem zu beheben.
Ein Beispiel unten zeigt eine kanonische Verzeichnisstruktur eines subDomain
-Moduls einschließlich seiner Layouts (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
Nach dieser einfachen Struktur können Sie ein beliebiges Layout über den Namen im Controller des Moduls festlegen:
namespace myApp\modules\subDomain\controllers;
class HomeController extends Controller {
public function actionGetDomain() {
$this->layout = 'domain'; // equals 'myApp/modules/subDomain/views/layouts/domain'
}
}
Dies ist der bevorzugte Weg, da Module eigenständige Softwareeinheiten sind, die aus eigenen Modellen, Layouts, Steuerungen usw. bestehen.
In einigen Fällen möchten Sie möglicherweise eine Layoutdatei verwenden, die sich außerhalb des Modulverzeichnisses befindet:
class HomeController extends Controller {
public function actionGetDomain() {
$this->layout = '@app/views/layouts/main';
}
}
Dabei ist @app der Basispfad der aktuell laufenden Anwendung. Beispiel:
myApp/frontend
Stellen Sie in dieser Situation sicher, dass die Layoutdatei main.php im folgenden Verzeichnis vorhanden ist:
myApp/frontend/views/layouts/main.php
Wenn ich ein anderes Layout im Controller benötige, füge ich einfach den folgenden Code hinzu
public function beforeAction($action)
{
$this->layout = 'layout'; //your layout name
return parent::beforeAction($action);
}
stellen Sie sicher, dass Ihr Layout im entsprechenden Ordner vorhanden ist
'@app/views/layouts/layout.php'
Eine andere praktische Möglichkeit, verschiedene Layouts in Ihrer Anwendung zu verwenden, ist das Erstellen einer abstrakten Klasse. Zum Beispiel:
abstract class AdminBaseController extends Controller
{
public function beforeAction($action)
{
$this->layout = '@app/views/admin/layouts/main.php';
return parent::beforeAction($action);
}
...
}
Und dann extends
Ihren Controller.
class ArticlesController extends AdminBaseController { ... }
Sie können die Variable im Controller einstellen.
class DefaultController extends Controller
{
public $layout = 'main.php';
}
Oder indem Sie den vollständigen Pfad übergeben
public $layout = '@frontend/modules/idModule/views/layouts/main.php';
Sie können $ this-> layout = 'main' hinzufügen. in der Modulinitmethode. Die main.php sollte sich innerhalb des Ansichtsordners der Module unter Layouts befinden.
Wenn Sie es standardmäßig innerhalb des Moduls festlegen möchten, können Sie dies durch Schreiben tun
$this->layout = '@frontend/modules/user/views/layouts/main';
innerhalb der init()
-Funktion Ihrer Modulklasse sieht Ihr vollständiger Code folgendermaßen aus
public function init() {
parent::init();
$this->layout = '@frontend/modules/user/views/layouts/main';
// custom initialization code goes here
}
Sie können auch die layout
-Eigenschaft in construtor
wie folgt festlegen:
class ArticlesController extends Controller
{
public function __construct($id, $module, $config = array()) {
parent::__construct($id, $module, $config);
$this->layout='main4articles';
}
....