Controller_name控制器名
ACTION_NAME 方法名
module_name 模块名
快捷函数
U()制作url地址的快捷函数
C(名称) 获得配置变量(convertion.php)
C(名称,值) 设置
L() 获得语言变量信息
E()给页面输出错误信息
A("模块/控制器") 实例化User控制器对象
A("Home/User")
get_defined_constants(true); true 分组显示
__CONTROLLER__ user自己定义的常量 直接写 无需{$Think.const.__Controller__}
跨控制器调用
Think.class.php 中有自动加载autoload()函数
快捷函数 A("User") || A("模块/控制器") A("Home/User")
A("资源://模块/控制器")
R("User/login"); 直接调用方法
返射
class Peo{
public function go(){
return 'lets go';
}
public function want($k,$v){
return '小名想要'.$v.' 但是他要先有'.$k;
}
}
/**
$san = new Peo();
$do1 = new ReflectionMethod($san,'go');
echo $do1->invoke($san); //输出lets go
**/
$san = new Peo();
$do2 = new ReflectionMethod($san,'want');
echo $do2->invokeargs($san,array('才华','美女')); //小名想要美女 但是他要先有才华
'DB_FIELDS_CACHE' => true, // 启用字段缓存
1 当为调试模式是,不起作用
2 当为false时,不去作用 缓存在 Runtime\Data
$goods = new \Model\GoodsModel();
Model\GoodsModel Object 实例化时为GoodsModel; 可以用GoodsModel中唯一的方法
在以前的版本中 D()与 直接new 一样,现在不行了
$goods = D('goods'); 实例化时为 父类 Model,只能用父类的方法
Think\Model Object
$goods = M('goods'); 实例化时为 父类 Model,只能用父类的方法
Think\Model Object
D()与M() 一样 都在函数库function.php文件
配置模板Smarty
convertion.php
Behavior行为配置变量信息(页面底部日志显示配置,smarty配置)
T'TMPL_ENGINE_TYPE' => 'Smarty',
DB.class.php
select distinct field from table join where group having order union comment
$obj = D()
$obj->select();// 执行查询 select("20,21,23,44")
find(33) 返回一维数组
$obj->table(数据表);
$obj->where(参数);sql语句
group(字段); 分组
having(参数条件) 查询出的表再筛选
order() 排序
limit() 限制
具体方法 field() where() limit()
__call调用 'order' 'having','group', Model.class
聚合函数sum avg
add() 两种方式实现数据添加
1 数组 $goods = D("goods");
$arr = array(
'goods_name'=>"苹果9",
'goods_number'=>"11",
'goods_price'=>"99999"
);
$rst = $goods->add($arr); //方法返回最新添加的主键id
var_dump($rst);
2 AR方式
ActiveRecord 活跃纪录
一条纪录看做对象
字段看做属性
$goods = D("goods");
$goods->goods_name='苹果';
$goods->goods_number='33';
$goods->add();数据添加 返回主键
更新纪录
save()与add()类似
1 数组中有goods_id之类的,自动把它传到where
$goods->where("goods_id=44")->save();
删除delete(22)
delete("22,33,44");
where("goods_id=23")->delete();
收集表单数据,
__SELF__ action="" 自身
$this->create() 收集post表单数据
$this->add()
success('添加商品信息',url);
error()
原生sql
1 查询 query(); 返回一个二维数组
2 添加,修改,删除 execute();返回受影响的行数
$_GET[]
http://www.web.com/admin/goods/upd/name/wen/age/22
网址和方法参数的顺序无影响 将
function upd($name,$age){
直接用$name,$age
}
更新的action为__SELF__为带参数的有goods_id/22
无需隐藏域 在 $rst = $goods->save();
中加$goods->where->($goods_id)->save();
表单验证
表单通过create()方法收集数据
自定义model模型实现具体验证规则
$pathVaildate = true; 使所有报错一起出现
跳转success 由于模板是Smarty,所以在controller中
success 方法需要调整
将模板中的内容用 定界符 复制到方法中,再输出内容,最后exit;
命名空间
namespace test1;
$w = "不知道能输出";
function n(){
return 'fengyuan这是t1的命名空间';
}
namespace test2;
$w = "不知道能输出";
function n(){
return '这是t2的命名空间';
}
//echo test1\n(); //报错!!!调用的是test2\test1\n();这是相对定位;
echo \test1\n(); //调用test\n(); 不报错 完全限定名称
echo \test1\$w; //不能输出
命名空间针对: 类,函数,常量作用
use 空间 (导入空间)
使用元素 (默认现在本空间内找,若没有再去use的空间)
4 1 没有使用namesppace定义空间,当前空间就是公共空间,
例如一个有namespace的文件,引入(include)没有namespace的文件空间,
就是公共空间.在namespace文件里边可以通过 斜杠(\) 直接访问公共空间元素
2当前没有空间,引入文件有空间,默认就是当前空间
命名空间的第一个namespace声明前面不能有任何代码
使程序严谨,公共命名空间的元素都用 \斜杠 访问
空间引入 use ; 起别名 as
tp框架对多语言的支持
1 多语言通过Behavior支持
语言包一共有四种, 后定义的会覆盖前面的
1 L()快捷函数,可以获得全部的语言变量
2 当为Smarty模板时,使用assign('lang',L()); 传递变量值
验证码
1 Think/library/Think/Verify.class.php
$varify = new 命名空间 verify();
$verify->entry(); 生成验证码
οnclick="javascript:this.src='{$smarty.const.__CONTROLLER__}/ver?tm='+Math.random()"
<a style="color: #fff" οnclick="if (confirm('确定要退出吗?')) return true; else return false;"
href="{$smarty.const.__MODULE__}/Manager/login" target=_top>退出系统</a> </td>
target 是关键
1 tp框架使用自定义功能类
在项目目录下面 建立Component的目录,文件的命名空间为Component;
自定义的分页类
$total = $goods->count();
$per =9;
$page = new \Component\Page($total,$per);
$sql = 'select * from sw_goods a left join sw_category b on a.goods_category_id = b.cat_id order by goods_id desc '.$page->limit;
$info = $goods->query($sql);
$pagelist = $page->fpage();
$this->assign('pagelist',$pagelist);
缓存用
文件缓存:
内存:
数据库:
S(name,value)设置缓存信息
S(name);
S(name,null);
缓存方法1:外部用户访问的方法
方法2:被其他方法调用的方法,获得指定数据
//文件上传
if(!empty($_FILES)){
$config = array(
'rootPath' => './Public',
'savePath' => '/Upload/',
'saveName' => array('uniqid',''),
);
$upload = new \Think\Upload($config);// 实例化上传类
$info = $upload->uploadOne($_FILES['goods_big_img']);
if(!$info) {
// 上传错误提示错误信息
echo $upload->getError();
}else{
// 上传成功 获取上传文件信息
$goods_img = $info['savepath'].$info['savename'];
$_POST['goods_big_img']=$goods_img;
}
}
$goods->create();
$rst = $goods->add();
//图片缩略图
//制作缩略图
$small = new \Think\Image();
//找到大图位置,并打开
$small->open($upload->rootPath.$goods_img);
$smallimg = $info['savepath'].'small_'.$info['savename'];
//实施缩略
$small->thumb(150,150)->save($upload->rootPath.$smallimg);
$_POST['goods_small_img'] = $smallimg;
权限管理
auth_id
auth_name
auth_pid
auth_c
auth_a
auth_path
auth_level
--权限表
CREATE TABLE `sw_auth` (
`auth_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`auth_name` varchar(20) NOT NULL COMMENT '名称',
`auth_pid` smallint(6) unsigned NOT NULL COMMENT '父id',
`auth_c` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器',
controller控制器 Goods
`auth_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法',
action 方法 showlist
`auth_path` varchar(32) NOT NULL COMMENT '全路径',
全路径:用户信息排序使用
① : 如果是顶级权限,全路径等于本记录主键值
② :如果不是顶级权限,全路径等于 "父级全路径-(中恒线)本记录主键值"
`auth_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '级别',
基本:0顶级权限 1次顶级权限 2次次顶级
权限呈现缩进关系使用
PRIMARY KEY (`auth_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
权限数据模拟:
insert into sw_auth values (1,'商品管理',0,'','',1,0);
insert into sw_auth values (2,'订单管理',0,'','',2,0);
insert into sw_auth values (3,'广告管理',0,'','',3,0);
insert into sw_auth values (4,'商品列表',1,'Goods','showlist',"1-4",1);
insert into sw_auth values (5,'添加商品',1,'Goods','add',"1-5",1);
insert into sw_auth values (6,'商品分类',1,'Goods','cate',"1-6",1);
insert into sw_auth values (7,'用户评论',1,'User','comment',"1-7",1);
insert into sw_auth values (8,'订单列表',2,'Order','showlist',"2-8",1);
insert into sw_auth values (9,'订单打印',2,'Order','print',"2-9",1);
insert into sw_auth values (10,'添加订单',2,'Order','add',"2-10",1);
insert into sw_auth values (11,'广告列表',3,'Advert','showlist',"3-11",1);
insert into sw_auth values (12,'广告位置',3,'Advert','position',"3-12",1);
1 用户登录显示权限信息 $_SESSION['mg_id'] 用户id;
2 根据session信息获得 角色 role_id信息
3根据角色id信息获得权限列表ids信息
4 根据权限ids信息差查询具体权限信息,进而显示
父级和子级权限
{foreach $p_info as $k=>$v} //父级
{foreach $s_info as $vv}
{if($vv.auth_pid ==$k)}
{$vv.auth_name}
//子级
{/if}
{/foreach}
{/foreach}
{foreach $pinfo as $k=>$v}
foreach $ainfo as $vv}
{if $vv.auth_pid == $v.auth_id}
{/if}
{/foreach}
</table>
{/foreach}
给普通控制器定义父类 Component/AdminController.class.php
所有普通控制继承他, 父类再去继承Controller
Admincontroller.class.php
function __contruct()
function _empty(){} 定义空的控制器
function success 重写调转页面
select role_auth_ac from sw_role r left join sw_manager m where r.role_id = m.mg_role_id where m.mg_id = 2;