|-转 一篇为你讲透Yii2的widget
yii开发中,用到了大量的widget,我们也能自己建立一个widget,今天为你讲解widget的运行机理,让你游刃有余的操作它。
ActiveForm、Breadcrumbs、DetailView、LinkPager、ListView 等等,这些内置的挂件让我们开发变的如此简单。
yii开发中,用到了大量的widget,我们也能自己建立一个widget,今天为你讲解widget的运行机理,让你游刃有余的操作它。
ActiveForm、Breadcrumbs、DetailView、LinkPager、ListView 等等,这些内置的挂件让我们开发变的如此简单。
本节教你自定义一个widget,顺便说下widget的运行机理和几大重要函数。
老规矩,先说目录。
- 什么时候用widget
- 新建一个widget
- begin & end 方法
- beforeRun & afterRun 方法
begin...
什么时候用widget
场景还是蛮简单的、当我们发现页面有的区块重复出现了,比如TOP10、比如内容编辑器等、就要考虑是否要做成一个widget了。
新建一个widget
我们还是举例把,新建一个Top10的区块。首先我们要在应用程序的components下新建一个Top10Widget的类,根据psr-4规则,布局应该是这样的
- components
- components\Top10Widget.php
Top10Widget.php的内容
namespace app\components; use yii\base\Widget; class Top10Widget extends Widget { public $catId; public function init(){ parent::init(); if(empty($this->catId)){ $this->catId = 0; } } public function run(){ parent::run(); } }
作为一个widget,你必须要继承于yii\base\Widget才可以,就像我们的Top10Widget一样。类的变量代表将来视图使用该挂件时对其传递的参数,除此之外我们要重载Widget的init和run两个方法。
要注意的一点是,在方法里需要先调用父类的对应方法,如上面代码一样,这个要记住。
init() 方法旨在对传递过来的变量进行验证、筛选及处理,所以对于init而言,如果参数出现异常代表前台并没有传递参数正确,这个时候你可以使用throw new Exception("xxx");来抛出异常,页面会报错,当然为了美观,我们可以使用try ... catch....将这个异常接住然后更友好的显示。
小提示:对于throw异常的方法,在run中也一样,我建议try .... catch ....它们。
好的,上面说了init的初衷,接下来说下run函数(有些挂件并没有使用init,而是将所有数据都放到run里处理也是可以的,不过我一般不这么干)。
run() 方法代表该关键的执行逻辑,针对于init处理过的变量,进行逻辑处理,最后显示给客户想要的东西。就和action一样,这里面可以执行很多很多。
最后我们可以通过return 或 echo 将结果返回给浏览器
namespace app\components; use yii\base\Widget; class Top10Widget extends Widget { public $catId; // 省略的代码.... public function run(){ parent::run(); return $this->catId; // 不完全等价于 echo $this>-catId } }
那么一个问题出现了,如果我仅仅是想像是一些数字结果,而是希望它的样子更丰富,我要如何做那?
我想你也想到了,我们可以对这个挂件加载一个视图,然后在视图里处理。
namespace app\components; use yii\base\Widget; class Top10Widget extends Widget { public $catId; // 省略的代码.... public function run(){ parent::run(); return $this->render('top10',[ 'catId'=>$this->catId ]); } }
top10.php文件在哪建立?按照约定,我们需要在app\components\views下建立这个视图。
use app\components\Top10Widget; <?= Top10Widget::widget(['catId'=>98]);?>
看到了吧,和控制的视图一样,先use,在使用。 ...