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所有模块的操作都可以直接使用它的函数 包含扩展类:import5.所有页面的权限把控:{用于后台登陆} 代码示例:见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 ""; 跳转一般都是自己写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_test9.View10.模板引擎11.调试12.缓存13.要十分小心注意return和exit的区别: return 是终止一个函数的运行,跳出return所处的函数外面;所以如果“return写在一个函数A”,而A被调用到其他函数B里面, 尽管A可能是我们做某个验证,如果A条件适宜就输出B的其他剩余部分代码,如果不满足,就跳出去。 这时候return可就不管用了,他只是跳出A,你B中调用了A,它跳出B的那一刻,已经执行了B的余下代码,所以显然就不合适了。 这时候,exit最好,exit是中断整个脚本的余下输出 但有时候我们只是想跳出单个函数而不能让整个脚本文件中断,就必须用return