- 0
- 아포리아
- 조회 수 95
5/23
[기능] 문제 순서 변경을 위한 함수 및 액션 추가
중요한 기능 중에 하나가 시험지의 출제 문제 순서 변경이라고 생각합니다.
그래서 스킨에서 문제의 순서를 바꾸려고 시도를 해봤는데,
인접한 두 문제의 question_srl과 list_order를 놔두고 나머지 칼럼 데이터를 바꿔치기 하는 것말고는 별다른 방도가 없을 것 같습니다.
게시판 모듈의 확장변수처럼 document_srl을 공유하는 문항들에 idx를 별도 칼럼으로 두는 것도 좋겠지만, 그 또한 스키마 변경 및 그에 따르는 작업량이 만만치 않을 것 같더라구요ㅜ
그래서 문제의 순서를 변경할 수 있는 exam.controller.php에 별도의 함수를 작성하고 module.xml에도 관련 액션을 추가해서, 스킨단에서 exec_json으로 해당 기능을 구현해봤습니다.
exam.controller.php의 354행쯤부터...
/**
* @brief 시험지에 문제 순서 변경 처리
*/
public function procExamQuestionSwap()
{
// 권한 체크
if($this->module_info->module != "exam")
{
return $this->makeObject(-1, "msg_invalid_request");
}
if (!$this->grant->create)
{
return $this->makeObject(-1, 'msg_not_permitted');
}
$oExamModel = getModel('exam');
// question_srl으로 문제정보도 체크
$question_srl = Context::get('question_srl');
$_questionitem = $oExamModel->getQuestion($question_srl);
// targeted_srl으로 순서를 바꿀 문제정보도 체크
$targeted_srl = Context::get('targeted_srl');
$_targeteditem = $oExamModel->getQuestion($targeted_srl);
$args = new StdClass();
$args->question_srl = $question_srl;
$args->question_level = $_targeteditem->get('question_level');
$args->question_type = $_targeteditem->get('question_type');
$args->title = $_targeteditem->get('title');
$args->content = $_targeteditem->get('content');
$args->answer = $_targeteditem->get('answer');
for ( $i = 1; $i <= 5; $i++ )
{
$args->{'answer'.$i} = $_targeteditem->get('answer'.$i);
}
$args->answer_check_type = $_targeteditem->get('answer_check_type');
$args->use_description = $_targeteditem->get('use_description');
$args->description_title = $_targeteditem->get('description_title');
$args->description = $_targeteditem->get('description');
$args->regdate = $_targeteditem->get('regdate');
$args->ipaddress = $_targeteditem->get('ipaddress');
$args->status = $_targeteditem->get('status');
$args->point = $_targeteditem->get('point');
$output = $this->updateQuestion($args);
$args = new StdClass();
$args->question_srl = $targeted_srl;
$args->question_level = $_questionitem->get('question_level');
$args->question_type = $_questionitem->get('question_type');
$args->title = $_questionitem->get('title');
$args->content = $_questionitem->get('content');
$args->answer = $_questionitem->get('answer');
for ( $i = 1; $i <= 5; $i++ )
{
$args->{'answer'.$i} = $_questionitem->get('answer'.$i);
}
$args->answer_check_type = $_questionitem->get('answer_check_type');
$args->use_description = $_questionitem->get('use_description');
$args->description_title = $_questionitem->get('description_title');
$args->description = $_questionitem->get('description');
$args->regdate = $_questionitem->get('regdate');
$args->ipaddress = $_questionitem->get('ipaddress');
$args->status = $_questionitem->get('status');
$args->point = $_questionitem->get('point');
$output = $this->updateQuestion($args);
}
그리고 module.xml의 35행쯤에
<action name="procExamQuestionSwap" type="controller" />
_paper_edit.html 의 문항 반복문 내 적당한 곳에...
<a href="#" cond="$no !== 1" data-ssrl="{$qitem->question_srl}" data-tsrl="{$examitem->getQuestions()[$no-1]->question_srl}" class="exam_btn btn_close question_swap"><i class="xi-angle-up"></i></a>
<a href="#" cond="$no !== $examitem->getQuestionCount()" data-ssrl="{$qitem->question_srl}" data-tsrl="{$examitem->getQuestions()[$no+1]->question_srl}" class="exam_btn btn_close question_swap"><i class="xi-angle-down"></i></a>
exam.js 에서 클릭 이벤트 처리
// 문제 순서 변경 이벤트
$(document).on('click', 'a.question_swap', function(event) {
event.preventDefault();
var selected_srl = $(this).data('ssrl');
var targeted_srl = $(this).data('tsrl');
if ( !selected_srl || !targeted_srl ) return;
if ( !confirm('문제의 순서를 변경하시겠습니까?') ) return;
var params = {
selected_srl : selected_srl,
targeted_srl : targeted_srl
};
exec_json('exam.procExamQuestionSwap', params, function(ret_obj) {
location.reload();
});
});
등을 추가했습니다.
문항 순서 변경을 위해 급하게 짜긴 했는데요.
일단 스킨단에서 무리없이 받아서 순서를 변경하는 데에는 성공할 수 있었습니다.