반응형

쇼핑몰에서 가장 중요한것중 하나가 카테고리다. 종합쇼핑몰이나 단순 쇼핑몰이나 모두 카테고리는 중요하다. 여기선 대분류 중분류 소분류로 해서 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에선 필요값들을 받아서 처리하도록 수정했다. 기본적인 것들이니 쉽게 확인할 수 있을것이다.
다음엔 카테고리를 등록하는 걸 해보자.
 

개발하다 힘들면 눌러.

https://www.zzarbang.com

반응형

+ Recent posts