Framework Yii2 czy kazda strona powinna miec inny kontroller?

0

Witam, nie rozumiem frameworka yii2. Podstawa jest kontroler, jednak kazdy kontroller ma inny widok.
Robię sklep internetowy i wygląda to tak:
screenshot-20200421182548.png

sitecontroller.php

<?php
namespace frontend\controllers;

use Yii;
use yii\data\Pagination;
use common\models\LoginForm;
use common\models\PostForm;
use common\models\SearchForm;
use common\models\User;
use common\models\UserFriend;
use common\models\UserYeswant;
use common\models\Post;
use common\models\ApiVideo;
use common\models\Material;
use common\models\PasswordResetRequestForm;
use common\models\ResetPasswordForm;
use common\models\SignupForm;
use common\models\ContactForm;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\web\UploadedFile;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use yii\web\NotFoundHttpException;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;


/**
 * Site controller :)
 */
class SiteController extends \rootapp\components\Controllerrun
{
	/**
	 * @inheritdoc
	 */
	public function behaviors()
	{
		return [
			'verbs' => [
				'class' => VerbFilter::className(),
				'actions' => [
					'logout' => ['post','get'],
				],
			],
			'access' => [
				'class' => AccessControl::className(),
				'only' => ['index','myaccount'],
				'rules' => [
					[
						'actions' => ['myaccount'],
						'allow' => true,
						'roles' => ['@'],
						'matchCallback' => function ($rule, $action) {
							if(!Yii::$app->user->isGuest){
								return true;
							}else{
								return false;
							}
						}
					],
					[
						'actions' => ['index'],
						'allow' => true,
					]
				]
			]
		];
	}

	/**
	 * @inheritdoc
	 */
	public function actions()
	{
		return [
			'error' => [
				'class' => 'yii\web\ErrorAction',
			],
			'captcha' => [
				'class' => 'yii\captcha\CaptchaAction',
				'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
			],
		];
	}


	public function actionIndex()
	{
		$model = 'OK';
		return $this->render('index',['model'=>$model]);
	}

}

listcontroller.php

<?php
namespace app\Controllers;

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

}

Problem jest, że każdy kontroller ma inny widok z nagłówkami tzn. layouts a ja potrzebuje jednego layoutu i wiele /site np. lista produktów, koszyk itp.
Czy do każdego powinno się tworzyć nowy kontroler?

0

Ale jaki jest problem?

Każdy controller to osobny folder z widokami. Folder ma mieć nazwę taką samą jak controller. A nazwy plików, to nazwy akcji.

Jeśli masz takie coś:

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

To widok będzie znajdował się w /list/index.php.

1

Nadal nie kumam o co Ci chodzi...

Problem jest, że każdy kontroller ma inny widok z nagłówkami

Jakimi nagłówkami?

W folderze layout umieszczasz główne szablony, który jest wspólny dla widoków. Jak chcesz zmienić na inny layout to wewnątrz akcji musisz np. dodać $this->layout = 'jakis_layout'.

Dla każdego controllera tworzysz nowy folder. Np. SiteController powinien mieć folder site. I do niego wstawiasz potem potrzebne widoki dla akcji. Jak masz akcję loginAction, to tworzysz widok login.php. Kontroler najlepiej żeby zawierał powiązane tematycznie akcje, i to najlepiej nie za wiele.

Jeśli jednak chcesz w akcji X użyć innego widoku z tego samego controllera, to po prostu zamiast return $this->render('x') robisz return $this->render('Y'). A jak chcesz użyć z innego controllera, to robisz return $this->render('/controller/widok').

1 użytkowników online, w tym zalogowanych: 0, gości: 1