适用扩展通常包含了以下三步:
xyz
,我们也可以使用路径别名定位到包含了
xyz
所有文件的基目录.
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
));
使用 应用的部件, 首先我们需要添加一个新条目到 应用配置 的 components
属性, 如下所示:
return array(
// 'preload'=>array('xyz',...),
'components'=>array(
'xyz'=>array(
'class'=>'application.extensions.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// 其他部件配置
),
);
Yii::app()->xyz
来访问部件.部件将会被
惰性创建
(就是,仅当它第一次被访问时创建.) , 除非我们把它配置到
preload
属性里.
return array(
'components'=>array(
'db'=>array(
'class'=>'CDbConnection',
'behaviors'=>array(
'xyz'=>array(
'class'=>'ext.xyz.XyzBehavior',
'property1'=>'value1',
'property2'=>'value2',
),
),
),
//....
),
);
behaviors()
method. The classes will automatically attach any behaviors declared in this method during initialization. For example,
public function behaviors(){
return array(
'xyz'=>array(
'class'=>'ext.xyz.XyzBehavior',
'property1'=>'value1',
'property2'=>'value2',
),
);
}
// 组件不需要主体内容
<?php $this->widget('application.extensions.xyz.XyzClass', array(
'property1'=>'value1',
'property2'=>'value2')); ?>
// 组件可以包含主体内容
<?php $this->beginWidget('application.extensions.xyz.XyzClass', array(
'property1'=>'value1',
'property2'=>'value2')); ?>
...组件的主体内容...
<?php $this->endWidget(); ?>
动作 被 控制器 用于响应指定的用户请求.假设动作的类 XyzClass
属于 xyz
扩展,我们可以在我们的控制器类里重写 CController::actions 方法来使用它:
class TestController extends CController{
public function actions()
{
return array(
'xyz'=>array(
'class'=>'application.extensions.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// 其他动作
);
}}
然后,我们可以通过 路由 test/xyz
来访问.
过滤器 也被 控制器 使用.过滤器主要用于当其被 动作 挂起时预处理,提交处理用户请求.假设过滤器的类XyzClass
属于 xyz
扩展,我们可以在我们的控制器类里重写 CController::filters 方法来使用它:
class TestController extends CController{
public function filters()
{
return array(
array(
'application.extensions.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// 其他过滤器
);
}}
在上述代码中,我们可以在数组的第一个元素里使用加号或者减号操作符来限定过滤器只在那些动作中生效.更多信息,请参照文档的 CController.
控制器 提供了一套可以被用户请求的动作.我们需要在 应用配置 里设置 CWebApplication::controllerMap 属性,才能在控制器里使用扩展:
return array(
'controllerMap'=>array(
'xyz'=>array(
'class'=>'application.extensions.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// 其他控制器
),
);
校验器主要用在 模型类(继承自 CFormModel 或者 CActiveRecord)中.假设校验器类 XyzClass
属于 xyz
扩展,我们可以在我们的模型类中通过 CModel::rules 重写 CModel::rules 来使用它:
class MyModel extends CActiveRecord // or CFormModel{
public function rules()
{
return array(
array(
'attr1, attr2',
'application.extensions.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// 其他校验规则
);
}}
控制台命令
控制台命令扩展通常使用一个额外的命令来增强 yiic
的功能.假设命令控制台 XyzClass
属于 xyz
扩展,我们可以通过设定控制台应用的配置来使用它:
return array(
'commandMap'=>array(
'xyz'=>array(
'class'=>'application.extensions.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// 其他命令
),
);
然后,我们就能使用配备了额外命令 xyz
的 yiic
工具了.
通用部件
使用一个通用 部件, 我们首先需要通过使用
Yii::import('application.extensions.xyz.XyzClass');
来包含它的类文件.然后,我们既可以创建一个类的实例,配置它的属性,也可以调用它的方法.我们还可以创建一个新的子类来扩展它.
Yii是精心设计,使第三方库可易于集成,进一步扩大Yii的功能。 当在一个项目中使用第三方库,程序员往往遇到关于类命名和文件包含的问题。 因为所有Yii类以C
字母开头,这就减少可能会出现的类命名问题;而且因为Yii依赖SPL autoload执行类文件包含,如果他们使用相同的自动加载功能或PHP包含路径包含类文件,它可以很好地结合。
下面我们用一个例子来说明如何在一个Yii application从Zend framework使用Zend_Search_Lucene部件。
首先,假设protected
是application base directory,我们提取Zend Framework的发布文件到protected/vendors
目录 。 确认protected/vendors/Zend/Search/Lucene.php
文件存在。
第二,在一个controller类文件的开始,加入以下行:
Yii::import('application.vendors.*');
require_once('Zend/Search/Lucene.php');
上述代码包含类文件Lucene.php
。因为我们使用的是相对路径,我们需要改变PHP的包含路径,以使文件可以正确定位。这是通过在require_once
之前调用Yii::import
做到。
一旦上述设立准备就绪后,我们可以在controller action里使用Lucene
类,类似如下:
$lucene=new Zend_Search_Lucene($pathOfIndex);
$hits=$lucene->find(strtolower($keyword));