git-svn-id: http://xe-core.googlecode.com/svn/trunk@1407 201d5d3c-b55e-5fd7-737f-ddc643e51545

This commit is contained in:
zero 2007-05-15 09:03:23 +00:00
parent 1ea801bf67
commit c459b1bf0d
11 changed files with 351 additions and 29 deletions

View file

@ -3,6 +3,8 @@
<actions>
<action name="dispImporterAdminContent" type="view" standalone="true" admin_index="true" />
<action name="procImporterAdminStep1" type="controller" standalone="true" />
<action name="procImporterAdminStep12" type="controller" standalone="true" />
<action name="procImporterAdminImport" type="controller" standalone="true" />
</actions>
</module>

View file

@ -14,7 +14,6 @@
// action forward에 등록 (관리자 모드에서 사용하기 위함)
$oModuleController = &getController('module');
$oModuleController->insertActionForward('importer', 'view', 'dispImporterAdminContent');
$oModuleController->insertActionForward('importer', 'controller', 'procImporterAdminImport');
return new Object();
}

View file

@ -14,10 +14,85 @@
}
/**
* @brief import
* @brief import step1
* import하려는 대상에 따라 결과값을 구해서 return
* 회원정보 : next_step=2, module_list = null
* 모듈정보 : next_step=12, module_list = modules..
* 회원정보 동기화 : next_step=3
**/
function procImporterAdminImport() {
function procImporterAdminStep1() {
$source_type = Context::get('source_type');
switch($source_type) {
case 'module' :
// 모듈 목록을 구함
$oModuleModel = &getModel('module');
$module_list = $oModuleModel->getMidList();
foreach($module_list as $key => $val) {
$module_list_arr[] = sprintf('%d,%s (%s)', $val->module_srl, $val->browser_title, $val->mid);
}
if(count($module_list_arr)) $module_list = implode("\n",$module_list_arr);
$next_step = 12;
break;
case 'member' :
$next_step = 2;
break;
case 'syncmember' :
$next_step = 3;
break;
}
$this->add('next_step', $next_step);
$this->add('module_list', $module_list);
}
/**
* @brief import step12
* module_srl을 이용하여 대상 모듈에 카테고리값이 있는지 확인하여
* 있으면 카테고리 정보를 return, 아니면 파일 업로드 단계로 이동
**/
function procImporterAdminStep12() {
$target_module= Context::get('target_module');
// 대상 모듈의 카테고리 목록을 구해옴
$oDocumentModel = &getModel('document');
$category_list = $oDocumentModel->getCategoryList($target_module);
if(count($category_list)) {
foreach($category_list as $key => $val) {
$category_list_arr[] = sprintf('%d,%s', $val->category_srl, $val->title);
}
if(count($category_list_arr)) {
$category_list = implode("\n",$category_list_arr);
$next_step = 13;
}
} else {
$category_list = null;
$next_step = 2;
}
$this->add('next_step', $next_step);
$this->add('category_list', $category_list);
}
/**
* @brief import xml file
* XML File을 읽어서 파싱 입력..
**/
function procImporterAdminImport() {
set_time_limit(0);
$module_srl = Context::get('module_srl');
$category_srl = Context::get('category_srl');
$xml_file = Context::get('xml_file');
// 파일을 찾을 수 없으면 에러 표시
if(!file_exists($xml_file)) return new Object(-1,'msg_no_xml_file');
// XML Parser로 XML을 읽음
$xml_doc = XmlParser::loadXmlFile($xml_file);
$this->setError(-1);
$this->setMessage('haha');
}
}
?>

View file

@ -6,27 +6,39 @@
**/
// 버튼에 사용되는 언어
$lang->cmd_importer_list = 'Importer 목록';
$lang->cmd_module_config = 'Importer 공통 설정';
$lang->cmd_view_info = 'Importer 정보';
$lang->cmd_manage_menu = '메뉴관리';
$lang->cmd_make_child = '하위 카테고리 추가';
$lang->cmd_enable_move_category = "카테고리 위치 변경 (선택후 위 메뉴를 드래그하세요)";
$lang->cmd_remake_cache = '캐시파일 재생성';
$lang->cmd_layout_setup = '레이아웃 설정';
$lang->cmd_layout_edit = '레이아웃 편집';
$lang->cmd_sync_member = '동기화';
// 항목
$lang->parent_category_name = '상위 카테고리명';
$lang->category_name = '분류명';
$lang->expand = '펼침';
$lang->category_group_srls = '그룹제한';
$lang->source_type = '이전 대상';
$lang->type_member = '회원 정보';
$lang->type_module = '게시물 정보';
$lang->type_syncmember = '회원정보 동기화';
$lang->target_module = '대상 모듈';
$lang->xml_file = 'XML 파일';
$lang->import_step_title = array(
1 => 'Step 1. 이전 대상 선택',
12 => 'Step 1-2. 대상 모듈 선택',
13 => 'Step 1-3. 대상 분류 선택',
2 => 'Step 2. XML파일 업로드',
3 => 'Step 2. 회원정보와 게시물의 정보 동기화',
);
$lang->import_step_desc = array(
1 => '이전을 하려는 XML파일의 종류를 선택해주세요.',
12 => '데이터 이전을 할 대상 모듈을 선택해주세요.',
13 => '데이터 이전을 할 대상 분류를 선택해주세요.',
2 => "데이터 이전을 할 XML파일의 위치를 입력해주세요.\n같은 계정일 경우 상대 또는 절대 경로를, 다른 서버에 업로드 되어 있으면 http://주소.. 를 입력해주세요",
3 => '회원정보와 게시물의 정보가 이전후에 맞지 않을 수 있습니다. 이 때 동기화를 하시면 user_id를 기반으로 올바르게 동작하도록 합니다.',
);
// 안내/경고
$lang->msg_sync_member = '동기화 버튼을 클릭하시면 회원정보와 게시물정보의 동기화를 시작합니다.';
$lang->msg_no_xml_file = 'XML파일을 찾을 수 없습니다. 경로를 다시 확인해주세요';
// 주절 주절..
$lang->about_category_name = '카테고리 이름을 입력해주세요';
$lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)';
$lang->about_layout_setup = 'Importer의 레이아웃 코드를 직접 수정할 수 있습니다. 플러그인 코드를 원하는 곳에 삽입하시거나 관리하세요';
$lang->about_importer = "Importer를 만드시고 관리할 수 있는 Importer 모듈입니다.\nImporter 모듈은 Importer 스킨에 포함된 레이아웃을 이용하니 생성후 꼭 분류 및 스킨 관리를 통해서 Importer를 꾸미시기 바랍니다.\nImporter내에 다른 게시판을 연결하시고 싶을때에는 메뉴모듈로 메뉴를 만들고 나서 스킨관리에 연결해 주시면 됩니다";
$lang->about_type_member = '데이터 이전 대상이 회원정보일 경우 선택해주세요';
$lang->about_type_module = '데이터 이전 대상이 게시판등의 게시물 정보일 경우 선택해주세요';
$lang->about_type_syncmember = '회원정보와 게시물정보등을 이전후 회원정보 동기화 해야 할때 선택해주세요';
$lang->about_importer = "제로보드4, zb5beta 또는 다른 프로그램의 데이터를 제로보드XE 데이터로 이전할 수 있습니다.\n이전을 위해서는 <a href=\"#\" onclick=\"winopen('');return false;\">XML Exporter</a>를 이용해서 원하는 데이터를 XML파일로 생성후 업로드해주셔야 합니다.";
?>

View file

@ -0,0 +1,10 @@
<filter name="import_xml" module="importer" act="procImporterAdminImport">
<form>
<node target="xml_file" required="true" />
</form>
<parameter />
<response callback_func="completeImport">
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -0,0 +1,12 @@
<filter name="step1" module="importer" act="procImporterAdminStep1">
<form>
<node target="source_type" required="true" filter="alpha" />
</form>
<parameter />
<response callback_func="completeStep1">
<tag name="error" />
<tag name="message" />
<tag name="next_step" />
<tag name="module_list" />
</response>
</filter>

View file

@ -0,0 +1,12 @@
<filter name="step12" module="importer" act="procImporterAdminStep12">
<form>
<node target="target_module" required="true" />
</form>
<parameter />
<response callback_func="completeStep12">
<tag name="error" />
<tag name="message" />
<tag name="next_step" />
<tag name="category_list" />
</response>
</filter>

View file

@ -1,3 +1,109 @@
<div>
<!--%import("js/importer_admin.js")-->
<!--%import("filter/step1.xml")-->
<!--%import("filter/step12.xml")-->
<!--%import("filter/import_xml.xml")-->
<!-- 설명 -->
<div style="border:1px solid #CCCCCC;margin-bottom:10px;padding:10px;">
{nl2br($lang->about_importer)}
</div>
<!-- step 1. import하려는 XML파일의 성격 및 대상 모듈을 지정 -->
<div id="step1">
<form action="./" method="get" onsubmit="return procFilter(this, step1);">
<div style="font-weight:bold">{$lang->import_step_title[1]}</div>
<div>{$lang->import_step_desc[1]}</div>
<table border="1">
<tr>
<td>
<input type="radio" name="source_type" value="module" id="source_type_module" />
<label for="source_type_module">{$lang->type_module}</label>
</td>
<td>{$lang->about_type_module}</td>
</tr>
<tr>
<td>
<input type="radio" name="source_type" value="member" id="source_type_member" />
<label for="source_type_member">{$lang->type_member}</label>
</td>
<td>{$lang->about_type_member}</td>
</tr>
<tr>
<td>
<input type="radio" name="source_type" value="syncmember" id="source_type_syncmember" />
<label for="source_type_syncmember">{$lang->type_syncmember}</label>
</td>
<td>{$lang->about_type_syncmember}</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="{$lang->cmd_next}" />
</td>
</tr>
</table>
</form>
</div>
<!-- step 1-2. 대상이 게시물 정보일 경우 대상 모듈 목록을 선택하도록 함 -->
<div id="step12" style="display:none">
<form action="./" method="get" onsubmit="return procFilter(this, step12);">
<div style="font-weight:bold">{$lang->import_step_title[12]}</div>
<div>{$lang->import_step_desc[12]}</div>
<div>
<select name="target_module" id="target_module">
</select>
</div>
<div>
<input type="submit" value="{$lang->cmd_next}" />
</div>
</form>
</div>
<!-- step 1-3. 대상이 게시물 정보일 경우 모듈 선택후 분류가 있으면 분류 선택을 하도록 함 -->
<div id="step13" style="display:none">
<form action="./" method="get" onsubmit="return doStep13(this)">
<div style="font-weight:bold">{$lang->import_step_title[13]}</div>
<div>{$lang->import_step_desc[13]}</div>
<div>
<select name="target_category" id="target_category">
<option value=""></option>
</select>
</div>
<div>
<input type="submit" value="{$lang->cmd_next}" />
</div>
</form>
</div>
<!-- step 2. XML 파일 지정 -->
<div id="step2" style="display:none">
<form action="./" method="get" onsubmit="return doStep2(this)">
<input type="hidden" name="module_srl" value="" />
<input type="hidden" name="category_srl" value="" />
<div style="font-weight:bold">{$lang->import_step_title[2]}</div>
<div>{$lang->import_step_desc[2]}</div>
<div>
<input type="text" name="xml_file" value="./" />
<input type="submit" value="{$lang->cmd_next}" />
</div>
</form>
</div>
<!-- step 3. 회원 동기화 시작 버튼 -->
<div id="step3" style="display:none">
<div style="font-weight:bold">{$lang->import_step_title[3]}</div>
<div>{$lang->import_step_desc[3]}</div>
<div>
{$lang->msg_sync_member}
</div>
<div>
<input type="button" value="{$lang->cmd_sync_member}" />
</div>
</div>
<!-- final step. 진행 완료 또는 실패 메세지 -->
<div id="step_finish" style="display:none">
</div>

View file

@ -0,0 +1,86 @@
/**
* @file modules/importer/js/importer_admin.js
* @author zero (zero@nzeo.com)
* @brief importer에서 사용하는 javascript
**/
/* Step 1 처리 */
function completeStep1(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var next_step = ret_obj['next_step'];
var module_list = ret_obj['module_list'];
if(module_list) {
var sel = xGetElementById("target_module");
var module_list_arr = module_list.split("\n");
for(var i=0;i<module_list_arr.length;i++) {
var pos = module_list_arr[i].indexOf(',');
var value = module_list_arr[i].substr(0,pos);
var text = module_list_arr[i].substr(pos+1);
var opt_obj = new Option(text, value, true, true);
sel.options[sel.options.length] = opt_obj;
}
sel.selectedIndex = 0;
}
xGetElementById('step1').style.display = 'none';
xGetElementById('step'+next_step).style.display = 'block';
}
/* Step 1-2 모듈선택 처리 (카테고리 있으면 카테고리 선택으로, 아니면 바로 파일 업로드로) */
function completeStep12(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var next_step = ret_obj['next_step'];
var category_list = ret_obj['category_list'];
if(category_list) {
var sel = xGetElementById("target_category");
var category_list_arr = category_list.split("\n");
for(var i=0;i<category_list_arr.length;i++) {
var pos = category_list_arr[i].indexOf(',');
var value = category_list_arr[i].substr(0,pos);
var text = category_list_arr[i].substr(pos+1);
var opt_obj = new Option(text, value, true, true);
sel.options[sel.options.length] = opt_obj;
}
sel.selectedIndex = 0;
}
xGetElementById('step12').style.display = 'none';
xGetElementById('step'+next_step).style.display = 'block';
}
/* Step 1-3 카테고리 선택후 파일 업로드 보여주기 */
function doStep13(fo_obj) {
xGetElementById('step13').style.display = 'none';
xGetElementById('step2').style.display = 'block';
return false;
}
/* Step 2 XML파일을 입력받아서 처리~ */
function doStep2(fo_obj) {
var sel_module = xGetElementById("target_module");
if(sel_module.options.length>0) {
var module_srl = sel_module.options[sel_module.selectedIndex].value;
fo_obj.module_srl.value = module_srl;
}
var sel_category = xGetElementById("target_category");
if(sel_category.options.length>1) {
var category_srl = sel_category.options[sel_category.selectedIndex].value;
fo_obj.category_srl.value = category_srl;
}
procFilter(fo_obj, import_xml);
return false;
}
/* Step Complete Import */
function completeImport(ret_obj) {
alert(ret_obj["message"]);
location.href = location.href;
}