Thinkphp笔记

更新时间:2024-01-14 13:48:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Thinkphp

1. 配置gvim

?

打开安装目录下的_vimrc文件,添加 ? set nu! 显示行数 ? colorscheme darkblue 背景颜色设置为深蓝色 ? gvim配置不自动生成备份文件

默认情况下用gVim编辑文件时,会自动生成带~的备份文件。如果不想在编辑文件时自动生成备份文件的话,可以这么做:打开gVim安装目录下的vimrc_example.vim,将其中的如下部分中的else语句用引号注释掉: if has(\

set nobackup \else

set backup \即将上面四句改为: if has(\

set nobackup \\

\ \里,else部分用双引号注释掉即可。set backup是设置使用自动生成备份文件的命令。 ? windows上gvim的编码设置

Windows系统默认的编码是cp936,所以用gvim一打开文件,默认是用gb2312编码打开的。这导致很多时候打开的文件是乱码,不能正常显示,那要怎么解决这个问题呢?很简单,看下面的设定: 打开gvim,到菜单栏找到“编辑”,在下拉菜单找到“启动设定”

点击 “启动设定” 进去,你会看到相应的配置文件

在文件的末尾加入如下设定: set encoding=utf-8

set fileencodings=utf-8,chinese,latin-1 if has(\

set fileencoding=chinese else

set fileencoding=utf-8 endif

source $VIMRUNTIME/delmenu.vim

source $VIMRUNTIME/menu.vim

language messages zh_CN.utf-8

保存后退出gvim,重新启动,惊喜出现了,乱码不见了,是不是很简单,可以动手试一试了!

2. 配置项目文件(__ROOT__\\Home\\Conf\\config.php)

'URL_PATHINFO_DEPR'=>'-',//修改URL的分隔符 'TMPL_L_DELIM'=>'<{', //修改左定界符 'TMPL_R_DELIM'=>'}>', //修改右定界符 'DB_TYPE'=>'mysql', //设置数据库类型 'DB_HOST'=>'localhost',//设置主机

'DB_NAME'=>'thinkphp',//设置数据库名 'DB_USER'=>'root', //设置用户名 'DB_PWD'=>'', //设置密码 'DB_PORT'=>'3306', //设置端口号 'DB_PREFIX'=>'tp_', //设置表前缀

'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息

'SHOW_PAGE_TRACE'=>true,//开启页面Trace

'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名 'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次 'TMPL_DETECT_THEME'=>true,//自动侦测模板主题 'THEME_LIST'=>'your,my',//支持的模板主题列表

'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则 '__CSS__'=>__ROOT__.'/Public/Css', '__JS__'=>__ROOT__.'/Public/Js', ),

'LAYOUT_ON'=>true,//开启模板渲染

'URL_CASE_INSENSITIVE'=>true,//url不区分大小写

'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制伪静态的后缀 'APP_GROUP_LIST' => 'Home,Admin', //项目分组设定 'DEFAULT_GROUP' => 'Home', //默认分组

3. 项目配置(__ROOT__\\index.php)

?>

//3.开启调试模式

define('APP_DEBUG',true); //4.应用核心文件

require './ThinkPHP/ThinkPHP.php'

4. 开启调试功能

? ?

开启调试功能(在项目文件夹下的index.php中) define('APP_DEBUG',true);

我们需要设置配置文件(Conf/config.php),开启页面trace 'SHOW_PAGE_TRACE'=>true,//开启页面Trace

5. url的4种访问方式

? ? ? ?

PATHINFO 模式 -- 重点!!!!!!

http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2 普通模式

http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2 REWRITE模式

http://域名/项目名/模块名/方法名/键1/值1/键2/值2 兼容模式

http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2

6. 获取url中的参数

$id=$_GET['id'];

7. 获取表单中的数据

html中的form表单如下

获取表单数据的Action对象函数如下 public function do_login(){ echo \ dump($_POST['username']); }

注:如果表单中的method=\则上述函数中的$_POST要改为$_GET

8. 超链接地址的写法

同项目下的超链接可不写ip地址 如要访问项目thinkphp下的UserAction中的delete函数,可写为

但是为了防止因项目名称(thinkphp)的更改,导致系统不能使用,可使用”__URL__”替换”/thinkphp/index.php/User/”,如以上地址改写为

9. 将两个字符串合并

$m->where(\也可以是单引号

10. ThinkPHP 3 的输出

? ?

通过 echo 等PHP原生的输出方式在页面中输出 通过display方法输出,如

想分配变量可以使用assign方法,如在Action中

// 本类由系统自动生成,仅供测试用途 class IndexAction extends Action { public function index(){

$this->assign('name','yinliang'); //给变量name分配值yinliang $this->display(); //输出Home\\Tpl\\Index\\index.html }

public function show(){ echo \ } } ?>

在Home\\Tpl\\Index\\index.html中要访问name变量可以在文件中添加{$name}(修改了左右定界符的则把{,}分别修改为修改后的左右定界符) 修改左右定界符(为了防止{$data }与Jquery语法混淆) 休要修改配置文件(Conf/config.php)中的配置项 'TMPL_L_DELIM'=>'<{', //修改左定界符 TMPL_R_DELIM'=>'}>', //修改右定界符

?

11. ThinkPHP 3 的模型使用 (与数据库链接,操作数据库)

?

配置数据库(在Conf/config.php中配置数据库相关信息)

'DB_TYPE'=>'mysql', //设置数据库类型 'DB_HOST'=>'localhost',//设置主机

'DB_NAME'=>'thinkphp',//设置数据库名 'DB_USER'=>'root', //设置用户名 'DB_PWD'=>'', //设置密码 'DB_PORT'=>'3306', //设置端口号

? ?

?

?

?

'DB_PREFIX'=>'tp_', //设置表前缀加表前缀是为了更好的区分表,比如 cw_代表财务 cg_代表采购,如果没有表前缀,则将tp_去掉即可 也可以使用DSN方法进行配置

'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息

如果两种方式同时存在,以DSN方式为优先 在Action的index函数中获取值 public function index(){ $m=new Model(User);//记住U大写

$arr=$m->select();//user表中的所有数据都被放到数组$arr中

$this->assign('name',$arr[1]['username']);//将name赋值为数组$arr中下标为

//1的元素的username的值

$this->display();

}

还有一种简单实用模型的方式

M() 等效为 new Model(); $m=M('User'); $arr=$m->select();

使用模型的实例可以对数据进行操作,操作的工作一般就是对数据库进行 增删改查 CURD

增 -C Create $m->add() 删 -D Delete $m->delete() 改 -U Update $m->save() 查 -R Read $m->select() 模板可以遍历数组 html页面中

<{$vo.id}>----<{$vo.username}>-----<{$vo.sex}>

在Action中的index中给array赋值 public function index(){

$m=new Model(User); $arr=$m->select();

$this->assign('array',$arr);

$this->assign('name',$arr[1]['username']); $this->display();

}

12. ThinkPHP 3.1.2 CURD特性

?

ThinkPHP 3 读取数据 对数据的读取 Read $m=new Model('User'); $m=M('User');

?

?

select

$m->select();//获取所有数据,以数组形式返回 find

$m->find($id);//获取单条数据

getField(字段名)//获取一个具体的字段值 $arr=$m->where('id=2')->getField('username'); ThinkPHP 3 创建数据 对数据的添加 Create $m=new Model('User'); $m=M('User'); $m->字段名=值 $m->add();

返回值是新增的id号

代码示例:

public function add(){ $m=new Model('User'); $m->username=$_POST['username']; $m->sex=$_POST['sex']; $newId=$m->add(); if($newId>0){ $this->success(\ }else{ $this->error(\ } }

ThinkPHP 3 删除数据 $m=M('User');

$m->delete(2); //删除id为2的数据

$m->where('id=2')->delete(); //与上面效果相同,也是删除id为2的数据 返回值是受影响行数

代码示例:

public function delete(){ $id=$_GET['id']; $m=new Model('User'); var_dump($id); // $m->delete(11); $count=$m->where('id='.$_GET['id'])->delete(); if($count>0){ $this->success(\ // $this->success(\数据删除成功!!!\ }else{

?

$this->error(\ // $this->error(\数据删除失败!!!\ } }

ThinkPHP 3 更新数据 $m=M('User'); $data['id']=1;

$data['username']='ztz2';

$m->save($data); 返回值是受影响行数

代码示例:

public function update(){ $m=new Model('User'); $data['id']=$_POST['id']; $data['username']=$_POST['username']; $data['sex']=$_POST['sex']; $count=$m->save($data); if($count>0){ $this->success(\ }else{ $this->error(\ } }

13. ThinkPHP 3.1.2 查询方式

find只能查询一天记录,select可以查询多条记录 ? 普通查询方式

? 字符串

$arr=$m->where(\

? 数组

$data['sex']=0; $data['username']='gege'; $arr=$m->where($data)->find(); 注意:这种方式默认是and的关系,如果使用or关系,需要添加数组值 $data['sex']=0; $data['username']='gege'; $data['_logic']='or';

? 表达式查询方式

$data['id']=array('lt',6); $arr=$m->where($data)->select(); EQ 等于 NEQ不等于

GT 大于 EGT大于等于 LT 小于 ELT小于等于

示例代码:

public function show(){ $m=new Model('User'); $data['id']=array(\ $arr=$m->where($data)->select(); var_dump($arr); $this->display(); }

? LIKE 模糊查询 $data['username']=array('like','%ge');//查询username以ge结尾的user

$data['username']=array('like','%ge%');//查询username包含ge的user $arr=$m->where($data)->select(); ? NOTLIKE $data['username']=array('notlike','%ge%'); //查询username不包含ge的user $arr=$m->where($data)->select();

? 注意:如果一个字段要匹配多个通配符

$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系

$arr=$m->where($data)->select(); ? BETWEEN

$data['id']=array('between',array(5,7)); $arr=$m->where($data)->select(); //SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) ) $data['id']=array('not between',array(5,7));//注意,not 和 between中间一定要有空格 $arr=$m->where($data)->select();

? IN

$data['id']=array('in',array(4,6,7)); $arr=$m->where($data)->select(); //SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) ) $data['id']=array('not in',array(4,6,7)); $arr=$m->where($data)->select(); //SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) ) ? 区间查询

$data['id']=array(array('gt',4),array('lt',10));//默认关系是 and 的关系

//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) ) $data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系 $data['username']=array(array('like','%2%'),array('like','%五%'),'gege','or'); ? 统计查询

? count //获取个数

$data['username']=array(array(\KE\

echo $m->where($data)->count(); ? max //获取最大数

echo $m->max(\? min //获取最小数

echo $m->min(\? avg //获取平均数

echo $m->avg(\? sum //获取总和

echo $m->sum(\

? SQL直接查询

? query 主要数处理读取数据的

` 成功返回数据的结果集 失败返回boolean false $m=M(); $result=$m->query(\ from tp_user where id >50\ var_dump($result); ? execute 用于更新个写入操作

成功返回影响行数

失败返回boolean false $m=M(); $result=$m->execute(\ var_dump($result);

14. ThinkPHP 3.1.2 连贯操作

? PHP中类的构造方法

所有类的构造方法都如下,只是参数可以不一样 function __construct($tableName){ }

? 字符串操作函数

? AddSlashes: 字符串加入斜线。 ? bin2hex: 二进位转成十六进位。 ? Chop: 去除连续空白。 ? Chr: 返回序数值的字符。 ? chunk_split: 将字符串分成小段。 ? convert_cyr_string: 转换古斯拉夫字符串成其它字符串。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? crypt: 将字符串用 DES 编码加密。 echo: 输出字符串。 explode: 切开字符串。 flush: 清出输出缓冲区。

get_meta_tags: 抽出文件所有 meta 标记的资料。 htmlspecialchars: 将特殊字符转成 HTML 格式。 htmlentities: 将所有的字符都转成 HTML 字符串。 implode: 将数组变成字符串。 join: 将数组变成字符串。 ltrim: 去除连续空白。

md5: 计算字符串的 MD5 哈稀。 nl2br: 将换行字符转成
。 Ord: 返回字符的序数值。

parse_str: 解析 query 字符串成变量。 print: 输出字符串。

printf: 输出格式化字符串。

quoted_printable_decode: 将 qp 编码字符串转成 8 位字符串。 QuoteMeta: 加入引用符号。

rawurldecode: 从 URL 专用格式字符串还原成普通字符串。 rawurlencode: 将字符串编码成 URL 专用格式。 setlocale: 配置地域化信息。

similar_text: 计算字符串相似度。 soundex: 计算字符串的读音值 sprintf: 将字符串格式化。

strchr: 寻找第一个出现的字符。 strcmp: 字符串比较。

strcspn: 不同字符串的长度。

strip_tags: 去掉 HTML 及 PHP 的标记。 StripSlashes: 去掉反斜线字符。 strlen: 取得字符串长度。

strrpos: 寻找字符串中某字符最后出现处。 strpos: 寻找字符串中某字符最先出现处。 strrchr: 取得某字符最后出现处起的字符串。 strrev: 颠倒字符串。

strspn: 找出某字符串落在另一字符串遮罩的数目。 strstr: 返回字符串中某字符串开始处至结束的字符串。 strtok: 切开字符串。

strtolower: 字符串全转为小写。 strtoupper: 字符串全转为大写。 str_replace: 字符串取代。 strtr: 转换某些字符。 substr: 取部份字符串。

trim: 截去字符串首尾的空格。

ucfirst: 将字符串第一个字符改大写。

? ucwords: 将字符串每个字第一个字母改大写。 ? 常用连贯操作

? where

帮助我们设置查询条件 ? order

对结果进行排序(desc降序排列,asc升序排列) $arr=$m->order('id desc')->select();

$arr=$m->order(array('id'=>'desc','sex'=>'asc'))->select(); $arr=$m->where($data)->order(\? limit

限制结果

limit(2,5) //从第二条开始取出5条

limit('2,5') //从第二条开始取出5条 limit(10)//limit(0,10) ? field

设置查询字段

field('username as name,id')//获取username,id字段,并且将username字段重命名为name

field(array('username'=>'name','id')//同上 field('id',true) //获取除了id以外的所有字段

$arr=$m->where($data)->order(https://www.bwwdw.com/plus/\

asc\只获取username字段 $arr=$m->where($data)->order(https://www.bwwdw.com/plus/\

asc\只获取username,id字段 ? table ? group ? having ? 补充连贯操作

? alias 用于给当前数据表定义别名 字符串 ? page 用于查询分页(内部会转换成limit) 字符串和数字 ? join* 用于对查询的join支持 字符串和数组 ? union* 用于对查询的union支持 字符串、数组和对象 ? distinct 用于查询的distinct支持 布尔值 ? lock 用于数据库的锁机制 布尔值 ? cache 用于查询缓存 支持多个参数(以后在缓存部分再详细描述) ? relation 用于关联查询(需要关联模型扩展支持) 字符串 ? validate 用于数据自动验证 数组 ? auto 用于数据自动完成 数组 ? filter 用于数据过滤 字符串 ? scope* 用于命名范围 字符串、数组

15. ThinkPHP 3.1.2 视图

? 模板的使用

规则

模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)

更换模板文件的后缀名(修改配置文件Conf/config.php) 'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名 ? 修改模板文件目录层次(修改配置文件Conf/config.php)

'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次 ? 模板主题

'DEFAULT_THEME'=>'your',//设置默认模板主题

需要在TPL下面新建一个your文件夹作为模板主题文件夹

如何动态修改模板主题?

? 在后台准备一个功能,修改config.php文件中的默认模板项 ? 通过url传递 t=主题 参数可以修改不同的模板

修改配置文件Conf/config.php,添加如下项 'DEFAULT_THEME'=>'your',//设置默认模板主题 'TMPL_DETECT_THEME'=>true,//自动侦测模板主题 'THEME_LIST'=>'your,my',//支持的模板主题列表 如要访问my主题则url后加上?t=my,如

http://localhost/thinkphp/index.php/User/index?t=my

? 输出模板内容

? display

? display中没有参数 $this->display();

? 可以带参数

$this->display(本模块文件夹下的其他模板文件); $this->display('index2'); $this->display(其他文件夹下的模板文件); $this->display('Public:error');//注意,仅仅需要在Tpl下有Public文件夹以及其中的error.html即可,不需要一定有Public模块 $this->display(其他主题下的 文件夹下的 模板文件);//需要开启主题支持 $this->display('my:Index:index'); $this->display(一个url路径); $this->display('./Public/error.html');//访问的是thinkphp\\Public\\error.html $this->display('./Public/error.html','utf-8','text/xml');

?

$this->show($content);

? fetch方法

获得模板文件中的内容,以字符串形式返回 $content=$this->fetch('Public:error'); ? show方法

不需要模板文件,可以直接输出模板内容 $content=$this->fetch('Public:error'); dump($content); $content=str_replace('h1','i',$content); $this->show($content);

? 模板中的赋值

//$this->assign('name','赵桐正'); $this->name='赵桐正2'; $this->display(); ? 模板替换

__PUBLIC__:会被替换成当前网站的公共目录 通常是 (项目目录/Public/),如thinkphp/Public/,可以用来调用外部的js,css等文件

__ROOT__: 会替换成当前网站的地址(不含域名) __APP__: 会替换成当前项目的URL地址 (不含域名) __GROUP__:会替换成当前分组的URL地址 (不含域名) __URL__: 会替换成当前模块的URL地址(不含域名) __ACTION__:会替换成当前操作的URL地址 (不含域名) __SELF__: 会替换成当前的页面URL

? 更换模板变量规则,修改配置项

'TMPL_PARSE_STRING'=>array( //添加自己的模板变量规则 '__CSS__'=>__ROOT__.'/Public/Css', '__JS__'=>__ROOT__.'/Public/Js', ),

16. ThinkPHP自带的验证码相关操作

(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm/19.杂项/19.8验证码)

? 将thinkphp的扩展包解压缩 将Extend文件夹中所有项拷贝到

thinkphp\\Public\\ThinkPHP\\ Extend中

? 在\\Home\\Lib\\Action中新建PublicAction.class.php并打开填写代码如下

class PublicAction extends Action { Public function verify(){ import('ORG.Util.Image'); Image::buildImageVerify(); }

} ?

buildImageVerify($length,$mode,$type,$width,$height,$verifyName) 的用法

length 验证码的长度,默认为4位数 验证字符串的类型,默认为数字,其他支持类型有0 字母 1 数model 字 2 大写字母 3 小写字母 4中文 5混合 type 验证码的图片类型,默认为png width 验证码的宽度,默认会自动根据验证码长度自动计算 height 验证码的高度,默认为22 verifyName 验证码的SESSION记录名称,默认为verify

? 通过

onClick=\加载图片 . 加上

onClick=\的目的是当点击生成的图片时,图片自动更改后面的+'?'+Math.random()是为了让浏览器认为加载的是不同的图片,从而不从缓存中直接读取图片,已达到更换图片的效果. ? 后台中验证码验证

if($_SESSION['verify'] != md5($_POST['verify'])) { $this->error('验证码错误!');

}

17. ThinkPHP 3.1.2中自定义类的创建与加载

? 在\\Public\\ThinkPHP\\Extend\\Library\\ORG\\My中新建Test.class.php文件,内容如下

public $name='yinliang'; } ?>

? 任何函数想引用Test类,要在函数中添加import('ORG.My.Test');,如

public function index(){ import('ORG.My.Test'); $obj=new Test; echo $obj->name; }

18. ThinkPHP 3.1.2 模板中的变量

? 变量输出

? 标量输出 ? 数组输出 {$name[1]} {$name['k2']} {$name.k1}

对象输出

{$name:k} {$name->k} ? 系统变量 ?

用法 含义 例子 $Think.server 获取{$Think.server.php_self} $_SERVER $Think.get 获取$_GET {$Think.get.id} $Think.post 获取$_POST {$Think.post.name} $Think.request 获取{$Think.request.user_id} $_REQUEST $Think.cookie 获取{$Think.cookie.username} $_COOKIE $Think.session 获取{$Think.session.user_id} $_SESSION $Think.config 获取系统配{$Think.config.app_status} 置参数 $Think.lang 获取系统语{$Think.lang.user_type} 言变量 $Think.const 获取系统常{$Think.const.app_name}量 {$Think.APP_NAME} $Think.env 获取环境变{$Think.env.HOSTNAME} 量 $Think.version 获取框架版{$Think.version} 本号 $Think.now 获取当前时{$Think.now} 间 $Think.template 获取当前模{$Think.template} 板 $Think.ldelim 获取模板左{$Think.ldelim} 界定符 $Think.rdelim 获取模板右{$Think.rdelim} 界定符 或? 默认值 {$name|default='这里是默认值'}

? 使用函数

{$name|strtoupper} 生成的编译后文件是 Action函数中{$name|date='Y m d H:i:s',###}// ###代表$name

? 运算符

+ - * / % ++ -- {$name++}

19. ThinkPHP 3.1.2 模板中的语法知识

? 导入CSS和JS文件

? 传统的html方式

? import

//导入Public文件夹下面的Js目录中的test.js文件,import标签可以省略type属性,默认就是js的 //可以更改默认文件夹 设置basepath属性 ? load

//方法可以自动检测导入的文件类型

? 分支结构

? if

未成年 青春年少 成年

两个对象关系对照表 > < == <= >= != === !==

gt lt eq elt egt neq heq nheq 一个和尚挑水吃 两个和尚台水吃 三个和尚没水吃

这里是默认值

? 循环结构

? for

用法

start(必须) end(必须) name(可选) step(可选) comparison(可选) 循环变量开始值 循环变量结束值 循环变量名,默认值为i 步进值,默认值为1 判断条件,默认为lt ?

举例:

{$j}abc volist name(必须) id(必须) offset(可选) length(可选) key(可选) mod(可选) empty(可选)

要输出的数据模板变量 循环变量 要输出数据的offset 输出数据的长度 循环的key变量,默认值为i 对key值取模,默认为2 如果数据为空显示的字符串 ?

{$v.username}
foreach name(必须) item(必须) key(可选) 要输出的数据模板变量 循环单元变量 循环的key变量,默认值为key

id姓名性别

{$v.id}

{$v.username}

特殊标签 ? 比较标签

<比较标签 name=\变量\值\内容

eq或者 equal 等于 如 不是10 neq 或者notequal 不等于 如 是10 gt 大于 egt 大于等于 lt 小于 elt 小于等于 heq 恒等于 nheq 不恒等于

? 范围标签 ? in/notin

在这些数字里面不在这些数字的范围内 在这些数字里面不在这些数字的范围内 ? between/ notbetween

{$n}在1-10之间{$n}不在1到10之间 ? present/not present

标签来判断模板变量是否已经赋值,

m有赋值m没有赋值

? empty/notempty

empty标签判断模板变量是否为空, n为空赋值n有值

? defined / notdefined

判断常量是否已经定义

? define

在模板中定义常量

模板中变量赋值

? 其他标签使用

? 在模板中直接使用PHP代码 echo \我是赵桐正\? 建议更改左右定界符 在配置文件中改变 'TMPL_L_DELIM'=>'<{', //修改左定界符 'TMPL_R_DELIM'=>'}>', //修改右定界符

20. ThinkPHP 3.1.2中的乱码处理

要保证php文件与html文件的编码是相同的,(假设都是utf-8)如

IndexAction.class.php传中文字符给index.html,则在html的中要有

21. ThinkPHP 3.1.2 模板的使用技巧

? 模板包含

?

(务必记住此知识点)下面的例子我们在包含header模板的时候传入了title,keywords,css和js变量:

就可以在包含的header.html文件里面使用var1和var2变量,方法

[title]

? 模板渲染(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm/8.模板引擎

/8.24模板布局) ? 自动开启模板渲染 设置配置文件 'LAYOUT_ON'=>true,//开启模板渲染 准备一个模板渲染页面,在页面中使用{__CONTENT__}接受具体模板页面的内容 如果在摸一个具体模板中不希望使用渲染模板,可以在页首添加{__NOCONTENT__} ? 不开启自动模板渲染可以在每一个具体页面的页首添加 ? 使用技巧 在渲染模板文件中也可以使用其他模板文件的内容

这里是渲染页面!!!

{__CONTENT__}

? 模板的继承(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm/8.模板引擎

/8.25模板继承)

22. 空模块和空操作{当用户调用的方法(但是模块存在)不存在时的默认操作}

? 空操作 function _empty($name){ $this->show(\不存在 返回首页\

}

? 空模块 class EmptyAction extends Action{ function index(){ $city=M('City'); $arr=$city->select(); $this->assign('list',$arr); $name=MODULE_NAME; $this->display(\ } }

23. 系统常量

下面这些系统常量会随着开发环境的改变或者设置的改变而产生变化。

常量名 IS_CGI IS_WIN IS_CLI __ROOT__ __APP__ __GROUP__ __URL__ __ACTION__ __SELF__ __INFO__ __EXT__ APP_NAME GROUP_NAME MODULE_NAME ACTION_NAME APP_DEBUG MODE_NAME APP_PATH THINK_PATH MEMORY_LIMIT_ON RUNTIME_FILE THEME_NAME THEME_PATH APP_TMPL_PATH LANG_SET

MAGIC_QUOTES_GPC

NOW_TIME 说明

是否属于 CGI模式 是否属于Windows 环境 是否属于命令行模式 网站根目录地址

当前项目(入口文件)地址 当前分组的URL地址 当前模块的URL地址 当前操作的URL地址 当前URL地址

当前的PATH_INFO字符串 当前URL地址的扩展名

当前项目名 当前分组名 当前模块名 当前操作名 是否开启调试模式 当前模式名称 当前项目路径 系统框架路径 系统内存统计支持 项目编译缓存文件名 当前主题名称 当前模板主题路径 当前模板URL路径 当前浏览器语言 MAGIC_QUOTES_GPC 当前请求时间(3.1新增)

IS_GET IS_POST IS_PUT IS_DELETE IS_AJAX

当前是否GET请求(3.1新增) 当前是否POST请求(3.1新增) 当前是否PUT请求(3.1新增) 当前是否DELETE请求(3.1新增) 当前是否AJAX请求(3.1新增)

24. 前置和后置操作(详见ThinkPHP3.1.2完全开发手册

CHM[2013-01-15].chm5.12)

系统会检测当前操作是否具有前置和后置操作,如果存在就会按照顺序执行,前置和后置操作的方法名是在要执行的方法前面加 _before_和_after_,例如: 1. class CityAction extends Action{

2. //前置操作方法

3. public function _before_index(){ 4. echo 'before
'; 5. }

6. public function index(){ 7. echo 'index
'; 8. }

9. //后置操作方法

10. public function _after_index(){ 11. echo 'after
'; 12. } 13. }

如果我们访问

1. http://serverName/index.php/City/index 结果会输出

before index after

对于任何操作方法我们都可以按照这样的规则来定义前置和后置方法。如果当前的操作并没有定义操作方法,而是直接渲染模板文件,那么如果定义了前置 和后置方法的话,依然会生效。真正有模板输出的可能仅仅是当前的操作,前置和后置操作一般情况是没有任何输出的。 需要注意的是,在有些方法里面使用了exit或者错误输出之类的话 有可能不会再执行后置方法了。

例如,如果在当前操作里面调用了系统Action的error方法,那么将不

会再执行后置操作,但是不影响success方法的后置方法执行。

? 可以通过前置操作来实现登录,如果用户没有登录,则跳转到登录页面,示例代码

如下

class IndexAction extends Action { public function _before_index(){ //如果没有登录,跳转到登录页面 if(!isset($_SESSION['username']) || $_SESSION['username']==''){ $this->redirect('Login/index'); } }

public function index(){ $city=M('City'); $arr=$city->select(); $this->assign('list',$arr); $this->display(); } }

//登录的Action

class LoginAction extends Action{ function index(){ $this->display(); } function do_login(){ $username=$_POST['username']; $password=$_POST['password']; $user['username']=$_POST['username']; $user['password']=$_POST['password']; $m=new Model('User'); $c=$m->where($user)->count(); if($c>0){ $_SESSION['username']=$_POST['username']; $this->redirect('Index/index'); }else{ $this->error(\登录失败!!!\ } // echo $c.\ // echo \ // echo $username;

}

}

25. ThinkPHP 3.1.2 URL

? URL规则

1、默认是区分大小写的 2、如果我们不想区分大小写可以改配置文件 'URL_CASE_INSENSITIVE'=>true,//url不区分大小写 3、如果模块名为 UserGroupAction(前提是'URL_CASE_INSENSITIVE'=>true) 那么url找模块就必要要写成 http://localhost/thinkphp4/index.php/user_group/index 4、如果'URL_CASE_INSENSITIVE'=>false 那么url也可以写为 http://localhost/thinkphp4/index.php/UserGroup/index ? URL伪静态(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.7)

'URL_HTML_SUFFIX'=>'html|shtml|xml',//限制伪静态的后缀名

? URL路由(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.8)

? 启动路由

要在配置文件中开启路由支持, 需要在配置文件中设置URL_ROUTER_ON 参数为true

? 使用路由

? 规则表达式配置路由

? 'my'=>'Index/index',//静态地址路由 ? ':id/:num'=>'Index/index',

//动态地址路由,可以作为url传递参数,如: url地址为

//http://localhost/thinkphp4/index.php/10/1000 //则后台可以通过

echo $_GET['id'].\ echo $_GET['num'].\//获取id和num的值

? 'year/:year/:month/:date'=>'Index/index',//动态和静态混合地址路由 ? 'year/:year\\d/:month\\d/:date\\d'=>'Index/index',//动态和静态混合地址路

由 加上 \\d代表类型只能是数字 'my/:id$'=>'Index/index',// 加上$说明地址中只能是 my/1000 后面不能有其他内容了

? 正则表达式配置路由

'/^year\\/(\\d{4})\\/(\\d{2})\\/(\\d{2})/'=>'Index/index?year=:1&month=:2&date=:3'

? 注意事项:

? 越复杂的路由越往前面放

'URL_ROUTE_RULES'=>array( 'my/:year/:month:/:day'=>'Index/day', 'my/:id\\d'=>'Index/index', 'my/:name'=>'Index/index', )

? 可以使用$作为完全匹配的路由规则

'URL_ROUTE_RULES'=>array( 'my/:id\\d$'=>'Index/index', 'my/:name$'=>'Index/index', 'my/:year/:month:/:day$'=>'Index/day', ), ? 用正则匹配的方式

'URL_ROUTE_RULES'=>array( '/^my\\/(\\d+)$/'=>'Index/index?id=:1', '/^my\\/(\\w+)$/'=>'Index/index?name=:1', '/^my\\/(\\d{4})\\/(\\d{2})\\/(\\d{2})$/'=>'Index/day?year=:1&month=:2&day=:3', ),

? 下面是规则路由的定义示例:

1. 2. 3. 4. 5. 6.

'URL_ROUTER_ON' => true, //开启路由

'URL_ROUTE_RULES' => array( //定义路由规则

'news/:year/:month/:day' => array('News/archive', 'status=1'), 'news/:id' => 'News/read', 'news/read/:id' => '/news/:1', ),

? URL重写, 为了达到更好的SEO效果可能需要去掉URL里面的index.php ,通过

URL重写的方式可以达到这种效果 (详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.9)

? URL生成, 为了配合所使用的URL模式,我们需要能够动态的根据当前的URL

设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.10)

26. ThinkPHP 3.1.2 分组、页面跳转与ajax

? 使用分组: 模块分组功能是为了更好的组织已有的模块,并且增加项目容量的一个

有效机制。分组功能可以把以往的多项目合并到一个项目中去,这样一来,之前需要采用跨项目操作的地方,现在因为在一个项目中从而免去了不少麻烦,并且公共文件的重用也方便了,并且每个分组都可以有自己独立的配置文件、公共文件、语言包,在URL的访问上面也非常清晰。(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.6)

? 页面跳转(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.14) ? Ajax(详见ThinkPHP3.1.2完全开发手册CHM[2013-01-15].chm5.19) ?

本文来源:https://www.bwwdw.com/article/tmmo.html

Top