이 부분은 다음 패치에 기본 스킨에 적용할 내용입니다.

이 팁은 기본스킨을 기준으로 여러분들에게 제공하는 팁이기 때문에 스킨마다 파일의 구조가 매우 많이 아주 딥딥딥 개 쩔게 틀리다는걸 유염하시고 인지해주셨으면 좋겠습니다..

 

자 일딴 해당 이슈에 대해서 문제점이 발생하는 원인부터 한번 알아보면..

사실 출석부에서는 정말 견고한 작업을 통해서 인설트 작업을 시작하게 됩니다.

function procAttendanceInsertAttendance()
{
   $today = zDate(date('YmdHis'),"Ymd");

   if($_SESSION['is_attended'] == $today)
   {
      return new Object(-1,'attend_already_checked');
   }

   $_SESSION['is_attended'] = $today;

   /*attendance model 객체 생성*/
   $oAttendanceModel = getModel('attendance');

   $logged_info = Context::get('logged_info');
   $member_srl = $logged_info->member_srl;

   $config = $oAttendanceModel->getConfig();

   //관리자 출석이 허가가 나지 않았다면,
   if($config->about_admin_check != 'yes' && $logged_info->is_admin == 'Y')
   {
      $_SESSION['is_attended'] = 0;
      return new Object(-1, '관리자는 출석할 수 없습니다.');
   }

   /*출석이 되어있는지 확인 : 오늘자 로그인 회원의 DB기록 확인*/
   if($oAttendanceModel->getIsChecked($logged_info->member_srl)>0)
   {
      $_SESSION['is_attended'] = 0;
      return new Object(-1, 'attend_already_checked');
   }

   $is_logged = Context::get('is_logged');
   if(!$is_logged)
   {
      return new Object(-1,'로그인 사용자만 출석 할 수 있습니다.');
   }
   if($oAttendanceModel->getIsChecked($logged_info->member_srl) > 0 && $oAttendanceModel->availableCheck($config) != 0)
   {
      return new Object(-1, '일시적인 오류로 출석 할 수 없습니다.');
   }

   //ip중복 횟수 확인
   $ip_count = $oAttendanceModel->getDuplicateIpCount($today, $_SERVER['REMOTE_ADDR']);
   if($ip_count >= $config->allow_duplicaton_ip_count)
   {
      $_SESSION['is_attended'] = 0;
      return new Object(-1, 'attend_allow_duplicaton_ip_count');
   }

   $g_obj = Context::getRequestVars();

   //인사말 필터링('#'시작문자 '^'시작문자 필터링)
   if(preg_match("/^\#/",$g_obj->greetings)) return new Object(-1, 'attend_greetings_error');

   $output = self::insertAttendance($g_obj, $config, $member_srl);

   if($output->toBool())
   {
      $this->setMessage('att_success');
   }
   else
   {
      return new Object(-1, '에러?');
   }

   if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON')))
   {
      $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', 'attendance');
      header('location: ' . $returnUrl);
      return;
   }
}

코드 소환!

세션, 회원인지 아닌지, 로그인 사용자면 이사람이 오늘 출석한 내역이 있는지부터 정말 많이 검사하고 꼼꼼하게 합니다.

그런대도 이런 문의가 올라오곤합니다.

https://xe1.xpressengine.com/index.php?mid=qna&search_target=title_content&search_keyword=%EC%B6%9C%EC%84%9D%EB%B6%80&document_srl=23113214

 

그럴때마다 추천하는건.. 써버좀! 바꾸세요! C... 아 아닙니다..

무겁게 제작된 출석부가 잘못이죠.. 암요암요..ㅠㅠ

 

사실.. 출석부가 무거운것보단 서버의 insert작업이 얼마나 늦게 적용되느냐도 가장 큰문제고, 연산읽어대는 횟수도 큰 문제점으로 작용하기도 합니다..ㅠㅠ

그래서 한꺼번에 출석하는 시간인 0시에 많은 사람들이 모여 출석을 하면 오히려 중복 액션이 취해졌다고 인식하여 출석이 되는경우가 있기도 하죠..

 

게다가 세션으로 모든 중복출석을 그나마 막아버리도록 했엇지만, 100프로 완벽하게 막아내지는 못하고 있고요..(그래서 예전에 쓴 방법이 필터를 이용한 방법이였던 것 같았는데 너무 구시대고 두번클릭하는 번거로움도 있어서..)

 

그래서 이걸 좀 색다른 방식으로 바꿔보자는 겁니다.

 

우선 출석부의 경우는 한번만 눌러도 여러분들이 우려하시는 정상적으로 출석이 안되는 경우가 나타날 가능성은 정말 없습니다. 연타하는 이유는 한가지입니다.. 

 

"의지의 인!" 빠름~ 빠름~

그렇기 때문에 우리는 당연히 연타를 하는것이 맞습니다. 출석하는 시간도 아까워 연타합니다.

그 마음 잘압니다...

그래서 그 연타하시는분에게 한번만 눌러주세요 라고 아무리 부탁해바짜.. 안먹힘ㅋ

 

그럼 우리가 바뀌어야 합니다.

 

방법이 어떤게 있을까 하고 몽실아빠님의 사이트를 둘러보다가 예전에 메모게시판에 글쓸때 등록중.. 이라고 하면서 등록버튼을 막아버리는 아주 참신한 js가 잇는걸 발견했습니다.

그래서 코드를 Ctrl+c !! 하고 말씀드렸더니.. 원작자 코노하님임..(하앍. XE공홈에 올리셧다고... 꿀팁 ㄳ)

아무튼 우리는 이 코드를 이용하여 기본스킨에서 출석시 출석을 하지 못하도록 할꺼임.

 

은 설명 귀찮으니 아래 코드 그대로 

xe/modules/attendance/skins/default/att.html 파일에 Ctrl+c -> Ctrl+v 하시길 바래용~

 

<div class="alert alert-warning">{$lang->attend_click_msg}</div>

<div class="x">
   <form action="./" method="post" id="click_button" style="text-align:center" class="write_author" ruleset="Attendanceinsert">
      <input type="hidden" name="mid" value="{$mid}" />
      <input type="hidden" name="act" value="procAttendanceInsertAttendance" />
      <input type="hidden" name="xe_validator_id" value="modules/attendance/skins/default/attendanceinsert" />


      <span class="input-append" style="width:100%; display:inline-block">

         <input type="text" name="greetings" id="greetings" style="width:50%; height:26px" value="{$greeting_name}" class="write_text" />
         <input type="hidden" name="about_position" value="yes" />



         <button type="submit" class="x_btn x_btn-inverse sm-btn" onclick="beCheckWrite(this)"><i class="fa fa-paw fa-2x"></i></button>
      </span>
   </form>
</div>

<script>
function beCheckWrite(obj){

   var delaytime = 10000,
         submingText = '출석중..',
         ori_text = '<i class="fa fa-paw fa-2x"></i>',
         checkInput = false;

   if(!ori_text){
      checkInput = false;
      ori_text = jQuery(obj).text();
   }else{
      checkInput = true;
   }


   if(ori_text == submingText) return false;


   //obj.disabled=true;


   if(!checkInput){
      jQuery(obj).text(submingText);
   }else{
      jQuery(obj).val(submingText);
   }

   // 설정한 시간이 지나면 다시 활성화
   setTimeout(function(){
      if(checkInput) jQuery(obj).val(ori_text);
      else jQuery(obj).text(ori_text);
   },delaytime);

   return true;
}
</script>

대략적으로 코드 설명을 하자면.. 출석하는 과정중에 출석버튼을 활성화하지 못하도록 막아버리는 행위입니다.

즉, 출석 버튼을 누르게 되면 "출석중..." 이라는 문구가 뜨게 되고, 해당 부분이 10초간 버튼이 먹통현상을 보이게 됩니다.(사실은 디시블~) 10초가 지나면 클릭을 가능한 상태로 원상복구 되고요...

아무튼 이런식으로 막아버리면됩니다.

람보

profile
람보입니다.
  • profile
    네 감사합니다. 적용해볼게요^^
  • profile
    출석부 기능을 조금 슬림하게, 직관적이게 해주셨으면 해요^^ 기능도 많고 좀 복잡하다는 생각이 들어서요
  • ?
    람보님 저거 att.html파일에 맨밑에 적으면되나요??
  • ? profile
    그대로 복사해서 att.html 파일에 있는 내용 전부 지우고 저걸로 대처하세요.
  • profile ?
    넵 감사합니다~
  • profile ?
    람보님 람보님꼐서 배포하신 출석부 7.0.1 잘 받았습니다. 출석부를 사용하고싶은데 모듈 설치까지는 했는데 출석부 추가하는방법을 잘 모르겠네요 ㅠㅠ