변경 파일 목록
총 4개
변경 파일 코드
추가삭제
변경 전DBTableField.php
| ['val' => 'naverFl', 'typ' => 's', 'def' => 'y', 'name' => '네이버쇼핑여부','batch'=>'y'], // 네이버수입및제작여부 | |
| ['val' => 'daumFl', 'typ' => 's', 'def' => 'y', 'name' => '다음쇼핑하우연동여부', 'batch'=>'y'], // 다음쇼핑하우연동여부 | |
| ['val' => 'paycoFl', 'typ' => 's', 'def' => 'y', 'name' => '페이코쇼핑여부','batch'=>'y'], // 페이코수입및제작여부 | |
| ['val' => 'modDt', 'typ' => 's', 'def' => null], // 수정일 | |
| ['val' => 'regDt', 'typ' => 's', 'def' => null], // 등록일 | |
| ]; | |
| // @formatter:on | |
변경 후DBTableField.php
| ['val' => 'naverFl', 'typ' => 's', 'def' => 'y', 'name' => '네이버쇼핑여부','batch'=>'y'], // 네이버수입및제작여부 | |
| ['val' => 'daumFl', 'typ' => 's', 'def' => 'y', 'name' => '다음쇼핑하우연동여부', 'batch'=>'y'], // 다음쇼핑하우연동여부 | |
| ['val' => 'paycoFl', 'typ' => 's', 'def' => 'y', 'name' => '페이코쇼핑여부','batch'=>'y'], // 페이코수입및제작여부 | |
| ['val' => 'modDt', 'typ' => 's', 'def' => null, 'batch'=>'y'], // 수정일 | |
| ['val' => 'regDt', 'typ' => 's', 'def' => null], // 등록일 | |
| ]; | |
| // @formatter:on | |
변경 전GoodsAdmin.php
| const EXCEL_FL = 'R'; | |
| /** | |
| * 생성자 | |
| */ | |
| $this->search['sortList'] = array( | |
| 'g.goodsNo desc' => __('등록일 ↓'), | |
| 'g.goodsNo asc' => __('등록일 ↑'), | |
| 'g.goodsNm asc' => __('상품명 ↓'), | |
| 'g.goodsNm desc' => __('상품명 ↑'), | |
| 'g.goodsPrice asc' => __('판매가 ↓'), | |
| $getValue = Request::get()->toArray(); | |
| gd_isset($getValue['delFl'], 'n'); | |
| // --- 정렬 설정 | |
| if ($getValue['delFl'] == 'y') { | |
| $sort = gd_isset($getValue['sort'], 'delDt desc , g.goodsNo desc'); | |
| if ($this->goodsDivisionFl) { | |
| $join[] = ' LEFT JOIN ' . DB_GOODS . ' as goods ON g.goodsNo = goods.goodsNo '; | |
| } | |
| } elseif ($getValue['parentFormID'] === 'regular_goods') { | |
| $sort = gd_isset($getValue['sort'], 'g.goodsNo desc'); | |
| $join[] = ' LEFT JOIN ' . DB_GOODS . ' as goods ON g.goodsNo = goods.goodsNo '; | |
| } elseif ($getValue['parentFormID'] === 'present') { | |
| $join[] = ' LEFT JOIN ' . DB_GOODS . ' AS goods ON g.goodsNo = goods.goodsNo '; | |
| $join[] = ' LEFT JOIN ' . DB_SCM_DELIVERY_BASIC . ' AS delivery ON delivery.sno = goods.deliverySno '; | |
| } else { | |
| $sort = gd_isset($getValue['sort'], 'g.goodsNo desc'); | |
| } | |
| $this->setSearchGoods($getValue); | |
| //상품 헤택 모듈 | |
| $getValue = Request::get()->toArray(); | |
| gd_isset($getValue['delFl'], 'n'); | |
| $sort = gd_isset($getValue['sort'], 'g.goodsNo desc'); | |
| $changeGoodsTableFl = false; | |
| if ($mode == 'restock') { | |
| if(empty($arrGoodsNo)) return true; | |
| $updateField = []; | |
| foreach(DBTableField::tableGoodsSearch() as $k => $v) { | |
| if($v['batch'] =='y') $updateField[] = 'gs.'.$v['val'].'='.'g.'.$v['val']; | |
| $this->setSearchGoods($getValue); | |
| if($getValue['goodsNo'] && is_array($getValue['goodsNo'])) { | |
| $this->arrWhere[] = 'goodsNo IN (' . gd_implode(',', $getValue['goodsNo']) . ')'; | |
| } | |
| $strSQL = ' SELECT COUNT(g.goodsNo) AS cnt FROM ' . $this->goodsTable . ' as g WHERE ' . gd_implode(' AND ', $this->arrWhere); | |
| $this->db->bind_param_push($arrBind['bind'], 'i', $goodsNo); | |
| $this->db->setModDtUse(true); | |
| $this->db->set_update_db(DB_GOODS, 'cateCd = ?', 'goodsNo = ?', $arrBind['bind']); | |
| unset($getLink); | |
| } | |
| } | |
| $this->db->bind_param_push($arrBind['bind'], 'i', $goodsNo); | |
| $this->db->setModDtUse(true); | |
| $return = $this->db->set_update_db(DB_GOODS, $arrBind['param'], 'goodsNo = ?', $arrBind['bind']); | |
| unset($arrBind, $goodsData); | |
| return $return; | |
| } | |
| unset($arrBind); | |
| } | |
| return $arrData['applyFl']; | |
| } | |
변경 후GoodsAdmin.php
| const EXCEL_FL = 'R'; | |
| // 정렬 SQL 인젝션 방지용 화이트리스트 (관리자 상품 리스트 정렬 옵션) | |
| protected const SORT_ALLOW_LIST = [ | |
| 'g.goodsNo desc', 'g.goodsNo asc', | |
| 'g.modDt desc', 'g.modDt asc', | |
| 'g.goodsNm asc', 'g.goodsNm desc', | |
| 'g.goodsPrice asc', 'g.goodsPrice desc', | |
| 'companyNm asc', 'companyNm desc', | |
| 'g.makerNm asc', 'g.makerNm desc', | |
| 'g.orderGoodsCnt desc', | |
| 'g.hitCnt desc', | |
| 'orderRate desc', | |
| 'g.cartCnt desc', | |
| 'g.wishCnt desc', | |
| 'g.reviewCnt desc', | |
| 'delDt desc, g.goodsNo desc', | |
| 'delDt asc', | |
| ]; | |
| // 정렬 SQL 인젝션 방지용 화이트리스트 (관리자 상품 일괄처리 리스트 - getAdminListBatch) | |
| protected const SORT_ALLOW_LIST_BATCH = [ | |
| 'g.goodsNo desc', 'g.goodsNo asc', | |
| 'g.modDt desc', 'g.modDt asc', | |
| 'goodsNm asc', 'goodsNm desc', | |
| 'companyNm asc', 'companyNm desc', | |
| 'goodsPrice asc', 'goodsPrice desc', | |
| 'fixedPrice asc', 'fixedPrice desc', | |
| 'costPrice asc', 'costPrice desc', | |
| ]; | |
| /** | |
| * 생성자 | |
| */ | |
| $this->search['sortList'] = array( | |
| 'g.goodsNo desc' => __('등록일 ↓'), | |
| 'g.goodsNo asc' => __('등록일 ↑'), | |
| 'g.modDt desc' => __('수정일 ↓'), | |
| 'g.modDt asc' => __('수정일 ↑'), | |
| 'g.goodsNm asc' => __('상품명 ↓'), | |
| 'g.goodsNm desc' => __('상품명 ↑'), | |
| 'g.goodsPrice asc' => __('판매가 ↓'), | |
| $getValue = Request::get()->toArray(); | |
| gd_isset($getValue['delFl'], 'n'); | |
| // --- 검색 설정 보조 JOIN | |
| if ($getValue['delFl'] == 'y') { | |
| if ($this->goodsDivisionFl) { | |
| $join[] = ' LEFT JOIN ' . DB_GOODS . ' as goods ON g.goodsNo = goods.goodsNo '; | |
| } | |
| } elseif ($getValue['parentFormID'] === 'regular_goods') { | |
| $join[] = ' LEFT JOIN ' . DB_GOODS . ' as goods ON g.goodsNo = goods.goodsNo '; | |
| } elseif ($getValue['parentFormID'] === 'present') { | |
| $join[] = ' LEFT JOIN ' . DB_GOODS . ' AS goods ON g.goodsNo = goods.goodsNo '; | |
| $join[] = ' LEFT JOIN ' . DB_SCM_DELIVERY_BASIC . ' AS delivery ON delivery.sno = goods.deliverySno '; | |
| } | |
| // --- 정렬 설정 (SQL 인젝션 방지 - 사용자 입력은 화이트리스트만 허용) | |
| if (isset($getValue['sort']) && in_array($getValue['sort'], self::SORT_ALLOW_LIST, true)) { | |
| $sort = $getValue['sort']; | |
| } else { | |
| $sort = ($getValue['delFl'] == 'y') ? 'delDt desc, g.goodsNo desc' : 'g.goodsNo desc'; | |
| } | |
| // 수정일 정렬 시 NULL 처리 - 등록일로 대체, 페이징 안정화 보조정렬 | |
| if (preg_match('/^g\.modDt\s+(asc|desc)$/i', $sort, $m)) { | |
| $sort = "COALESCE(g.modDt, g.regDt) {$m[1]}, g.goodsNo desc"; | |
| } | |
| $this->setSearchGoods($getValue); | |
| //상품 헤택 모듈 | |
| $getValue = Request::get()->toArray(); | |
| gd_isset($getValue['delFl'], 'n'); | |
| // 정렬 설정 (SQL 인젝션 방지 - 사용자 입력은 화이트리스트만 허용) | |
| if (isset($getValue['sort']) && in_array($getValue['sort'], self::SORT_ALLOW_LIST_BATCH, true)) { | |
| $sort = $getValue['sort']; | |
| } else { | |
| $sort = 'g.goodsNo desc'; | |
| } | |
| $changeGoodsTableFl = false; | |
| if ($mode == 'restock') { | |
| if(empty($arrGoodsNo)) return true; | |
| // goodsNo 는 정수 전용 식별자 → IN 절 SQL 인젝션 방어 (sink 지점에서 일괄 정수화) | |
| $arrGoodsNo = array_map('intval', $arrGoodsNo); | |
| $updateField = []; | |
| foreach(DBTableField::tableGoodsSearch() as $k => $v) { | |
| if($v['batch'] =='y') $updateField[] = 'gs.'.$v['val'].'='.'g.'.$v['val']; | |
| $this->setSearchGoods($getValue); | |
| if($getValue['goodsNo'] && is_array($getValue['goodsNo'])) { | |
| $this->arrWhere[] = 'goodsNo IN (' . gd_implode(',', array_map('intval', $getValue['goodsNo'])) . ')'; | |
| } | |
| $strSQL = ' SELECT COUNT(g.goodsNo) AS cnt FROM ' . $this->goodsTable . ' as g WHERE ' . gd_implode(' AND ', $this->arrWhere); | |
| $this->db->bind_param_push($arrBind['bind'], 'i', $goodsNo); | |
| $this->db->setModDtUse(true); | |
| $this->db->set_update_db(DB_GOODS, 'cateCd = ?', 'goodsNo = ?', $arrBind['bind']); | |
| // es_goodsSearch 동기화 | |
| if ($this->goodsDivisionFl) { | |
| $this->updateGoodsSearch([$goodsNo]); | |
| } | |
| unset($getLink); | |
| } | |
| } | |
| $this->db->bind_param_push($arrBind['bind'], 'i', $goodsNo); | |
| $this->db->setModDtUse(true); | |
| $return = $this->db->set_update_db(DB_GOODS, $arrBind['param'], 'goodsNo = ?', $arrBind['bind']); | |
| // es_goodsSearch 동기화 | |
| if ($this->goodsDivisionFl) { | |
| $this->updateGoodsSearch([$goodsNo]); | |
| } | |
| unset($arrBind, $goodsData); | |
| return $return; | |
| } | |
| unset($arrBind); | |
| } | |
| // es_goodsSearch 동기화 | |
| if ($this->goodsDivisionFl) { | |
| $this->updateGoodsSearch($arrGoodsNo, $getData['modDtUse']); | |
| } | |
| return $arrData['applyFl']; | |
| } | |
변경 전GoodsBatchPriceController.php
| //정렬 재정의 | |
| $getData['search']['sortList'] = array( | |
| 'g.goodsNo desc' => sprintf(__('등록일 %1$s'), '↓'), | |
| 'g.goodsNo asc' => sprintf(__('등록일 %1$s'), '↑'), | |
| 'goodsNm asc' => sprintf(__('상품명 %1$s'), '↓'), | |
| 'goodsNm desc' => sprintf(__('상품명 %1$s'), '↑'), | |
| 'companyNm asc' => sprintf(__('공급사 %1$s'), '↓'), | |
| 'companyNm desc' => sprintf(__('공급사 %1$s'), '↑'), | |
| 'fixedPrice asc' => sprintf(__('정가 %1$s'), '↓'), | |
| 'fixedPrice desc' => sprintf(__('정가 %1$s'), '↑'), | |
| 'costPrice asc' => sprintf(__('매입가 %1$s'), '↓'), | |
| 'costPrice desc' => sprintf(__('매입가 %1$s'), '↑'), | |
| 'goodsPrice asc' => sprintf(__('판매가 %1$s'), '↓'), | |
| 'goodsPrice desc' => sprintf(__('판매가 %1$s'), '↑'), | |
| ); | |
| $this->setData('goods', $goods); | |
변경 후GoodsBatchPriceController.php
| //정렬 재정의 | |
| $getData['search']['sortList'] = array( | |
| 'g.goodsNo desc' => __('등록일 ↓'), | |
| 'g.goodsNo asc' => __('등록일 ↑'), | |
| 'g.modDt desc' => __('수정일 ↓'), | |
| 'g.modDt asc' => __('수정일 ↑'), | |
| 'goodsNm asc' => __('상품명 ↓'), | |
| 'goodsNm desc' => __('상품명 ↑'), | |
| 'companyNm asc' => __('공급사 ↓'), | |
| 'companyNm desc' => __('공급사 ↑'), | |
| 'fixedPrice asc' => __('정가 ↓'), | |
| 'fixedPrice desc' => __('정가 ↑'), | |
| 'costPrice asc' => __('매입가 ↓'), | |
| 'costPrice desc' => __('매입가 ↑'), | |
| 'goodsPrice asc' => __('판매가 ↓'), | |
| 'goodsPrice desc' => __('판매가 ↑'), | |
| ); | |
| $this->setData('goods', $goods); | |
변경 전GoodsPsController.php
| // 상품리스트 메모 저장하기(그리드) | |
| case 'goods_list_memo' : | |
| try { | |
| if ($goods->getGoodsListAdminMemo($postValue['goodsNo'], $postValue['adminMemo'], 'update')) { | |
| $this->layer(__('정상적으로 저장 되었습니다.')); | |
| } | |
| } catch (Exception $e) { | |
| throw new LayerNotReloadException($e->getMessage()); | |
| } | |
| break; | |
| // 상품리스트 선택 조회항목 삭제하기 | |
| case 'goods_list_add_grid_del' : | |
| try { | |
| // 조회항목 | |
| if ($goods->goodsListDisplayEachDelete($postValue)) { | |
| echo true; | |
| } | |
| } catch (Exception $e) { | |
| throw new LayerNotReloadException($e->getMessage()); | |
| } | |
| break; | |
변경 후GoodsPsController.php
| // 상품리스트 메모 저장하기(그리드) | |
| case 'goods_list_memo' : | |
| try { | |
| \DB::begin_tran(); | |
| $result = $goods->getGoodsListAdminMemo($postValue['goodsNo'], $postValue['adminMemo'], 'update'); | |
| \DB::commit(); | |
| if ($result) { | |
| $this->layer(__('정상적으로 저장 되었습니다.')); | |
| } | |
| } catch (Exception $e) { | |
| \DB::rollback(); | |
| throw new LayerNotReloadException($e->getMessage()); | |
| } | |
| break; | |
| // 상품리스트 선택 조회항목 삭제하기 | |
| case 'goods_list_add_grid_del' : | |
| try { | |
| \DB::begin_tran(); | |
| // 조회항목 | |
| $result = $goods->goodsListDisplayEachDelete($postValue); | |
| \DB::commit(); | |
| if ($result) { | |
| echo true; | |
| } | |
| } catch (Exception $e) { | |
| \DB::rollback(); | |
| throw new LayerNotReloadException($e->getMessage()); | |
| } | |
| break; | |