1.配置文件为了效率:应该在底层修改:一改则所有APP都能用
如果单独某个APP需要特定的配置,再在单独的conf.php中单独定义,或者C方法在特定位置单独修改
配置:TP底层{管理配置}+APP配置{我们自己每一个APP的自定义配置}
{大家公用的配置放在惯例配置里面}
{单独每个APP的特定配置写在自己的conf.php里面}
*APP单独设置举例:
admin和home可能连接的数据库不一样
admin和home默认的入口文件后的默认进入模板和操作不一样,在每个APP的conf里面单独配置它
所以在项目开发时,一定不要盲目写代码,一定好好思考,我有几个模块,
这几个模块公用的功能是什么,共有的配置是什么,可以用一个文件共享他们的公用模块吗?
然后在设计好共有部分和私有部分,再开始写代码、
举个例子:在开发多个项目的时候,我感觉大部分的项目的数据库都是一样的链接,那么
至少数据库的链接可以在惯例配置{底层ThinkPHP}里面写,那么就大大提高代码共享了
2.
3.模板替换这几个很重要:
__ROOT__:网站根目录
__APP__:当前应用网站绝对路径
__URL__:当前模块的网站绝对路径
__ACTION__:当前操作的网站绝对路径
__SELT__:当前的URL
__PUBLIC__:根目录下的Public目录的网站绝对路径
../Public:当前APP下的Public目录的网站绝对路径{这绝对不是常量}
__TMPL__:
* 这几个替换,在html和PHP中均可以解析替换的规则相同吗?
* PHP中:
__ROOT__:网站根目录
__APP__:当前应用网站绝对路径
__URL__:当前模块的网站绝对路径
__ACTION__:当前操作的网站绝对路径
__SELT__:当前的URL
* 模板中:
__ROOT__:网站根目录
__APP__:当前应用网站绝对路径
__URL__:当前模块的网站绝对路径
__ACTION__:当前操作的网站绝对路径
__SELT__:当前的URL
__PUBLIC__:根目录下的Public目录的网站绝对路径
../Public:当前APP下的Public目录的网站绝对路径{这绝对不是常量}
__TMPL__:
* 但是:它们都是系统定义的常量吗?
__ROOT__:网站根目录
__APP__:当前应用网站绝对路径
__URL__:当前模块的网站绝对路径
__ACTION__:当前操作的网站绝对路径
__SELT__:当前的URL
这4个是系统的路径常量{自己在方法里面测试一下就知道了}
其他的就不是,那么其他的是什么原理支持替换,以后研究底层再说
* 静态资源一定要用网站的绝对路径。
* 代码示例:在index.html里面输出一个图片
4.Home/Common/haoge.php:当前APP所有模块的操作都可以直接使用它的函数
包含扩展类:import
5.所有页面的权限把控:{用于后台登陆}
代码示例:见test文件夹
需求:
求一个方法,
除了在Login模块的所有方法之前不执行,
但是在其他任何模块的所有操作之前都要执行。
解决方案:
class LoginAction extends Action {//这个Login模块单独开来,它显示的就是登陆的方法细节,它没有继承CommonAction}
class CommonAction extends Action{
public function _initialized(){
//权限把控的细节函数啦
}
}
//权限把控的实现过程,这个类就是其他所有模块的父类了,
以后其他模块{除Login外}就不用继承Action这个TP底层的基类了
//这个_initialized()就是用来解决如何实现每个模块在第一步就执行验证方法的关键,TP的类继承的有一个规则,
所有继承了父类的子类,做任何操作之前都要先执行父类的_initialized()这个初始化函数
class IndexAction extends CommonAction{};
class UserAction extends CommonAction{};
//看清楚现在所有其他模块都是继承CommonAction,而不是以前的Action
//但不要担心,因为CommonAction已经继承了Action ,所有但凡继承了CommonAction的模块依然 能使用Action的方法
6.URL模式:{URL_MODEL参数定义}
1).普通模式:http://localhost/yzm/index.php?m=Index&a=index&id=10
2).pathinfo模式:http://localhost/yzm/index.php/Index/index/id/10
3).rewrite模式:修改apche,修改项目或者底层的配置文件,URL_MODEL
4).兼容模式:http://localhost/yzm/?s=/Index/index/id/10
拓展:在模板里写PHP的函数也不是不可以,直接在{}这么写:{:M('User')},函 数前面加冒号
这个启示我:如果在前台或者后台生成U模板替换,但是还有更 厉害更方便的方法:U();也是很快而且和URL_MODULE联 系更紧密,担任到底是选U 还是__URL__看项目的决策吧
7.Action
1).定制报错页面:
系统在debug模式下默认是底层的TPL目录下的Think_Exception.tpl //我们如果去掉debug模式,这个页面就不会指向了,
debug模式下我可以在APP的conf里面定义异常页面:
'TMPL_EXCEPTION_FILE'=> './Public/error.tpl' //error.html则个页面我自己创建一个就OK,
这个路径也是看情况自己决定放哪里合适
异常模板中可以使用的变量:{用PHP代码去实现,因为异常模板里面不支持模板引擎}
$e['file']
$e['line']
$e['message']
$e['trace']
2).在操作中获取当前模块和操作:
1.$_GET[_URL_][0] $_GET[_URL_][1];
__URL__ __ACTION__
2.MODULE_NAME
ACTION_NAME
3).常用常量:
MOUDLE_NAME
ACTION_NAME
IS_GET
IS_POST
IS_AJAX
{在部署模式下,关闭debug那么异常页面不会出现,但是页面如果出错,它就显示找不到页面,所以应该要优化一下}
4).空模块,空操作://不存在的模块和操作,对于用户访问不存在的页面,需要给他优化一下报错页面
function _empty(){ $this->myerror(); }
function myerror(){$this->display('myerror'); }//注意这里的display必须写死去哪个页面,否则默认很奇葩不是去myerror
空模块:在lib/下面写模块。
class EmptyAction extends Action {。。。}; //在里面也可以结合一下定制空操作{写_empty()方法}
5).URL伪静态:{功能类似rewrite}
设置页面URL的静态后缀,去底层的配置文件
'URL_HTML_SUFFIX'=>'html'; //最好让他只支持html,否则一大堆后缀不和谐啊
URL重写:就是和rewrite一模一样的配置和功能
URL生成:研究U();//动态生成URL,以配合项目移植和某些操作
U("show");
U("User/show");
U("User/show?id=10");
U("User/show", "id=10");
U("User/show", array('id'=>'10'));
重定向:$this->redirect('User/index', array('id'=>'10'), '5', '即将跳转');
//如果一定要调到百度:在function 里面用js: echo "<script>location='http://www.baidu.com'</script>";
跳转一般都是自己写js的函数解决
页面跳转:
//由于底层实现success和error的原理就是替换当前地址栏的某些部分,如果没写全地址栏那就悲剧了,所以这么用success和error:
$this->success('yes', U('show'), 5);
$this->error('no', U('show'), 5);
如果想修改success和error的展示页面,见手册,这个太好改了
URL路由:利用路由规则,虚假地址转去真实地址
URL大小写:
//由于TP默认自动加载所有的Action,所以无需导入对应的Action就可以直接调用类了
跨模块操作A():比如我当前在Home项目下的Index模块,
$user = A('User');//使用当前项目中的User模块
$user->select();
比如我现在在Home项目下,
$user = A('Admin://User'),直接调用Admin项目下的User模块
R()调用方法:
R('User/info');//User在当前项目内,
R('Admin://User/info');//User在Admin项目内。
获取系统变量:
比普通post和get数组获取的方式多了个过滤,{记住!!!:过滤只能对单个数组元素,不要直接传整个数组名}
第7讲还有时间再看它什么意思???{转实体:避免sql注入}
获取系统变量进入数据库:还不如直接用htmlspecialchars($_GET['name']),不建议使用$this->_get('name');
而从数据库出来$str,这么操作一下:$str = htmlspecialchars_decode($str)就OK了,还是用PHP的原生方案
第8讲的Ajax完全不懂,明天或者周六再好好看懂
Action参数绑定:
给URL传方法里面需要的参数,而对应的在方法里面写拿这些参数做什么?这就是所谓的绑定
8.Model 见文件model_test
9.View
10.模板引擎
11.调试
12.缓存
13.要十分小心注意return和exit的区别:
return 是终止一个函数的运行,跳出return所处的函数外面;所以如果“return写在一个函数A”,而A被调用到其他函数B里面,
尽管A可能是我们做某个验证,如果A条件适宜就输出B的其他剩余部分代码,如果不满足,就跳出去。
这时候return可就不管用了,他只是跳出A,你B中调用了A,它跳出B的那一刻,已经执行了B的余下代码,所以显然就不合适了。
这时候,exit最好,exit是中断整个脚本的余下输出
但有时候我们只是想跳出单个函数而不能让整个脚本文件中断,就必须用return