首先需要说明的是,fecshop的小部件和yii2的不同,fecshop的小部件是由
Yii::$app->page->widget->render($configKey) 函数得到的内容
小部件的介绍:相当于个独立功能块,有2部分组成,1. 数据提供者block,2. view部分,view部分是html内容,一些动态数据需要从block中获取,通过数据提供部分和数据显示部分组成一个独立块。
小部件的功能:在电商网站,或者其他网站,我们会有一些块,在很多页面显示,譬如newsletter,rss,product view history等,可能在产品页面侧栏,分类页面搜索页侧栏面,账户中心侧栏等页面显示这个快,因此我引入了小部件的功能,通过配置直接添加,比较方面。
小部件实现的原理:分为3块,1.view文件和多模板路径,通过优先级依次匹配,直到文件存在,返回viewFile 。2. 通过配置里面的类以及方法,得到动态数据,数据格式为数组,3.通过view组件的renderFile函数,把view的路径和动态参数param,画出来最终的html。
小部件的使用:
1.添加配置:
在page组件中找到子组件widget
return [
'page' => [
'class' => 'fecshop\services\Page',
//'terry' => 'xxxx',
# 子服务
'childService' => [
'widget' => [
'class' => 'fecshop\services\page\Widget',
# 定义默认方法,也就是widgetConfig 里面各个部件里面的method如果没有填写
# 则使用该配置。
# 'defaultObMethod' => 'getLastData',
'widgetConfig' => [
'menu' =>[
# 必填
'class' => 'fec\block\TestMenu',
# view 的绝对路径配置方式
'view' => '@fec/views/testmenu/index.php',
# 下面为选填
'method'=> 'getLastData',
'terry1'=> 'My1',
'terry2'=> 'My2',
],
'love' => [
'class' => 'fecshop\app\appfront\modules\Cms\block\widget\Test',
# 根据多模板的优先级,依次去模板找查找该文件,直到找到这个文件。
'view' => 'cms/home/test.php',
'terry' => 'II',
]
]
],
上面定义了2个小部件,一个是menu,一个是love,
class是数据提供的类,method是返回数据的方法,view是html部分,其他的参数为class初始化传入类变量,
对于class 是和namesapces一致的
对于view 有2中方法,一种是加入@,譬如@fec,@vendor等,通过autoload查找绝对路径,另外一种就是通过多模板路径,通过多模板的优先级,依次到路径里面查找该view文件,最终返回view文件,因此,优先级低的view文件如果想更改,可以在高优先级的模板中新建这个文件即可(路径要对应好)。
下面以love举例:
新建class文件:
<?php
namespace fecshop\app\appfront\modules\Cms\block\widget;
use Yii;
use fecshop\app\appfront\modules\AppfrontController;
class Test
{
public $terry;
# 网站信息管理
public function getLastData()
{
return [
'i' => $this->terry,
'love' => 'loves',
'you' => 'terry',
];
}
}
view文件内容:appfront/theme/terry/theme01/cms/home/test.php
love test <?= "$i $love $you" ?>
通过上面,我们在page-theme组件中加入了配置,新建了小部件的class和对应的方法和变量,view文件,下面我们就可以调用了
在controller中调用:
echo Yii::$app->page->widget->render('love');
可以看到页面输出:
love test II loves terry
我们在controller,view,layout等加入这个小部件,然后对应的html就会显示出来,还是蛮好用的。我们可以配置好各个小部件,有需要就直接添加,甚至给一个小部件做几种样式,在不同的页面调用。
《如何使用yii2 fecshop的小部件widget》有1个想法