------------------------------------------------------------------yii2.0------------------------------------------------------------------------
1.php新特性
-
匿名函数
-
数组短语法形式: [1,2,3] 取代 array(1,2,3) 。这在多维数组、嵌套数组中,代码更清晰、
简短。
-
在视图文件中使用PHP的 <?= 标签,取代 echo 语句。
-
标准PHP库(SPL) 类和接口,具体可以查看 SPL Class and Interface
-
延迟静态绑定, 具体可以查看 Late Static Bindings
-
PHP标准日期时间
-
特性(Traits)
-
使用PHP intl 扩展实现国际化支持, 具体可以查看 PECL init 。
了解Yii2.0使用了PHP的新特性,可以避免开发时由于环境不当,特别是开发生产环境切换时,产 生莫名其妙的错误。 同时,也是让读者朋友借机学习PHP新知识的意思。
2.属性+事件+行为
component 区分成 object ( set get ) <== compent( event + behavior )
Yii1.1是 , 就 已 经 有 了component了 。Yii2将Yii1中 的CComponent拆 分 成 两 个 类 : yii\base\Object 和 yii\base\Component 。Object比较轻量级些,通过getter和setter定义了 类 的 属 性 (property) 。Component派 生 自Object, 并 支 持 事 件 (event) 和 行 为 (behavior) 。 因 此,Component类具有三个重要的特性:
• 属性(property) • 事件(event)
• 行为(behavior)
相信你或多或少了解过,这三个特性是丰富和拓展类功能、改变类行为的重要切入点。
3.别名
小结一下,默认预定义别名一共有10个,其中路径别名9个,URL别名只有 @web 1个: • @yii 表示Yii框架所在的目录;
• @app 表示正在运行的应用的根目录;
• @vendor 表示第三方库所有目录;
• @runtime 表示正在运行的应用的运行时用于存放运行时文件的目录; • @webroot 表示正在运行的应用的入口文件 index.php 所在的目录; • @web URL别名,表示当前应用的根URL;
• @common 表示通用文件夹;
• @frontend 表示前台应用所在的文件夹;
• @backend 表示后台应用所在的文件夹;
• @console 表示命令行应用所在的文件夹;
• 其他使用Composer安装的Yii扩展注册的二级别名。
-
别名需在使用前定义,因此通常来讲,定义别名应当在放在应用的初始化阶段。
-
别名必然以 @ 打头。
-
别名的定义可以使用之前已经定义过的别名。
-
别名在储存时,至多只分成两级,第一级的键是根别名。 第二级别名的键是完整的别名,而不是 去除根别名后剩下的所谓的“二级”别名。
-
Yii通过分层的树结构来保存别名最主要是为高效检索作准备。
-
很多地方可以直接使用别名,而不用调用 Yii::getAlias() 转换成真实的路径或URL。
-
别名解析时,优先匹配较长的别名。
-
Yii预定义了许多常用的别名供编程时使用。
- 使用别名时,要将别名放在最前面,不能放在中间。
4.自动加载机制
require==>new
_autoload==>new
spl_autoload_register==>new (允许自定义 自动加载 函数或是类)
检查 $classMap[$className] 看看是否在映射表中已经有拟加载类的位置信息;
如果有,再看看这个位置信息是不是一个路径别名,即是不是以 @ 打头, 是的话,将路径别名解 析成实际路径。 如果映射表中的位置信息并非一个路径别名,那么将这个路径作为类文件的所在 位置。 类文件的完整路径保存在 $classFile ;
如果 $classMap[$className] 没有该类的信息, 那么,看看这个类名中是否含有 \ , 如果 没有,说明这是一个不符合规范要求的类名,autoloader直接返回。 PHP会尝试使用其他已经注册 的autoloader进行加载。 如果有 \ ,认为这个类名符合规范,将其转换成路径形式。 即所有的 \ 用 / 替换,并加上 .php 的后缀。
将替换后的类名,加上 @ 前缀,作为一个路径别名,进行解析。 从别名的解析过程我们知道,如 果根别名不存在,将会抛出异常。 所以,类的命名,必须以有效的根别名打头:
MVC
DIP(依赖倒置 设计原则)==>IoC(控制反转 设计思路)==>DI(依赖注入 设计模式)==>构造函数或是属性注入
5.配置文件
Yii应用配置文件生效的顺序是:
• 前台、后台、命令行互不影响;
• 前台、后台、命令行覆盖common;
• aliases和main互不影响;
• params是main的一部份;
• 带local的覆盖不带local的。
-------------------------------------------------------------------------------------------yii1.1----------------------------------------------------------------------------------------
小结:
controllers:filters accessRules 常见调用 behavior
models:ar rules relations search curd +labels
views:导航 日期 列表页 菜单层级 动态效果(按钮 弹窗 进度条 拖拽 选中) | 表单 上传 验证码 分页 ajax 防xss|编辑器 语言包 格式化
extensions:ajax 多图 多上传 编辑器 mail right debug css/js压缩 editor srbac
configs:入口信息(path + import)设置信息(components(作为widget加载,可有自带的view)+modules) 其他信息 (time charset language)
+url 逻辑 配置 参数
.htaccess 防盗链 规范网址 错误页面 加密 验证 缓存 伪静态 压缩
yiiblog的东西
教程:
http://blog.csdn.net/dreamzml/article/category/1285252
http://blog.csdn.net/mapdigit/article/category/1198915
http://www.thinksaas.cn/group/show/283/
小结:
http://www.cnblogs.com/thinksasa/p/3780549.html
http://blog.csdn.net/iefcu/article/details/6021443
获取(见具体实现):类/方法 方式 参数 文件(多国语言 主题替换 加载样式) | url | curd(多表 & 查询) | widget(控件 日历 验证码 上传文件 & 特效)
默认控制和方法并获取ID
判断提交参数
获取提交方式
导入js css meta
调用生成url
mysql curd
创建 widget CWidget::init()与CWidget::run()的区别
命名空间常量 system=>framework zii=>library application==>应用 webroot==>入口目录 ext==>第三方扩展
具体实现:
控件 ActionFormDemo CListview CDetailView CGridView
日历 DatePickerDemo
验证码 CCaptchaDemo
多文件上传 MultiFileUploadDemo
加载缓存 memcache/redis
使用事务 transaction
多表&查询组件 视图嵌套 DetailViewDemo
验证规则 :自定义的规则
criteria查找:条件查找
Ajax 验证
多国语言 I18ndemo
加载样式 registerCss registerJavascript
主题替换 ThemeDemo
UI组件,特效的查文件名 :
--CJuiAccordion 手风琴
--CJuiAutoComplete 自动填充完成
--JuiButtonDemo 按钮属性
--CJuiDialog 弹窗
--JuiDraggable CJuiDroppable 拖拽
--CJuiProgressBar 进度条
--CJuiResizable 框框缩放
--CJuiSelectable select事件
--JuiSlider 图片缩放
--CJuiSliderInput输出对应的值
--CJuiSortable 拖拽排序
--CTreeView 树形图
--CTextHighlighter 显示代码示例
--CMenu+ breadcrumbs 菜单栏
--CMaskedTextField 格式输入框
--TabViewDemo 标签分页
+JuiTabsDemo
详细:
controllers:filters accessRules 常用调用 behavior
filter:framework/web/filters/CFilter.php
- public function filters()
- {
- //过滤只用于actionEdit和actionCreate方法
- return array(
- 'accessControl',
- 'postOnly + delete',
- 'test + edit, create’, //自定义方法
- );
- }
- //定义的过滤方法 Filters+Test,也就是上面的
- public function FilterTest($filterChain)
- {
- //判断什么的
- //过滤完后继续执行代码
- $filterChain->run();
- }
accessRules:framework/yiilite.php ccontroller—>controller—>自定义+Controller
- public function accessRules()
- {
- return array(
- array('allow', // 所有用户有操作权限:index,view
- 'actions'=>array('index','view'),
- 'users'=>array('*'),
- ),
- array('allow', // 仅登录用户有权限操作:create,update
- 'actions'=>array('create','update'),
- 'users'=>array('@'),
- ),
- array('allow', // 指定用户有权限操作:admin,delete
- 'actions'=>array('admin','delete'),
- 'users'=>array('admin'),
- 'expression'=>array($this,'isNormalAdmin'), //表示调用$this(即**Controller)中的isNormalAdmin方法。
- ),
- array('deny', // 禁止所有用户操作
- 'users'=>array('*'),
- ),
- );
- }
其他选项:http://www.cnblogs.com/freespider/p/3490233.html
常见调用: path/controller/action/val http:ip cookies session http://blog.csdn.net/xinqingch/article/details/9045641
request—>cookie getParam userHostAddress urlReferrer url hostInfo
homeUrlreturnUrl BasePath baseUrl attributes
getController()->getAction()->id;
Yii::app()->request->isPostRequest;
db—>getLastInsertID
url调用:http://blog.csdn.net/dreamzml/article/details/8479047
behavior: framework/base/CBehavior.php
event—>事件onclick event handler—>回调callback
- <?php
- class eventClass extends CBehavior
- {
- public function show(){
- echo "show";
- }
- }
- class test extends CComponents
- {
- public function hello(){
- $this->attachBehavior(‘onclick',"eventClass");
- $this->show();
- }
- 源码分析:http://blog.chinaunix.net/uid-27003384-id-3338673.html
- http://blog.csdn.net/chengfei112233/article/details/7659768
models:ar rules relations search curd +labels
ar:framework/db/ar/CActiveRecord.php
before/after + Validate Save Delete Construct Find:
rules: framework/validators
require:unique compare length in type default exist safe unsafe
match : email url numerical catcher file date boolean
relations:framework/db/ar/CActiveRecord.php
BELONGS_TO
(属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A (例如Post
属于User
);
'category'=>array(self::BELONGS_TO, ‘其他表’, ‘本类的字段')
解释:其他表.PK=本表.字段
'image' => array(self::HAS_MANY, ‘其他表', ‘其他表的字段'),
解释:其他表的字段 关联本类的主键
'categories'=>array(self::MANY_MANY, 'Category', 'prop_category(prop_id, category_id)’) 解释:中间表名( 本表外键, many表外键 )
'user'=>array(self::HAS_ONE,‘其他表','字段'),
解释:本表主键 = 其他表的字段
HAS_MANY
(有多个): 如果表 A 和 B 之间的关系是一对多,则 A 有多个 B (例如User
有多个Post
);HAS_ONE
(有一个): 这是HAS_MANY
的一个特例,A 最多有一个 B (例如User
最多有一个Profile
);MANY_MANY
(多对多) 这个对应于数据库中的 多对多 关系。由于多数 DBMS 不直接支持 多对多 关系,因此需要有一个关联表将 多对多 关系分割为 一对多 关系。在 AR 术语中,我们可以解释MANY_MANY
为BELONGS_TO
和HAS_MANY
的组合。
如果是一对一:A->VarName
如果是一对多:A->VarName->name
如果是多对多
- $users = As->VarName
- foreach($users as $u){
- $_tmp_users[] = $u -> getName;
- }
- userStr = implode(', ', $_tmp_users);
http://hudeyong926.iteye.com/blog/1274077
search:/framework/db/schema/CDbCriteria.php
compare select add(In/NotIn)Condition addSearchCondition addBetweenCondition join order group having limit with prams
curd:framework/yiilite.php
参数:bindParam
查询:query queryall query row queryColumn queryScalar execute
数据集合:find findall findbypk findAllByAttributes findAllBySql
查询个数:count countBySql exists
添加:save insert
修改:updateAll updateByPk updateCounters
删除: deleteAll deleteByPk delete
事务:beginTransaction commit rollback
分页:http://zhengdl126.iteye.com/blog/1460779
views:framework/zii+web+utils
导航 日期 列表页 菜单层级 动态效果(按钮 弹窗 进度条 拖拽 选中) | 表单 上传 验证码 分页 ajax 防xss |编辑器 语言包 格式化
yii自带效果:cbreadcrumbs CJuiDatePicker CGridView clistview kindEditor language droplist format
http://blog.csdn.net/mapdigit/article/category/1198915/1
http://jingyan.baidu.com/article/ed15cb1b78871c1be2698141.html
ActiveForm 表单
Captcha 验证码
MultiFileUpload 上传文件
DatePicker 日期
Menu 标签
Tabs 标签
TreeView 层级菜单
TabView 标签
ListView 列表页
DetailView 详情页
GridView 列表页
Accordion 折叠页面
Selectable 选中
AutoComplete 自动显示
TextHighlighter 高亮代码
Theme 主题
多国语言示例
ClipWidget 预定义(宏)
ContentDecorator 嵌套
Button 按钮
Dialog 弹窗
ProgressBar 进度条
Slider 进度条拖放
SliderInput 进度条输入
MaskedTextField 输入框格式
StarRating 星星
+
Draggable 拖放图片
Droppable 拖放图片
Resizable 缩放
Sortable 拖放
功能:model (属性和验证) ctrl(方法和权限) view(widgets)
验证码: framework/validators/CCaptchaValidator.php
—model 加一个属性和rules
—view 加载widget(‘captcha')
—controller:action 中加验证码调captcha,同时加入到accessRules
—表单开启ajax后 修改testLimit
ajax:framework/web/widgets/CActiveForm.php
—model:rules+function (CFormModel)
—view:widget(CActiveForm)
—controller:调用model的类判断 $_POST['ajax']===‘form-id'
链接:http://601502546.blog.163.com/blog/static/25961076201312703536673/
分页--
path:framework/web/widgets/pagers/CLinkPager.php
ctrl CPagination view CLinkPager
path:framework/zii/widgets/CListView.php
ctrl CActiveDataProvider view zii.widgets.CListView
path:framework/zii/widgets/grid/CGridView.php
modelCActiveDataProvider view CGridView
链接:http://blog.csdn.net/dreamzml/article/details/8225366
xss--framework/web/widgets/CHtmlPurifier.php
CHtmlPurifier==>ctrl + filter +model + view
extensions:ajax 多图 多上传 编辑器 mail right debug css/js压缩 editor srbac
config
Yii::import('application.vendors.*’);
controller
require_once('Zend/Search/Lucene.php’);
$lucene=newZend_Search_Lucene($pathOfIndex);
$hits=$lucene->find(strtolower($keyword));
链接:http://keshion.iteye.com/blog/1594948
configs:入口信息(path + import)设置信息(components+modules) 其他信息 (time charset language)
basePath name aliases defaultController preload defaultController import(models components modules)
components(db params cache gii session cookie url user errorHandler log ) modules(gii 自定义)
timeZone theme sourceLanguage charset language theme
http://hudeyong926.iteye.com/blog/1484367
+url 逻辑 配置 参数
逻辑:解析(解析 - 正则 - path+get)+创建(解析 path+get 正则 ) http://www.cnblogs.com/mrcoke/articles/2407759.html
参数:格式 后缀 规则(正则) 隐藏index.php http://kenzou04jolin.blog.163.com/blog/static/8655006520130152475659/
配置:config+nginxRewrite+(apache==>.htaccess)
+.htaccess
http://jingyan.baidu.com/article/e8cdb32b8feba237052bada6.html
http://3y.uu456.com/bp-sd48b120bd64783e0q122bf6-1.htm
+yiiBlog
1.controller route:
postcontroller.index->view->_view->Post.model->返回controller
postcontroller.create->create.view->_form->返回controller
update同上
postcontroller.admin->postmodel.search->admin.view-->p.ctrl.up/del/view-->返回controller
postcontroller.view-->_view _comments \comment\_form-->返回controller
Ajax:CActiveForm CAutoComplete
+controller.ajax
route: comment._comment-->postContorller.view-->addComment
//view
/*CActiveForm挂件里面的一个极为有用的特性是它支持数据验证
支持三个层面的数据验证
服务器端验证,基于AJAX的验证,客户端验证
*/
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'comment-form',
'enableAjaxValidation' = >true, //ajax验证
'enableClientValidation' = >true,//客户端js验证
)); ?>
<?php $this->endWidget(); ?>
cotroller
if(isset($_POST['ajax']) && $_POST['ajax']==='comment-form')
{
echo CActiveForm::validate($comment);
Yii::app()->end();
}
+view.CAutoComplete
route:post.view-->post.controller
//post.view
<?php echo $form->labelEx($model,'tags'); ?>
<?php $this->widget('CAutoComplete', array(
'model'=>$model, //post的model对象
'attribute'=>'tags', //对应的属性值
'url'=>array('suggestTags'), //controller的方法
'multiple'=>true, //允许输入多个,默认都好隔开
'htmlOptions'=>array('size'=>50), //输入框
)); ?>
//postcontroller $_GET[q]是输入的值
public function actionSuggestTags()
{
if(isset($_GET['q']) && ($keyword=trim($_GET['q']))!=='')
{
$tags=Tag::model()->suggestTags($keyword);
if($tags!==array())
echo implode("\n",$tags);
}
}
2.数据控件:
CDbCriteria==>compare or condition ==>CActiveDataProvider==>render
3.view控件
列表页
CListView==>dataProvider itemView template
http://blog.csdn.net/mapdigit/article/details/8452128
列表页
CgridView==>dataProvider filter
columns(array(
'name'=>字段名称
'type'=>链接的raw
'filter'=>下拉菜单的生成
'value'==>model层查询),
...
array('class'=>'CButtonColumn'),)
http://www.imobilebbs.com/wordpress/archives/4079?variant=zh-cn
详情页
CDetailView==>(dataProvider,attributes)
http://blog.csdn.net/mapdigit/article/details/8452130
l