首先需要说明的是,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个想法