==================
1201-复习第四节:路径访问与模块控制器之间的关系
==================
lib主要存放控制器和模型的。
Thinkphp当中模块(控制器),动作与URL的关系
我们所有访问模块、动作都必须经过主入口文件。(项目入口文件)
如果我们访问主入口文件的时候,我们并不知道访问的哪一块!!
Thinkphp规定所有的主入口文件默认访问index控制器
并且所有的控制器默认去找index方法或index动作。
必须类名与文件名相当,首字母必须大写,
后面必须加上Action,必须要继承Action这个类!
class IndexAction extends Action
//商品管理相关
//用户注册相关UserAction.class.php
//private 定义私有方法不能访问,那又何意义?
主要体现在能够在这里写一个与用户模块相关的方法,但是你又不希望原有方法太过臃肿因此可以定义私有方法来实现
用其他公用方法 再调用!!!
如果验证规范发生变化,不用再找一堆代码,可以直接在反复中更改
public function index ->默认访问
pathinfo模式
四种路径访问模式
0 普通模式:(get方式传值)
http://serverName/appName/?m=module&a=action&id=1
1 pathinfo模式==默认模式
http://serverName/appName/module/action/id/1/
/module/action
2 rewrite重写(伪静态)
在开启了Apache的URL_REWRITE模块后,就可以启用REWRITE模式了,具体参考下面的URL重写部分。
3、兼容模式
http://serverName/appName/?s=/module/action/id/1/
这种格式在pathinfo下会提示你路径格式不正确。兼容模式可以处理
==================
1202-复习第五节:pathinfo两种模式与模块和控制器之间的关系
==================
分普通模式和智能识别模块和操作
配置文件:Conf/config.php
'URL_PATHINFO_MODEL'=>1;//普通模式需要加上m a
如:/a/user(模块)/m/index(动作方法)
如何接受get传值:
/a/user(模块)/m/index(动作方法)/username/名字/password/密码
2)'URL_PATHINFO_MODEL'=>2;智能模式:pathinfo的默认模式
/user/index/ get传值方式与pathinfo普通模式的传值一样
URL_PATHINFO_DEPR=>'-、/';更改分隔符
如/user-index
1203-12用户增删改查(CURD)
==================
1205-复习第六节:06:ThinkPHP模块替换与系统常量
==================
===========================
1207-复习第七节:07调试
===========================
APP_DEBUG:调试模式,
更加详细的错误信息
快速定位和解决问题
===================================
页面跳转:
===================================
页面跳转是指在应用开发中,经常会遇到一些带有提示信息的,例如提示操作成功或着错误的页面,并且自动跳转到另外一个目标页面。系统的Action类内置两个跳转方法success 和error 用于页面跳转提示,而且支持ajax提交。
'TMOL_ACTION_ERROR'
模板文件可以使用模板标签,并且可以使用下面的模版变量:
$msgTitle:操作标题
$message :页面提示信息
$status:操作状态 1 表示成功, 0表示失败 具体还可以由项目本身定义规则
$waitSecond 跳转等待时间 单位为秒
$jumpUrl:跳转页面地址
success 和error方法会自动判断当前请求是否属于Ajax请求,如果属于 Ajax 请求 则会调用ajaxReturn方法返回信息。
===================================
字段映射:
===================================
字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能,假设我们的User表里面有username和email字段,我们需要映射成另外的字段,
Class UserModel extends Model{
protected $_map=array(
'name'=>'username';
'mail'=>'email';//把表单中的email映射到数据库表中的字段
);
}
field:用于定义要查询的字段
用法 field($field,$except=false)
参数:field 必须:字段名,支持字符串和数组,支持指定字段别名;如果为true
则表示显式或者数据表的所有字段。
assign:要在模版中输出变量,必须在Action类中把变量传递给模板,视图类提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值,
$this->assign('name',$value);
等价于$this->name =$value;
===========================
模块:
===========================
应用控制器即核心控制器,会管理整个用户执行的过程,并负责模块的调度和操作的执行,并且在最后销毁该应用实例。
任何一个URL访问都可以认为是某个模块的某个操作。
http://domain/project/group/model/action/others'param
=======================
自动验证:
=======================
类型检查只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能来完成模型的业务规则验证,而大多数情况下面数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能只要在Model类里面定义$_validate属性。是由多个验证因子组成的二维数组。
验证因子格式:
array(验证字段,验证规则,错误提示,【验证条件,附加规则,验证时间】)
=======================
自动完成:
=======================
Model类,$_auto属性,可以完成数据自动处理功能,用来处理默认值、数据过滤以及其他系统写入字段。
$_auto属性是由多个填充因子组成的数组。
填充因子格式:array(填充字段,填充内容,【填充条件,附加规则】)
//如果是在前台项目当中,或是在后台项目应用当中。
//必须在对应的项目(或说应用)的Tpl目录下,找到default(默认皮肤),下面新建一个与控制名(不带Action)
//相同的文件夹
//例如 index控制器,就建一个index目录
//User就应该建一个User目录
//必须要再建一个与方法相同的.html文件,放到这个目录下面
//
/* function index(){
$this->display('gg');
//与Smarty下面的不一样,那个找tpl文件
} */
//display的参数:
//$this->display('指定位置',‘编码方式’,‘文的mimie’);
//例如 (‘index’,‘utf-8’,'text/html')
//跨模块调用模版
//跨皮肤操作
//$this->display('皮肤的目录名称@找哪个目录的名称:模版的名称');
//全路径输出:加载文件的位置都以主入口文件定位。
//$this->display('./Public/文件名');
<?php
//普通查询
在查询带入where条件等,最少有三种方式:
在普通查询里面还可以使用查询表示式
EQ 等于(=)
NEQ 不等于(!=)
GT 大于(>)
EGT 大于等于(>=)
LT 小于 (<)
ELT:小于等于(<=)
LIKE 等价于sql里面的like
【NOT】 BETWEEN
【NOT】 IN
exp 比较特殊 是指使用标准SQL语句
1.字符串形式
id>4 and id<9
2.数组形式====>推荐使用方法
$user=M('user');
$data['username']='liwenkai';
$list=$user->where(array('username'=>'liwenkai'))->select();
3、对象形式
$user=M('user');
$a=new stdClass();
$a->username="liwenkai";
$list=$user->where($a)->select();
dump($list);
//区间查询:
id>3 and id<10
//组合查询
多字段查询
$data['username']='gaoce227';
$data['password']='dddd';
$data['id']=array('lt',10);
$data['_logic']='or';
$data['_string']='id<3';
//复合查询
$data['_complex']=$where;
//统计查询:
$user->count() from;
$user->max();
$user->min;
$user->avg()
$user->sum()
//定位查询
getN(正数、负数);
//Model里面没有getN((),在AdvModel里了
//写一个CommonModel 让其不再继承model而是继承advModel
//自定义写一个对应的自定义模型Model
first
last
//SQL查询
execute() 主要用于更新和写入:有受影响行数但没有结果集
query() 主要用于查询:有影响行数且有结果集
//动态查询
就是在某个方法后面加上一个字段名,或者是找前几条记录的时候,直接加上topN()
getByCreateip()
========================
20121228:ActiveRecord
========================
ThinkPHP实现了ActiveRecord模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录映射到对象,最大的特点就是使用方便和便于理解(因为采用了对象化),提供了开发的最佳体验。从而达到敏捷开发的目的。下面我们用AR模式来换一种方式来重新完成CURD操作。
一、创建数据:
i. $User = M('User');//实例化User对象
1. //然后直接给数据对象赋值
$User -> name = 'ThinkPHP';
$User -> email = 'ThinkPHP@gmail.com';
二、查询记录
三、更新记录
四、删除记录
=====================================================================
20121209:三大自动:
=====================================================================
=================
自动验证:
=================
类型检测只是针对数据库级别的验证,所以系统还内置了数据对象的自动验证功能,来完成模型的业务规则验证。而大多数情况下面,数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能,只需要在Model类里面定义$_validate属性,是由多个验证因子组成的二维数组。
格式:
array( 验证字段,验证规则,错误提示,【验证条件,附件规则,验证时间】)
1)验证字段 必须 --- 需要验证的表单字段名称。这个字段并不一定数据库字段, 也可以是表单的一些辅助字段,例如确认密码和验证码等。有个别验 证规则和字段无关的
2)验证规则 必须
3)提示信息 必须
4)验证条件 可选
5)附加规则 可选
6)验证时间 可选
附加规则:
=====================
自动填充(自动完成):
=====================
在Model类定义 $_auto属性,可以完成数据自动处理功能,用来处理默认值、数据过滤以及其他系统写入字段。$_auto属性是由多个填充因子组成的数组。
格式:array(填充字段,填充内容,填充条件,附加规则)
填充字段:就是需要进行处理的表单字段。这个字段不一定是数据库字段,也可以是表单的一些辅助字段,比如验证码和确认密码。
填充规则:配合附加规则完成。
填充时间:MODEL_INSERT或1;MODEL_UPDATE或2;MODEL_BOTH或3
附加规则:
function,使用函数,表示“填充规则”的内容是一个函数名
callback,回调方法,表示填充规则的内容是当前模型的是个方法
field,用其他字段填充,表示填充的内容是一个其他字段的值
String,字符串(默认填充方式)。
注:function和callback的区别:
functon 一般是指系统函数,或说一些通用的函数。或者别人定义的,反正不再这个类中
而callback是在当下所需要,而在该类中直接定义的函数,或称成员方法。
=====================
自动映射(字段映射):
=====================
本来表单name与数据库表中的字段是必须对应相同的。但也可以使用其他的不同与数据表中的字段。然后再通过映射。这样可以隐藏真正的数据库表的字段。假如我们的数据库user表中有username和email字段,而表单字段是name和mail。我们需要映射成另外的字段:
Class UserModel extends Model{
protected $_map = array(
'name' => 'username', //把表单中name映射到数据库表的username字段
'mail' => 'email', // 把表单中的mail 映射到数据库表的email字段
);
}
字段映射支持对主键的映射
如果修改时,需要数据库表中的字段映射到表单中,需要对查询数据进行处理,处理方式调用Model类的parseFieldsMap方法。例如:
//实例化User模型
$User = M('User');
$data = $User->find(3);
这个时候取出的data数据包含的实际是username和email字段。为方便表单输出,我们需要处理字段映射显示表单中。就需要使用下面的代码处理:
$data = $User -> parseFieldsMap($data);
这样data数据中就包含了name和email字段数据了。而不再有username 和email 字段数据了。
-------------------------------------悲催的分割线---------------------------------------------------------
20121228:Thinkphp中的视图
这里指的是数据库当中的视图:虚拟存在的一张表,它里面有行和列信息,同时也有具体的数据;但这个数据并不是写在这个表里面的。他是通过你查询出来的表(引用的表)当中的数据。
所有数据,对于用户来说是透明的,视图可以过滤数据。
要定义视图模型,只需要继承ViewModel,然后设置viewField属性即可。
class BlogViewModel extends ViewModel {
public $viewFields = array(
'Blog' = > array('id','name','title'),
'Category' = > array('title'=>'category_name','_on'= >'Blog.category_id = Category.id'),
'User' = > array('name' => 'username','_on'=>'Blog.uer_id=User.id');
);
}
// 一个元素对应一张表;
//默认情况下会根据定义的名称自动获取表名,如果希望指定数据表,可以使用:
'_table' => "test_db.test_table"
如果希望给当前数据表定义另外的别名,可以使用
‘_as’=> 'myBlog';
BlogView 视图模式 除了包含Blog模型之外,还包含了Category,User模型。
_on 来给视图模型定义关联查询条件。例如:
'_on' => 'Blog.category.id = Category.id'
20121230:21讲——缓存
ThinkPHP在数据缓存方面包括文件方式、共享内存方式和数据库方式在内的多种方式进行缓存,通过插件方式还可以增加以后需要的缓存类。目前支持的缓存方式包括:File、Apachenote、Apc、Eaccelerator、Memcache、Shmop、Sqlite、Db、Redis和Xcache。
动态缓存:所有的缓存方式都被统一使用公共的调用接口,这个接口就是Cache缓存类。
缓存类的使用很简单,首先实例化缓存类:
$cache=Cache::getInstance(‘缓存方式’,’缓存参数’);
通用缓存参数:
expire,缓存有效期,(默认由DATA_CACHE_TIME参数配置)
length:缓存队列长度(默认为0);
queue 缓存队列方式(默认file 还支持xcache和apc)
使用Xcache作为缓存方式,缓存有效期60s:
$cache=Cache::getInstance(‘Xcache’,array(‘expire’=>60));
$cache->set(‘名字’,’值’);
$value=$cache->get(‘’名字’);
缓存队列:
使用缓存队列很简单,只需要给当前缓存实例设置length参数即可,默认length为0,表示不启用缓存队列功能。缓存队列的设置:
$Cache = Cache::getInstance(‘Xcache’,array(‘expire’=>’60’,’length’=>10));
S 方法——支持缓存有效期:
S(‘名字’,‘数据’,‘3600’,‘类型’);
F 方法——快捷缓存:F(‘’,‘’,);
能够创建缓存子目录
20121231 :第22讲 :关联模型操作
关联关系包括三种:
一对一关联:ONE_TO_ONE
HAS_ONE BELONGS_TO
一对多:ONE_TO_MANY
HAS_MANY BELONGS_TO
多对多:MANY_TO_MANY
关联定义:ThinkPHP可以很轻松的完成数据表中的关联CURD操作,目前支持的关联包括四种:HAS_ONE,BELONGS_TO ,HAS_MANY ,MANY_TO_MANY.
所有的关联定义都统一在模型类的$_link成员变量里面定义,并且可以支持动态定义。要支持管理操作,模型类必须继承RelationModel类,关联定义的格式是:
protected $_link = array(
‘关联1’ => array(
‘关联属性1’ => ‘定义’,
‘关联属性N’ => ‘定义’,
),
‘关联2’ =>array(
‘关联属性1’ => ‘定义’,
’关联属性2‘ => ‘定义’,
),
);
关联属性:
mapping_type
class_name
mapping_name
foreign_key:关联的外键名称。外键默认的规则是当前数据对象名称_id
condition 关联条件
mapping_field:关联要查询的字段。
as_fields : 直接把关联的字段值映射成数据对象的某个字段。
========================================================
20121231:第23讲--ThinkPHP 的RBAC,基于角色的权限控制
========================================================
Role-based Access Control
Full扩展包
财务
安全拦截器
认证管理器:识别不同的身份
决策访问管理器(即时模式、登陆模式)
运行身份管理::单身份、多身份管理B/S
THINKPHP 当中的RBAC难点在于,数据库设计:
数据库结构----------项目【应用】,模块、动作,
节点(项目、模块、方法)之间的关系。弄清访问顺序:项目--->模块----->方法
按顺序划分等级:
项目level---1
模块level---2
方法level---3
access表:
控制各个角色,是否能够访问某个项目,某个模块,某个方法。
在access表当中有的节点,有的用户组,才能访问,在access表当中没有就不能访问
这个角色在access有节点,
访问顺序!!!!!!!--------->项目---模块-----方法
IndexAction
UserAction
PublicAction
CommonAction :权限验证模块可以继承该类
配置文件:。。。。。。
初始化接口:
function _initialize(){
//复制examples例子里面的代码
import(‘ORG.Util.RABC’);
}
前置,后置
L 方法
C 方法
D 方法
M 方法
U 方法
20130108:模版技术
ThinkTemplate:ThinkPHP内置模版
xml风格
效率高
引用了Smarty的一些东西。
数组:
关联,中括号或点好
索引,中括号
对象:
: 冒号
/*
输出方法并执行返回值
{:function()}
(:U(‘user/insert’))
*/
系统变量:$think.get.id 比$_GET 好
{(~function())}------执行并不输出
{$atime|date=’Y-m-h H:i:s’,###}----三个#号啥意思
快捷输出方式{@var} {#var} --------后面不能加函数,不支持函数
包含头信息、尾信息
<include file=”header”/>
<include file=”footer”/>
如果是跨模版的话 Public:header
导入js、css
<import type=’js’ file=’Js.Util.A’>
或load 方式
或最直接的link
<volist name=’list’ id =’vo’ key=’’ offset=”” length=’’ mod=>
{$vo[‘id’]}
//花括号可以自己定义
//offset=‘5’:意思是
//偶数输出:mod=‘2’再加上<eq name=’mod’></eq>
//key 只显示键
</volist>
<foreach name=’list’ item=’vo’>
</foreach>
<switch name=’’>
<case> </case>
</switch>
//自定义标签
html:select name=’id’ dbclick=’’
//url路径
//A 方法
//.shtml
//20130109-------模版引擎
----变量输出
Action中使用assign方法可以给模版变量赋值,-这里是变量输出,讲的是怎么把赋值后在模版文件中输出变量:
如果我们在Action中赋值了一个name模版变量:
$name = ‘Thinkphp’;
$this->assign(‘name’,$name);
使用内置模板引擎输出变量,只需要在模版文件中使用:{$name}===
注意:
外面花括号叫限定符或成模板标签,可以自已定义.
模版标签{和$之间不能有任何的空格,否则标签无效
模板编译后的结果就是<?php echo $name?>
普通标签默认开始标记是{,结束标记是}。也可以通过设置TMP_L_DELIM和TMPL_R_DELIM进行更改,例如我们在项目配置文件中定义:
‘TMPL_L_DELIM’=>’<{’,
‘TMPL_R_DELIM’=>’}>’,
那么刚才变量输出{$name} 就应该改成:<{$name}>
assign方法里面的第一个参数才是模板文件中使用的变量名称。如果改成下面的代码:
$name = ‘ThinkPHP’;
$this->assign(‘name2’,$name);//如果再使用{$name}输出就无效了,必须使用{$name2}才能输出模板变量的值了。
如果我们需要把一个用户数据对象复制给模板变量:
$user = M(‘name’);
$user = $user->find(1);
$this->assign(‘user’,$user);
也就是说$user其实是一个数组变量,我们可以这样输出相关的值:
{$user[‘name’]}//输出用户的名称===>支持点语法----可以写成--{$user.name}
{$user[‘email’]}//输出用户的email的地址。
==================================================================
想到了:属性访问:ThinkPHP模型对象的实例本身也是一个数据对象,所有属性的访问就显得非常直观和简单:可以支持对象和数组的两种方式来访问数据属性。
find,data,create 方法都会产生数据对象。
字段定义:
无需在模型类里面手动定义数据表的字段,系统会在模型首次实例化的时候自动获取数据表的字段信息,而且只需要一次,以后永久缓存字段信息,除非设置不缓存,如果调试模式不会产生字段缓存文件,那表示每次都会重新获取数据表字段信息。
字段缓存保存在Runtime/Data/_fields/ 目录下面。
缓存机制:每个模型对应的一个字段缓存文件(而并非每个数据表对应一个字段缓存文件。)命名格式:数据库名.模型名.php===
DB_FIELDS_CACHE=>false //关闭字段自动缓存,(一般在开发的时候经常变动数据库的结构,而不希望进行数据表的字段缓存,可以在项目配置文件中增加这个false配置)。
模型定义:模型类一般位于项目的Lib/Model目录下面,当我们创建一个UserModel类的时候,其实已经遵循了系统的约定。模型类的命名规则是除去表前缀的数据表名称。采用驼峰法命名。并且首字母大写,然后加上模型类的后缀定义Model。
如果规则和系统约定不符合,那么需要设置Model类数据表的名称属性。
两个关于数据表名称的属性定义:
tableName:
trueTableName:
dbName:
==================================================================
如果$user 是一个对象而不是一个数组的话。
$user = M(‘name’);
$user->find(1);
$this->assign(‘user’,$user);
可以使用下面的方法输出相关的属性值:
{$user:name}//输出用户的名称
{$user:email}//输出用户的email地址
系统变量:系统常量:系统特殊变量的输出,不需要实现赋值给某个模板变量。系统变量的输出必须以$Think.打头。并且仍然可以支持使用函数。
-------------------------------------------------------------------------------------------------------------------
=================
复习文件上传
=================
文件上传重点是先导入./ThinkPHP/Lib/ORG/Net/UploadFile.class.php.
import(‘ORG.Net.UploadFile’);
--------------------------------------------------------------------------------------------------------------------
===================
分页
===================
分页重点是先导入./ThinkPHP/Lib/ORG/Util/Page.class.php.
import(‘ORG.Net.UploadFile’);
之后,new一个Page类;
之前先得到总记录条数:用count()方法,设定好每页显示几条;
之后setConfig
----------------------------------------------------------------------------------------------------------------------
=================
验证码:
=================