}
? 空模块 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) ?