1. 开启调试模式:
修改入口文件index.php,打开调试开关。
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
老版本在入口文件中没有此配置项,需要去ThinkPHP/ThinkPHP.php修改。
描述:数据表新增/修改字段时,无法对新增/修改的字段进行更新及插入数据,更新插入操作无报错,但是正常读取数据。
方法:清除运行时数据,直接删除 Runtime\Data\_fields 目录下对应的数据表文件。甚至可以把Runtime目录直接删除,再次请求的时候这个目录会重建。
3. where条件使用:
where条件使用时,注意where的对象是数值还是字符串,如果是字符串,需要添加引号。
$user = M('user');
$user->pass = '123';
$id = 1;
$result = $user->where('id='.$id)->save();
// or
$name = 'admin';
$result = $user->where('name="'.$name.'"')->save();
// 注意:id字段是int ,name字段是varchar,在处理的时候,name="admin" 这对引号如果不加的话,会出现一些异常。这种字符串与数值之间的使用的差异在其他语言跟数据库之中也存在。
$user = M('user');
$conf_x['id'] = '1';
$data['pass']='123';
$result = $user->where($conf_x)->save($data);
//or
$conf_y['name']='admin';
$reuslt = $user->where($conf_y)->save($data);
这样可以绕过一些引号的问题。
同样在select操作时,where条件也会存在类似的异常,需要注意。
4. 使用非默认模版:
$this->display();
$this->display('模块:操作');
$this->display('主题@模块:操作');
$this->display('主题@模块:操作','编码');
$this->display();
$this->display('Base:success');
$this->display('Admin@Base:success');
$this->display('Admin@Base:success','gbk');
$this->display('Admin@Base:success','utf-8');
//使用不同的display原型,指定不同的模版,可以输出一些公共/共用的页面。
5. 构造函数/初始化函数:
这里所说的构造函数与PHP中的构造函数有所差异,THINKPHP中有另外一个class的构造函数 _initialize(),每次有操作被请求的时候,都会执行构造函数,这样就可以在构造函数中实现一些公共的操作,使得代码更加简洁,更好维护。
class CommonController extends Controller {
public function _initialize(){
// do some common things here
init_data();
init_enviroment();
....
}
public function xxx(){
}
....
}
6. 继承处理:
写一个公共的类,继承Controller,然后在这个类中实现一些所有Control都会实现的一些功能,然后每个操作的类都继承这个公共类,通过调用父类已经实现的功能来实现一些功能及数据初始化,避免代码的冗余跟不一致性。例如后台管理每个界面都需要登录账户的账户信息,需要控制权限及菜单,都可以通过公共类来实现。结合上面讲到的构造函数,可以无形的在构造函数中进行数据初始化及权限控制。
class CommonController extends Controller {
public function _initialize(){
// do some common things here
init_data();
init_enviroment();
....
}
public function xxx(){
}
....
}
class UserController extends CommonController {
public function _initialize(){
parent::_initialize();
$this->assign("class_name","UserController");
init_data_child();
....
}
public function xxx(){
}
....
}
7. 模版继承:
除了PHP自身的继承之外,THINKPHP还有一个模版的继承,这样就可以把一些页面公共的模块放在父模版中,而各个功能页面分别继承父模版,然后再次实现父模版中的块,并替换掉父模版中的块。
<!-- Base/base.html -->
<!DOCTYPE html>
<html class="no-js">
<head>
<block name="head">
<title>base test</title>
</block>
</head>
<body>
<block name="body">
base body .
</block>
</body>
<block name="footer">
base footer .
</block>
</html>
<!-- Child/child.html -->
<extend name="Base:base" />
<block name="head">
<title> child test</title>
</block>
<block name="body">
child test body.
</block>
8. 公共提示页面:
可以使用thinkphp自带的success或者error定义公共页面,也可以自己再次封装,使用display进行处理,灵活性更强。
<!--success.html-->
<meta http-equiv='Refresh' content='{$time};URL={:U($next_url)}'>
$this->assign('next_url','user_list');
$this->assign('next_url','/xx/user/user_info/id/1');
$this->success();
// success 实际上仍然是调用display,因此,可以直接调用display,如:
$this->display('Base:success');
//$this->error();
模版配置参数的路径:
//'TMPL_ACTION_ERROR' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件
//'TMPL_ACTION_SUCCESS' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件
//如果觉得success跟error满足不了需求,可以自定义一个页面,然后调用display显示。
public function my_success($url,$delay,$msg){
$this->assign('url',$url);
$this->assign('delay',$delay);
$this->assign('err_msg',$msg);
$this->display('Base:my_success');
}
// test my_success
$this->my_success('/Admin/user/user_list',3,'test my_success!');
9. redirect重定向:
原型:$this->redirect(string url,arrary params,int delay,string msg);
调用方式:
$this->redirect('/Admin/user/user_info/id/1','',3);
or
$this->redirect('/Admin/user/user_info',array('id'=>1),3 );
即参数可以放在url中,或者放在第二个参数中。