it-swarm.com.de

Legen Sie das Layout vom Modul-Controller in yii2 fest

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
13
Maulana Yusuf

Es gibt mehrere Möglichkeiten, um dieses Problem zu beheben.

Erstellen Sie eine Layoutdatei im entsprechenden Modulverzeichnis

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.

Geben Sie den vollständigen Pfad zu dem Verzeichnis an, das Ihre Layoutdatei enthält

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
19
Oleksandr

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'
5
zhisme

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 { ... }
3
Russell Sk.

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';
3
rafaelvaloto

Sie können $ this-> layout = 'main' hinzufügen. in der Modulinitmethode. Die main.php sollte sich innerhalb des Ansichtsordners der Module unter Layouts befinden.

1
Opad

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
}
1

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';
  }
....
0
SaidbakR