thinkphp

ThinkPHP中forward和redirect的区别

ThinkPHP中forward和redirect的区别在那里呢? 首先看代码注释: forward: 执行某个Action操作(隐含跳转) 支持指定模块和延时执行 redirect: Action跳转(URL重定向) 支持指定模块和延时跳转 其次看代码组织,二者的行为是不同的: forward: redirect: forward是通过框架内部的ACTION和MODULE的调用,实现页面显示的是另一个你想要的内容。 redirect则是通过改变URL地址栏,直接跳转过去的。 上论坛搜索,发现老大给出了一些指点,其说明如下: 可以把forward看成是隐含跳转,rediret是直接跳转。 redirect是会改变url ,跳过去执行另外的操作 forward只是隐含执行一个操作方法,url本身并不会跳转(这个其实不是绝对的,因为隐含执行的操作可能会有一个重定向的过程) 例外论坛里有位兄弟已经给出了forward的用法:

ThinkPHP上传类库的Bug修复

最近开发网站用到了ThinkPHP 2.0的上传类库, 用来实现一个图片上传功能。 使用过程中发现,如果开启了子目录创建方式,则会出现一些问题: 1. 无法生成缩略图, 此问题的修复办法如下, 在 UploadFile.class.php 中找到 line#145 替换成为: 2. 返回参数中没有包含缩略图的文件名,原始的返回参数如下: savename 参数包含了子目录路径,保存缩略图路径到数据库的时候,还需要写额外的function替换出缩略图的存放路径。 我对此做了一些修改: 返回的参数中多了一个subpath用来存放子目录路径,savename不再包含子目录路径。 如果你的thumbPrefix是'thumb_', 现在你只需 我上传了修改后的UploadFile.class.php文件,你可以随意使用。如果你发现其他问题,欢迎留言讨论。

使用正则表达式进行ThinkPHP的自动验证

ThinkPHP的自动验证机制是为了进行表单数据验证,验证可以支持function、 callback、confirm、equal、unique和regex,这里要讲的是使用正则表达式进行验证。 一般我们见的比较多的是设置规则为require、email之类的,其实这些本身也是属于正则表达式验证方式,只是系统内置定义了一些常用的正则表达式而已。这些内置的正则表达式的定义可以参考model类的regex方法,内置支持的正则定义包括: require 字段必须、email 邮箱、url URL地址、currency 货币、number 数字、zip 邮编、integer 整数、double 浮点数、english 英文字母,但是并不局限于这些正则规则的,我们完全可以直接在验证规则里面使用正则表达式进行定义,这样我们可以凭借强大的正则表达式来进行表单字段验证,例如: array(‘name’,'/^[a-z]\w{3,}$/i’,'名字不符合要求!’); array(‘password’,'/^[a-z]\w{6,30}$/i’,'密码不符合要求!’); array(‘ac...

ThinkPHP的动态数据查询方法

ThinkPHP提供了数据的动态查询方法,可以简化你的查询代码,例如: $User->where(‘name=”ThinkPHP”‘)->find(); 可以简化为: $User->getByName(‘ThinkPHP’); $User->where(‘email=”thinkphp@qq.com”‘)->find(); 可以简化为: $User->getByEmail(‘thinkphp@qq.com’); getBy**** 方法里面的**** 会转换成小写的字段名,如果字段不存在,就会出错。 如果你的字段名是user_id ,那么查询方法应该写成: $User->getByUserId(5); UserId 会被解析成为数据库的user_id字段,这点需要注意,以免引起不必要的麻烦。 目前尚不支持,对多个字段的动态查询。

避免ThinkPHP URL目录过深的技巧

按照ThinkPHP的默认URL模式,通常是: http://serverName/模块名/操作名/变量1/值1/变量2/值2… 很多人担心这样的URL会导致目录层次过深,而且由于这样的URL改变了当前的相对路径,所以如果不注意写法,经常会导致JS和CSS加载不到。问题就在于这个”/”,这两个问题都可以通过一个小技巧解决,而且不影响你的开发,只需要在项目配置文件中设置 ‘URL_PATHINFO_DEPR’=>’-', 这个配置默认值是”/” 我们更改为”-” 配置修改以后,上面的URL地址就可以变成: http://serverName/模块名-操作名-变量1-值1-变量2-值2… 不过要注意的是,模板里面的链接地址最好是用U方法动态生成的,而不是固定写死的,否则模板会有一定的修改工作。

ThinkPHP判断当前操作的请求类型

在很多情况下面,我们需要判断当前操作的请求类型是GET POST 甚至是PUT DELETE,一方面可以针对作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求。 TP的Action类内置了一些判断方法用于判断请求类型,包括: isGet 是否是GET提交 isPost 是否是POST提交 isPut 是否是PUT提交 isDelete 是否是DELETE提交 isHead 是否是HEAD提交 使用举例如下: 另外还提供了一个判断当前是否属于AJAX提交的方法 isAjax 是否属于AJAX提交 需要注意的是,如果使用的是ThinkAjax或者自己写的Ajax类库的话,需要在表单里面添加一个隐藏域,告诉后台属于ajax方式提交,默认的隐藏域名称是ajax(可以通过VAR_AJAX_SUBMIT配置),如果是JQUERY类库的话,则无需添加任何隐藏域即可自动判断。

利用ThinkPHP路由实现用户动态URL

之前讲过利用空操作实现的用户动态URL,其实路由也可以实现同样的功能,例如: 我们本来有一个User模块的read操作,现在的URL是 http://serverName/User/read/id/3 我们希望缩短成 http://serverName/User/3 现在无需修改任何代码,只需要增加路由定义即可。 要使用路由,确保首先开启路由 ‘URL_ROUTER_ON’=>true 然后在项目配置目录下面增加routes.php 路由定义文件,添加下面的定义: return array( ‘User@’=>array( array(‘/^\/(\d+)$/’,'User’,'read’,'id’), ), ); 现在就可以使用 http://serverName/User/3 和 http://serverName/User/read/id/3 同时访问了

ThinkPHP模型单独设置数据表的前缀

ThinkPHP的数据表前缀一般是统一定义的,但是如果个别数据表的前缀不统一的话应该如何处理。 例如,大多数表的前缀是think_ 而有两个表的前缀是top_,应该怎么处理? 解决办法是在模型里面单独设置自己的表前缀,例如: 我们在项目配置文件里面设置 ‘DB_PREFIX’=>’think_’ 其实TP的惯例配置默认就是上面的设置,呵呵~ 然后在模型里面单独设置个别的表前缀,代码如下: class UserModel extends Model{ protected $tablePrefix = ‘top_’; } 实例化UserModel后,实际连接的数据表就变成了top_user,而不再是think_user。

创建数据对象后的更改

在使用ThinkPHP的create方法之后,我们仍然可以对创建的数据对象进行任何操作。 例如: ThinkPHP模型的create方法是用于创建数据对象,因为是创建到内存,因此在写入数据库之前可以随意添加或者更改。很多开发者为了需要自己设置字段,而放弃 create方法,其实大可不必。 上面的处理方式有两个好处: 1、动态的更改字段可以避免在模型里面定义定义自动完成 或者直接使用M方法实例化模型而减少开销 2、可以解决在某些特殊的情况下难以统一定义自动完成的情况.

巧用模型的表后缀实现多语言数据存储

在网站开发的时候经常需要用到多语言的网站版本,这里我们介绍一种巧用模型的后缀来实现的多语言表的连接。 假如我们需要存储网站的三个语言版本的数据,包括:简体中文、繁体中文和英文。 假设分别对应了数据库的三个表(以新闻表为例) think_new_cn 简体中文(默认语言) think_new_tw 繁体中文 think_new_en 英文 并且假设三个表的结构是一致的,只是表名不同。 然后,我们创建New模型如下:(注意我们只是创建了一个模型,而不是创建三个模型)