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