widget('Widget_Options'); $dbConfig = $options->plugin('EmlogToTypecho'); /* 初始化一个db */ if (Typecho_Db_Adapter_Mysql::isAvailable()) { $db = new Typecho_Db('Mysql', $dbConfig->prefix); } else { $db = new Typecho_Db('Pdo_Mysql', $dbConfig->prefix); } /* 只读即可 */ $db->addServer(array( 'host' => $dbConfig->host, 'user' => $dbConfig->user, 'password' => $dbConfig->password, 'charset' => 'utf8', 'port' => $dbConfig->port, 'database' => $dbConfig->database ), Typecho_Db::READ); /* 删除当前内容 */ $masterDb = Typecho_Db::get(); $this->widget('Widget_Abstract_Contents')->to($contents)->delete($masterDb->sql()->where('1 = 1')); $this->widget('Widget_Abstract_Comments')->to($comments)->delete($masterDb->sql()->where('1 = 1')); $this->widget('Widget_Contents_Post_Edit')->to($edit); $masterDb->query($masterDb->delete('table.relationships')->where('1 = 1')); /* 获取 emlog 管理员信息 */ $emUser = $db->fetchRow($db->query($db->select()->from('table.user'))); $emUsername = $emUser['username']; $emNickname = $emUser['nickname']; /* 转换评论表 */ $i = 1; while (true) { $result = $db->query($db->select()->from('table.comment') ->order('cid', Typecho_Db::SORT_ASC)->page($i, 100)); $j = 0; while ($row = $db->fetchRow($result)) { $status = ''; if ('y' == $row['hide']) { $status = 'waiting'; } else { $status = 'approved'; } if (($emUsername == $row['poster']) || ($emNickname == $row['poster']) ) { $authorId = 1; } else { $authorId = 0; } $row['comment'] = preg_replace(array( "/\s*

/is", "/\s*<\/p>\s*/is", "/\s*\s*/is", "/\s*<(div|blockquote|pre|table|ol|ul)>/is", "/<\/(div|blockquote|pre|table|ol|ul)>\s*/is" ), array( '', "\n\n", "\n", "\n\n<\\1>", "\n\n" ), $row['comment']); $comments->insert(array( 'coid' => $row['cid'], 'cid' => $row['gid'], 'created' => $row['date'], 'author' => $row['poster'], 'authorId' => $authorId, 'ownerId' => 1, 'mail' => $row['mail'], 'url' => $row['url'], 'ip' => $row['ip'], 'agent' => NULL, 'text' => $row['comment'], 'type' => 'comment', 'status' => $status, 'parent' => $row['pid'] )); $j ++; unset($row); } if ($j < 100) { break; } $i ++; unset($result); } /* 转换文章表 */ $i = 1; while (true) { $result = $db->query($db->select()->from('table.blog') ->order('gid', Typecho_Db::SORT_ASC)->page($i, 100)); $j = 0; while ($row = $db->fetchRow($result)) { $type = ''; if ('page' == $row['type']) { $type = 'page'; } else { if ('y' == $row['hide']) { $type = 'post_draft'; } else { $type = 'post'; } } $contents->insert(array( 'cid' => $row['gid'], 'title' => $row['title'], 'slug' => Typecho_Common::slugName(urldecode($row['alias']), $row['gid']), 'created' => $row['date'], 'modified' => $row['date'], 'text' => $row['content'], 'order' => 0, 'authorId' => $row['author'], 'template' => NULL, 'type' => $type, 'status' => 'publish', 'password' => $row['password'], 'commentsNum' => $row['comnum'], 'allowComment' => ('n' == $row['allow_remark']) ? '0' : '1', 'allowPing' => 0, 'allowFeed' => '1' )); $j ++; unset($row); } if ($j < 100) { break; } $i ++; unset($result); } /* 转换 metas 表 */ $sorts = $db->fetchAll($db->select()->from('table.sort')); foreach ($sorts as $sort) { $blogs = $db->fetchAll($db->select()->from('table.blog') ->where('sortid = ?', $sort['sid'])); $masterDb->query($masterDb->insert('table.metas')->rows(array( 'mid' => $sort['sid'] + 1, 'name' => $sort['sortname'], 'slug' => $sort['alias'], 'type' => 'category', 'description' => $sort['description'], 'count' => count($blogs), 'parent' => (0 != $sort['pid']) ? $sort['pid'] + 1 : 0 ))); } unset($sorts); $emtags = $db->fetchAll($db->select()->from('table.tag')); foreach ($emtags as $emtag) { $gid = trim($emtag['gid'], ','); $gids = explode(',', $gid); $masterDb->query($masterDb->insert('table.metas')->rows(array( 'name' => $emtag['tagname'], 'slug' => Typecho_Common::slugName($emtag['tagname']), 'type' => 'tag', 'description' => NULL, 'count' => count($gids) ))); } /* 转换关系表 */ $emblogs = $db->fetchAll($db->select()->from('table.blog')); foreach ($emblogs as $emblog) { $masterDb->query($masterDb->insert('table.relationships') ->rows(array( 'cid' => $emblog['gid'], 'mid' => (-1 == $emblog['sortid']) ? 1 : ($emblog['sortid'] + 1) ))); } unset($emblogs); $tags = $masterDb->fetchAll($masterDb->select()->from('table.metas')->where('type = ?', 'tag')); foreach ($tags as $tag) { foreach ($emtags as $emtag) { if ($tag['name'] == $emtag['tagname']) { $gid = trim($emtag['gid'], ','); $gids = explode(',', $gid); foreach ($gids as $cid) { $masterDb->query($masterDb->insert('table.relationships')->rows(array( 'cid' => $cid, 'mid' => $tag['mid'] ))); } } } } unset($emtags); /* 更新附件地址 */ $emOptions = $db->fetchAll($db->select()->from('table.options')); $static = array(); foreach ($emOptions as $emOption) { $static[$emOption['option_name']] = $emOption['option_value']; } unset($emOptions); $static['blogurl']; $oldUrl = rtrim($static['blogurl'], '/') . '/content/uploadfile'; $path = defined('__TYPECHO_UPLOAD_DIR__') ? __TYPECHO_UPLOAD_DIR__ : '/usr/uploads'; $newUrl = rtrim($options->siteUrl, '/') . $path . '/emlog'; $sql = "UPDATE `" . $masterDb->getPrefix() . "contents` SET `text` = REPLACE(`text`,'" . $oldUrl . "','" . $newUrl . "');"; $masterDb->query($sql); $this->widget('Widget_Notice')->set(_t('数据已经转换完成'), NULL, 'success'); $this->response->goBack(); } public function action() { $this->widget('Widget_User')->pass('administrator'); $this->on($this->request->isPost())->doImport(); } }