1<?php 2/* 3 * e107 website system 4 * 5 * Copyright (C) 2008-2013 e107 Inc (e107.org) 6 * Released under the terms and conditions of the 7 * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) 8 * 9 */ 10 11 12require_once('import_classes.php'); 13 14class smf_import extends base_import_class 15{ 16 17 public $title = 'SMF v2.x (Simple Machines Forum)'; 18 public $description = 'Currently does not import membergroups or more than 1 post attachment '; 19 public $supported = array('users','forum','forumthread','forumpost'); 20 public $mprefix = 'smf_'; 21 public $sourceType = 'db'; 22 23 function init() 24 { 25 26 27 } 28 29 function config() 30 { 31 32 return; 33 34 $frm = e107::getForm(); 35 36 $var[0]['caption'] = "Path to phpBB3 Attachments folder (optional)"; 37 $var[0]['html'] = $frm->text('forum_attachment_path',null,40,'size=xxlarge'); 38 $var[0]['help'] = "Relative to the root folder of your e107 installation"; 39 40 return $var; 41 } 42 43 44 // Set up a query for the specified task. 45 // Returns TRUE on success. FALSE on error 46 function setupQuery($task, $blank_user=FALSE) 47 { 48 if ($this->ourDB == null) 49 { 50 e107::getMessage()->addDebug("Unable to connext"); 51 return FALSE; 52 } 53 54 switch ($task) 55 { 56 case 'users' : 57 58 // Set up Userclasses. 59 if($this->ourDB && $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}membergroups WHERE group_name = 'Jr. Member' ")) 60 { 61 e107::getMessage()->addDebug("Userclasses Found"); 62 } 63 64 $result = $this->ourDB->gen("SELECT * FROM {$this->DBPrefix}members WHERE `is_activated`=1"); 65 if ($result === false) 66 { 67 $message = $this->ourDB->getLastErrorText(); 68 e107::getMessage()->addError($message); 69 return false; 70 } 71 break; 72 73 74 case 'forum' : 75 $qry = "SELECT f.*, m.id_member, m.poster_name, m.poster_time FROM {$this->DBPrefix}boards AS f LEFT JOIN {$this->DBPrefix}messages AS m ON f.id_last_msg = m.id_msg GROUP BY f.id_board "; 76 77 $result = $this->ourDB->gen($qry); 78 if ($result === false) 79 { 80 $message = $this->ourDB->getLastErrorText(); 81 e107::getMessage()->addError($message); 82 return false; 83 } 84 break; 85 86 case 'forumthread' : 87 88 $qry = "SELECT t.*, m.poster_name, m.subject, m.poster_time, m.id_member, l.poster_name as lastpost_name, l.poster_time as lastpost_time, l.id_member as lastpost_user FROM {$this->DBPrefix}topics AS t 89 LEFT JOIN {$this->DBPrefix}messages AS m ON t.id_first_msg = m.id_msg 90 LEFT JOIN {$this->DBPrefix}messages AS l ON t.id_last_msg = l.id_msg 91 GROUP BY t.id_topic"; 92 93 $result = $this->ourDB->gen($qry); 94 if ($result === false) return false; 95 96 break; 97 98 case 'forumpost' : 99 100 $qry = "SELECT m.*, a.filename, a.fileext, a.size FROM {$this->DBPrefix}messages AS m LEFT JOIN {$this->DBPrefix}attachments AS a ON m.id_msg = a.id_msg GROUP BY m.id_msg ORDER BY m.id_msg ASC "; 101 102 $result = $this->ourDB->gen($qry); 103 if ($result === false) return false; 104 break; 105 106 case 'forumtrack' : 107 //$result = $this->ourDB->gen("SELECT * FROM `{$this->DBPrefix}forums_track`"); 108 //if ($result === FALSE) return FALSE; 109 break; 110 111 default : 112 return FALSE; 113 } 114 115 $this->copyUserInfo = false; 116 $this->currentTask = $task; 117 return TRUE; 118 } 119 120 121 122 function convertUserclass($data) 123 { 124 if(empty($data)) 125 { 126 return 0; 127 } 128 129 $convert = array( 130 // 1 => e_UC_ADMINMOD, 131 2 => e_UC_ADMINMOD, 132 3 => e_UC_MODS, 133 4 => e_UC_NEWUSER, 134 135 ); 136 137 if(!empty($convert[$data])) 138 { 139 return $convert[$data]; 140 } 141 142 143 return 0; 144 145 /* 146 1 Administrator #FF0000 -1 0 5#staradmin.gif 1 0 -2 147 2 Global Moderator #0000FF -1 0 5#stargmod.gif 0 0 -2 148 3 Moderator -1 0 5#starmod.gif 0 0 -2 149 4 Newbie 0 0 1#star.gif 0 0 -2 150 5 Jr. Member 50 0 2#star.gif 0 0 -2 151 6 Full Member 100 0 3#star.gif 0 0 -2 152 7 Sr. Member 250 0 4#star.gif 0 0 -2 153 8 Hero Member 500 0 5#star.gif 0 0 -2 154 */ 155 } 156 157 function convertAdmin($data) 158 { 159 160 if($data == 1) 161 { 162 return 1; 163 } 164 165 } 166 167 //------------------------------------ 168 // Internal functions below here 169 //------------------------------------ 170 171 // Copy data read from the DB into the record to be returned. 172 function copyUserData(&$target, &$source) 173 { 174 if ($this->copyUserInfo) 175 { 176 $target['user_id'] = 0; // $source['id_member']; 177 } 178 179 $target['user_name'] = $source['real_name']; 180 $target['user_login'] = $source['member_name']; 181 $target['user_loginname'] = $source['memberName']; 182 $target['user_password'] = $source['passwd']; // Check - could be plaintext 183 $target['user_email'] = $source['email_address']; 184 $target['user_hideemail'] = $source['hide_email']; 185 $target['user_image'] = $source['avatar']; 186 $target['user_signature'] = $source['signature']; 187 188 $target['user_chats'] = $source['instant_messages']; 189 $target['user_join'] = $source['date_registered']; 190 $target['user_lastvisit'] = $source['last_login']; 191 192 $target['user_location'] = $source['location']; 193 $target['user_icq'] = $source['icq']; 194 $target['user_aim'] = $source['aim']; 195 $target['user_yahoo'] = $source['yim']; 196 $target['user_msn'] = $source['msn']; 197 $target['user_timezone'] = $source['time_offset']; // Probably needs formatting 198 $target['user_customtitle'] = $source['usertitle']; 199 $target['user_ip'] = $source['member_ip']; 200 $target['user_homepage'] = $source['website_url']; 201 $target['user_birthday'] = $source['birthdate']; 202 $target['user_admin'] = $this->convertAdmin($source['id_group']); 203 $target['user_class'] = $this->convertUserclass($source['id_group']); 204 205 $target['user_plugin_forum_viewed'] = 0; 206 $target['user_plugin_forum_posts'] = $source['posts']; 207 208 // $target['user_language'] = $source['lngfile']; // Guess to verify 209 return $target; 210 } 211 212 213 214 /** 215 * $target - e107_forum table 216 * $source - smf table boards 217 */ 218 function copyForumData(&$target, &$source) 219 { 220 221 $target['forum_id'] = $source['id_board']; 222 $target['forum_name'] = $source['name']; 223 $target['forum_description'] = $source['description']; 224 $target['forum_parent'] = $source['id_parent']; 225 $target['forum_sub'] = ($source['child_level'] > 1) ? $source['id_parent'] : 0; 226 $target['forum_datestamp'] = time(); 227 $target['forum_moderators'] = ""; 228 229 $target['forum_threads'] = $source['num_topics']; 230 $target['forum_replies'] = $source['num_posts']; 231 $target['forum_lastpost_user'] = $source['id_member']; 232 $target['forum_lastpost_user_anon'] = empty($source['id_member']) ? $source['poster_name'] : null; 233 $target['forum_lastpost_info'] = $source['poster_time'].'.'.$source['id_last_msg']; 234 $target['forum_class'] = e_UC_MEMBER; 235 $target['forum_order'] = $source['board_order']; 236 $target['forum_postclass'] = e_UC_MEMBER; 237 $target['forum_threadclass'] = e_UC_MEMBER; 238 $target['forum_options'] = e_UC_MEMBER; 239 $target['forum_sef'] = eHelper::title2sef($source['name'],'dashl'); 240 241 return $target; 242 243 244 } 245 246 247 /** 248 * $target - e107 forum_threads 249 * $source - smf topics. 250 */ 251 function copyForumThreadData(&$target, &$source) 252 { 253 254 $target['thread_id'] = (int) $source['id_topic']; 255 $target['thread_name'] = $source['subject']; 256 $target['thread_forum_id'] = (int) $source['id_board']; 257 $target['thread_views'] = (int) $source['num_views']; 258 $target['thread_active'] = intval($source['locked']) === 0 ? 1 : 0; 259 $target['thread_lastpost'] = (int) $source['lastpost_time']; 260 $target['thread_sticky'] = (int) $source['id_sticky']; 261 $target['thread_datestamp'] = (int) $source['poster_time']; 262 $target['thread_user'] = (int) $source['id_member_started']; 263 $target['thread_user_anon'] = empty($source['id_member']) ? $source['poster_name'] : null; 264 $target['thread_lastuser'] = (int) $source['lastpost_user']; 265 $target['thread_lastuser_anon'] = empty($source['lastpost_user']) ? $source['lastpost_name'] : null; 266 $target['thread_total_replies'] = (int) $source['num_replies']; 267 $target['thread_options'] = null; 268 269 return $target; 270 271 } 272 273 274 /** 275 * $target - e107_forum_post table 276 * $source -smf 277 */ 278 function copyForumPostData(&$target, &$source) 279 { 280 $target['post_id'] = (int)$source['id_msg']; 281 $target['post_entry'] = $source['body']; 282 $target['post_thread'] = (int) $source['id_topic']; 283 $target['post_forum'] = (int) $source['id_board']; 284 $target['post_status'] = intval($source['approved']) === 1 ? 0 : 1; 285 $target['post_datestamp'] = (int) $source['poster_time']; 286 $target['post_user'] = (int) $source['id_member']; 287 $target['post_edit_datestamp'] = (int) $source['modified_time']; 288 $target['post_edit_user'] = $source['post_edit_user']; 289 $target['post_ip'] = e107::getIPHandler()->ipEncode($source['poster_ip']); 290 $target['post_user_anon'] = empty($source['id_member']) ? $source['poster_name'] : null; 291 $target['post_attachments'] = $this->processAttachments($source); 292 $target['post_options'] = null; 293 294 295 return $target; 296 297 298 } 299 300 301 /** 302 * todo copyForumPostAttachments() 303 * @param $source 304 * @return null|string 305 */ 306 307 308 /** 309 * @todo Support for multiple attachments. 310 * @param $source 311 * @return null|string 312 */ 313 private function processAttachments($source) 314 { 315 if(empty($source['filename'])) 316 { 317 return null; 318 } 319 320 321 if($source['fileext'] == 'png' || $source['fileext'] == 'jpg' || $source['fileext'] == 'jpg') 322 { 323 $type = 'img'; 324 } 325 else 326 { 327 $type = 'file'; 328 } 329 330 $arr = array(); 331 $arr[$type][0] = array( 332 'file' => $source['filename'], 333 'name' => $source['filename'], 334 'size' => $source['size'] 335 ); 336 337 return e107::serialize($arr); 338 339 } 340 341 /** 342 * $target - e107_forum_track 343 * $source -??? 344 */ 345 function copyForumTrackData(&$target, &$source) 346 { 347 $target['track_userid'] = $source['user_id']; 348 $target['track_thread'] = $source['forum_id']; 349 350 return $target; 351 } 352 353 354/* 355CREATE TABLE {$db_prefix}polls ( 356 id_poll mediumint(8) unsigned NOT NULL auto_increment, 357 question varchar(255) NOT NULL default '', 358 voting_locked tinyint(1) NOT NULL default '0', 359 max_votes tinyint(3) unsigned NOT NULL default '1', 360 expire_time int(10) unsigned NOT NULL default '0', 361 hide_results tinyint(3) unsigned NOT NULL default '0', 362 change_vote tinyint(3) unsigned NOT NULL default '0', 363 guest_vote tinyint(3) unsigned NOT NULL default '0', 364 num_guest_voters int(10) unsigned NOT NULL default '0', 365 reset_poll int(10) unsigned NOT NULL default '0', 366 id_member mediumint(8) NOT NULL default '0', 367 poster_name varchar(255) NOT NULL default '', 368 PRIMARY KEY (id_poll) 369) ENGINE=MyISAM; 370 * 371 * 372 * 373 374 375 * 376 * INSERT INTO {$db_prefix}membergroups 377 (id_group, group_name, description, online_color, min_posts, stars, group_type) 378VALUES (1, '{$default_administrator_group}', '', '#FF0000', -1, '5#staradmin.gif', 1), 379 (2, '{$default_global_moderator_group}', '', '#0000FF', -1, '5#stargmod.gif', 0), 380 (3, '{$default_moderator_group}', '', '', -1, '5#starmod.gif', 0), 381 (4, '{$default_newbie_group}', '', '', 0, '1#star.gif', 0), 382 (5, '{$default_junior_group}', '', '', 50, '2#star.gif', 0), 383 (6, '{$default_full_group}', '', '', 100, '3#star.gif', 0), 384 (7, '{$default_senior_group}', '', '', 250, '4#star.gif', 0), 385 (8, '{$default_hero_group}', '', '', 500, '5#star.gif', 0); 386# -------------------------------------------------------- 387 388 * 389 390 * 391 * * 392 393CREATE TABLE {$db_prefix}membergroups ( 394 id_group smallint(5) unsigned NOT NULL auto_increment, 395 group_name varchar(80) NOT NULL default '', 396 description text NOT NULL, 397 online_color varchar(20) NOT NULL default '', 398 min_posts mediumint(9) NOT NULL default '-1', 399 max_messages smallint(5) unsigned NOT NULL default '0', 400 stars varchar(255) NOT NULL default '', 401 group_type tinyint(3) NOT NULL default '0', 402 hidden tinyint(3) NOT NULL default '0', 403 id_parent smallint(5) NOT NULL default '-2', 404 PRIMARY KEY (id_group), 405 KEY min_posts (min_posts) 406) ENGINE=MyISAM; 407 408CREATE TABLE {$db_prefix}members ( 409 id_member mediumint(8) unsigned NOT NULL auto_increment, 410 member_name varchar(80) NOT NULL default '', 411 date_registered int(10) unsigned NOT NULL default '0', 412 posts mediumint(8) unsigned NOT NULL default '0', 413 id_group smallint(5) unsigned NOT NULL default '0', 414 lngfile varchar(255) NOT NULL default '', 415 last_login int(10) unsigned NOT NULL default '0', 416 real_name varchar(255) NOT NULL default '', 417 instant_messages smallint(5) NOT NULL default 0, 418 unread_messages smallint(5) NOT NULL default 0, 419 new_pm tinyint(3) unsigned NOT NULL default '0', 420 buddy_list text NOT NULL, 421 pm_ignore_list varchar(255) NOT NULL default '', 422 pm_prefs mediumint(8) NOT NULL default '0', 423 mod_prefs varchar(20) NOT NULL default '', 424 message_labels text NOT NULL, 425 passwd varchar(64) NOT NULL default '', 426 openid_uri text NOT NULL, 427 email_address varchar(255) NOT NULL default '', 428 personal_text varchar(255) NOT NULL default '', 429 gender tinyint(4) unsigned NOT NULL default '0', 430 birthdate date NOT NULL default '0001-01-01', 431 website_title varchar(255) NOT NULL default '', 432 website_url varchar(255) NOT NULL default '', 433 location varchar(255) NOT NULL default '', 434 icq varchar(255) NOT NULL default '', 435 aim varchar(255) NOT NULL default '', 436 yim varchar(32) NOT NULL default '', 437 msn varchar(255) NOT NULL default '', 438 hide_email tinyint(4) NOT NULL default '0', 439 show_online tinyint(4) NOT NULL default '1', 440 time_format varchar(80) NOT NULL default '', 441 signature text NOT NULL, 442 time_offset float NOT NULL default '0', 443 avatar varchar(255) NOT NULL default '', 444 pm_email_notify tinyint(4) NOT NULL default '0', 445 karma_bad smallint(5) unsigned NOT NULL default '0', 446 karma_good smallint(5) unsigned NOT NULL default '0', 447 usertitle varchar(255) NOT NULL default '', 448 notify_announcements tinyint(4) NOT NULL default '1', 449 notify_regularity tinyint(4) NOT NULL default '1', 450 notify_send_body tinyint(4) NOT NULL default '0', 451 notify_types tinyint(4) NOT NULL default '2', 452 member_ip varchar(255) NOT NULL default '', 453 member_ip2 varchar(255) NOT NULL default '', 454 secret_question varchar(255) NOT NULL default '', 455 secret_answer varchar(64) NOT NULL default '', 456 id_theme tinyint(4) unsigned NOT NULL default '0', 457 is_activated tinyint(3) unsigned NOT NULL default '1', 458 validation_code varchar(10) NOT NULL default '', 459 id_msg_last_visit int(10) unsigned NOT NULL default '0', 460 additional_groups varchar(255) NOT NULL default '', 461 smiley_set varchar(48) NOT NULL default '', 462 id_post_group smallint(5) unsigned NOT NULL default '0', 463 total_time_logged_in int(10) unsigned NOT NULL default '0', 464 password_salt varchar(255) NOT NULL default '', 465 ignore_boards text NOT NULL, 466 warning tinyint(4) NOT NULL default '0', 467 passwd_flood varchar(12) NOT NULL default '', 468 pm_receive_from tinyint(4) unsigned NOT NULL default '1', 469 PRIMARY KEY (id_member), 470 KEY member_name (member_name), 471 KEY real_name (real_name), 472 KEY date_registered (date_registered), 473 KEY id_group (id_group), 474 KEY birthdate (birthdate), 475 KEY posts (posts), 476 KEY last_login (last_login), 477 KEY lngfile (lngfile(30)), 478 KEY id_post_group (id_post_group), 479 KEY warning (warning), 480 KEY total_time_logged_in (total_time_logged_in), 481 KEY id_theme (id_theme) 482) ENGINE=MyISAM; 483 484*/ 485 486 487 488 489 490} 491 492 493