xe타운 1년 개근을 다짐하고 잘하고 있다고 생각했는데... 오늘 살표보니 7월 13일 하루 출석을 빼먹었네요 ㅠㅠ
하루 빼먹은것을 모르고 개근이라고 생각하고 있었네요 ㅎㅎㅎ
기념으로 출석부 로딩 속도를 향샹할 수 있는 방법이 있을까 소스를 조금 살펴봤습니다.
1. 출석부(7.0.3)의 기본 스킨을 살펴봤습니다.
2. 저는 xe전문가(?)가 아닙니다. 해결방법이 아니라 참고정도로만 생각하세요.-
사용자의 출결 상황을 로딩할때 db로 쿼리 날리는 횟수가 너무 많은것을 발견했습니다.
일별로 하나씩 쿼리를 날려서 해당일자에 사용자가 출석했는지 체크를 해서 화면에 표시합니다.
이번달(7월)은 31일까지 있으므로 로딩할때마다 총 31번의 쿼리를 날리게 됩니다. 이는 때에따라 db에 상당한 부하를 가할 수 있습니다.
이를 한번의 쿼리로 사용자의 출석 일자를 모두 불러온 후 php단에서 출결을 체크 하도록 변경 해 봤습니다.
나름 기존의 코드 변경을 최소화 하는 방법을 생각해 봤습니다.
1. attendance/queries폴더에 getIsCheckedM.xml을 추가 합니다. 내용은 아래와 같습니다.
<query id="getIsCheckedM" action="select"> <tables> <table name="attendance" /> </tables> <columns> <column name="regdate" /> </columns> <conditions> <condition operation="equal" column="member_srl" var="member_srl" pipe="and"/> <condition operation="like_prefix" column="regdate" var="day" pipe="and" /> </conditions> </query>
2. attendance폴더 아래의 attendance.model.php파일에 아래의 펑션을 추가합니다.
function getIsCheckedM($member_srl, $today) { $arg = new stdClass(); $arg->day = $today; $arg->member_srl = $member_srl; $output = executeQueryArray('attendance.getIsCheckedM',$arg); $q_result = array(); foreach ($output->data as $value) { $q_result[] = substr($value->regdate, 0, 8); } return array_count_values($q_result); }
3. attendance/skins/default 폴더아래 list.html을 열어서 아래를 참고해서 수정합니다.
<table cellspacing="0" class="listTable" width="100%"> {@$_day=1} {@$j=0} {@$check_month = sprintf("%s%s",$admin_date_info->_year,$admin_date_info->_month)} {@$checkedM = $oAttendanceModel->getIsCheckedM($logged_info->member_srl, $check_month)} <!--@while($_day <= $admin_date_info->day_max)--> <!--@if($j%40 == 0)--><tr><!--@end--> <!--@while($j <= $admin_date_info->week_start)-->{@$j++}<!--@end--> <td height="35px;" <!--@if(sprintf('%04d%02d%02d',$admin_date_info->_year,$admin_date_info->_month,$_day) > date('Ymd'))-->class="stamp1"<!--@else-->class="stamp"<!--@end--> > {@$check_date = sprintf("%s%s%02d",$admin_date_info->_year,$admin_date_info->_month,$_day)} {@$checked = $checkedM[$check_date]} <!--@if($checked == 1 && $is_logged)-->
11, 12라인 추가
18번 라인 {@$checked = $oAttendanceModel->getIsCheckedA($logged_info->member_srl, $check_date)} 을 위의 코드로 변경.