dmstr/yii2-themed-view-path-behavior

通过 yii2 主题轻松设置视图路径映射的 behavior

1.1.0 2022-12-09 12:06 UTC

This package is auto-updated.

Last update: 2024-09-09 15:56:55 UTC


README

通过 yii2 主题路径映射 轻松扩展视图路径的 behavior。

配置选项见: ThemedViewPathBehavior.php

ThemedViewPathBehavior 可以附加到

  • 控制器
  • 模块
  • 小部件

路径顺序

由于 yii\base\Theme 将使用给定路径列表中第一个匹配的视图文件,因此生成的路径映射中的顺序是相关的。

见: 指南: 主题继承

在此行为的上下文中,基本上有两种情况

是否应该将所有者的默认视图路径设置为 yii 搜索视图文件的第一个或最后一个目录?

可以使用 pathOrder 属性来定义顺序

使用的事件

根据 owner 的类型,行为将自己附加到事件

示例

扩展一个控制器的视图路径

任务

  • 您已安装 dmstr/yii2-active-record-search
  • 您想将 SearchGroupController 集成到另一个模块中,例如 admin 模块,以管理 active-record-search 模块中的 SearchGroups
  • 您想覆盖一些(但不是全部)来自 \dmstr\activeRecordSearch\controllers\SearchGroupController 的默认视图

解决方案

  • 通过行为配置设置 active-record-search 模块视图路径作为后备。
<?php

namespace project\modules\admin\controllers;

use dmstr\themedViewPath\ThemedViewPathBehavior;

class SearchGroupController extends \dmstr\activeRecordSearch\controllers\SearchGroupController
{

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['themedViewPath'] = [
            'class' => ThemedViewPathBehavior::class,
            'pathMap' => '@vendor/dmstr/yii2-active-record-search/src/views/search-group',
            'useAsBasePath' => false,
        ];

        return $behaviors;

    }

    public function actionCreate()
    {
        return "Action is not available in this context";
    }

    public function actionDelete($id)
    {
        return "Action is not available in this context";
    }
}

为 ProductController 生成的路径映射

[
    '/app/project/src/modules/admin/views/search-group' => [
        0 => '/app/project/src/modules/admin/views/search-group'
        1 => '@vendor/dmstr/yii2-active-record-search/src/views/search-group'
    ]
]

通过 BaseController 扩展所有(子)控制器的视图路径

任务

  • 您有一个 admin 模块,其中您定义了用于管理 giiant 创建的 AR 模型的控制器的 CRUD 模块
  • 您的 admin 控制器的名称(ID)也定义在 CRUD 模块中
  • 您想覆盖生成的 CRUD 中的一些(但不是全部)默认视图

解决方案

  • 将行为添加到用作控制器的 BaseController,这些控制器应使用 CRUD 模块中的视图作为后备,并将 basePath 定义为路径映射。
  • 控制器 ID 将附加到行为中
<?php

namespace project\modules\admin\controllers;

use dmstr\themedViewPath\ThemedViewPathBehavior;
use yii\web\Controller;

class BaseController extends Controller
{
    #....
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['themedViewPath'] = [
            'class' => ThemedViewPathBehavior::class,
            'pathMap' => '@project/modules/cruds/views',
            'useAsBasePath' => true,
        ];

        return $behaviors;

    }
    #....

为 ProductController 生成的路径映射

[
    '/app/project/src/modules/admin/views/product' => [
        1 => '/app/project/src/modules/admin/views/product'
        3 => '@project/modules/cruds/views/product'
    ]
]

通过 BaseController 使用 "branded" 子目录扩展所有(子)控制器的视图路径

任务

  • 与上面相同,但增加了可以存储 "branded" 视图的额外子目录

解决方案

  • 与上面相同,但添加了另一个具有 "branded" 名称的路径
<?php

namespace project\modules\admin\controllers;

use dmstr\themedViewPath\ThemedViewPathBehavior;
use project\components\ApplicationHelper;
use yii\web\Controller;

class BaseController extends Controller
{
    #....
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['themedViewPath'] = [
            'class' => ThemedViewPathBehavior::class,
            'pathMap' => [
                '@project/modules/cruds/views',
            ],
            'subDirs' => [
                ApplicationHelper::brand(),
            ],
            'useAsBasePath' => true,
        ];

        return $behaviors;

    }
    #....

为 ProductController 生成的路径映射

[
    '/app/project/src/modules/admin/views/product' => [
        0 => '/app/project/src/modules/admin/views/product/customer-name'
        1 => '/app/project/src/modules/admin/views/product'
        2 => '@project/modules/cruds/views/product/customer-name'
        3 => '@project/modules/cruds/views/product'
    ]
]

通过 Module 扩展所有控制器的视图路径

任务

  • 您有一个模块,其中默认(例如自动生成)视图文件位于模块的默认 ./views/ 目录中
  • 您想用模块的 ./views-extended/ 目录中的文件覆盖一些(但不是全部)默认视图

解决方案

  • 将行为添加到 Module 类
  • pathMap 中定义 *-extended 目录
  • pathOrder 设置为 ThemedViewPathBehavior::MAP_PREPEND,因为 yii 应该首先在给定的 ./views-extended/ 中搜索,并使用默认视图路径作为后备
<?php

namespace app\modules\cruds;

use dmstr\themedViewPath\ThemedViewPathBehavior;

/**
 *  module definition class.
 */
class Module extends \yii\base\Module
{
    #....
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['themedViewPath'] = [
            'class' => ThemedViewPathBehavior::class,
            'pathMap' => $this->getViewPath() . '-extended',
            'pathOrder' => ThemedViewPathBehavior::MAP_PREPEND,
        ];

        return $behaviors;

    }
    #....

}

此模块中控制器的生成路径映射

[
    '/app/project/src/modules/cruds/views' => [
        0 => '/app/project/src/modules/cruds/views-extended'
        1 => '/app/project/src/modules/cruds/views'
    ]
]

为小部件添加替代的 branded/themed 视图路径

任务

  • 您有一个小部件,并希望根据定义的 brand 通过每个 brand 的子目录覆盖(某些)视图

解决方案

  • 将行为添加到 Widget 类
  • 为当前上下文定义子目录(在本例中通过ApplicationHelper::brand()实现)
<?php

namespace project\modules\frontend\widgets\careerportal;

use dmstr\themedViewPath\ThemedViewPathBehavior;
use project\components\ApplicationHelper;

class LatestJobs extends \yii\base\Widget
{

    #....
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['themedViewPath'] = [
            'class' => ThemedViewPathBehavior::class,
            'subDirs' => [
                ApplicationHelper::brand(),
            ],
        ];

        return $behaviors;

    }
    #....
}

为小部件生成的路径映射

[
    '/app/project/src/modules/frontend/widgets/careerportal/views' => [
        0 => '/app/project/src/modules/frontend/widgets/careerportal/views/customer-name'
        1 => '/app/project/src/modules/frontend/widgets/careerportal/views'
    ]
]