• 목록
  • 아래로
  • 위로

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();
	});
});

 

등을 추가했습니다.
문항 순서 변경을 위해 급하게 짜긴 했는데요.
일단 스킨단에서 무리없이 받아서 순서를 변경하는 데에는 성공할 수 있었습니다.

공유

facebooktwitterpinterestbandkakao story
퍼머링크

댓글 0

에디터