From 230e9cefb76bfce4bbdfe155429b03704c98ca83 Mon Sep 17 00:00:00 2001 From: Cameron Date: Tue, 16 Apr 2013 16:00:13 -0700 Subject: [PATCH] phpBB3 Users and Forum import. --- e107_plugins/import/admin_import.php | 48 +- e107_plugins/import/import_classes.php | 194 +++--- e107_plugins/import/import_user_class.php | 310 ++++++---- .../import/providers/phpbb2_import_class.php | 2 +- .../import/providers/phpbb3_import_class.php | 580 ++++++++++++++++++ 5 files changed, 906 insertions(+), 228 deletions(-) create mode 100644 e107_plugins/import/providers/phpbb3_import_class.php diff --git a/e107_plugins/import/admin_import.php b/e107_plugins/import/admin_import.php index 327caa214..fd276e5e4 100644 --- a/e107_plugins/import/admin_import.php +++ b/e107_plugins/import/admin_import.php @@ -30,7 +30,7 @@ Options supported: */ - define('IMPORT_DEBUG',FALSE); + define('IMPORT_DEBUG',TRUE); // define('IMPORT_DEBUG',TRUE); require_once("../../class2.php"); @@ -91,15 +91,20 @@ class import_main_ui extends e_admin_ui protected $deleteExisting = false; // delete content from existing table during import. protected $selectedTables = array(); // User selection of what tables to import. eg. news, pages etc. protected $importClass = null; - + protected $checked_class_list = ''; // Definitions of available areas to import protected $importTables = array( - 'users' => array('message' => LAN_CONVERT_25, 'classfile' => 'import_user_class.php', 'classname' => 'user_import'), - 'news' => array('message' => LAN_CONVERT_28, 'classfile' => 'import_news_class.php', 'classname' => 'news_import'), - 'page' => array('message' => "Pages", 'classfile' => 'import_page_class.php', 'classname' => 'page_import'), - 'links' => array('message' => "Links", 'classfile' => 'import_links_class.php', 'classname' => 'links_import'), - 'media' => array('message' => "Media", 'classfile' => 'import_media_class.php', 'classname' => 'media_import'), + 'users' => array('message' => LAN_CONVERT_25, 'classfile' => 'import_user_class.php', 'classname' => 'user_import'), + 'news' => array('message' => LAN_CONVERT_28, 'classfile' => 'import_news_class.php', 'classname' => 'news_import'), + 'page' => array('message' => "Pages", 'classfile' => 'import_page_class.php', 'classname' => 'page_import'), + 'links' => array('message' => "Links", 'classfile' => 'import_links_class.php', 'classname' => 'links_import'), + 'media' => array('message' => "Media", 'classfile' => 'import_media_class.php', 'classname' => 'media_import'), + 'forum' => array('message' => "Forum", 'classfile' => 'import_forum_class.php', 'classname' => 'forum_import'), + 'forumthread' => array('message' => "Forum Topics/Threads", 'classfile' => 'import_forum_class.php', 'classname' => 'forumthread_import', 'nolist'=>true), + 'forumpost' => array('message' => "Forum Posts", 'classfile' => 'import_forum_class.php', 'classname' => 'forumpost_import', 'nolist'=>true), + 'forumtrack' => array('message' => "Forum Track", 'classfile' => 'import_forum_class.php', 'classname' => 'forumtrack_import', 'nolist'=>true), + // 'forumpost' => array('message' => "Media", 'classfile' => 'import_media_class.php', 'classname' => 'media_import'), 'comments' => array('message'=> "Comments"), // 'forumdefs' => array('message' => LAN_CONVERT_26), // 'forumposts' => array('message' => LAN_CONVERT_48), @@ -167,6 +172,11 @@ class import_main_ui extends e_admin_ui $this->deleteExisting = varset($_POST['import_delete_existing_data'],0); + if(varset($_POST['classes_select'])) + { + $this->checked_class_list = implode(',',$_POST['classes_select']); + } + if($_POST['selectedTables']) { $this->selectedTables = $_POST['selectedTables']; @@ -198,7 +208,7 @@ class import_main_ui extends e_admin_ui $mes = e107::getMessage(); $frm = e107::getForm(); - + $tableCount = 0; // $mes->addDebug(print_a($this->providers,true)); $text = " @@ -218,9 +228,11 @@ class import_main_ui extends e_admin_ui ".LAN_CONVERT_06.""; - foreach($this->importTables as $name) // 1 column for each of users, news, forum etc. + foreach($this->importTables as $val) // 1 column for each of users, news, forum etc. { - $text .= "".$name['message'].""; + if(vartrue($val['nolist'])){ continue; } + $text .= "".$val['message'].""; + $tableCount++; } $text.=" @@ -234,7 +246,7 @@ class import_main_ui extends e_admin_ui CSV ".ADMIN_TRUE_ICON.""; - for ($i=0; $i < count($this->importTables)-1; $i++) + for ($i=0; $i < $tableCount-1; $i++) { $text .= " "; } @@ -257,6 +269,7 @@ class import_main_ui extends e_admin_ui foreach($this->importTables as $key=>$val) { + if(vartrue($val['nolist'])){ continue; } $text .= "".(in_array($key,$info['supported']) ? ADMIN_TRUE_ICON : " ")."\n"; } @@ -453,7 +466,10 @@ class import_main_ui extends e_admin_ui $importType ".LAN_CONVERT_20." - + + +
Must be different from the one e107 uses.
+ $importType ".LAN_CONVERT_21." @@ -648,8 +664,9 @@ class import_main_ui extends e_admin_ui if($k == 'users') // Do any type-specific default setting { - $exporter->overrideDefault('user_class', $checked_class_list); - break; + $mes->addDebug("dbImport(): Overriding Default for user_class: ".$this->checked_class_list); + $exporter->overrideDefault('user_class', $this->checked_class_list); + // break; } if ($this->deleteExisting) @@ -694,7 +711,7 @@ class import_main_ui extends e_admin_ui /// - old BELOW ---------------------------------------- - + /* foreach ($this->importTables as $k => $v) { if (isset($this->selectedTables[$k])) @@ -775,6 +792,7 @@ class import_main_ui extends e_admin_ui } } + */ // $msg = LAN_CONVERT_29; return true; diff --git a/e107_plugins/import/import_classes.php b/e107_plugins/import/import_classes.php index b1b5346f8..f4d0b063c 100644 --- a/e107_plugins/import/import_classes.php +++ b/e107_plugins/import/import_classes.php @@ -79,13 +79,21 @@ class base_import_class return $this->saveMediaData($dataRecord); break; - case 'forumdefs' : + case 'forum' : return $this->saveForumData($dataRecord); break; - case 'forumposts' : - return $this->savePostData($dataRecord); + case 'forumthread' : + return $this->saveForumThreadData($dataRecord); + break; + + case 'forumpost' : + return $this->saveForumPostData($dataRecord); break; + + case 'forumtrack' : + return $this->saveForumTrackData($dataRecord); + break; case 'polls' : break; @@ -134,10 +142,20 @@ class base_import_class return $this->copyMediaData($initial, $result); break; - case 'forumdefs' : + case 'forum' : + return $this->copyForumData($initial, $result); break; + + case 'forumthread' : + return $this->copyForumThreadData($initial, $result); + break; - case 'forumposts' : + case 'forumpost' : + return $this->copyForumPostData($initial, $result); + break; + + case 'forumtrack' : + return $this->copyForumTrackData($initial, $result); break; case 'polls' : @@ -189,85 +207,105 @@ class base_import_class { return $target; } -} - - -//=========================================================== -// UTILITY ROUTINES -//=========================================================== - -// Process all bbcodes in the passed value; return the processed string. -// Works recursively -// Start by assembling matched pairs. Then map and otherwise process as required. -// Divide the value into five bits: -// Preamble - up to the identified bbcode (won't contain bbcode) -// BBCode start code -// Inner - text between the two bbcodes (may contain another bbcode) -// BBCode end code -// Trailer - remaining unprocessed text (may contain more bbcodes) -// (Note: preg_split might seem obvious, but doesn't pick out the actual codes -function proc_bb($value, $options = "", $maptable = null) -{ - $bblower = (strpos($options,'bblower') !== FALSE) ? TRUE : FALSE; // Convert bbcode to lower case - $bbphpbb = (strpos($options,'phpbb') !== FALSE) ? TRUE : FALSE; // Strip values as phpbb - $nextchar = 0; - $loopcount = 0; - - while ($nextchar < strlen($value)) - { - $firstbit = ''; - $middlebit = ''; - $lastbit = ''; - $loopcount++; - if ($loopcount > 10) return 'Max depth exceeded'; - unset($bbword); - $firstcode = strpos($value,'[',$nextchar); - if ($firstcode === FALSE) return $value; // Done if no square brackets - $firstend = strpos($value,']',$firstcode); - if ($firstend === FALSE) return $value; // Done if no closing bracket - $bbword = substr($value,$firstcode+1,$firstend - $firstcode - 1); // May need to process this more if parameter follows - $bbparam = ''; - $temp = strpos($bbword,'='); - if ($temp !== FALSE) + + function copyForumData(&$target, &$source) { - $bbparam = substr($bbword,$temp); - $bbword = substr($bbword,0,-strlen($bbparam)); + return $target; } - if (($bbword) && ($bbword == trim($bbword))) - { - $laststart = strpos($value,'[/'.$bbword,$firstend); // Find matching end - $lastend = strpos($value,']',$laststart); - if (($laststart === FALSE) || ($lastend === FALSE)) - { // No matching end character - $nextchar = $firstend; // Just move scan pointer along - } - else - { // Got a valid bbcode pair here + + function copyForumPostData(&$target, &$source) + { + return $target; + } + + function copyForumThreadData(&$target, &$source) + { + return $target; + } + + function copyForumTrackData(&$target, &$source) + { + return $target; + } + + + + //=========================================================== + // UTILITY ROUTINES + //=========================================================== + + // Process all bbcodes in the passed value; return the processed string. + // Works recursively + // Start by assembling matched pairs. Then map and otherwise process as required. + // Divide the value into five bits: + // Preamble - up to the identified bbcode (won't contain bbcode) + // BBCode start code + // Inner - text between the two bbcodes (may contain another bbcode) + // BBCode end code + // Trailer - remaining unprocessed text (may contain more bbcodes) + // (Note: preg_split might seem obvious, but doesn't pick out the actual codes + function proc_bb($value, $options = "", $maptable = null) + { + $bblower = (strpos($options,'bblower') !== FALSE) ? TRUE : FALSE; // Convert bbcode to lower case + $bbphpbb = (strpos($options,'phpbb') !== FALSE) ? TRUE : FALSE; // Strip values as phpbb + $nextchar = 0; + $loopcount = 0; + + while ($nextchar < strlen($value)) + { $firstbit = ''; - if ($firstcode > 0) $firstbit = substr($value,0,$firstcode); - $middlebit = substr($value,$firstend+1,$laststart - $firstend-1); - $lastbit = substr($value,$lastend+1,strlen($value) - $lastend); - // Process bbcodes here - if ($bblower) $bbword = strtolower($bbword); - if ($bbphpbb && (strpos($bbword,':') !== FALSE)) $bbword = substr($bbword,0,strpos($bbword,':')); - if ($maptable) - { // Do mapping - if (array_key_exists($bbword,$maptable)) $bbword = $maptable[$bbword]; + $middlebit = ''; + $lastbit = ''; + $loopcount++; + if ($loopcount > 10) return 'Max depth exceeded'; + unset($bbword); + $firstcode = strpos($value,'[',$nextchar); + if ($firstcode === FALSE) return $value; // Done if no square brackets + $firstend = strpos($value,']',$firstcode); + if ($firstend === FALSE) return $value; // Done if no closing bracket + $bbword = substr($value,$firstcode+1,$firstend - $firstcode - 1); // May need to process this more if parameter follows + $bbparam = ''; + $temp = strpos($bbword,'='); + if ($temp !== FALSE) + { + $bbparam = substr($bbword,$temp); + $bbword = substr($bbword,0,-strlen($bbparam)); } - $bbbegin = '['.$bbword.$bbparam.']'; - $bbend = '[/'.$bbword.']'; - return $firstbit.$bbbegin.proc_bb($middlebit,$options,$maptable).$bbend.proc_bb($lastbit,$options,$maptable); - } - } - else - { - $nextchar = $firstend+1; + if (($bbword) && ($bbword == trim($bbword))) + { + $laststart = strpos($value,'[/'.$bbword,$firstend); // Find matching end + $lastend = strpos($value,']',$laststart); + if (($laststart === FALSE) || ($lastend === FALSE)) + { // No matching end character + $nextchar = $firstend; // Just move scan pointer along + } + else + { // Got a valid bbcode pair here + $firstbit = ''; + if ($firstcode > 0) $firstbit = substr($value,0,$firstcode); + $middlebit = substr($value,$firstend+1,$laststart - $firstend-1); + $lastbit = substr($value,$lastend+1,strlen($value) - $lastend); + // Process bbcodes here + if ($bblower) $bbword = strtolower($bbword); + if ($bbphpbb && (strpos($bbword,':') !== FALSE)) $bbword = substr($bbword,0,strpos($bbword,':')); + if ($maptable) + { // Do mapping + if (array_key_exists($bbword,$maptable)) $bbword = $maptable[$bbword]; + } + $bbbegin = '['.$bbword.$bbparam.']'; + $bbend = '[/'.$bbword.']'; + return $firstbit.$bbbegin.$this->proc_bb($middlebit,$options,$maptable).$bbend.$this->proc_bb($lastbit,$options,$maptable); + } + } + else + { + $nextchar = $firstend+1; + } + } //endwhile; + } - } //endwhile; - + } - - ?> diff --git a/e107_plugins/import/import_user_class.php b/e107_plugins/import/import_user_class.php index 037083f24..353f07109 100644 --- a/e107_plugins/import/import_user_class.php +++ b/e107_plugins/import/import_user_class.php @@ -30,48 +30,48 @@ To use: class user_import { - var $userDB = NULL; - var $blockMainAdmin = TRUE; - var $error; + var $userDB = NULL; + var $blockMainAdmin = TRUE; + var $error; // Every field must be in exactly one of the arrays $userDefaults, $userSpecial, $userMandatory - var $userDefaults = array( - 'user_id' => 0, - 'user_customtitle' => '', - 'user_sess' => '', // Photo - 'user_email' => '', - 'user_signature' => '', - 'user_image' => '', // Avatar - 'user_hideemail' => 1, - 'user_lastvisit' => 0, - 'user_currentvisit' => 0, - 'user_lastpost' => 0, - 'user_chats' => 0, - 'user_comments' => 0, - 'user_ip' => '', - 'user_ban' => 0, - 'user_prefs' => '', - // 'user_viewed' => '', - 'user_visits' => 0, - 'user_admin' => 0, - 'user_login' => '', // User real name - 'user_class' => '', - 'user_perms' => '', - 'user_xup' => '' - ); + var $userDefaults = array( + 'user_id' => 0, + 'user_customtitle' => '', + 'user_sess' => '', // Photo + 'user_email' => '', + 'user_signature' => '', + 'user_image' => '', // Avatar + 'user_hideemail' => 1, + 'user_lastvisit' => 0, + 'user_currentvisit' => 0, + 'user_lastpost' => 0, + 'user_chats' => 0, + 'user_comments' => 0, + 'user_ip' => '', + 'user_ban' => 0, + 'user_prefs' => '', + // 'user_viewed' => '', + 'user_visits' => 0, + 'user_admin' => 0, + 'user_login' => '', // User real name + 'user_class' => '', + 'user_perms' => '', + 'user_xup' => '' + ); // Fields which are defaulted at save-time if not previously set - var $userSpecial = array('user_join', 'user_realm', 'user_pwchange'); + var $userSpecial = array('user_join', 'user_realm', 'user_pwchange'); // Fields which must be set up by the caller. - var $userMandatory = array( - 'user_name', 'user_loginname', 'user_password' - ); + var $userMandatory = array( + 'user_name', 'user_loginname', 'user_password' + ); // Predefined fields which may appear in the extended user fields - var $userExtended = array( + var $userExtended = array( 'user_language', 'user_country', 'user_location', @@ -81,136 +81,178 @@ class user_import 'user_msn', 'user_homepage', 'user_birthday', - 'user_timezone' + 'user_timezone', + 'user_plugin_forum_posts' ); - // Array is set up with those predefined extended fields which are actually in use - var $actualExtended = array(); + // Array is set up with those predefined extended fields which are actually in use + var $actualExtended = array(); // Constructor - function user_import() - { - global $sql; - $this->userDB = new db; // Have our own database object to write to the user table - - // Create list of predefined extended user fields which are present - if($ret = getcachedvars("userdata_{$uid}")) + function user_import() { - foreach ($this->userExtended as $v) - { - if (isset($ret[$v])) $this->actualExtended[] = $v; - } + global $sql; + $this->userDB = new db; // Have our own database object to write to the user table + + // Create list of predefined extended user fields which are present + if($ret = getcachedvars("userdata_{$uid}")) + { + foreach ($this->userExtended as $v) + { + if (isset($ret[$v])) $this->actualExtended[] = $v; + } + } } - } // Empty the user DB - by default leaving only the main admin. - function emptyTargetDB($inc_admin = FALSE) - { - $delClause = ''; - if ($inc_admin === TRUE) + function emptyTargetDB($inc_admin = FALSE) { - $this->blockMainAdmin = FALSE; + $delClause = ''; + if ($inc_admin === TRUE) + { + $this->blockMainAdmin = FALSE; + } + else + { + $this->blockMainAdmin = TRUE; + $delClause = 'user_id != 1'; + } + $this->userDB->delete('user',$delClause); + $this->userDB->delete('user_extended',$delClause); } - else - { - $this->blockMainAdmin = TRUE; - $delClause = 'user_id != 1'; - } - $this->userDB->db_Delete('user',$delClause); - $this->userDB->db_Delete('user_extended',$delClause); - } // Set a new default for a particular field - function overrideDefault($key, $value) - { -// echo "Override: {$key} => {$value}
"; - if (!isset($this->userDefaults[$key])) return FALSE; - $this->userDefaults[$key] = $value; - } + function overrideDefault($key, $value) + { + // echo "Override: {$key} => {$value}
"; + if (!isset($this->userDefaults[$key])) return FALSE; + $this->userDefaults[$key] = $value; + } // Returns an array with all relevant fields set to the current default - function getDefaults() - { - return $this->userDefaults; - } - - - // Vet a user or login name. If OK, always returns the name. - // On error, if $just_strip true, returns 'processed' name; otherwise returns FALSE - function vetUserName($name, $just_strip = FALSE) - { - $temp_name = trim(preg_replace('/ |\#|\=|\$/', "", strip_tags($name))); - if (($temp_name == $name) || $just_strip) return $temp_name; - return FALSE; - } - - - // Add a user record to the DB - pass array as parameter. - // Returns an error code on failure. TRUE on success - function saveData($userRecord) - { - if ($this->blockMainAdmin && isset($userRecord['user_id']) && ($userRecord['user_id'] == 1)) return 1; - $extendedFields = array(); - foreach ($userRecord as $k => $v) + function getDefaults() { - if (in_array($k,$this->userExtended)) - { - if (in_array($k,$this->actualExtended)) $extendedFields[$k] = $v; // Pull out any extended field values which are needed - unset($userRecord[$k]); // And always delete from the original data record - } + return $this->userDefaults; } - foreach ($userRecord as $k => $v) - { // Check only valid fields being passed - if (!array_key_exists($k,$this->userDefaults) && !in_array($k,$this->userSpecial) && !in_array($k,$this->userMandatory) ) // + + + // Vet a user or login name. If OK, always returns the name. + // On error, if $just_strip true, returns 'processed' name; otherwise returns FALSE + function vetUserName($name, $just_strip = FALSE) + { + $temp_name = trim(preg_replace('/ |\#|\=|\$/', "", strip_tags($name))); + if (($temp_name == $name) || $just_strip) return $temp_name; + return FALSE; + } + + + // Add a user record to the DB - pass array as parameter. + // Returns an error code on failure. TRUE on success + function saveData($userRecord) + { + if ($this->blockMainAdmin && isset($userRecord['user_id']) && ($userRecord['user_id'] == 1)) { - echo "Failed on {$k} => {$v}
"; - return 2; + e107::getMessage()->addDebug("Skipping user record of main-admin"); + return true; + // return 1; } - } - // Check user names for invalid characters - $userRecord['user_name'] = $this->vetUserName($userRecord['user_name'],FALSE); - $userRecord['user_loginname'] = $this->vetUserName($userRecord['user_loginname'],FALSE); - if (($userRecord['user_name'] === FALSE) || ($userRecord['user_name'] === FALSE)) return 5; + + $extendedFields = array(); + + foreach ($userRecord as $k => $v) + { + if (in_array($k,$this->userExtended)) + { + if (in_array($k,$this->actualExtended)) + { + $extendedFields[$k] = $v; // Pull out any extended field values which are needed + } + + unset($userRecord[$k]); // And always delete from the original data record + } + } + + foreach ($userRecord as $k => $v) // Check only valid fields being passed + { + if (!array_key_exists($k,$this->userDefaults) && !in_array($k,$this->userSpecial) && !in_array($k,$this->userMandatory) ) // + { + e107::getMessage()->addDebug("Failed on {$k} => {$v} "); + return 2; + } + } + // Check user names for invalid characters + $userRecord['user_name'] = $this->vetUserName($userRecord['user_name'],FALSE); + $userRecord['user_loginname'] = $this->vetUserName($userRecord['user_loginname'],FALSE); + + if (($userRecord['user_name'] === FALSE) || ($userRecord['user_name'] === FALSE)) + { + e107::getMessage()->addDebug("user_name was empty"); + return 5; + } + + if (trim($userRecord['user_name']) == '') $userRecord['user_name'] = trim($userRecord['user_loginname']); + if (trim($userRecord['user_loginname']) == '') $userRecord['user_loginname'] = trim($userRecord['user_name']); + + foreach ($this->userMandatory as $k) + { + if (!isset($userRecord[$k])) + { + e107::getMessage()->addDebug("Failed userMandatory on {$k}"); + return 3; + } + + if (strlen($userRecord[$k]) < 3) + { + // e107::getMessage()->addDebug("Failed userMandatory length on {$k}"); + // return 3; + } + } + + if (!isset($userRecord['user_join'])) $userRecord['user_join'] = time(); + + $userRecord['user_realm'] = ''; // Never carry across these fields + $userRecord['user_pwchange'] = 0; - if (trim($userRecord['user_name']) == '') $userRecord['user_name'] = trim($userRecord['user_loginname']); - if (trim($userRecord['user_loginname']) == '') $userRecord['user_loginname'] = trim($userRecord['user_name']); - foreach ($this->userMandatory as $k) - { - if (!isset($userRecord[$k])) return 3; - if (strlen($userRecord[$k]) < 3) return 3; - } - if (!isset($userRecord['user_join'])) $userRecord['user_join'] = time(); - $userRecord['user_realm'] = ''; // Never carry across these fields - $userRecord['user_pwchange'] = 0; + if(!$result = $this->userDB->replace('user',$userRecord)) + { + return 4; + } + + if (count($extendedFields)) + { + $extendedFields['user_extended_id'] = varset($userRecord['user_id'],0) ? $userRecord['user_id'] : $result; + + if($this->userDB->insert('user_extended',$extendedFields) === false) + { + e107::getMessage()->addDebug("Failed to insert extended fields: ".print_a($extendedFields)); + return 6; + } - if(!$result = $this->userDB->db_Insert('user',$userRecord)) - { - return 4; + } + return TRUE; } - - if (count($extendedFields)) - { - $extendedFields['user_extended_id'] = varset($userRecord['user_id'],0) ? $userRecord['user_id'] : $result; - $result = $this->userDB->db_Insert('user_extended',$extendedFields); - if ($result === FALSE) return 6; - } - return TRUE; - } - function getErrorText($errnum) // these errors are presumptuous and misleading. especially '4' . - { - $errorTexts = array(0 => 'No error', 1 => 'Can\'t change main admin data', 2 => 'invalid field passed', - 3 => 'Mandatory field not set', 4 => 'User already exists', 5 => 'Invalid characters in user or login name', - 6 => 'Error saving extended user fields'); - if (isset($errorTexts[$errnum])) return $errorTexts[$errnum]; - return 'Unknown: '.$errnum; - } + function getErrorText($errnum) // these errors are presumptuous and misleading. especially '4' . + { + $errorTexts = array( + 0 => 'No error', + 1 => 'Can\'t change main admin data', + 2 => 'invalid field passed', + 3 => 'Mandatory field not set', + 4 => 'User already exists', + 5 => 'Invalid characters in user or login name', + 6 => 'Error saving extended user fields' + ); + + if (isset($errorTexts[$errnum])) return $errorTexts[$errnum]; + return 'Unknown: '.$errnum; + } } diff --git a/e107_plugins/import/providers/phpbb2_import_class.php b/e107_plugins/import/providers/phpbb2_import_class.php index 83ce8a2b1..263437766 100644 --- a/e107_plugins/import/providers/phpbb2_import_class.php +++ b/e107_plugins/import/providers/phpbb2_import_class.php @@ -35,7 +35,7 @@ require_once('import_classes.php'); class phpbb2_import extends base_import_class { - public $title = 'PHPBB Version 2/3'; + public $title = 'PHPBB Version 2'; public $description = 'Should do most versions, and Dragonfly'; public $supported = array('users'); public $mprefix = 'phpbb_'; diff --git a/e107_plugins/import/providers/phpbb3_import_class.php b/e107_plugins/import/providers/phpbb3_import_class.php new file mode 100644 index 000000000..7b1dad2d4 --- /dev/null +++ b/e107_plugins/import/providers/phpbb3_import_class.php @@ -0,0 +1,580 @@ + E107 forum IDs + + + // 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 "); + 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' : + $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 'polls' : + return FALSE; + break; + + case 'news' : + return FALSE; + break; + + + default : + return FALSE; + } + + $this->copyUserInfo = true; // !$blank_user; + $this->currentTask = $task; + return TRUE; + } + + + + //------------------------------------ + // 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']; + + if ((substr($source['user_password'],0,3) == '$H$') && (strlen($source['user_password']) == 34)) // Convert salted password to E107 style (they use the same basic coding) + { + $target['user_password'] = substr_replace($source['user_password'], '$E$',0,3); + } + else // Probably an old md5 password + { + $target['user_password'] = $source['user_password']; + } + + $target['user_email'] = $source['user_email']; + $target['user_signature'] = $this->proc_bb($source['user_sig'],'phpbb,bblower'); + $target['user_hideemail'] = $source['user_allow_viewemail']; + $target['user_join'] = $source['user_regdate']; + // $target['user_forums'] = $source['user_posts']; + $target['user_admin'] = 0; // $source['user_level']; + $target['user_lastvisit'] = $source['user_lastvisit']; + $target['user_ban'] = $source['user_type']; + + switch ($source['user_avatar_type']) + { + default: + $target['user_image'] = $source['user_avatar']; + } + + // $target['user_plugin_forum_viewed']; + $target['user_plugin_forum_posts'] = $source['user_posts']; + + $target['user_timezone'] = $source['user_timezone']; // source is decimal(5,2) + $target['user_language'] = $source['user_lang']; // May need conversion + $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_'] = $source['']; + // $target[] = $source['user_active]; // PHPBB2 + // $target['user_lastpost'] = $source['user_lastpost_time']; // PHPBB3 + 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'] = ""; + $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_id']; + $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['']; + $target['post_entry'] = $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'] = $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; + } + + + + + + + + + + + + + + + + + + + + + +// ---------------------------------------------- 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 + * + +/* +Historical info for conversion below here + +function convertParents($catid) +{ + $parentArray = array( + array("srcdata" => "cat_id", "e107" => "forum_id", "type" => "INT", "value" => $catid), + array("srcdata" => "cat_title", "e107" => "forum_name", "type" => "STRING"), + array("srcdata" => "cat_order", "e107" => "forum_order", "type" => "INT"), + array("srcdata" => "cat_desc", "e107" => "forum_description", "type" => "STRING"), + array("srcdata" => "null", "e107" => "forum_moderators", "type" => "INT", "value" => 254) + ); + return $parentArray; +} + +function convertForums($catid) +{ + $forumArray = array( + array("srcdata" => "forum_id", "e107" => "forum_id", "type" => "INT"), + array("srcdata" => "cat_id", "e107" => "forum_parent", "type" => "STRING", "value" => $catid), + array("srcdata" => "forum_name", "e107" => "forum_name", "type" => "STRING"), + array("srcdata" => "forum_desc", "e107" => "forum_description", "type" => "STRING"), + array("srcdata" => "forum_order", "e107" => "forum_order", "type" => "INT"), + array("srcdata" => "forum_topics", "e107" => "forum_threads", "type" => "INT"), + array("srcdata" => "forum_posts", "e107" => "forum_replies", "type" => "INT"), + array("srcdata" => "null", "e107" => "forum_moderators", "type" => "INT", "value" => 254) + ); + return $forumArray; +} + + +//function convertTopics($poster) +function convertTopics() +{ + $topicArray = array( + array("srcdata" => "forum_id", "e107" => "thread_forum_id", "type" => "INT"), + array("srcdata" => "topic_title", "e107" => "thread_name", "type" => "STRING"), + array("srcdata" => "post_text", "e107" => "thread_thread", "type" => "STRING", "default" => "", "sproc" => "usebb,phpbb,bblower"), + array("srcdata" => "topic_poster", "e107" => "thread_user", "type" => "STRING"), + array("srcdata" => "null", "e107" => "thread_active", "type" => "INT", "value" => 1), + array("srcdata" => "topic_time", "e107" => "thread_datestamp", "type" => "INT"), + array("srcdata" => "topic_views", "e107" => "thread_views", "type" => "INT"), + array("srcdata" => "topic_replies", "e107" => "thread_total_replies", "type" => "INT"), + array("srcdata" => "null", "e107" => "thread_parent", "type" => "INT", "value" => 0), + ); + return $topicArray; +} + + + + +function convertForumPosts($parent_id, $poster) +{ + $postArray = array( + array("srcdata" => "post_text", "e107" => "thread_thread", "type" => "STRING", "default" => "", "sproc" => "usebb,phpbb,bblower"), + array("srcdata" => "forum_id", "e107" => "thread_forum_id", "type" => "INT"), + array("srcdata" => "post_time", "e107" => "thread_datestamp", "type" => "INT"), + array("srcdata" => "topic_views", "e107" => "thread_views", "type" => "INT"), + array("srcdata" => "post_time", "e107" => "thread_lastpost", "type" => "INT"), + array("srcdata" => "poster_id", "e107" => "thread_user", "type" => "STRING"), + array("srcdata" => "post_subject", "e107" => "thread_name", "type" => "STRING"), + array("srcdata" => "null", "e107" => "thread_parent", "type" => "INT", "value" => $parent_id), + ); + return $postArray; +} + + +/* +-- -------------------------------------------------------- +PHPBB uses three tables to record a poll. Looks wildly different to E107! +-- +-- Table structure for table `_phpbb_vote_desc` +CREATE TABLE `_phpbb_vote_desc` ( + `vote_id` mediumint(8) unsigned NOT NULL auto_increment, + `topic_id` mediumint(8) unsigned NOT NULL default '0', + `vote_text` text NOT NULL, + `vote_start` int(11) NOT NULL default '0', + `vote_length` int(11) NOT NULL default '0', + PRIMARY KEY (`vote_id`), + KEY `topic_id` (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ; + + +-- +-- Table structure for table `_phpbb_vote_results` +CREATE TABLE `_phpbb_vote_results` ( + `vote_id` mediumint(8) unsigned NOT NULL default '0', + `vote_option_id` tinyint(4) unsigned NOT NULL default '0', + `vote_option_text` varchar(255) NOT NULL default '', + `vote_result` int(11) NOT NULL default '0', + KEY `vote_option_id` (`vote_option_id`), + KEY `vote_id` (`vote_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + + +-- +-- Table structure for table `_phpbb_vote_voters` +CREATE TABLE `_phpbb_vote_voters` ( + `vote_id` mediumint(8) unsigned NOT NULL default '0', + `vote_user_id` mediumint(8) NOT NULL default '0', + `vote_user_ip` char(8) NOT NULL default '', + KEY `vote_id` (`vote_id`), + KEY `vote_user_id` (`vote_user_id`), + KEY `vote_user_ip` (`vote_user_ip`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +*/ + + +/* + +//----------------------------------------------------------- +// ### get phpbb categories and insert them as forum parents +//----------------------------------------------------------- + +mysql_query("TRUNCATE TABLE {$mySQLprefix}forum", $e107Connection); + + +$phpbb_res = mysql_query("SELECT * FROM {$phpbb2Prefix}categories", $phpbbConnection); +if(!$phpbb_res) +{ + goError("Error! Unable to access ".$phpbb2Prefix."categories table."); +} + +$catcount = 500; +while($parent = mysql_fetch_array($phpbb_res)) +{ + + $parentArray = convertParents($catcount); + + $query = createQuery($parentArray, $parent, $mySQLprefix."forum"); + echo (mysql_query($query, $e107Connection) ? "Successfully inserted parent: ".$parent['cat_id'].": ".$parent['cat_title'] : "Unable to insert parent: ".$parent['cat_id'].": ".$parent['cat_title']."
".mysql_errno() . ": " . mysql_error())."
"; + flush(); + + $phpbb_res2 = mysql_query("SELECT * FROM {$phpbb2Prefix}forums WHERE cat_id = ".$parent['cat_id'], $phpbbConnection); + if($phpbb_res2) + { + while($forum = mysql_fetch_array($phpbb_res2)) + { + $forumArray = convertForums($catcount); + $query = createQuery($forumArray, $forum, $mySQLprefix."forum"); + echo (mysql_query($query, $e107Connection) ? "Successfully inserted forum: ".$parent['cat_id'].": ".$parent['cat_title'] : "Unable to insert forum: ".$parent['cat_id'].": ".$parent['cat_title']."
".mysql_errno() . ": " . mysql_error())."
"; + flush(); + } + } + else + { + echo "Didn't find any forums for parent '".$parent['cat_title']."'
"; + } + $catcount ++; +} + + +//------------------------------------------------------ +// Read in forum topics +//------------------------------------------------------ + +mysql_query("TRUNCATE TABLE {$mySQLprefix}forum_t", $e107Connection); +mysql_query("TRUNCATE TABLE {$mySQLprefix}polls", $e107Connection); + +$query = "SELECT * FROM {$phpbb2Prefix}topics +LEFT JOIN {$phpbb2Prefix}posts_text ON ({$phpbb2Prefix}topics.topic_title = {$phpbb2Prefix}posts_text.post_subject) +LEFT JOIN {$phpbb2Prefix}posts ON ({$phpbb2Prefix}posts.post_id = {$phpbb2Prefix}posts_text.post_id) +ORDER BY topic_time ASC"; + +$phpbb_res = mysql_query($query, $phpbbConnection); +if(!$phpbb_res) +{ + goError("Error! Unable to access ".$phpbb2Prefix."topics table."); +} +while($topic = mysql_fetch_array($phpbb_res)) +{ + + //echo "
"; print_r($topic); echo "
"; + + if($topic['topic_vote']) + { + // poll attached to this topic ... + $topic['topic_title'] = "[poll] ".$topic['topic_title']; + $query = "SELECT * FROM {$phpbb2Prefix}vote_desc WHERE topic_id=".$topic['topic_id']; + $phpbb_res3 = mysql_query($query, $phpbbConnection); + $pollQ = mysql_fetch_array($phpbb_res3); + + $query = "SELECT * FROM {$phpbb2Prefix}vote_results WHERE vote_id=".$pollQ['vote_id']; + $phpbb_res3 = mysql_query($query, $phpbbConnection); + $options = ""; + $votes = ""; + while($pollO = mysql_fetch_array($phpbb_res3)) + { + $options .= $pollO['vote_option_text'].chr(1); + $votes .= $pollO['vote_result'].chr(1); + } + + extract($pollQ); + $vote_text = $tp->toDB($vote_text); // McFly added 25/5/06 + $options = $tp->toDB($options); // McFly added 25/5/06 + $query = "INSERT INTO ".$mySQLprefix."polls VALUES ('0', {$vote_start}, {$vote_start}, 0, 0, '{$vote_text}', '{$options}', '{$votes}', '', 2, 0, 0, 0, 255, 0)"; + echo (mysql_query($query, $e107Connection) ? "Poll successfully inserted" : "Unable to insert poll ({$query})")."
"; + } + + + if($topic['topic_poster'] == 2) + { + $topic['topic_poster'] = 1; + } + + if($topic['topic_poster'] == -1) + { + $poster = ($topic['post_username'] ? $topic['post_username'] : "Anonymous"); + $topic['topic_poster'] = "0.".$poster; // McFly moved, edited 25/5/06 + } + + $topicArray = convertTopics(); // McFly edited 25/5/06 + $query = createQuery($topicArray, $topic, $mySQLprefix."forum_t"); + + if(!mysql_query($query, $e107Connection)) + { + echo "Unable to insert topic: ".$topic['topic_id']."
"; + flush(); + } + else + { + echo "Successfully inserted topic: ".$topic['topic_id']."
"; + flush(); + $parent_id = mysql_insert_id(); + $topic_id = $topic['topic_id']; + + //echo "PARENT: $parent_id, TOPIC: $topic_id
"; + +// Not checking post_subject might work better + $query = "SELECT * FROM {$phpbb2Prefix}posts LEFT JOIN {$phpbb2Prefix}posts_text ON ({$phpbb2Prefix}posts.post_id = {$phpbb2Prefix}posts_text.post_id) WHERE topic_id='{$topic_id}' ORDER BY post_time DESC"; +// $query = "SELECT * FROM {$phpbb2Prefix}posts LEFT JOIN {$phpbb2Prefix}posts_text ON ({$phpbb2Prefix}posts.post_id = {$phpbb2Prefix}posts_text.post_id) WHERE topic_id='{$topic_id}' AND post_subject = '' ORDER BY post_time DESC"; + $phpbb_res2 = mysql_query($query, $phpbbConnection); + if(!$phpbb_res2) + { + goError("Error! Unable to access ".$phpbb2Prefix."posts / ".$phpbb2Prefix."posts_text table."); + } + while($post = mysql_fetch_array($phpbb_res2)) + { + + if($post['poster_id'] == 2) + { + $post['poster_id'] = 1; + } + if($post['poster_id'] == -1) + { + $poster = ($post['post_username'] ? $post['post_username'] : "Anonymous"); + $post['poster_id'] = "0.".$poster; // McFly moved, edited 25/5/06 + } + + + $postArray = convertForumPosts($parent_id, $poster); + $query = createQuery($postArray, $post, $mySQLprefix."forum_t",$mapdata); + echo (mysql_query($query, $e107Connection) ? "Successfully inserted thread: ".$post['post_id'] : "Unable to insert thread: ".$parent['cat_id'].": ".$parent['cat_title']."
".mysql_errno() . ": " . mysql_error())."
"; + flush(); + } + } +} + +*/ + +?>