e107_plugins/import/providers/phpbb3_import_class.php
<?php
/*
* e107 website system
*
* Copyright (C) 2008-2009 e107 Inc (e107.org)
* Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
*
*
*
* $Source: /cvs_backup/e107_0.8/e107_plugins/import/phpbb2_import_class.php,v $
* $Revision$
* $Date$
* $Author$
*/
require_once(__DIR__.'/../import_classes.php');
class phpbb3_import extends base_import_class
{
public $title = 'phpBB Version 3';
public $description = 'Import phpBB3 Users and Forums';
public $supported = array('users','forum','forumthread','forumpost','forumtrack');
public $mprefix = 'phpbb_';
public $sourceType = 'db';
var $catcount = 0; // Counts forum IDs
var $id_map = array(); // Map of PHPBB forum IDs ==> E107 forum IDs
private $forum_attachments = array();
private $forum_attachment_path = null;
private $forum_moderator_class = false;
var $helperClass; // forum class.
function init()
{
$formattach = trim($_POST['forum_attachment_path'],"/" );
$this->forum_attachment_path = vartrue($formattach, false);
if($data = e107::getDb('phpbb')->retrieve('userclass_classes','userclass_id',"userclass_name='FORUM_MODERATOR' "))
{
$this->forum_moderator_class = $data;
}
}
function config()
{
$frm = e107::getForm();
$var[0]['caption'] = "Path to phpBB3 Attachments folder (optional)";
$var[0]['html'] = $frm->text('forum_attachment_path',null,40,'size=xxlarge');
$var[0]['help'] = "Relative to the root folder of your e107 installation";
return $var;
}
function help()
{
return "some help text";
}
// Set up a query for the specified task.
// Returns TRUE on success. FALSE on error
// If $blank_user is true, certain cross-referencing user info is to be zeroed
function setupQuery($task, $blank_user=FALSE)
{
if ($this->ourDB == NULL) return FALSE;
switch ($task)
{
case 'users' :
$result = $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}users ORDER BY user_id ASC ");
if ($result === FALSE) return FALSE;
break;
case 'forum' :
$result = $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}forums");
if ($result === FALSE) return FALSE;
break;
case 'forumthread' :
$result = $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}topics");
if ($result === FALSE) return FALSE;
break;
case 'forumpost' :
if($this->ourDB->gen("SELECT * FROM {$this->DBPrefix}attachments"))
{
while($row = $this->ourDB->fetch())
{
$id = $row['post_msg_id'];
$key = $row['physical_filename'];
$this->forum_attachments[$id][$key] = $row['real_filename'];
}
}
$result = $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}posts");
if ($result === FALSE) return FALSE;
break;
case 'forumtrack' :
$result = $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}forums_track");
if ($result === FALSE) return FALSE;
break;
case 'news':
case 'polls' :
return FALSE;
break;
default :
return FALSE;
}
$this->copyUserInfo = true; // !$blank_user;
$this->currentTask = $task;
return TRUE;
}
/**
* Convert salted password to e107 style (they use the same basic coding)
*/
function convertPassword($password)
{
if ((substr($password ,0,3) == '$H$') && (strlen($password) == 34))
{
return substr_replace($password, '$E$',0,3);
}
else // Probably an old md5 password
{
return $password;
}
}
function convertBirthday($date)
{
$tp = e107::getParser();
if(trim($date) == '')
{
return;
}
list($d,$m,$y) = explode("-",$date);
return $tp->leadingZeros($y,4)."-".$tp->leadingZeros($m,2)."-".$tp->leadingZeros($d,2);
}
function convertUserclass($perm='')
{
if($perm == '')
{
return;
}
$conv = array(1 => e_UC_GUEST, 4 => e_UC_MODS, 6 => e_UC_BOTS, 7 => e_UC_NEWUSER);
if($this->forum_moderator_class !== false)
{
$conv[4] = $this->forum_moderator_class;
$conv[5] = $this->forum_moderator_class;
}
return vartrue($conv[$perm]) ? $conv[$perm] : "";
/*
* 1 GUESTS
2 REGISTERED
3 REGISTERED_COPPA
4 GLOBAL_MODERATORS
5 ADMINISTRATORS
6 BOTS
7 NEWLY_REGISTERED
*
*/
}
function convertUserBan($data)
{
if($data == 3) // founder in phpbb3, but 'bounced' in e107.
{
return;
}
else
{
return $data;
}
}
//------------------------------------
// Internal functions below here
//------------------------------------
/**
* Copy data read from the DB into the record to be returned.
* $target - e107_users table
* $source - phpbb_user table : https://wiki.phpbb.com/Table.phpbb_users
*/
function copyUserData(&$target, &$source)
{
// if ($this->copyUserInfo)
$target['user_id'] = $source['user_id'];
$target['user_name'] = $source['username'];
$target['user_loginname'] = $source['username'];
$target['user_password'] = $this->convertPassword($source['user_password']);
$target['user_email'] = $source['user_email'];
$target['user_signature'] = $this->convertText($source['user_sig']);
$target['user_image'] = $source['user_avatar'];
$target['user_hideemail'] = $source['user_allow_viewemail'];
$target['user_join'] = $source['user_regdate'];
$target['user_lastvisit'] = $source['user_lastvisit'];
$target['user_currentvisit'] = 0;
$target['user_admin'] = 0; // $source['user_level'];
$target['user_lastpost'] = $source['user_lastpost_time'];
$target['user_chats'] = '';
$target['user_comments'] = '';
$target['user_ip'] = $source['user_ip'];
$target['user_ban'] = $this->convertUserBan($source['user_type']);
$target['user_prefs'] = '';
$target['user_visits'] = '';
$target['user_admin'] = ($source['group_id'] == 5 || $source['user_type']==3) ? 1 : 0 ; //user_type == 3 is 'founder'
$target['user_login'] = '';
$target['user_class'] = $this->convertUserclass($source['group_id']);
$target['user_perms'] = ($source['user_type']==3) ? '0' : '';
$target['user_realm'] = '';
$target['user_pwchange'] = $source['user_passchg'];
$target['user_xup'] = '';
// Extended Fields.
$target['user_plugin_forum_viewed'] = 0;
$target['user_plugin_forum_posts'] = $source['user_posts'];
$target['user_timezone'] = $source['user_timezone']; // source is decimal(5,2)
$target['user_language'] = e107::getLanguage()->convert($source['user_lang']); // convert from 2-letter to full.
$target['user_location'] = $source['user_from'];
$target['user_icq'] = $source['user_icq'];
$target['user_aim'] = $source['user_aim'];
$target['user_yahoo'] = $source['user_yim'];
$target['user_msn'] = $source['user_msnm'];
$target['user_homepage'] = $source['user_website'];
$target['user_birthday'] = $this->convertBirthday($source['user_birthday']);
$target['user_occupation'] = $source['user_occ'];
$target['user_interests'] = $source['user_interests'];
return $target;
}
/**
* $target - e107_forum table
* $source - phpbb_forums table : https://wiki.phpbb.com/Table.phpbb_forums
*/
function copyForumData(&$target, &$source)
{
$target['forum_id'] = $source['forum_id'];
$target['forum_name'] = $source['forum_name'];
$target['forum_description'] = $source['forum_desc'];
$target['forum_parent'] = $source['parent_id'];
$target['forum_sub'] = "";
$target['forum_datestamp'] = time();
$target['forum_moderators'] = "";
$target['forum_threads'] = $source['forum_topics'];
$target['forum_replies'] = $source['forum_posts'];
$target['forum_lastpost_user'] = $source['forum_last_poster_id'];
$target['forum_lastpost_user_anon'] = $source['forum_last_poster_name'];
$target['forum_lastpost_info'] = $source['forum_last_post_time'];
// $target['forum_class'] = "";
// $target['forum_order']
// $target['forum_postclass']
// $target['forum_threadclass']
// $target['forum_options']
return $target;
}
/**
* $target - e107 forum_threads
* $source - phpbb_topics : https://wiki.phpbb.com/Table.phpbb_topics
*/
function copyForumThreadData(&$target, &$source)
{
$target['thread_id'] = $source['topic_id'];
$target['thread_name'] = $source['topic_title'];
$target['thread_forum_id'] = $source['forum_id'];
$target['thread_views'] = $source['topic_views'];
// $target['thread_active'] = $source['topic_status'];
$target['thread_lastpost'] = $source['topic_last_post_time'];
$target['thread_sticky'] = $source['topic_time_limit'];
$target['thread_datestamp'] = $source['topic_time'];
$target['thread_user'] = $source['topic_poster'];
$target['thread_user_anon'] = $source['topic_first_poster_name'];
$target['thread_lastuser'] = $source['topic_last_poster_id'];
$target['thread_lastuser_anon'] = $source['topic_last_poster_name'];
$target['thread_total_replies'] = $source['topic_replies'];
// $target['thread_options'] = $source['topic_'];
return $target;
}
/**
* $target - e107_forum_post table
* $source - phpbb_posts table : https://wiki.phpbb.com/Table.phpbb_posts
*/
function copyForumPostData(&$target, &$source)
{
$target['post_id'] = $source['post_id'];
$target['post_entry'] = $this->convertText($source['post_text']);
$target['post_thread'] = $source['topic_id'];
$target['post_forum'] = $source['forum_id'];
// $target['post_status'] = $source[''];
$target['post_datestamp'] = $source['post_time'];
$target['post_user'] = $source['poster_id'];
$target['post_edit_datestamp'] = $source['post_edit_time'];
$target['post_edit_user'] = $source['post_edit_user'];
$target['post_ip'] = $source['poster_ip'];
// $target['post_user_anon'] = $source[''];
$target['post_attachments'] = $this->convertAttachment($source);
// $target['post_options'] = $source[''];
return $target;
}
/**
* $target - e107_forum_track
* $source - phpbb_forums_track : https://wiki.phpbb.com/Table.phpbb_forums_track
*/
function copyForumTrackData(&$target, &$source)
{
$target['track_userid'] = $source['user_id'];
$target['track_thread'] = $source['forum_id'];
return $target;
}
function convertAttachment($row)
{
if($row['post_attachment'] != 1)
{
return;
}
$id = $row['post_id'];
if(isset($this->forum_attachments[$id]))
{
$attach = array();
$forum = $this->helperClass; // e107_plugins/forum/forum_class.php
if($folder = $forum->getAttachmentPath($row['poster_id'],true)) // get Path and create Folder if needed.
{
e107::getMessage()->addDebug("Created Attachment Folder: ".$folder );
}
else
{
e107::getMessage()->addError("Couldn't find/create attachment folder for user-id: ".$row['poster_id'] );
}
foreach($this->forum_attachments[$id] as $file => $name)
{
if(preg_match('#.JPG|.jpg|.gif|.png|.PNG|.GIF|.jpeg|.JPEG$#',$name))
{
$attach['img'][] = $file;
}
else
{
$attach['file'][] = $file;
}
if($this->forum_attachment_path) // if path entered - then move the files.
{
$oldpath = e_BASE.$this->forum_attachment_path."/".$file;
$newpath = $folder.$file;
if(rename($oldpath,$newpath))
{
e107::getMessage()->addDebug("Renamed file from <b>{$oldpath}</b> to <b>{$newpath}</b>" );
}
else
{
e107::getMessage()->addError("Couldn't rename file from <b>{$oldpath}</b> to <b>{$newpath}</b>" );
}
}
}
}
return e107::serialize($attach); // set attachments
}
function convertText($text)
{
$text = preg_replace('#<!-- s(\S*) --><img([^>]*)><!-- s(\S*) -->#','$1',$text); // Smilies to text
$text = preg_replace('#\[img:([^\]]*)]([^\[]*)\[/img:([^\]]*)]#', '[img]$2[/img]', $text); // Image Bbcodes.
$text = preg_replace('#<!-- m --><a class="postlink" href="([^>]*)">([^<]*)</a><!-- m -->#','[link=$1]$2[/link]',$text); // links
$text = preg_replace('#<!-- w --><a class="postlink" href="([^>]*)">([^<]*)</a><!-- w -->#','[link=$1]$2[/link]',$text); // links
$text = preg_replace('#\[attachment([^\]]*)]([^\[]*)\[/attachment:([^\]]*)]#','',$text);
if(preg_match('#\[/url:([^\]]*)]#',$text, $match)) // strip bbcode hash.
{
$hash = $match[1];
$text = str_replace($hash,'',$text);
}
$text = html_entity_decode($text,ENT_NOQUOTES,'UTF-8');
$detected = mb_detect_encoding($text); // 'ISO-8859-1'
$text = iconv($detected,'UTF-8',$text);
return $text;
}
// ---------------------------------------------- OLD ---------------------------------
function convertForumParent(&$target, &$source)
{
$this->catcount++;
$this->id_map[$source['cat_id']] = $this->catcount;
$target['forum_id'] = $this->catcount; // Create new IDs for parent forums
$target['forum_name'] = $source['cat_title'];
$target['forum_order'] = $source['cat_order'];
$target['forum_description'] = $source['cat_desc'];
$target['forum_moderators'] = e_UC_ADMIN;
// $target['forum_'] = $source[''];
// $target['forum_'] = $source[''];
}
/**
* $target - e107 table
* $source - phpbb3 table
*/
function convertForum(&$target, &$source, $catid)
{
$this->catcount++;
$this->id_map[$source['forum_id']] = $this->catcount;
$target['forum_id'] = $this->catcount;
$target['forum_parent'] = $this->id_map[$source['cat_id']]; // Map to the new E107 ID, rather than directly use the one from the DB
$target['forum_name'] = $source['forum_name'];
$target['forum_description'] = $source['forum_desc'];
$target['forum_order'] = $source['forum_order'];
$target['forum_threads'] = $source['forum_topics'];
$target['forum_replies'] = $source['forum_posts'];
$target['forum_moderators'] = e_UC_ADMIN;
// $target['forum_'] = $source[''];
}
}
/*
e107
thread_id
thread_name
thread_forum_id
thread_views
thread_active
thread_lastpost
thread_sticky
thread_datestamp
thread_user
thread_user_anon
thread_lastuser
thread_lastuser_anon
thread_total_replies
thread_options
*/