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, botów: 0