본문으로 건너뛰기

상품 리스트 및 상품 가격 관리 정렬 기능 개선.

PHP 7 · GODO25
변경 파일 수: 4개
변경 파일 목록
4
변경 파일 코드
추가삭제
Component/Database/DBTableField.php+1-1
변경 전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
 
Component/Goods/GoodsAdmin.php+67-5
변경 전GoodsAdmin.php
 
const DEFAULT_STORAGE = ['local', 'obs'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* 생성자
*/
$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 ';
}
 
 
 
 
 
} 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 (' . implode(',', $getValue['goodsNo']) . ')';
}
 
$strSQL = ' SELECT COUNT(g.goodsNo) AS cnt FROM ' . $this->goodsTable . ' as g WHERE ' . 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 DEFAULT_STORAGE = ['local', 'obs'];
 
// 정렬 SQL 인젝션 방지용 화이트리스트 (관리자 상품 리스트 정렬 옵션)
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)
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 ';
}
}
 
// --- 정렬 설정 (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 (' . implode(',', array_map('intval', $getValue['goodsNo'])) . ')';
}
 
$strSQL = ' SELECT COUNT(g.goodsNo) AS cnt FROM ' . $this->goodsTable . ' as g WHERE ' . 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'];
}
 
 
Controller/Admin/Goods/GoodsBatchPriceController.php+14-12
변경 전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);
 
Controller/Admin/Goods/GoodsPsController.php+10-2
변경 전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;