小部件是视图里的可重用单元。

小部件是在视图中使用的,但是可能需要使用控制器传给他的模型,比如在渲染表单的时候。比如一般的时间拾取器就可以直接砸视图里加入如下代码就可以:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget(['name' => 'date']) ?>

如果用到model 就大致是这样的:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([
'model' => $model,
'attribute' => 'from_date',
'language' => 'ru',
'clientOptions' => [
'dateFormat' => 'yy-mm-dd',
],
]) ?>

一些小部件可在[[yii\base\Widget::begin()]] 和 [[yii\base\Widget::end()]] 调用中使用数据内容。比如ActiveForm 小组件就是这样使用的。

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?> <?php $form = ActiveForm::begin(['id' => 'login-form']); ?> <?= $form->field($model, 'username') ?> <?= $form->field($model, 'password')->passwordInput() ?> <div class="form-group">
<?= Html::submitButton('Login') ?>
</div> <?php ActiveForm::end(); ?>

和调用 [[yii\base\Widget::widget()]] 返回渲染结果不同, 调用 [[yii\base\Widget::begin()]] 方法返回一个可组建小部件内容的小部件实例。

创建小部件:

继承 yii\base\Widget 并实现 init 和 run方法就可以创建一个小部件。

1、创建一个像上面提到的时间选择器那样可以直接输出的小部件:

namespace app\components;

use yii\base\Widget;
use yii\helpers\Html; class HelloWidget extends Widget {
public $message; public function init() {
parent::init();
if(null == $this->message) {
$this->message = 'Hello World';
}
} public function run() {
return Html::encode($this->message);
}
}

在模板中使用的代码是:

<?php
use app\components\HelloWidget;
?>
<?= HelloWidget::widget(['message'=>'This is a HelloWidget!'])?>

2、如果要创建一个用 begin 和 end 中使用的小部件:

amespace app\components;

use yii\base\Widget;
use yii\helpers\Html; class HelloWidget extends Widget {
public $message; public function init() {
parent::init();
ob_start();
} public function field() {
return Html::encode('这个是实例调用的方法!');
} public function run() {
$this->message = ob_get_clean();
return Html::encode($this->message);
}
}

模板里调用是这样的:

<?php
use yii\helpers\Html;
use app\components\HelloWidget;
?> <?php echo Html::encode($message);?><br />
<?php $hello = HelloWidget::begin();?>
这次使用的事begin 和 end方法。
<?= $hello->field();?>
<?php HelloWidget::end();?>

有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个视图文件, 然后调用[[yii\base\Widget::render()]]方法渲染该视图文件,小部件的视图文件默认存储在WidgetPath/views目录,WidgetPath代表小部件类文件所在的目录。 假如上述示例小部件类文件在@app/components下,会渲染@app/components/views/hello.php视图文件。 You may override 可以覆盖[[yii\base\Widget::getViewPath()]]方法自定义视图文件所在路径。

public function run(){
return $this->render('hello');
}

最后提点应该注意的:

  • 创建小部件时仍需要遵循MVC模式,通常逻辑代码在小部件类,展示内容在视图中。
  • 小部件设计时应是独立的,也就是说使用一个小部件时候,可以直接丢弃它而不需要额外的处理。 但是当小部件需要外部资源如CSS, JavaScript, 图片等会比较棘手, 幸运的时候Yii提供 资源包 来解决这个问题。
  • 当一个小部件只包含视图代码,它和视图很相似, 实际上,在这种情况下,唯一的区别是小部件是可以重用类,视图只是应用中使用的普通PHP脚本。

Yii框架2.0的小部件的更多相关文章

  1. Yii框架2.0的安装过程

    Yii框架是个不错的php开发框架,大型项目上都可以使用.和大多框架一样他也是开源,而且采用了mvc结构的. Yii1.*,直接下载然后用脚步可以创建自己的项目了,最近看了下Yii2.0版本的,他推荐 ...

  2. Yii框架2.0的Gii

    Yii框架的Gii在我看来算是个快速创建器,当然对于学习来说意义不大,但对于已经懂得他的原理并用他开发的话,就是个快速开发的好工具. 他能快速的创建控制器,模块,crup,插件,Module. 打开g ...

  3. Yii框架2.0的 验证码

    最近看了一个Yii的教程视频,是按1.1的版本讲的,我想用Yii2.0的框架也参考他的学习开发下,结果发现好多不一样的,现在就说说验证码的事 首先加入一个actions 做验证码图片的显示,实际事调用 ...

  4. Yii框架2.0 数据库操作初接触

    Yii2.0和Yii1.1版本的变动还是挺多的,我发现配置文件有许多不同,Yii1.1版本里有个main.php 好多信息是在这里配置的,比如默认控制器,数据库连接信息:Yii的数据库配置被单独拿出来 ...

  5. Yii框架2.0的视图和widgets表单的使用

    2.0的控制器的创建和action方法的添加和1.0的基本是一样的.但我发现他的widgets 的ActiveForm和1.1版本有些不一样的地方. 对于视图基本也是一样的,有render 和 ren ...

  6. Yii框架2.0的模型

    模型是 MVC 模式中的一部分, 是代表业务数据.规则和逻辑的对象. 可通过继承 [[yii\base\Model]] 或它的子类定义模型类,基类[[yii\base\Model]]支持许多实用的特性 ...

  7. Yii框架2.0的控制器

    控制器是继承[[yii\base\Controller]]类的对象,负责处理请求和生成响应. 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息 ...

  8. yii框架中的一些小细节配置问题

    1.查看运行时间'db'=>array(      'connectionString' => 'mysql:host=localhost;dbname=shop',      'emul ...

  9. Yii框架2.0的模块

    模块是个独立的软件单元,也是又控制器,视图,模型组成的,也可以有自己的布局.但他必须属于某个应用下,不能独立存在. 其中模块的控制器,视图和应用的控制器和视图使用基本相同,不作赘述,下面说说模块的使用 ...

随机推荐

  1. js in

    定义: in操作符用来判断某个属性属于某个对象,可以是对象的直接属性,也可以是通过prototype继承的属性.(参见hasOwnProperty) 注意事项: n         对于一般的对象属性 ...

  2. python保存爬取的图片

    用爬虫抓取图片的保存 保存图片 request=urllib2.Request(randNumberUrl,data,headers) picture=opener.open(request).rea ...

  3. python操作word【简单封装】

    #!/usr/bin/env python # -*- coding: utf-8 -*- import win32com.client import os #-------------------- ...

  4. [转]VC传递消息sendmessage

    SendMessage的基本结构如下: SendMessage( HWND hWnd,  //消息传递的目标窗口或线程的句柄. UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定 ...

  5. PHP——0128练习相关1——window.open()

    Window.open()方法参数详解 1, 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html ...

  6. nginx的root alias 指令

    location /img/ { alias /var/www/image/; } #若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件 ...

  7. post 获取checkbox值

    $str_tag=""; $s=$_POST['goods_server_name']; for($i=0;$i<count($s);$i++){ if($i==0){ $s ...

  8. 向服务器发送josn字符串,服务器端解析

    <script type="text/javascript"> $(function () { $("#btnsave").click(functi ...

  9. css中!important的用法总结

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. vim 编辑器使用技巧

    看着李立鹏熟练的使用vim,哥心里痒痒的,也来试试! vim pkf.txt i 插入编辑 esc -> :x //退出保存 f8 ->//进入多窗口模式 以下是其他命令: 命令历史 以: ...