第一步:备份代码和数据库
第二步:合并插件和应用代码
第三步:代码目录全部改成小写(Uploads除外)
第四步:控制器和模型的PHP文件改名
把controller目录下的文件名人全部由 ***Controller.class.php 改成 ***.php, 如:ActionController.class.php 改成 Action.php。把model目录下的文件名人全部由 ***Model.class.php 改成 ***.php, 如:ActionModel.class.php 改成 Action.php。可以下载这个工具实现批量自动更改
第五步:把view/default的模板目录修改成 view/ (相当去掉default这一层目录)
第六步:手工批量更新以下内容
把这些controller文件里的命名空间由
namespace Admin\Controller; 全部替换成 namespace app\admin\controller;
把类定义由 class ***Controller extends *** 修改成 class *** extends ***,如:
class ActionController extends 全部替换成 class Action extends
把extends AdminController 修改成 extends Admin
把 use Think\Controller; 修改 use think\Controller;
把这些model文件里的命名空间由
namespace Admin\Model; 全部替换成 namespace app\admin\model;
把类定义由 class ***Model extends *** 修改成 class *** extends ***,如:
class ActionModel extends 全部替换成 class Action extends
把use Think\Model; 修改成(注意大小定):use think\Model;
直接使用M或者db函数保存数据时save不能再,需要把save替换成update方法,如:
M('attribute')->where(array('name'=>'addon_status'))->save(array('extra'=>$tmpStr));
修改成:
M('attribute')->where(array('name'=>'addon_status'))->update(array('extra'=>$tmpStr));
在模型中,save既表示增加数据也表示更新数据,在TP3.2升级的用户建议在已有save方法前加入显性更新操作,如:->save( 替换成 ->isUpdate(true)->save(
对象名不能为Public,所以 Public.php 需要改名为 Publics.php
class Public extends 修改为 class Publics extends
还要把相关的Url的地址由 Public/** 修改为 Publics/***
最后把Public.php文件删除
把模板下的public目录 修改为 publics,然后把里面的公共html文件的路径全部修改为publics/:
Public/base => publics/base
删除view下面的public目录
把所有的 extends \Think\Controller 修改为 extends \think\Controller
model文件里的验证规则不再可用,需要另写验证器实现,因此需要删除这个多余的代码,如删除下面这个:
protected $_validate = array(
array('name', 'require', '标识不能为空', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
array('name', '', '标识已经存在', self::VALUE_VALIDATE, 'unique', self::MODEL_BOTH),
array('title', 'require', '名称不能为空', self::MUST_VALIDATE , 'regex', self::MODEL_BOTH),
);
把所有IS_POST 替换为:request()->isPost()
把所有IS_GET 替换为:request()->isGet()
把所有IS_AJAX 替换为:request()->isAjax()
把Controller文件里的 $this->display( 全部修改成 return $this->fetch(
所有 $this->redirect( 函数调用修改成 return $this->redirect(
所有 redirect( 函数调用修改成 return redirect(
把model里的->getField( 修改 ->value(
把model里的->getFields( 修改 ->column(
把model里的->add( 修改 ->save(,如果是用M函数增加的数据,要修改成 ->insert(
在application/common.php 文件里加入单字母函数兼容函数,并且把weiphp里的application/Common/Common.php里的函数也复制过来
在config目录下增加一个define.php文件,专门用于一些兼容性的常量定义
模板标签的规则由:
// 标签库标签开始标记
'taglib_begin' => '<',
// 标签库标签结束标记
'taglib_end' => '>',
升级TP5的规则为:
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
需要把所有的模板标签全部替换
把Common/Public 全部替换成 common/Publics
$this->success 和 $this->error 的返回值发生了变化,其中:
status => core
info => msg
这部分内容需要手工一个一个确认修改,无法批量替换(PS:已在TP核心里加了兼容,不需要再修改)
TP5的模板中不再支持include里加block标签,所以要把所有include里的block转换出来
TP5中的模型中的find方法返回的不再是数组,而是对象,因此不能用is_array判断返回的结果。但这个返回的对象还可以当数组用
is_array肯定是为false,因此要去掉。但dump($user['nickname']);这样打印用户昵称时还是能正常显示出来的。也可以在把结果转换数组如:->find()->toArray();
模型中的join写法由:
M()->table($px . 'public_follow as f')
->join($px . 'user as u ON f.uid=u.uid')
->where($map)
->count();
修改成:
M()->table($px . 'public_follow')->alias('f')
->join($px . 'user u', 'f.uid=u.uid')
->where($map)
->count();
在application/database.php里定义一个常量:
define('DB_PREFIX', 'wp_');
然后把所有 C ( 'DB_PREFIX' ) 变量全部修改成: DB_PREFIX
把所以模型里的 protected $tableName = '***'; 替换成: protected $table = DB_PREFIX.'***';
使用preg_replace时可能会报以下错误:
preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
解决方法如:
$msg = preg_replace ( "#\\\u([0-9a-f]+)#ie", "iconv('UCS-2','UTF-8', pack('H4', '\\1'))", $msg );
修改成:
$msg = preg_replace_callback ( "#\\\u([0-9a-f]+)#i", function($r) { return iconv('UCS-2','UTF-8', pack('H4', '\\1'));}, $msg );
方法重写时,如果父级的方法带参数,那么重写的方法也需要定义一样的参数才行,:
如果按之前的写法重写lists方法:
就会报错误:
Declaration of app\topmenu\Controller\TopMenu::lists() should be compatible with app\common\controller\Base::lists($model = NULL, $page = 0)
解决方法就是只能把父级方法修改修改成不带参数的:
其它几个通用方法edit,add,del,config也同样这样处理
把Home模块下的Addons, Base, Public目录下的模板全部转移到 common/view/base 目录下,然后:
把 Base/common 全部替换成: common@base/common
把 Public/header 全部替换成: common@base/header
把 Public/head 全部替换成: common@base/head
把 Public/footer 全部替换成: common@base/footer
把 Public/var 全部替换成: common@base/var
把 Addons/_nav 全部替换成: common@base/_nav
Base/no_side_common => common@base/no_side_common
把全部 _ADDONS 替换成:MODULE_NAME
把全部 _CONTROLLER 替换成:CONTROLLER_NAME
把全部 _ACTION 替换成:ACTION_NAME
把
把
把 $search_url || 全部替换成:
把 $post_url || 全部替换成:
把 $get_param[model]=$model['name'] 全部替换成 isset($model['name']) && $get_param[model]=$model['name']
把 $_REQUEST ['_addons'] 全部替换成:MODULE_NAME
把 $_REQUEST ['_controller'] 全部替换成:CONTROLLER_NAME
把 $_REQUEST ['_action'] 全部替换成: ACTION_NAME
把 public/Home下的文件转移到 public/static/base目录下,然后把相应的文件目录全部更改过来:
Public/Home/images => public/static/base/images
SITE_PATH . '/Addons/' => APP_PATH . '/'
$get_param[model] => $get_param['model']
$this->display( => return $this->fetch(
parent::common_edit => return parent::common_edit
parent::common_add => return parent::common_add
parent::common_del => return parent::common_del
parent::common_lists => return parent::common_lists
$field[name] => $field['name']
$field[value] => $field['value']
在TP3.2的模型中,create方法但创建数据对象 但不保存到数据库;在TP5中,create方法是创建并写入数据库,并返回数据实例。因此所有用到create方法的地方都需要修改,如:
if ($Model->create() && $id = $Model->save()) {
修改成:
$data = I('post.');
$id = $Model->isUpdate(false)->save($data);
if ($id) {
User/logout => home/User/logout
User/profile => home/User/profile
'User/login' => 'home/User/login'
把 ->getField( 修改成 ->value( 或者 ->column( 具体要看实际情况而定
mysqldump -u weixinhong -p -d paiqianos > /root/os.sql
在配置文件里把 var_page 的参数设置为 p,然后全部替换:
C('VAR_PAGE') => C('paginate.var_page')
把所有用到\Think\Page实现分页的方法全部改造成paginate
把 selectPage 替换成 paginate,相应的调用代码需要手工修改,如:
$list = M ( 'article_style')->selectPage(15);
修改成:
$list = M ( 'article_style')->paginate(15);
$list = dealPage($list);
如果使用Model调用,也可以使Model继承Common里的Base
I ( 'get. => I ( '
$info[addon] => $info['addon']
$vo[is_admin] => $vo['is_admin']
ONETHINK_ADDON_PATH => APP_PATH
addon_category => app_category
Addons:// =>
/Model => /model
'./Addons/ => APP_PATH.'
T函数已经不存在,需要全部搜索调用 T( 的地方修改掉
把应用下的model文件里的update方法与核心文件冲突,需要更改成别的名称:updateInfo 然后把调用这些地方的都统一更新
不能直接使用:->delete ( $id ) 删除数据,需要修改成:->where('id='.$id)->delete ( )
F函数已经删除,需要全站替换成S函数
getById方法不存在,需要全部修改成find
get_table_name ( $model ['id'] ) $model ['name']
然后删除 get_table_name函数
功能组件改造成widget