Yii框架小部件(Widgets)用法实例详解
本文实例讲述了Yii框架小部件(Widgets)用法。分享给大家供大家参考,具体如下:
小部件¶
小部件是在视图中使用的可重用单元,使用面向对象方式创建复杂和可配置用户界面单元。例如,日期选择器小部件可生成一个精致的允许用户选择日期的日期选择器,你只需要在视图中插入如下代码:
=DatePicker::widget(['name'=>'date'])?>
Yii提供许多优秀的小部件,比如activeform,menu,jQueryUIwidgets,TwitterBootstrapwidgets。接下来介绍小部件的基本知识,如果你想了解某个小部件请参考对应的类API文档。
使用小部件
小部件基本上在views中使用,在视图中可调用yii\base\Widget::widget()方法使用小部件。该方法使用配置数组初始化小部件并返回小部件渲染后的结果。例如如下代码插入一个日期选择器小部件,它配置为使用俄罗斯语,输入框内容为$model的from_date属性值。
=DatePicker::widget([ 'model'=>$model, 'attribute'=>'from_date', 'language'=>'ru', 'dateFormat'=>'php:Y-m-d', ])?>
一些小部件可在yii\base\Widget::begin()和yii\base\Widget::end()调用中使用数据内容。例如如下代码使用yii\widgets\ActiveForm小部件生成一个登录表单,小部件会在begin()和0end()执行处分别生成
注意和调用yii\base\Widget::widget()返回渲染结果不同,调用yii\base\Widget::begin()方法返回一个可组建小部件内容的小部件实例。
注意:当调用yii\base\Widget::end()的时候,一些小部件将使用输出缓冲来调整封闭的内容。因此,当调用yii\base\Widget::begin()和yii\base\Widget::end()时,最好在同一个视图文件里。不遵循这个规则可能会导致意外的输出。
配置全局默认值
小部件的全局默认值可以通过DI容器配置:
\Yii::$container->set('yii\widgets\LinkPager',['maxButtonCount'=>5]);
详见依赖注入容器"实践中的应用"一节。
创建小部件
继承yii\base\Widget类并覆盖yii\base\Widget::init()和/或yii\base\Widget::run()方法可创建小部件。通常init()方法处理小部件属性,run()方法包含小部件生成渲染结果的代码。渲染结果可在run()方法中直接"echoed"输出或以字符串返回。
如下代码中HelloWidget编码并显示赋给message属性的值,如果属性没有被赋值,默认会显示"HelloWorld"。
namespaceapp\components; useyii\base\Widget; useyii\helpers\Html; classHelloWidgetextendsWidget { public$message; publicfunctioninit() { parent::init(); if($this->message===null){ $this->message='HelloWorld'; } } publicfunctionrun() { returnHtml::encode($this->message); } }
使用这个小部件只需在视图中简单使用如下代码:
=HelloWidget::widget(['message'=>'Goodmorning'])?>
以下是另一种可在begin()和end()调用中使用的HelloWidget,HTML编码内容然后显示。
namespaceapp\components; useyii\base\Widget; useyii\helpers\Html; classHelloWidgetextendsWidget { publicfunctioninit() { parent::init(); ob_start(); } publicfunctionrun() { $content=ob_get_clean(); returnHtml::encode($content); } }
如上所示,PHP输出缓冲在init()启动,所有在init()和run()方法之间的输出内容都会被获取,并在run()处理和返回。
信息:当你调用yii\base\Widget::begin()时会创建一个新的小部件实例并在构造结束时调用init()方法,在end()时会调用run()方法并输出返回结果。
如下代码显示如何使用这种HelloWidget:
contentthatmaycontain's
有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个视图文件,然后调用yii\base\Widget::render()方法渲染该视图文件,例如:
publicfunctionrun() { return$this->render('hello'); }
小部件的视图文件默认存储在WidgetPath/views目录,WidgetPath代表小部件类文件所在的目录。假如上述示例小部件类文件在@app/components下,会渲染@app/components/views/hello.php视图文件。Youmayoverride可以覆盖yii\base\Widget::getViewPath()方法自定义视图文件所在路径。
小部件是面向对象方式来重用视图代码。
创建小部件时仍需要遵循MVC模式,通常逻辑代码在小部件类,展示内容在视图中。
小部件设计时应是独立的,也就是说使用一个小部件时候,可以直接丢弃它而不需要额外的处理。但是当小部件需要外部资源如CSS,JavaScript,图片等会比较棘手,幸运的时候Yii提供资源包来解决这个问题。
当一个小部件只包含视图代码,它和视图很相似,实际上,在这种情况下,唯一的区别是小部件是可以重用类,视图只是应用中使用的普通PHP脚本。
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。