/**
  * @brief 포인트 설정
  **/
 function setPoint($member_srl, $point, $mode = null)
 {
     $member_srl = abs($member_srl);
     $mode_arr = array('add', 'minus', 'update', 'signup');
     if (!$mode || !in_array($mode, $mode_arr)) {
         $mode = 'update';
     }
     // 설정 정보 가져오기
     $oMemberModel =& getModel('member');
     $oModuleModel =& getModel('module');
     $oPointModel =& getModel('point');
     $config = $oModuleModel->getModuleConfig('point');
     // 기존 포인트 정보를 구함
     $prev_point = $oPointModel->getPoint($member_srl, true);
     $prev_level = $oPointModel->getLevel($prev_point, $config->level_step);
     // 포인트 변경
     $args->member_srl = $member_srl;
     $args->point = $prev_point;
     switch ($mode) {
         case 'add':
             $args->point += $point;
             break;
         case 'minus':
             $args->point -= $point;
             break;
         case 'update':
             $args->point = $point;
             break;
         case 'signup':
             $args->point = $point;
             break;
     }
     if ($args->point < 0) {
         $args->point = 0;
     }
     $point = $args->point;
     // 포인트가 있으면 update, 없으면 insert
     $oPointModel =& getModel('point');
     if ($oPointModel->isExistsPoint($member_srl)) {
         executeQuery("point.updatePoint", $args);
     } else {
         executeQuery("point.insertPoint", $args);
     }
     // 새로운 레벨을 구함
     $level = $oPointModel->getLevel($point, $config->level_step);
     // 기존 레벨과 새로운 레벨이 다르면 포인트 그룹 설정 시도
     if ($level != $prev_level) {
         // 현재 포인트 대비하여 레벨을 계산하고 레벨에 맞는 그룹 설정을 체크
         $point_group = $config->point_group;
         // 포인트 그룹 정보가 있을때 시행
         if ($point_group && is_array($point_group) && count($point_group)) {
             // 기본 그룹을 구함
             $default_group = $oMemberModel->getDefaultGroup();
             // 제거될 그룹과 새로 부여 받을 그룹을 구함
             $del_group_list = array();
             $new_group_srls = array();
             asort($point_group);
             // 포인트 그룹 설정을 돌면서 현재 레벨까지 체크
             foreach ($point_group as $group_srl => $target_level) {
                 if ($config->group_reset != 'N') {
                     $del_group_list[] = $group_srl;
                 }
                 if ($target_level <= $level) {
                     $new_group_srls[] = $group_srl;
                 }
             }
             // 만약 새로운 그룹이 없다면 기본 그룹을 부여 받음
             if (!$new_group_srls[0]) {
                 $new_group_srls[0] = $default_group->group_srl;
             }
             // 연동 그룹 제거
             if ($config->group_reset != 'N' && $del_group_list && count($del_group_list)) {
                 $del_group_args->member_srl = $member_srl;
                 $del_group_args->group_srl = implode(',', $del_group_list);
                 $del_group_output = executeQuery('point.deleteMemberGroup', $del_group_args);
             }
             // 새로운 그룹을 부여
             foreach ($new_group_srls as $group_srl) {
                 $new_group_args->member_srl = $member_srl;
                 $new_group_args->group_srl = $group_srl;
                 executeQuery('member.addMemberToGroup', $new_group_args);
             }
         }
     }
     // 캐시 설정
     $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl));
     FileHandler::makedir($cache_path);
     $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl);
     FileHandler::writeFile($cache_filename, $point);
     return $output;
 }
Example #2
0
 /**
  * @brief Set points
  */
 function setPoint($member_srl, $point, $mode = null)
 {
     $member_srl = abs($member_srl);
     $mode_arr = array('add', 'minus', 'update', 'signup');
     if (!$mode || !in_array($mode, $mode_arr)) {
         $mode = 'update';
     }
     // Get configuration information
     $oMemberModel = getModel('member');
     $oModuleModel = getModel('module');
     $oPointModel = getModel('point');
     $config = $oModuleModel->getModuleConfig('point');
     // Get the default configuration information
     $current_point = $oPointModel->getPoint($member_srl, true);
     $current_level = $oPointModel->getLevel($current_point, $config->level_step);
     // Change points
     $args = new stdClass();
     $args->member_srl = $member_srl;
     $args->point = $current_point;
     switch ($mode) {
         case 'add':
             $args->point += $point;
             break;
         case 'minus':
             $args->point -= $point;
             break;
         case 'update':
         case 'signup':
             $args->point = $point;
             break;
     }
     if ($args->point < 0) {
         $args->point = 0;
     }
     $point = $args->point;
     // Call a trigger (before)
     $trigger_obj = new stdClass();
     $trigger_obj->member_srl = $args->member_srl;
     $trigger_obj->mode = $mode;
     $trigger_obj->current_point = $current_point;
     $trigger_obj->current_level = $current_level;
     $trigger_obj->set_point = $point;
     $trigger_output = ModuleHandler::triggerCall('point.setPoint', 'before', $trigger_obj);
     if (!$trigger_output->toBool()) {
         return $trigger_output;
     }
     // begin transaction
     $oDB =& DB::getInstance();
     $oDB->begin();
     // If there are points, update, if no, insert
     $oPointModel = getModel('point');
     if ($oPointModel->isExistsPoint($member_srl)) {
         executeQuery("point.updatePoint", $args);
     } else {
         executeQuery("point.insertPoint", $args);
     }
     // Get a new level
     $level = $oPointModel->getLevel($point, $config->level_step);
     // If existing level and a new one are different attempt to set a point group
     if ($level != $current_level) {
         // Check if the level, for which the current points are prepared, is calculate and set the correct group
         $point_group = $config->point_group;
         // If the point group exists
         if ($point_group && is_array($point_group) && count($point_group)) {
             // Get the default group
             $default_group = $oMemberModel->getDefaultGroup();
             // Get the removed group and the newly granted group
             $del_group_list = array();
             $new_group_list = array();
             asort($point_group);
             // Reset group after initialization
             if ($config->group_reset != 'N') {
                 // If the new level is in the right group
                 if (in_array($level, $point_group)) {
                     // Delete all groups except the one which the current level belongs to
                     foreach ($point_group as $group_srl => $target_level) {
                         $del_group_list[] = $group_srl;
                         if ($target_level == $level) {
                             $new_group_list[] = $group_srl;
                         }
                     }
                 } else {
                     $i = $level;
                     while ($i > 0) {
                         if (in_array($i, $point_group)) {
                             foreach ($point_group as $group_srl => $target_level) {
                                 if ($target_level == $i) {
                                     $new_group_list[] = $group_srl;
                                 }
                             }
                             $i = 0;
                         }
                         $i--;
                     }
                 }
                 // Delete the group of a level which is higher than the current level
                 foreach ($point_group as $group_srl => $target_level) {
                     if ($target_level > $level) {
                         $del_group_list[] = $group_srl;
                     }
                 }
                 $del_group_list[] = $default_group->group_srl;
             } else {
                 // Check until the current level by rotating setting the configurations of the point groups
                 foreach ($point_group as $group_srl => $target_level) {
                     $del_group_list[] = $group_srl;
                     if ($target_level <= $level) {
                         $new_group_list[] = $group_srl;
                     }
                 }
             }
             // If there is no a new group, granted the default group
             if (!$new_group_list[0]) {
                 $new_group_list[0] = $default_group->group_srl;
             }
             // Remove linkage group
             if ($del_group_list && count($del_group_list)) {
                 $del_group_args = new stdClass();
                 $del_group_args->member_srl = $member_srl;
                 $del_group_args->group_srl = implode(',', $del_group_list);
                 $del_group_output = executeQuery('point.deleteMemberGroup', $del_group_args);
             }
             // Grant a new group
             foreach ($new_group_list as $group_srl) {
                 $new_group_args = new stdClass();
                 $new_group_args->member_srl = $member_srl;
                 $new_group_args->group_srl = $group_srl;
                 executeQuery('member.addMemberToGroup', $new_group_args);
             }
         }
     }
     // Call a trigger (after)
     $trigger_obj->new_group_list = $new_group_list;
     $trigger_obj->del_group_list = $del_group_list;
     $trigger_obj->new_level = $level;
     $trigger_output = ModuleHandler::triggerCall('point.setPoint', 'after', $trigger_obj);
     if (!$trigger_output->toBool()) {
         $oDB->rollback();
         return $trigger_output;
     }
     $oDB->commit();
     // Cache Settings
     $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl));
     FileHandler::makedir($cache_path);
     $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl);
     FileHandler::writeFile($cache_filename, $point);
     $oCacheHandler = CacheHandler::getInstance('object', null, true);
     if ($new_group_list && $del_group_list && $oCacheHandler->isSupport()) {
         $object_key = 'member_groups:' . getNumberingPath($member_srl) . $member_srl . '_0';
         $cache_key = $oCacheHandler->getGroupKey('member', $object_key);
         $oCacheHandler->delete($cache_key);
     }
     $oCacheHandler = CacheHandler::getInstance('object');
     if ($new_group_list && $del_group_list && $oCacheHandler->isSupport()) {
         $object_key = 'member_info:' . getNumberingPath($member_srl) . $member_srl;
         $cache_key = $oCacheHandler->getGroupKey('member', $object_key);
         $oCacheHandler->delete($cache_key);
     }
     return $output;
 }