yii框架笔记

blovejin 贡献于2017-12-27

作者 X220  创建于2013-05-07 10:53:00   修改者X220  修改于2013-05-28 14:19:00字数16541

文档摘要:高性能框架、代码重用性发挥到了极致、惰性加载框架、速度非常快,缓存、登录组件、助手(小物件,灵活创建表单,常见html代码)、日志组件等等。 适合开发大型web应用系统
关键词:

【Yii框架学习】 介绍、安装部署框架、商城模板与yii结合、MVC 历史:2008年1月 到现在 Php框架:cakephp CI(codeIgniter) symfony TP(thinkphp) zendframework(官方) Yii 等等,还有许多叫不上名字的框架。 Yii:高性能框架、代码重用性发挥到了极致、惰性加载框架、速度非常快 缓存、登录组件、助手(小物件,灵活创建表单,常见html代码)、日志组件等等。 适合开发大型web应用系统 开发者:xue qiang (美国华人) 版本情况:(2008年-----2009年)1.0.0-----1.0.12 (2010年-----现在)1.1.0------1.1.13 【yii框架部署】 我们需要创建自己的应用系统 Cms 内容管理系统 Shop商城系统 Office办公系统 Crm客户关系管理系统 开始访问我们的应用系统。 【yii在什么地方用的多】 框架:dedecms ecshop crm Dedecms是内容管理系统的框架 Ecshop是做商城网站的框架 Crm是做客户关系管理系统的框架 以上3个框架都是“专门”针对具体领域的框架,这样的框架不灵活,死板。 Yii框架是通用的框架,一般适合客户需求比较灵活、比较花样多,比较复杂的地方。 Yii框架设计模式是主流MVC。 Yii框架是一个纯OOP面向对象框架。 【商城模板与Yii框架结合】 Yii访问需要走路由,设置好路由就会找到对应的控制器和方法 http://web.0507shop.com/ 路由:http://web.0507shop.com/index.php?r=site/index Controller控制器 view视图 Model模型 MVC设计模式 将样式、图片、js静态资源集成到系统里边 Css样式:/assets/default/css/ 图片:/assets/default/img Js: /assets/js/ 静态资源目录统一放入系统常量里边,方便调用。 /protected/config/constants.php 用户登录模板与Yii框架整合: 1. 创建UserController控制器 2. 创建视图views/user/login.php 3. 控制器调用视图$this->renderPatial(); 4. 引入css和图片,将样式目录与图片目录放入常量,统一调用。 【路由】 在框架里边我们通过路由获得控制器和方法 我们有了控制器的方法,就可以进一步与视图或模型进行交互 http://网址/index.php?r=控制器/方法 【商城其他页面与Yii结合】 Netbeans生成时间快捷键: Ctrl+j 今晚主要任务 : 商城前台模板 与 Yii结合 1, Yii框架部署起来(根据自己情况搭建虚拟主机,也可以使用localhost) 2, 控制器和视图理解好 控制器:UserController (名字Controller) 方法: actionLogin (action名字) Views/ 下边有许多目录,目录原则是:每个控制器名字在views下都有对应名字的目录存在,里边存放具体模板文件 3. 理解好常量文件constant.php(样式目录和图片目录定义) 4. 商城网站与Yii框架结合制作出效果(首页、登录、注册、商品列表、商品详细) 控制器调用视图 模板引入样式和图片 自定义控制器: 【昨天内容回顾】 我们又学习控制器和视图 l 父类Controller在哪了? 答: 这个父类我们没有显示包含进程序里边,比如include、requre之类包含指令 l 那么这个父类控制器Controller我们在什么地方给包含进来的? 答:在Yii应用的主配置文件里边main.php,间接通过引入compoments组件目录进来的 l 那么主配置文件main.php在什么地方引入到我们的应用里边的呢? 答:在统一入口处index.php 控制器----》父类控制器----》compoments---àmain.php----àindex.php 1. 在前台通过“布局”展示模板样式 2. 学习使用自动代码生成工具gii,通过gii创建后台模块 3. 在后台将模板展示出来 4. 根据情况引入数据库 【yii布局实现】 布局文件已经实现出来,下面我们需要使用这个布局文件 我们系统默认的布局文件是colum1.php 使用布局文件: 布局文件具体与什么有关系: 控制器渲染视图renderPartial()此方法不会渲染布局 render()这个方法会渲染布局。 下边我要做什么事情? 把公共的头部提取出来 现在我们布局已经做好了: 1. 制作布局文件layouts/文件名字,使用$content代表普遍模板内容。 2. 设置布局文件,在父类控制器里边public $layout = "//layouts/shop"; 3. 调用布局文件,在控制器方法里边使用方法render()就会调用布局文件。 【商城后台部署】 一般网站都会有“前台”和“后台” 前台:给一般普通用户来使用 后台:是给公司维护人员来使用,例如我们给网站添加商品、修改商品等操作是通过后台来处理的。 同学们思考:如何创建后台 后台有自己的控制器和视图 我们程序的架构是部署在Yii上边。 Yii自己有一个模块机制,可以帮组我们实现后台的搭建 模块:有自己独立的控制器、独立的视图、独立的模型,其不可以单独部署。 我们创建模块:gii(自动代码生成工具) gii在Yii里半是以模块形式存在。在main.php配置文件里边打开gii模块,以便使用。 gii模块如何来访问: 通过路由形式访问该模块 http://web.0507shop.com/index.php?r=模块名字 http://url/index.php?r=gii 路由会判断当前的名字,是模块定位到模块,否则定位控制器 现在我们要生成一个后台模块 我们给后台起一个名字“houtai” 现在我们后台模块已经创建成功,要想使用,必须在main.php引入该模块 现在我们访问后台模块 http://web.0507shop.com/index.php?=houtai 后台默认模板文件 D:\www\0507\shop\protected\modules\houtai\views\default\index.php 如上图,后台显示的时候为什么会显示前台的布局内容,是Yii代码重用性的体现,我们可以自定义后台布局进行显示,后边讲解。 【后台模板效果展示】 在后台有用户登录功能 通过控制器和视图展示登录页面 我们操作后台与操作前台是完全一样的行为习惯,不同的是我们访问后台: http://web.0507shop.com/index.php?r=模块/控制器/方法 后台在访问的时候,路由需要加上模块的名字。 前台访问: http://web.0507shop.com/index.php?r=控制器/方法 【模块】: 在Yii里边,就是独立形成的MVC设计模式的代码的集合体,也是有一定功能代码的集成,这个功能类似前台功能,前台有控制器、视图、模型,模块也有控制器、视图、模型。前台可以实现的功能,模块都可以实现。 【实现后台其他页面效果】 我们后台整体架构使用html里边的框架标签frameset 头部frame 左侧菜单部分frame 主体内容部分frame 整体是frameset 头部、左侧、主体都是单独的页面,有独立的控制器和方法来访问 后台整体实现: 使用了frameset标签将头部、左侧、右侧三种结合到一起形成了html框架布局,是“品”字型布局。 【后台商品列表页面部署】 控制器goods 视图 上图right的结合,在单击超链接的时候,连接内容会跑到frame对应的名字里边,name=”right” target=”_blank” //新窗口展示链接内容 target=”self” //本窗口展示链接内容 target=”名字” //这个名字与frame里边的名字一致,那么链接内容会跑到这个frame里边。 总结: 1. 前台视图文件的布局效果实现 2. 我们使用自动代码生成工具gii生成了后台模块 3. 后台视图页面实现(登录、frameset主体框架页面、商品操作) 明天会学习数据库操作 作业: 1. 利用gii将后台模块创建出来 2. 后台的登录、主体frameset框架页面、商品添加修改展示页面实现出来 3. 布局效果根据个人情况具体实现。 前两天学习Yii框架 前台的控制器和视图制作出来(模板与Yii框架结合) 视图模板关于布局layout使用 后台部署,gii生成后台模块 后台登录、商品展示、主体frameset框架部署起来 模块:让前台和后台的代码在物理上分隔来开 当我们有相对独立的业务需求,都可以通过模块来解决。 【数据库操作】 MVC框架 C:controller 控制器 V:view 视图 M:model 模型 操作数据库步骤: 1) 建立数据库php0507、建立数据表、写入测试数据 2) 通过Yii框架连接数据库main.php 3) 注意:数据库内部处理走PDO,因此需要让php开启PDO扩展。php.ini 4) 测试Yii 框架是否有链接上数据库 在控制器里边随便一个地方输出信息: var_dump(Yii::app()->db); 红色文字意思是获得数据库组件 Yii::app():Yii框架是纯OOP面向对象框架,每次web请求,相当于通过创建一个类的对象,让对象调用相关方法执行。对象是我们框架应用的核心对象,我们也可以通过代码获得这个应用对象(Yii::app())。 以上信息出现说明数据库有连接成功。 【使用数据库】 现在我们可以对数据库进行增、删、改、查操作 MVC,现在我们需要制作model来操作数据库 创建model模型goods 我们来看看“db”到底是谁? main.php Yii框架核心代码大约有10000行,有一个文件将全部核心代码整理了。 D:\www\0507\framework\ yiilite.php 【使用数据模型goods】 利用模型查询数据表的数据,在后台实现商品信息的查询 模型: 有多少数据表,就建立多少模型 模型其实就是类 我们对数据库进行操作,需要实例化模型类,产生对象 通过对象调用相关的方法,就可以实现数据库的操作 CActiveRecord:是活跃记录,AR,好多成熟框架都有此技术。 将数据表的相关内容以“类”的形式呈现出来。 我们学习AR技术。 让页面底部产生日志信息: 获得全部商品信息findAll() 结果是一个大的数组,里边有具体对象元素 我们可以遍历这个大的数组。 遍历出来的结果是具体每条记录的对象 记录对象产生了,就可以利用对象调用自己的属性(商品名称、价格、数量等等)获得具体信息 find()会产生一条记录信息,其会返回一个直接对象出来 我们可以通过对象调用自己的属性直接获得具体商品信息 对象->属性; findAll() 返回了一个数组,里边有好多对象元素信息 find() 直接返回了一个对象,可以通过对象获得具体商品信息。 【数据信息展现到视图模板里边】 通过模型获得商品信息展现到页面上 1. 通过模型获得具体商品信息 2. 将商品信息传递到视图模板里边renderPartial(’视图’,被传递变量信息) 3. 在视图里边获得具体商品信息展示。 【通过具体sql语句获得信息】 AR:findAllBysql(); 数据模型: 原则上 一个数据表对应一个模型 模型本质上说就是一个类, 我们对数据库操作需要通过这个类实现, 进而需要实例化这个类,产生对象 对象可以调用类里边的相关方法,进而对数据库进行操作 AR:CActiveRecord, 活跃记录,就是模型,就是类 model 【通过模型model实现数据的添加】 我们操作数据库,需要通过模型创建对象来操作 对象调用相关的方法,实现数据的操作 当我们创建一个对象,这个对象就代表数据表里边的一条记录。 数据表的字段,就是我们创建模型对象的属性 如何添加数据呢 我们把模型对象的属性信息设置好,就可以实现数据的添加。 【利用页面表单实现数据添加】 利用助手进行表单展现 助手:利用php程序来生成html代码。 Yii里边称助手是“小物件”widget 通过widget小物件创建添加商品的表单 首先处理视图: 其次 控制器需要把当前模型对象传递到视图里边,以供表单使用 再次 数据模型需要有一个方法提供汉字名字统一显示 labelEx($goods_model, 'goods_name') ?> labelEx($goods_model, 'goods_weight') ?> 等等。 表单校验: 今天5月9日内容总结 数据库操作 1. yii框架连接数据库main.php(db组件的配置) 2. 制作数据模型model 3. 我们通过数据模型对数据库进行查询和添加信息操作。 4. 通过小物件生成form表单 作业: 1. 配置数据库,完成goods模型的创建 2. 通过小物件实现添加商品信息form表单的显示 模型model 关于商品的数据模型goods model (MVC) 利用商品模型实现数据的查询和添加 查询: findAll() find() findBySql findAll() 该查询系列帮助我们获得多条数据,以数组形式给我们返回,数组里边的每个元素都是一个模型对象。获得具体数据需要遍历。 find() 该查询系列帮助我们每次只获得一条数据,以模型对象的形式给我们返回。 我们使用模型model步骤: 1. 创建模型对象 ① 模型名字::model() ② new 模型模型() 2. 利用对象调用模型里边的一些方法,实现对数据的操作 【商品数据添加】 现在我们已经把添加的表单展现出来,widget小物件展示的表单。 表单展现: model attributeLabels() 模型属性与汉字标签名字对应 controller 将模型传递到视图里边 view(小物件 widget) CactiveForm textField() 普通输入框 label() 展现标签对应名称 标签名称与模型属性对应 【商品添加逻辑部分】 在控制器我们接收表单数据 商品添加 制作表单 收集表单数据,收集好的数据给予数据模型 数据模型调用save方法,实现数据添加 【数据修改】 获得被修改的数据-----》展现到一个表单里边(呈现被修改数据的)-------》在表单里边针对具体内容进行修改-------》修改完毕提交表单进行数据的更新 修改商品信息,我们使用的模板是添加时候的模板,基本没有改动,form表单使用小物件构建的,这个小物件会自动把关联的信息给显示出来,节省了我们开发的成本,这也是我们使用小物件创建form表单的原因之一。 还有一个使用小物件的原因是表单验证需要使用小物件。 同样是save()方法被调用,有insert语句或update语句区分。 new Goods() 和 Goods::model() 都可以进行查询 前者主要是在添加的时候使用,后者是在查询或修改的时候使用。 如果我们添加数据,不使用new Goods,而使用Goods::model那么数据添加失败。 【商品信息删除】 【new Goods 和 Goods::model() 追代码】 new Goods 执行insert (要执行构造函数) Goods::model() 执行update CactiveRecord 【数据查询延伸】 AR(CActiveRecord)活跃记录 find() 查询一个信息 findByPk 根据主键查询信息 findBySql根据sql语句查询信息 findAll()查询全部信息 findAllByPk 根据主键查询全部信息 findAllBySql根据sql语句查询全部信息 findBySql 和 findAllBySql 根据sql语句查询信息,前者会查询一条记录信息,后者会查询条记录信息 前者给返回一个数据模型对象,后者以数组形式给我们返回多个数据模型对象 select * from goods limit 10 findByPk 和 findAllByPk 都是根据主键进行信息的查询 前者每次只可以传递一个主键信息,后者可以传递一个也传递多个 后者传递参数,如果是多个主键信息,需要以数组形式给我们传递。 select condition order limit offset 都是从哪来的。 我们使用findAll() 该方法是数据模型给我们封装好的方法,可以获得全部数据 findAll()是CactiveRecord这个类的成员方法。AR是对数据库向上的封装,AR通过OOP面向对象方式操作数据库。AR需要最终转变为具体的sql语句,通过一个中间类( criteria标准)协助转为的具体sql语句,上边的关键字就是这个中间类criteria的一些属性。 今天内容总结 1. 商品添加逻辑部分完成(save()) 2. 商品信息修改,通过widget小物件创建的表单可以用在添加和修改两个地方。 通过get方式传递被修改商品信息id,同时在控制器方法里边有参数接收 3. 删除商品信息 delete 删除和修改信息,需要注意是那个模型对象调用方法。 4. 详细介绍数据查询和中间标准类 criteria讲解 作业: 商品的增、删、改、查最好都要实现一遍。 【昨天内容回顾】 在后台对商品信息进行增、删、改、查 数据模型model进行操作 增加数据: 通过小物件widget建立表单 收集表单信息,将信息放入数据模型的对象里边 调用数据模型的方法save()实现数据的存储(insert) new Goods 修改数据: 通过get方式传递被修改商品的id 通过小物件widget建立修改表单 收集表单信息,将信息放入数据模型的对象里边 调用数据模型的方法save()实现数据的存储(update) Goods::model 删除数据: del($id) ---------à deleteByPk($pk,$condition='',$params=array()) 通过get方式将被删除商品的id传递到删除页面 将模型对象创建好,就可以删除商品信息了 查询数据: find() 每次只获得一条数据,以模型对象的形式给我们返回 findBySql findByPk findAll() 每次可以获得多条数据,数据是以模型对象数组(即使结果只有一条)的形式给我们返回 findAllBySql() findAllByPk find($contion,$param) $condition 相当于where后边的条件 $param 给where条件设置参数值 中间类criteria, select group order alias condition offset limit AR方式处理数据库信息activerecord 活跃记录 findBySql(); DAO 数据分页、前台用户注册、根据具体情况讲解用户登陆系统 【商品信息分页数据】 总的记录数目count == 110条数据 每页需要显示信息数目per == 20条数据 分页的总页数 page = count 除以 per 向上取整 5.5向上取整等于6 获得具体每页信息 limit 该关键字在mysql里边可以限制每次获得信息的条数 limit 偏移量,条数; 偏移量=(n-1)*per,20; 第一页:limit 0,20; 1 第二页:limit 20,20; 2 第三页:limit 40,20; 3 第n页:limit (n-1)*per,20; 我们已经准备好了一个分页类 通过小案例,演示分页类使用。 分页类与Yii框架结合 分页类在Yii框架里边以组件components形式存在 分页: 1. 获得总的商品记录数目 2. 实例化分页对象 3. 重新拼装具体分页sql语句指令 4. 获得页码列表 分页类与Yii框架结合,是以组件components的形式存在。 【前台实现用户注册功能】 就是在数据库里边建立一张数据表,建立一个表单,实现信息收集存入数据库 在本质上与商品添加是一样的 ① 实现多种样式表单域 ② 表单数据验证 在数据库建立用户注册表sw_user 设置separator分割符。 实现用户注册信息收集、校验信息(表单验证) 现在我们实现表单验证。 我们调用attributes一个模型里边不存在的属性,类会自动执行魔术方法__set(); 今天内容总结: 1. 数据分页实现 分类页当做组件被继承到Yii框架里边 2. 小物件widget创建用户注册表单,使用多种表单域实现方法。 3. 通过model数据模型里边的方法rules()设置,具体验证规则 4. attributes是数据模型的属性,可以帮组我们收集表单信息。 作业: 1. 在后台,实现商品数据分页显示 2. 在前台,通过小物件把用户注册表单实现出来,练习小物件widget使用。 2013-5-16 1. 用户注册验证 2. 用户登录系统功能 【用户注册验证】 通过小物件创建form表单 [view] 收集表单数据 attributes(对foreach的封装) [controller] 表单数据验证 rules() [model] 复选框验证 $user_model -> attributes = $_POST['User']; attributes这个属性在使用的时候会收集表单信息并赋予模型属性里边 该属性是和rules()方法一并使用,只有在rules()里边设置了验证规则的属性才可以被attributes接收 如果有的属性没有具体验证规则,则给一个safe规则。 确认密码验证 label 与 labelEx区别 如果有的选项是必填项(例如用户名、密码),那么labelEx会有一个”*”星号标识,label就没有 表单验证: rules()放进行数据验证 两类:一个是系统已经定义好的验证类,另一个是我们自己在模型里边定义好的具体验证方法进行验证。 【引入jquery进行数据验证】 有的项目是jquery本身无法验证的,那么就会跑到服务器继续验证。 【用户登录系统实现】 1. 制作表单 2. 收集表单数据(用户名、密码) 3. 去数据库校验用户名和密码 4. 用户信息session持久化 在Yii框架里边有两个模型:数据模型、表单模型 数据模型:与数据库进行交互的模型model(例如good模型、user模型) 表单模型:收集用户信息,然后丢弃。 我们要使用登录表单模型来进行用户登录系统功能实现 登录模型操作与数据模型是一致的,不同的是,登录模型不与数据库进行交互。 表单数据校验save()方法可以一边校验数据,校验成功可以存储数据 save() 到后边有一个环节会执行模型的rules()方法,也就校验表单了 我们现在实现用户登录需要校验,可以调用validate(),该方法可以校验我们输入的信息。 validate() 该方法在执行到后边 也会去执行rules()方法,进行表单的校验 save() validate() rules() save()方法执行会执行validate()方法,后边也会执行rules()方法 组件UserIdentity类的父级。 持久化用户信息login 用户登录系统: 表单 在控制器里边收集信息 验证用户信息:模型->validate()来验证用户信息,与表单验证是一致的 用户信息真实性:rules()方法里边有自定义一个方法来验证authenticate() 具体通过用户验证组件UserIdentity来验证的,这个组件里边也有一个方法authenticate()方法进行验证 持久化用户信息:模型调用login()方法来持久化。 总结: 表单验证 用户登录系统 作业: 1.实现用户注册表单验证 2.实现用户登录系统 2013-5-21 Yii框架前台用户注册、用户登录系统实现 校验用户名和密码 使用组件UserIdentity对用户名和密码进行校验 用户名存储到session里边,通过用户验证组件CwebUser à login(); 【用户注册用户名密码md5加密】 【记住用户(2周不用重复登录)】 红色的”*”星号是css控制的 记住登录状态 这样下次再登录网站的时候,就不用重复输入用户名和密码。 是浏览器的cookie把状态给记住了。 通过图解查看Yii框架如何实现记录登陆状态 实现: 1. 制作表单 2. 实现model模型 Cookie的名字和值,在框架里边已经设置好了,无需关心。 为什么不能退出系统 答:退出系统的时候只是删除session信息,页面重定向回首页,由于我们登录系统的时候已经让cookie记住了登录系统,每次访问网站的时候都会读取cookie信息,再session持久化。有点死循环过程。 1. 制作表单 2. 设计模型(rules() login() attributeLabels()) 【用户登录系统验证码设置】 Gd2画图工具 验证编码信息:随机数 验证码具体验证原理: 画图的同时就把验证编码进行session存储,用户输入的验证码信息与我们session里边存放的信息做比较。 实现: 1. 制作表单 如何使用该核心类: 在控制器里边使用。 表单部分与控制器部分的联系: $this->widget(‘CCaptcha’); 会间接调用控制器的方法 路由user/captcha 在登录模型里边对验证码进行校验: ‘captcha’会简介找到CcaptchaAction进行验证码的比较。 验证码使用步骤: 1. 在控制器设置actions方法 2. 在表单里边通过widget显示验证码 3. 在模型里边通过captcha校验验证码 widget('CCaptcha'); ?> 会简介访问路由 user/captcha (CcaptchaAction) array('verifyCode','captcha','message'=>'请输入正确的验证码'), 简介通过CcaptchaAction进行校验。 【后台用户登录系统】 1. 复习前台用户登录系统 2. 区分前台、后台用户信息(session区分) 为添加的数据表创建模型model 现在出现一个问题:前台登录用户信息与后台用户登录系统有混淆。 为后台管理员登陆系统设置session前缀信息 houtaiModule.php 【Yii框架中session的使用】 设置、使用、删除 【cookie在Yii框架中的使用】 【路径别名】 在Yii框架里边有许多地方使用路径别名: System application zii 等等 总结: 用户登录系统 记住登录状态(rememberMe) 验证码 (控制器、视图、验证模型) 后台管理员登录系统(为用户登录session信息设置前缀 houtaimodule.php设置) 会话控制session cookie的使用 作业: 1. 前台登录系统实现“记住登录状态“ 2. 前台登录系统“验证码“功能实现 第二个问题:session设置了前缀,前后台,读取用户名的时候,代码是一样的,yii框架是怎么区分前缀的。 我们读取用户登录信心通过CwebUser读取 Yii::app()->user->name; //获得name信息的时候会自动设置当前user用户组件的session前缀 2013-5-22 用户登录,记住登录状态、验证码、后台登录系统 【用户访问控制】 系统后台:用户登录、后台首页面、商品列表、添加商品、修改商品 后天的一些页面在用户没有登录系统的时候是不允许访问的,例如 商品列表、添加商品、修改商品 有一些页面无论用户是否登录系统,都是可以访问的,例如 用户登录 注意: 有的控制器方法被禁止访问(即使登录用户也如此),如果被访问,那么首先会询问用户是否是登录,如果用户已经登录系统,那么直接是403禁止访问。 关键字解释: 定义用户权限: l * 全部用户(无论登录与否) l ? 匿名用户 l 用户名,具体用户 l @ 登录系统用户 用户访问控制两个符号:+ - + 表示过滤器专门是针对哪个方法起作用 - 表示除了此方法,其他方法都会进行过滤 默认跳转登录界面: 前台: 后台: 【Yii::app()的理解】 Yii::app() 是一个实例化的对象,是我们在当前框架里边可以直接操作的对象, 我们可以把这个对象理解成请求应用的第一个对象。 Yii框架是纯OOP面向对象框架,也就是利用对象调用类的属性、方法,完成应用请求。 通过上图分析,我们知道了Yii::app()是系统第一个对象,是老大,我们可以利用该对象调用系统里边其他的相关方法、属性、对象。 Yii::app() 是CwebApplication类实例化的对象 CwebApplication(framework/web/CwebApplication.php) 因此Yii::app()可以调用CwebApplication 或父类 CApplication里边的相关属性或方法。 注意:不要随便访问CwebApplication 或 其父类的 相关方法,会影响系统稳定。 可以通过函数get_class(对象),根据对象获得对应的类。 系统应用组件 我们可以通过Yii::app() 调用系统的组件 User session request log db等等 在系统的任何角落都可以直接访问以上组件 Yii ::app()->user (实例化对象'CWebUser' => '/web/auth/CWebUser.php',) Yii ::app()->session (实例化'CHttpSession') Yii ::app()->request Yii ::app()->db Yii ::app()在入口处实例化index.php 【提示信息Flash()】 setFlash() 设置提示信息 getFlash() 提取提示信息 hasFlash() 判断提示信息有无 例如:setFlash(‘success’,’添加商品成功’) 会在session里边存储success信息 HasFlash(‘success’) ; 会判断当前session里边有没有名字是success这个变量 getFlash(‘success’) 会去session里边提取名字为success这个变量, 之后会把success这个变量给我们删除(重新刷新页面这个条信息也就消失了) 以上flash信息是用户组件user来设置 视图显示 【显示时间】 显示sql语句运行时间main.php 自己写的脚本代码运行时间 【用户退出系统同时删除session和cookie】 Yii ::app()->user->logout() ; 【如何获得当前控制器和方法】 控制器:$this -> id ; 方法:$this->action->id ; 总结: 1. 用户访问控制过滤 * @ ? 用户名 + - Filters accessControl accessRules 2. 直接操作的实例化对象Yii::app() 3. 显示提示信息setFlash() getFlash() hasFlash() 4. sql语句或脚本代码的执行时间显示Yii:: beginProfile() endProfile() 5. 用户退出系统集中删除cookie 和 session 6. 控制器和方法如何获得$this -> id; $this -> action->id; 作业: 在后台要为具体控制器设置上用户访问控制过滤 (在后台用户没有登录系统是禁止访问的) 2013-5-23 用户访问控制过滤filters 用户级别:* @ ? 用户名 符号: + - Filters() accessControl accessRules 权限:srbac 【缓存】 什么是缓存:我们从数据库读取出来的信息暂时放到一个更快的介质上存储,下次从这个更快的介质上读取信息。 介质:文件、数据库(优化好的数据)、内存 我们网站在进行访问的时候,有一些信息在相对一段时间之内是稳定,我们就把这样的信息放入缓存里边,这样用户每次来访问就是访问缓存的信息,对于大负载量的网站,可以明显提高网站的性能。 缓存类型: 为了缓存学习效果更好,我们制作两个页面实现缓存 台前的商品列表页面 台前的商品详细页面 缓存分类: 片段缓存 页面缓存 动态缓存 数据缓存 【商品列表和详细页面制作】 【片段缓存】 进行商品列表的独立区域缓存,片段缓存 我们的缓存是文件缓存,缓存的信息在目录runtime存放 使用缓存步骤: 1. 在程序里边设置缓存 2. 在主配置文件main.php里边配置缓存组件cache(在这个地方决定使用哪种缓存) 设置缓存文件的过期时间 Duration () 我们为缓存文件设置过期时间,在没有过期的时候系统都会使用缓存文件,如果已经过期,那么系统要重新生成缓存文件。 缓存变化: 我们的商品列表有实现片段缓存,那么在访问其他其它页码信息的时候也是访问这个缓存页面,因为,每页信息的路由都是一样的(goods/category),那么系统会误认为当前系统访问的页面是一个页面。当时页面的page参数是不一样的。 因此我们需要根据参数的变化生成不同的缓存文件。 缓存依赖: 我们的商品信息缓存可以自定义设置过期时间,根据具体需求业务类型决定,如果商品信息在没有过期之内已经变化了(数据库给更改的),这时缓存文件还没有过期,我们需要及时更新缓存文件(即使没有过期)以免误导客户,这种情况我们可以通过缓存依赖来实现。 缓存依赖条件:我们依赖的条件是总的商品价格,如果总价格发生变化,那么有可能是商品的信息有增加或减少的情况,或商品价格被修改。 如果一个商品价格增加5元,另一个商品价格减少5元,这样是不会更新缓存的,因为商品总价格没有发生变化。 片段缓存步骤: 1. 在main.php里边设置cache组件 2. 实现片段缓存(beginCache endCache) 3. 缓存变化 4. 缓存依赖 Duration、varyByParam、dependency这个几个属性在哪? System.web.widgets.CoutputCache.php 【页面缓存】 1. 是否可以通过“页面缓存”实现 答:这样是不可以,因为布局文件还没有被缓存 2. 我们是否可以再布局进行页面缓存 答:理论上不可以,视图先加载,布局后加载 视图:0.05135800 1369315232 时间小,先加载 布局:0.05197600 1369315232 时间打,后加载 用户访问控制实现页面缓存 Filters accessControl accessRules 【数据缓存】 具体就是可以缓存变量信息 变量 缓存的使用 设置: Yii::app()->cache->set(名字,值,过期时间); 使用:Yii::app()->cache->get(名字); 删除:Yii::app()->cache->delete(名字); 清空:Yii::app()->cache->flush(); 数据缓存应用(重要): 【动态缓存】 Smarty 动态缓存 insert 我们可以缓存整个页面,但是只有一个小的区域,会根据不同的条件显示不同的信息,这个小的区域我们需要设置动态缓存。 $this -> beginCache() 中间有区域需要动态缓存 回调函数:就是控制器里边的普通方法 $this -> renderDynamic(回调函数); $this -> benCache() 这个show_name()控制器要放入普通控制器父类里边Controller,这样代码可以重复利用。 总结: 缓存 1. main.php配置缓存组件cache 2. 缓存类型:片段缓存、页面缓存、数据缓存、动态缓存 3. 缓存存介质:文件、数据库、内存 片段缓存:beginCache() 页面缓存:filters过滤器实现 4. 具体变量缓存 Yii::app()->cache->set(名字,值,过期时间) Get(名字) Delete(名字) Flush()清空缓存,(数据、片段、页面都会清空) 作业: 利用数据缓存制作案例 前台商品详细信息,在通过数据库获得数据的时候要走缓存。 (缓存里边有数据走缓存,否则走数据库再生成缓存)。 2013-5-28 缓存: 片段缓存(beginCache endCache) 页面缓存(控制器方法里边通过filter过滤器实现) 数据缓存(Yii::app()->cache()->set() get() delete() flush()) 动态缓存(renderDynamic()) 1. 到main.php里边配置缓存组件 cache 2. 缓存信息存储区域:文件、内存、数据库、php缓存机制 3. 缓存变化(url地址变化、session变化、表达式等等) 4. 缓存依赖,我们需要在什么时候更新缓存信息(数据表信息变化实现缓存更新) 1. url地址美化 2. 错误处理 3. 主体theme 4. 面包屑 5. 源码追踪 6. 数据处理方式DAO 【url地址美化】 给域名地址做一个别名 伪静态,通过设置服务器服务,做域名地址的转换工作。 urlManager地址美化,通过程序的方式实现地址美化工作。 http://web.0507shop.com/index.php?r=user/login 变成: http://web.0507shop.com/index.php/user/login 以路径方式做路由的转换。 配置main.php: http://web.0507shop.com/index.php/user/login 变成 http://web.0507shop.com/index.php/user/login.html 给地址添加后缀 配置urlManager组件: user/login.html -----à user/login 让商品图片路径前边统一设置’/’反斜线 我们设置urlManager 上边url地址管理规则设置好后路由就要按照规则写: http://地址/index.php?r=goods/detail&id=20 以上地址不可以写了 http://地址/index.php/goods/detail/id/20 http://地址/index.php/控制器/方法/参数/值/参数/值/参数/值 http://web.0507shop.com/index.php/goods/detail/id/20 美化: http://web.0507shop.com/index.php/goods/20 配置urlManager组件: 我们通过url地址来模仿京东网址。 http://地址/index.php?r=goods/category&brand=4&price2&color=3&screen=5 美化: http://地址/index.php/goods/4-2-3-5.html http://地址/index.php/goods/4-2-3-5.html 美化 http://地址/goods/4-2-3-5.html 把默认索引文件index.php也去掉了 通过伪静态实现 我们生成了一个文件.htaccess,这个文件需要放到shop目录下边 【错误页面处理】 访问一个错误的控制器 访问一个错误的方法 有些控制器和方法禁止访问 以上访问会提示错误信息 404 403 以上错误信息是不方便给外边用户看到的。 1. 安全隐患 2. 用户体验不好 错误信息在site/error这个地方定义的。 现在我们要自定义错误页面来显示我们的错误信息 我们自己可以获得错误的详细信息: 错误处理 1. 重新定义错误信息页面,可以从用户体验触发 2. 我们可以根据错误信息来定位出错的地点 3. 错误信息页面在路由site/error定义。 【主题theme】 网站的样式会在特殊日子显示不同的样式(颜色、图片、文字大小),来迎合人们的心情。 网站美工在做设计的时候,也会准备多套模板供老板选择,这个地方我们可以通过主题实现。 网站的样式 我们需要在什么地方定义? views视图是与网站样式紧密关联。 为了特殊需求我们可以准备多套视图模板,以供选择。 再者我们准备了多套视图模板,能否方便切换。 比如我们的网站也有多套模板(新年、儿童节、圣诞节)。 制作多套views视图。 配置实用主题: 自定义的三个主题: 主题总结: 1. 并不是所有的网站都需要主体,比如门户网站、前台网站可以使用主题 访问量较低的网站也没有必要使用主题,后台也不会使用主题。 2. 会根据需求快速切换网站样式 3. 并不是所有页面都需要设置主题页面,其他没有设置主题的页面会使用原本的视图页面。 4. 美工还可以根据主题页面,多准备几套视图模板来适应领导的需求。 5. 在main.php里边做配置使用主题 【面包屑制作】 实现步骤: 1. 视图定义变量 2. 在布局通过显示 通过小物件widget实现面包屑显示。 【代码追踪】 源码追踪: CwebApplication=èCapplication==》Ccontroller===》CinlineAction等等主要流程文件。 【数据处理DAO data access object 数据处理对象】 Yii框架对数据处理可以通过两种方式:AR、DAO 前者主要是对简单sql语句处理 后者才是处理复杂sql语句 两种使用的基础是PDO,php data object : php数据对象 PDO就是为了兼容php处理各种数据库(mysql oracle sqlserver等等) 我们定义一条sql语句就可以 在mysql、oracle、sqlserver不同数据库来运行。 AR:处理数据CActiveRecord DAO对数据的处理 CdbCommand CdbDataReader 通过DAO实现数据的查询 使用预处理给数据库添加记录信息 DAO: 数据处理的第二种方式。每次数据处理需要先创建DAO对象 query() 针对查询 execute() 针对 添加、修改、删除 PDO预处理进行信息的添加、更新、删除。 今天重点是:网址美化urlManager 作业: 网址美化的3种方式自己练习一遍。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档