쇼핑몰에서 가장 중요한것중 하나가 카테고리다. 종합쇼핑몰이나 단순 쇼핑몰이나 모두 카테고리는 중요하다. 여기선 대분류 중분류 소분류로 해서 3단계의 카테고리 관리를 작업해보도록 하자.
우선 테이블을 만든다.
CREATE TABLE `category` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(10) DEFAULT NULL,
`pcode` varchar(10) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`step` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
INSERT INTO category (code,pcode,name,step) VALUES
('A0001',NULL,'컴퓨터',1),
('B0001','A0001','노트북',2),
('C0001','B0001','게임용',3);
이 강좌는 게시판만들기 강좌의 연장선상에 있다. "php+mysql 게시판 만들기 강좌"를 마치고 나서 진행하도록 하자.
소스를 짜 보자. 이번엔 /admin/product/에서 작업한다.
/admin/product/category.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$query="select * from category where step=1";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$cate1[]=$rs;
}
?>
<div style="margin-top:20px;">
<form class="row g-3">
<div class="col-md-4">
<select class="form-select" name="cate1" id="cate1" aria-label="Default select example">
<option value="">대분류</option>
<?php
foreach($cate1 as $c){
?>
<option value="<?php echo $c->code;?>"><?php echo $c->name;?></option>
<?php }?>
</select>
</div>
<div class="col-md-4">
<select class="form-select" name="cate2" id="cate2" aria-label="Default select example">
<option value="">중분류</option>
</select>
</div>
<div class="col-md-4">
<select class="form-select" name="cate3" id="cate3" aria-label="Default select example">
<option value="">소분류</option>
</select>
</div>
</form>
</div>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
대분류만 가져와서 select에 보여준다. 그다음에 대분류 중에 하나를 선택하면 대분류 하위의 중분류를 보여준다. 또 중분류를 선택하면 중분류 하위의 소분류를 보여준다. 이때는 ajax를 이용한다.
대분류에서 컴퓨터를 선택하면 중분류에 리스트가 나타나고 중분류에서 분류를 선택하면 다시 소분류에 나타나는 ajax작업을 해보자
/admin/product/category.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$query="select * from category where step=1";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$cate1[]=$rs;
}
?>
<div style="margin-top:20px;">
<form class="row g-3">
<div class="col-md-4">
<select class="form-select" name="cate1" id="cate1" aria-label="Default select example">
<option value="">대분류</option>
<?php
foreach($cate1 as $c){
?>
<option value="<?php echo $c->code;?>"><?php echo $c->name;?></option>
<?php }?>
</select>
</div>
<div class="col-md-4">
<select class="form-select" name="cate2" id="cate2" aria-label="Default select example">
<option value="">중분류</option>
</select>
</div>
<div class="col-md-4">
<select class="form-select" name="cate3" id="cate3" aria-label="Default select example">
<option value="">소분류</option>
</select>
</div>
</form>
</div>
<script>
$("#cate1").change(function(){
var cate1 = $("#cate1 option:selected").val();
var data = {
cate1 : cate1
};
$.ajax({
async : false ,
type : 'post' ,
url : 'category2.php' ,
data : data ,
dataType : 'html' ,
error : function() {} ,
success : function(return_data) {
$("#cate2").html(return_data);
}
});
});
$("#cate2").change(function(){
var cate2 = $("#cate2 option:selected").val();
var data = {
cate2 : cate2
};
$.ajax({
async : false ,
type : 'post' ,
url : 'category3.php' ,
data : data ,
dataType : 'html' ,
error : function() {} ,
success : function(return_data) {
$("#cate3").html(return_data);
}
});
});
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
ajax를 위한 파일 2개를 생성한다.
/admin/product/category2.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
$cate1 = $_POST['cate1'];
$html = "<option value=\"\">중분류</option>";
$query="select * from category where step=2 and pcode='".$cate1."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$html.="<option value=\"".$rs->code."\">".$rs->name."</option>";
}
echo $html;
?>
/admin/product/category3.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
$cate2 = $_POST['cate2'];
$html = "<option value=\"\">소분류</option>";
$query="select * from category where step=3 and pcode='".$cate2."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$html.="<option value=\"".$rs->code."\">".$rs->name."</option>";
}
echo $html;
?>
이렇게까지 작업을 완료했다면 조금 더 간소화 시켜보자. 현재는 ajax파일이 2개인데 이렇게 되면 분류가 4단계로 늘어나면 또 파일을 만들어야 하니 관리 포인트가 늘어난다. 파일을 조금 수정해서 ajax 파일 하나로 처리할 수 있도록 수정해보겠다.
먼저 category.php부터 수정한다.
/admin/product/category.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
$query="select * from category where step=1";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$cate1[]=$rs;
}
?>
<div style="margin-top:20px;">
<form class="row g-3">
<div class="col-md-4">
<select class="form-select cate_sel" data-id="1" name="cate1" id="cate1" aria-label="Default select example">
<option value="">대분류</option>
<?php
foreach($cate1 as $c){
?>
<option value="<?php echo $c->code;?>"><?php echo $c->name;?></option>
<?php }?>
</select>
</div>
<div class="col-md-4">
<select class="form-select cate_sel" data-id="2" name="cate2" id="cate2" aria-label="Default select example">
<option value="">중분류</option>
</select>
</div>
<div class="col-md-4">
<select class="form-select" data-id="3" name="cate3" id="cate3" aria-label="Default select example">
<option value="">소분류</option>
</select>
</div>
</form>
</div>
<script>
$(".cate_sel").change(function(){
var cate = $(this).val();
var step = $(this).attr("data-id");
step = parseInt(step)+1;
var data = {
cate : cate,
step : step
};
$.ajax({
async : false ,
type : 'post' ,
url : 'category_ajax.php' ,
data : data ,
dataType : 'html' ,
error : function() {} ,
success : function(return_data) {
$("#cate"+step).html(return_data);
}
});
});
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
ajax 파일을 하나로 접근하도록 수정했다. 또 그러기 위해서는 값을 넘겨줄때 현재 어떤 분류에서 넘겨줬는지 알아야하기때문에 그부분도 수정했다.
이번엔 ajax 파일을 만들어보자.
/admin/product/category_ajax.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
$cate = $_POST['cate'];
$step = $_POST['step'];
if($step==2){
$html = "<option value=\"\">중분류</option>";
}else if($step==3){
$html = "<option value=\"\">소분류</option>";
}
$query="select * from category where step=".$step." and pcode='".$cate."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$html.="<option value=\"".$rs->code."\">".$rs->name."</option>";
}
echo $html;
?>
ajax에선 필요값들을 받아서 처리하도록 수정했다. 기본적인 것들이니 쉽게 확인할 수 있을것이다.
다음엔 카테고리를 등록하는 걸 해보자.