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,先安装

  1. curl -s http://getcomposer.org/installer | php

然后用如下命令来获取

  1. 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)

    1. php /path/to/yii-application/init
  • 创建新的数据库,设置common/config/main-local.php里的components.db数据库信息
  • 使用控制台命令迁移数据库
    1. 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

  1. {
  2. "name": "yiisoft/yii2-app-advanced",
  3. "description": "Yii 2 Advanced Application Template",
  4. "keywords": ["yii", "framework", "advanced", "application template"],
  5. "homepage": "http://www.yiiframework.com/",
  6. "type": "project",
  7. "license": "BSD-3-Clause",
  8. "support": {
  9. "issues": "https://github.com/yiisoft/yii2/issues?state=open",
  10. "forum": "http://www.yiiframework.com/forum/",
  11. "wiki": "http://www.yiiframework.com/wiki/",
  12. "irc": "irc://irc.freenode.net/yii",
  13. "source": "https://github.com/yiisoft/yii2"
  14. },
  15. "minimum-stability": "dev",
  16. "require": {
  17. "php": ">=5.4.0",
  18. "yiisoft/yii2": "*",
  19. "yiisoft/yii2-swiftmailer": "*",
  20. "yiisoft/yii2-bootstrap": "*",
  21. "yiisoft/yii2-debug": "*",
  22. "yiisoft/yii2-gii": "*"
  23. },
  24. "scripts": {
  25. "post-create-project-cmd": [
  26. "yii\\composer\\Installer::setPermission"
  27. ]
  28. },
  29. "extra": {
  30. "writable": [
  31. "backend/runtime",
  32. "backend/web/assets",
  33. "console/runtime",
  34. "console/migrations",
  35. "frontend/runtime",
  36. "frontend/web/assets"
  37. ]
  38. }
  39. }

首先,修改一些基本信息。例如名称,描述,关键词,主页等等。
你还可以根据你的需要添加更多的应用程序。这些包都是来自packagist.org,可免费的浏览所有的代码。
修改完composer.json之后 就可以运行

  1. php composer.phar update --prefer-dist

,等下载并安装完成后就可以开始使用了。自动加载的类将会自动处理。

创建从后端到前端的链接

  通常情况下需要从后端应用程序连接到前端应用程序。因为前端应用程序可能包含自己的URL管理规则,所以需要再添加一个不同名字的后台的URL管理规则。

  1. return [
  2. 'components' => [
  3. 'urlManager' => [
  4. // here is your normal backend url manager config
  5. ],
  6. 'urlManagerFrontend' => [
  7. // here is your frontend URL manager config
  8. ],
  9. ],
  10. ];

之后,就可以像这样来使用前台的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',
),
),
)); ?>

yii2高级应用的更多相关文章

  1. yii2高级版账号密码问题

    yii2高级版默认后台没有密码,生成账号密码步骤: 1. CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` ...

  2. Yii2高级版本复制新项目出现问题解决(转)

    引用于 http://www.linuxidc.com/Linux/2015-02/114116.htm Yii2高级版本复制新项目会遇到下面的报错信息: exception 'yii\base\In ...

  3. Yii2 高级模板不使用Apache配置目录,将前后台入口移到根目录

    刚刚入手Yii2高级模板不久,部署项目时,得部署2个应用,个人感觉很繁琐,就将前后台入口文件全部拿到项目根目录.但是一看,完了,出错了!找教程找不到,还是自己解决吧 为了以后好升级,不改变Yii2核心 ...

  4. Yii2高级模板vendor和application非同级目录部署

    上面是Yii2的高级模板,当我们有多个application的时候,这种高级模板可以可以提供很好的扩展性,多个application共用一份YII2框架,默认情况下,框架和application是在同 ...

  5. yii2高级模板使用一个域名管理前后台

    yii2的高级模板分为backend和frontend,最开始用yii的时候并没怎么在意,就使用了两个域名分别解析前后台.今天无意间看见 可以使用一个域名指向前后台. 1.修改 advanced/ba ...

  6. Yii2高级模板的安装

    1.通过composer 安装高级版 C:wampwwwyii>composer create-project --prefer-dist yiisoft/yii2-app-advanced a ...

  7. windows 下安装Yii2 高级版本

    1.  首先安装 Composer 2.  执行  composer global require "fxp/composer-asset-plugin:~1.1.1" 3. 执行 ...

  8. yii2高级模板安装

    通过 Composer 安装 如果还没有安装 Composer,在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/insta ...

  9. Yii2 高级查询

    首先我们要自己写一个ActiveQuery 类并且继承 Yii2 的 ActiveQuery: namespace api\models; class ActiveQuery extends \yii ...

随机推荐

  1. 《理解 ES6》阅读整理:块绑定(Block Binding)

    变量声明一直是JavaScript中一个需要技巧的部分.在大多数基于C的编程语言中,变量(更正式地说是绑定)在声明的时候创建,然而在JavaScript中并不是这样.在JavaScript中,变量在何 ...

  2. SVEditor 1.3.6 发布

    SVEditor 1.3.6 支持代码高亮时没有处理 #ifdefs 语句的问题,支持类.接口.模块.任务和函数的代码折叠,修复了一些 bug. SVEditor 是一个Eclipse的插件,用来编辑 ...

  3. jqPlot图表插件学习之饼状图和环状图

    一.准备工作 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载对应的js和css(因为笔者在VS2 ...

  4. kali Linux系列教程之BeFF安装与集成Metasploit

    kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...

  5. 菜鸟日记-HTML

    第一部分  HTML---Hyper Text Markup Language--超文本标记语言 1.HTML标准:<html> <head> 网页上的控制信息 <tit ...

  6. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  7. windows xp/7命令提示符强制结束指定进程

    开始----“运行 ”输入cmd ,然后在命令提示符下输入tasklist,出现如下列表: Image Name                     PID Session Name        ...

  8. Objective-C 高性能的循环

    Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合  (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏 ...

  9. GO語言視頻教程

    第1课:https://github.com/Unknwon/go-fundamental-programming/blob/master/lectures/lecture1.md Go开发环境搭建h ...

  10. 在 Xen 虚拟机下修改系统当前时间

    在 Xen 虚拟机下修改系统当前时间 Xen 虚拟机默认不允许不同的虚拟机使用不同的系统时间,因此所有虚拟机的系统时间都会同宿主机的系统时间严格同步,用 date 命令修改虚拟机系统时间时虽然提示成功 ...