e107inc/e107

View on GitHub
e107_plugins/import/providers/phpbb3_import_class.php

Summary

Maintainability
A
2 hrs
Test Coverage
F
0%
<?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
 */