dmstr / yii2-themed-view-path-behavior
通过 yii2 主题轻松设置视图路径映射的 behavior
1.1.0
2022-12-09 12:06 UTC
Requires
- yiisoft/yii2: *
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'
]
]