*/ @set_time_limit(0); @require_once('./modules/importer/extract.class.php'); /** * ttimport class * ttxml import class * * @author NAVER (developers@xpressengine.com) * @package /modules/importer * @version 0.1 */ class ttimport { /** * Import data in module.xml format * @param int $key * @param int $cur * @param string $index_file * @param int $unit_count * @param int $module_srl * @param int $guestbook_module_srl * @param string $user_id * @param string $module_name * @return int */ function importModule($key, $cur, $index_file, $unit_count, $module_srl, $guestbook_module_srl, $user_id, $module_name=null) { // Get category information of the target module $oDocumentController = getController('document'); $oDocumentModel = getModel('document'); $category_list = $category_titles = array(); $category_list = $oDocumentModel->getCategoryList($module_srl); if(count($category_list)) foreach($category_list as $key => $val) $category_titles[$val->title] = $val->category_srl; // First handle categorty information $category_file = preg_replace('/index$/i', 'category.xml', $index_file); if(file_exists($category_file)) { $xmlDoc = Rhymix\Framework\Parsers\XEXMLParser::loadXmlFile($category_file); // List category information if($xmlDoc->categories->category) { $categories = array(); $idx = 0; $this->arrangeCategory($xmlDoc->categories, $categories, $idx, 0); $match_sequence = array(); foreach($categories as $k => $v) { $category = $v->name; if(!$category || $category_titles[$category]) continue; $obj = null; $obj->title = $category; $obj->module_srl = $module_srl; if($v->parent) $obj->parent_srl = $match_sequence[$v->parent]; $output = $oDocumentController->insertCategory($obj); if($output->toBool()) $match_sequence[$v->sequence] = $category_titles[$category] = $output->get('category_srl'); } $oDocumentController->makeCategoryFile($module_srl); } FileHandler::removeFile($category_file); } $category_list = $category_titles = array(); $category_list = $oDocumentModel->getCategoryList($module_srl); if(count($category_list)) foreach($category_list as $key => $val) $category_titles[$val->title] = $val->category_srl; // Get administrator information $oMemberModel = getModel('member'); $member_info = $oMemberModel->getMemberInfoByUserID($user_id); $author_xml_id = 0; if(!$cur) $cur = 0; // Open an index file $f = fopen($index_file,"r"); // Pass if already read for($i=0;$i<$cur;$i++) fgets($f, 1024); // Read each line until the codition meets for($idx=$cur;$idx<$cur+$unit_count;$idx++) { if(feof($f)) break; // Find a location $target_file = trim(fgets($f, 1024)); if(!file_exists($target_file)) continue; // Start importing data $fp = fopen($target_file,"r"); if(!$fp) continue; $obj = null; $obj->module_srl = $module_srl; $obj->document_srl = getNextSequence(); $obj->uploaded_count = 0; $files = array(); $started = false; $buff = null; // Start importing from the body data while(!feof($fp)) { $str = fgets($fp, 1024); // Prepare an item if(substr($str,0,5) == 'importAttaches($fp, $module_srl, $obj->document_srl, $files, $str)) $obj->uploaded_count++; continue; } if($started) $buff .= $str; } $xmlDoc = Rhymix\Framework\Parsers\XEXMLParser::loadXmlString(''.$buff); $author_xml_id = $xmlDoc->post->author->body; if($xmlDoc->post->category->body) { $tmp_arr = explode('/',$xmlDoc->post->category->body); $category = trim($tmp_arr[count($tmp_arr)-1]); if($category_titles[$category]) $obj->category_srl = $category_titles[$category]; } $obj->is_notice = 'N'; $obj->status = in_array($xmlDoc->post->visibility->body, array('public','syndicated'))?$oDocumentModel->getConfigStatus('public'):$oDocumentModel->getConfigStatus('secret'); $obj->title = $xmlDoc->post->title->body; $obj->content = $xmlDoc->post->content->body; $obj->password = md5($xmlDoc->post->password->body); $obj->commentStatus = $xmlDoc->post->acceptcomment->body=='1'?'ALLOW':'DENY'; $obj->allow_trackback = $xmlDoc->post->accepttrackback->body=='1'?'Y':'N'; //$obj->allow_comment = $xmlDoc->post->acceptComment->body=='1'?'Y':'N'; //$obj->allow_trackback = $xmlDoc->post->acceptTrackback->body=='1'?'Y':'N'; $obj->regdate = date("YmdHis",$xmlDoc->post->published->body); $obj->last_update = date("YmdHis", $xmlDoc->post->modified->body); if(!$obj->last_update) $obj->last_update = $obj->regdate; $tag = null; $tmp_tags = null; $tag = $xmlDoc->post->tag; if($tag) { if(!is_array($tag)) $tag = array($tag); foreach($tag as $key => $val) $tmp_tags[] = $val->body; $obj->tags = implode(',',$tmp_tags); } $obj->readed_count = 0; $obj->voted_count = 0; $obj->nick_name = $member_info->nick_name; $obj->user_name = $member_info->user_name; $obj->user_id = $member_info->user_id; $obj->member_srl = $member_info->member_srl; $obj->email_address = $member_info->email_address; $obj->homepage = $member_info->homepage; $obj->ipaddress = $_REMOTE['SERVER_ADDR']; $obj->list_order = $obj->update_order = $obj->document_srl*-1; $obj->notify_message = 'N'; // Change content information (attachment) $obj->content = str_replace('[##_ATTACH_PATH_##]/','',$obj->content); if(count($files)) { foreach($files as $key => $val) { $obj->content = preg_replace('/(src|href)\=(["\']?)'.preg_quote($key).'(["\']?)/i','$1="'.$val->url.'"',$obj->content); } } $obj->content = preg_replace_callback('!\[##_Movie\|([^\|]*)\|(.*?)_##\]!is', array($this, '_replaceTTMovie'), $obj->content); if(count($files)) { $this->files = $files; $obj->content = preg_replace_callback('!\[##_([a-z0-9]+)\|([^\|]*)\|([^\|]*)\|(.*?)_##\]!is', array($this, '_replaceTTAttach'), $obj->content); } // Trackback inserted $obj->trackback_count = 0; if($xmlDoc->post->trackback) { $trackbacks = $xmlDoc->post->trackback; if(!is_array($trackbacks)) $trackbacks = array($trackbacks); if(count($trackbacks)) { foreach($trackbacks as $key => $val) { $tobj = null; $tobj->trackback_srl = getNextSequence(); $tobj->module_srl = $module_srl; $tobj->document_srl = $obj->document_srl; $tobj->url = $val->url->body; $tobj->title = $val->title->body; $tobj->blog_name = $val->site->body; $tobj->excerpt = $val->excerpt->body; $tobj->regdate = date("YmdHis",$val->received->body); $tobj->ipaddress = $val->ip->body; $tobj->list_order = -1*$tobj->trackback_srl; $output = executeQuery('trackback.insertTrackback', $tobj); if($output->toBool()) $obj->trackback_count++; } } } // Comment $obj->comment_count = 0; if($xmlDoc->post->comment) { $comment = $xmlDoc->post->comment; if(!is_array($comment)) $comment = array($comment); foreach($comment as $key => $val) { $parent_srl = $this->insertComment($val, $module_srl, $obj->document_srl, $member_info, 0, $author_xml_id); if($parent_srl === false) continue; $obj->comment_count++; if($val->comment) { $child_comment = $val->comment; if(!is_array($child_comment)) $child_comment = array($child_comment); foreach($child_comment as $k => $v) { $result = $this->insertComment($v, $module_srl, $obj->document_srl, $member_info, $parent_srl, $author_xml_id); if($result !== false) $obj->comment_count++; } } } } if($module_name == 'textyle') { $args = new stdClass(); $args->document_srl = $obj->document_srl; $args->module_srl = $obj->module_srl; $args->logs = serialize(null); $output = executeQuery('textyle.insertPublishLog', $args); // Visibility value of published state $status_published = array('public', 'syndicated'); // Save state if not published if(!in_array($xmlDoc->post->visibility->body, $status_published)) { $obj->module_srl = $member_info->member_srl; } } // Document $output = executeQuery('document.insertDocument', $obj); if($output->toBool()) { // Tags if($obj->tags) { $tag_list = explode(',',$obj->tags); $tag_count = count($tag_list); for($i=0;$i<$tag_count;$i++) { $args = new stdClass; $args->tag_srl = getNextSequence(); $args->module_srl = $module_srl; $args->document_srl = $obj->document_srl; $args->tag = trim($tag_list[$i]); $args->regdate = $obj->regdate; if(!$args->tag) continue; $output = executeQuery('tag.insertTag', $args); } } } fclose($fp); FileHandler::removeFile($target_file); } fclose($f); if(count($category_list)) foreach($category_list as $key => $val) $oDocumentController->updateCategoryCount($module_srl, $val->category_srl); // Guestbook information $guestbook_file = preg_replace('/index$/i', 'guestbook.xml', $index_file); if(file_exists($guestbook_file)) { $xmlDoc = Rhymix\Framework\Parsers\XEXMLParser::loadXmlFile($guestbook_file); // Handle guest book information if($guestbook_module_srl && $xmlDoc->guestbook->comment) { $comment = $xmlDoc->guestbook->comment; if(!is_array($comment)) $comment = array($comment); if($module_name =='textyle') { foreach($comment as $key => $val) { $textyle_guestbook_srl = getNextSequence(); if($val->comment) { $child_comment = $val->comment; if(!is_array($child_comment)) $child_comment = array($child_comment); foreach($child_comment as $k => $v) { $result = $this->insertTextyleGuestbookItem($v, $module_srl, $member_info,0,$textyle_guestbook_srl,$author_xml_id); } } $result = $this->insertTextyleGuestbookItem($val, $module_srl, $member_info,$textyle_guestbook_srl,0,$author_xml_id); } } else { foreach($comment as $key => $val) { $obj = null; $obj->module_srl = $guestbook_module_srl; $obj->document_srl = getNextSequence(); $obj->uploaded_count = 0; $obj->is_notice = 'N'; $obj->status = $val->secret->body=='1'?$oDocumentModel->getConfigStatus('secret'):$oDocumentModel->getConfigStatus('public'); $obj->content = nl2br($val->content->body); // Extract a title form the bocy $obj->title = cut_str(strip_tags($obj->content),20,'...'); if ($obj->title == '') $obj->title = 'Untitled'; $obj->commentStatus = 'ALLOW'; $obj->allow_trackback = 'N'; $obj->regdate = date("YmdHis",$val->written->body); $obj->last_update = date("YmdHis", $val->written->body); if(!$obj->last_update) $obj->last_update = $obj->regdate; $obj->tags = ''; $obj->readed_count = 0; $obj->voted_count = 0; if($author_xml_id && $val->commenter->attrs->id == $author_xml_id) { $obj->password = ''; $obj->nick_name = $member_info->nick_name; $obj->user_name = $member_info->user_name; $obj->user_id = $member_info->user_id; $obj->member_srl = $member_info->member_srl; $obj->email_address = $member_info->email_address; $obj->homepage = $member_info->homepage; } else { $obj->password = $val->password->body; $obj->nick_name = $val->commenter->name->body; $obj->member_srl = 0; $homepage = $val->commenter->homepage->body; } $obj->ipaddress = $val->commenter->ip->body; $obj->list_order = $obj->update_order = $obj->document_srl*-1; $obj->notify_message = 'N'; $obj->trackback_count = 0; $obj->comment_count = 0; if($val->comment) { $child_comment = $val->comment; if(!is_array($child_comment)) $child_comment = array($child_comment); foreach($child_comment as $k => $v) { $result = $this->insertComment($v, $module_srl, $obj->document_srl, $member_info, 0,$author_xml_id); if($result !== false) $obj->comment_count++; } } // Document $output = executeQuery('document.insertDocument', $obj); } } } FileHandler::removeFile($guestbook_file); } return $idx-1; } /** * Insert textyle guest book * @param object $val * @param int $module_srl * @param object $member_info * @param int $textyle_guestbook_srl * @param int $parent_srl * @param int $author_xml_id * @return int|bool */ function insertTextyleGuestbookItem($val, $module_srl, $member_info, $textyle_guestbook_srl,$parent_srl = 0, $author_xml_id=null) { $tobj = null; if($textyle_guestbook_srl>0) { $tobj->textyle_guestbook_srl = $textyle_guestbook_srl; } else { $tobj->textyle_guestbook_srl = getNextSequence(); } $tobj->module_srl = $module_srl; $tobj->is_secret = $val->secret->body=='1'?1:-1; $tobj->content = nl2br($val->content->body); if($author_xml_id && $val->commenter->attrs->id == $author_xml_id) { $tobj->password = ''; $tobj->nick_name = $member_info->nick_name; $tobj->user_name = $member_info->user_name; $tobj->user_id = $member_info->user_id; $tobj->member_srl = $member_info->member_srl; $tobj->homepage = $member_info->homepage; $tobj->email_address = $member_info->email_address; } else { $tobj->password = $val->password->body; $tobj->nick_name = $val->commenter->name->body; $tobj->homepage = $val->commenter->homepage->body; $tobj->member_srl = 0; } $tobj->last_update = $tobj->regdate = date("YmdHis",$val->written->body); $tobj->ipaddress = $val->commenter->ip->body; if($parent_srl>0) { $tobj->parent_srl = $parent_srl; $tobj->list_order = $tobj->parent_srl * -1; } else { $tobj->list_order = $tobj->textyle_guestbook_srl*-1; } $output = executeQuery('textyle.insertTextyleGuestbook', $tobj); if($output->toBool()) return $tobj->textyle_guestbook_srl; return false; } /** * Attachment * @param resource $fp * @param int $module_srl * @param int $upload_target_srl * @param array $files * @param string $buff * @return bool */ function importAttaches($fp, $module_srl, $upload_target_srl, &$files, $buff) { $uploaded_count = 0; $file_obj = null; $file_obj->file_srl = getNextSequence(); $file_obj->upload_target_srl = $upload_target_srl; $file_obj->module_srl = $module_srl; while(!feof($fp)) { $str = fgets($fp, 1024); // If it ends with , break if(trim($str) == '') break; // If it starts with , handle the attachement in the xml file if(substr($str, 0, 9)=='') { $file_obj->file = $this->saveTemporaryFile($fp, $str); continue; } $buff .= $str; } if(!file_exists($file_obj->file)) return false; $buff .= ''; $xmlDoc = Rhymix\Framework\Parsers\XEXMLParser::loadXmlString($buff); $file_obj->source_filename = $xmlDoc->attachment->label->body; $file_obj->download_count = $xmlDoc->attachment->downloads->body; $name = $xmlDoc->attachment->name->body; // Set upload path by checking if the attachement is an image or other kind of file if (Rhymix\Framework\Filters\FilenameFilter::isDirectDownload($file_obj->source_filename)) { $path = sprintf("./files/attach/images/%s/%s", $module_srl,getNumberingPath($upload_target_srl,3)); $filename = $path.$file_obj->source_filename; $file_obj->direct_download = 'Y'; } else { $path = sprintf("./files/attach/binaries/%s/%s", $module_srl, getNumberingPath($upload_target_srl,3)); $filename = $path.md5(crypt(rand(1000000,900000), rand(0,100))); $file_obj->direct_download = 'N'; } // Create a directory if(!FileHandler::makeDir($path)) return; FileHandler::rename($file_obj->file, $filename); // Insert to the DB unset($file_obj->file); $file_obj->uploaded_filename = $filename; $file_obj->file_size = filesize($filename); $file_obj->comment = NULL; $file_obj->member_srl = 0; $file_obj->sid = md5(rand(rand(1111111,4444444),rand(4444445,9999999))); $file_obj->isvalid = 'Y'; $output = executeQuery('file.insertFile', $file_obj); if($output->toBool()) { $uploaded_count++; $tmp_obj = null; if($file_obj->direct_download == 'Y') $files[$name]->url = $file_obj->uploaded_filename; else $files[$name]->url = getUrl('','module','file','act','procFileDownload','file_srl',$file_obj->file_srl,'sid',$file_obj->sid); $files[$name]->direct_download = $file_obj->direct_download; $files[$name]->source_filename = $file_obj->source_filename; return true; } return false; } /** * Return a filename to temporarily use * @return string */ function getTmpFilename() { $path = "./files/cache/importer"; if(!is_dir($path)) FileHandler::makeDir($path); $filename = sprintf("%s/%d", $path, rand(11111111,99999999)); if(file_exists($filename)) $filename .= rand(111,999); return $filename; } /** * Read buff until key value comes out from a specific file point * @param resource $fp * @param string $buff * @return string */ function saveTemporaryFile($fp, $buff) { $temp_filename = $this->getTmpFilename(); $buff = substr($buff, 9); while(!feof($fp)) { $str = trim(fgets($fp, 1024)); $buff .= $str; if(substr($str, -10) == '') break; } $buff = substr($buff, 0, -10); $f = fopen($temp_filename, "w"); fwrite($f, base64_decode($buff)); fclose($f); return $temp_filename; } /** * Replace img tag in the ttxml * @param array $matches * @return string */ function _replaceTTAttach($matches) { $name = $matches[2]; if(!$name) return $matches[0]; $obj = $this->files[$name]; // If multimedia file is, if($obj->direct_download == 'Y') { // If image file is if(preg_match('/\.(jpg|gif|jpeg|png)$/i', $obj->source_filename)) { return sprintf('%s', $obj->url, str_replace('"','\\"',$matches[4])); // If other multimedia file but image is, } else { return sprintf('', $obj->url); } // If binary file is } else { return sprintf('%s', $obj->url, $obj->source_filename); } } /** * Convert the video file * @return string */ function _replaceTTMovie($matches) { $key = $matches[1]; if(!$key) return $matches[0]; return ''. ''. ''. ''. ''. ''. ''; } /** * Comment * @param object $val * @param int $module_srl * @param int $document_srl * @param object $member_info * @param int $parent_srl * @param int $author_xml_id * @return bool|int|object */ function insertComment($val, $module_srl, $document_srl, $member_info, $parent_srl = 0, $author_xml_id) { $tobj = null; $tobj->comment_srl = getNextSequence(); $tobj->module_srl = $module_srl; $tobj->document_srl = $document_srl; $tobj->is_secret = $val->secret->body=='1'?'Y':'N'; $tobj->notify_message = 'N'; $tobj->content = nl2br($val->content->body); $tobj->voted_count = 0; $tobj->status = 1; if($author_xml_id && $val->commenter->attrs->id == $author_xml_id) { $tobj->password = ''; $tobj->nick_name = $member_info->nick_name; $tobj->user_name = $member_info->user_name; $tobj->user_id = $member_info->user_id; $tobj->member_srl = $member_info->member_srl; $tobj->homepage = $member_info->homepage; $tobj->email_address = $member_info->email_address; } else { $tobj->password = $val->password->body; $tobj->nick_name = $val->commenter->name->body; $tobj->homepage = $val->commenter->homepage->body; $tobj->member_srl = 0; } $tobj->last_update = $tobj->regdate = date("YmdHis",$val->written->body); $tobj->ipaddress = $val->commenter->ip->body; $tobj->list_order = $tobj->comment_srl*-1; $tobj->sequence = $sequence; $tobj->parent_srl = $parent_srl; // Comment list first $list_args = new stdClass; $list_args->comment_srl = $tobj->comment_srl; $list_args->document_srl = $tobj->document_srl; $list_args->module_srl = $tobj->module_srl; $list_args->regdate = $tobj->regdate; // Set data directly if parent comment doesn't exist if(!$tobj->parent_srl) { $list_args->head = $list_args->arrange = $tobj->comment_srl; $list_args->depth = 0; // Get parent_srl if parent comment exists } else { // Get parent_srl $parent_args = new stdClass(); $parent_args->comment_srl = $tobj->parent_srl; $parent_output = executeQuery('comment.getCommentListItem', $parent_args); // Return if parent comment doesn't exist if(!$parent_output->toBool() || !$parent_output->data) return false; $parent = $parent_output->data; $list_args->head = $parent->head; $list_args->depth = $parent->depth+1; if($list_args->depth<2) $list_args->arrange = $tobj->comment_srl; else { $list_args->arrange = $parent->arrange; $output = executeQuery('comment.updateCommentListArrange', $list_args); if(!$output->toBool()) return $output; } } $output = executeQuery('comment.insertCommentList', $list_args); if($output->toBool()) { $output = executeQuery('comment.insertComment', $tobj); if($output->toBool()) return $tobj->comment_srl; } return false; } /** * List category * @param object $obj * @param array $category * @param int $idx * @param int $parent * @return void */ function arrangeCategory($obj, &$category, &$idx, $parent = 0) { if(!$obj->category) return; if(!is_array($obj->category)) $c = array($obj->category); else $c = $obj->category; foreach($c as $val) { $idx++; $priority = $val->priority->body; $name = $val->name->body; $obj = null; $obj->priority = $priority; $obj->name = $name; $obj->sequence = $idx; $obj->parent = $parent; $category[$idx] = $obj; $this->arrangeCategory($val, $category, $idx, $idx); } } } /* End of file ttimport.class.php */ /* Location: ./modules/importer/ttimport.class.php */