public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without this you wont be able to search the second table's data
$criteria->with = array('mySecondTable');
$criteria->compare('id', $this->id, true);
$criteria->compare('mySecondTable.column', $this->mySecondTable_column, true);
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
'sort'=>array(
'defaultOrder'=>'t.create_time DESC',
),
'pagination' => array(
'pageSize' => 100,
),
));
}
高级应用程序模板
这个模板用在大型的团队开发项目中,而且后台从前*立分离出来以便于部署在多个服务器中。由于YIi2.0的一些新的特性,这个程序模板的功能要更深一点。提供了基本的数据库的支持,注册、密码找回等功
可以通过Composer来安装
如果没有安装Composer,先安装
curl -s http://getcomposer.org/installer | php
然后用如下命令来获取
php composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-advanced /path/to/yii-application
也可以直接下载压缩文件:Yii 2 with advanced application template(beta)
https://github.com/yiisoft/yii2/ ... -app-2.0.0-beta.tgz
开始
安装完成后,需要对其进行初始化操作。
- 执行init,选择开发环境(dev)
php /path/to/yii-application/init
- 创建新的数据库,设置common/config/main-local.php里的components.db数据库信息
- 使用控制台命令迁移数据库
yii migrate
- 设置web服务器的根目录
前台/path/to/yii-application/frontend/web/对应的url为http://frontend/
后台/path/to/yii-application/backend/web/对应的url为http://backend/
目录结构
在根目录下面有这几个子目录
- backend——后台web程序
- common——公共的文件
- console——控制台程序
- environments——环境配置
- frontend——前台web程序
根目录下面还有包含一些文件
- .gitignore ——git版本控制中忽略的文件和目录,如果你有一些你不想要的文件到你的源代码里面就把它添加到这个文件中。
- composer.json——这个下面会描述
- init——在Composer里面所描述初始化脚本
- init.bat——和上面一样,不过是Windows下面的
- LIENSE.md——这个就不说了
- README.md——同上
- requirements.php——Yii运行环境要求检测文件
- yii——控制台程序引导文件
- yii.bat——Windows下面的东东
系统定义的路径别名
- @yii ——框架的目录。
- @app——当前正在运行的应用程序的基本路径。
- @common -公共文件目录。
- @frontend——前端web应用程序目录。
- @backend ——后端web应用程序目录。
- @console -控制台目录。
- @runtime——当前正在运行的web应用程序的运行时目录
- @vendor ——基础框架目录。
- @web ——当前正在运行的web应用程序的url
- @webroot——当前正在运行的web应用程序的web根目录。
应用程序
这个模板包含三个应用程序,前台、后台和控制台。前台通常来说就是展现给终端用户的,也就是项目本身。后台就是管理员控制面板,包含有分析以及类似的功能等。控制台主要用来做一些定时任务和一些简单的服务器的管理,另外也可以用来部署应用程序、数据库的迁移、资源的管理等。
common 目录提供一些公共的文件,可用于多个应用程序,例如User模型。
前台和后台都是web应用程序,他们都包含一个web目录,也就是web的根目录,在部署服务器的时候就得要指向这个目录。
每个应用程序都有他们自己的命名空间以及对应的别名。同理,common也有自己的命名空间和对应的别名。
配置和开发环境
在平常的开发中,直接设置配置文件会有多个问题
- 每个团队成员都有自己的配置选项。如果提交这样的配置将影响其他团队成员。
- 产品数据库密码和API密钥不应该在代码仓库中。
- 在有多个服务器的情况下:开发、测试、生产,每一个服务器都应该有自己的配置。
- 每种情况下都定义所有配置选项很重复,并且还要花太多的时间去维持它。
为了解决这些问题,Yii引入了一个非常简单的环境的概念。每个环境由环境目录下的一组文件的集合来表示。init命令用于不同环境之间切换。它只是复制从环境目录中所有应用程序的根目录。
通常环境包含应用程序引导文件如index.php和以-local.php后缀的配置文件。这些已经添加到.gitignore中,所以不会再添加到源码仓库中。
为了避免重复的配置文件相互覆盖。例如,前台应用程序按照以下顺序来读取配置:
- common/config/main.php
- common/config/main-local.php
- frontend/config/main.php
- frontend/config/main-local.php
参数文件按以下顺序读取
- common/config/params.php
- common/config/params-local.php
- frontend/config/params.php
- frontend/config/params-local.php
后面读取的文件配置会覆盖前面的配置
整个的流程图形如下
配置 Composer
应用程序安装完成后就可以设置要目录下面的composer.json
- {
- "name": "yiisoft/yii2-app-advanced",
- "description": "Yii 2 Advanced Application Template",
- "keywords": ["yii", "framework", "advanced", "application template"],
- "homepage": "http://www.yiiframework.com/",
- "type": "project",
- "license": "BSD-3-Clause",
- "support": {
- "issues": "https://github.com/yiisoft/yii2/issues?state=open",
- "forum": "http://www.yiiframework.com/forum/",
- "wiki": "http://www.yiiframework.com/wiki/",
- "irc": "irc://irc.freenode.net/yii",
- "source": "https://github.com/yiisoft/yii2"
- },
- "minimum-stability": "dev",
- "require": {
- "php": ">=5.4.0",
- "yiisoft/yii2": "*",
- "yiisoft/yii2-swiftmailer": "*",
- "yiisoft/yii2-bootstrap": "*",
- "yiisoft/yii2-debug": "*",
- "yiisoft/yii2-gii": "*"
- },
- "scripts": {
- "post-create-project-cmd": [
- "yii\\composer\\Installer::setPermission"
- ]
- },
- "extra": {
- "writable": [
- "backend/runtime",
- "backend/web/assets",
- "console/runtime",
- "console/migrations",
- "frontend/runtime",
- "frontend/web/assets"
- ]
- }
- }
首先,修改一些基本信息。例如名称,描述,关键词,主页等等。
你还可以根据你的需要添加更多的应用程序。这些包都是来自packagist.org,可免费的浏览所有的代码。
修改完composer.json之后 就可以运行
php composer.phar update --prefer-dist
,等下载并安装完成后就可以开始使用了。自动加载的类将会自动处理。
创建从后端到前端的链接
通常情况下需要从后端应用程序连接到前端应用程序。因为前端应用程序可能包含自己的URL管理规则,所以需要再添加一个不同名字的后台的URL管理规则。
- return [
- 'components' => [
- 'urlManager' => [
- // here is your normal backend url manager config
- ],
- 'urlManagerFrontend' => [
- // here is your frontend URL manager config
- ],
- ],
- ];
之后,就可以像这样来使用前台的url
Reference: Learn Yii Framework online – CGridView filter with relational field
Model:
1. 添加filter用的属性
var $a = “”;
var $b = “”;
2. 修改rules方法中的配置
array(‘……., a, b’, ‘safe’, ‘on’=>’search’);
3. 注意relations方法
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
‘xxx‘ => array(self::HAS_ONE, ‘xxxModel’, array(‘…’ => ‘….’)),
);
}
4. 修改search()方法添加行
$criteria->compare(‘xxx.ax‘,$this->a);
$criteria->compare(‘xxx.bx‘,$this->b);
View
1. ‘dataProvider’=>$model->with(“xxx“)->search(),
2. 列展示修改
array(
‘name’ => ‘a‘,
‘value’ => ‘$data->xxx->ax‘,
‘filter’ => array(select的下来菜单数组),
),
array(
‘name’ => ‘b‘,
‘value’ => ‘$data->xxx->bx‘,
‘filter’ => array(1 => “Set”, 0 => ‘Not Set’),
),
代码提示:
1. 添加的两个属性仅仅用于记录页面的搜索条件
2. search方法中的CDbCriteria搜索方法没有任何变化,请学习如何使用关联搜索
$criteria = new CDbCriteria;
//select
$criteria->select = '*';//默认*
$criteria->select = 'id,name';//指定的字段
$criteria->select = 't.*,t.id,t.name';//连接查询时,第一个表as t,所以用t.*
$criteria->distinct = FALSE; //是否唯一查询
//join
$criteria->join = 'left join table2 t2 on(t.id=t2.tid)'; //连接表
$criteria->with = 'xxx'; //调用relations
//where 查询数字字段
$criteria->addCondition("id=1"); //查询条件,即where id = 1
$criteria->addBetweenCondition('id', 1, 4);//between 1 and 4
$criteria->addInCondition('id', array(1,2,3,4,5)); //代表where id IN (1,23,,4,5,);
$criteria->addNotInCondition('id', array(1,2,3,4,5));//与上面正好相法,是NOT IN
//where 查询字符串字段
$criteria->addSearchCondition('name', '分类');//搜索条件,其实代表了。。where name like '%分类%'
//where 查询日期字段
$criteria->addCondition("create_time>'2012-11-29 00:00:00'");
$criteria->addCondition("create_time<'2012-11-30 00:00:00'");
//where and or
$criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND
//这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,
//即如果第二个参数是数组就会调用addInCondition
$criteria->compare('id', 1);
/** * 传递参数 */
$criteria->addCondition("id = :id");
$criteria->params[':id']=1;
//order
$criteria->order = 'xxx DESC,XXX ASC' ;//排序条件
//group
$criteria->group = 'group 条件';
$criteria->having = 'having 条件 ';
//limit
$criteria->limit = 10; //取1条数据,如果小于0,则不作处理
$criteria->offset = 1; //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'chapter-grid',
'dataProvider'=>$model->search(), //数据结果集
'filter'=>$model,
'columns'=>array(
'id',
//锚点<a href="http://www.gulianqiang.com/"></a>
array(
'name'=>'name',
'type'=>'raw',
'value'=>'CHtml::link($data->name,"/book/$data->id")',
),
//图片
array(
'name'=>'image',
'type'=>'image',
'value'=>'LImages::getPath("book").$data->image',//图片相对路径
),
//下拉列表
array(
'name'=>'type',
'value'=>'Lookup::item("chapterType",$data->type)',
'filter'=>Lookup::items('chapterType'),
),
//内容截取
array(
'name'=>'content',
'type'=>'html',
'value'=>'mb_substr(htmlspecialchars_decode($data->content),0,100,"utf-8")',
),
//时间
array(
'name'=>'create_time',
'type'=>'datetime',
),
// 根据相关信息读数据库
array(
'name'=>'user_id',
'value'=>'User::model()->findbyPk($data->user_id)->username',
'filter'=>false,
),
array(
'class'=>'CButtonColumn',
),
),
)); ?>