반응형
쇼핑몰에서 상품을 등록하는 것만큼 중요한 것은 없을 것이다. 그만큼 할것도 많다. 회사마다 사람마다 드럽게 다양한 상품 만들기를 원한다. 특히 마케팅이라던지 영업이라던지 하는 타이틀을 달고 있는 사람들은 별 희안한 요구를 하기도 한다. 하지만 여기서는 가장 기본적인 상품 등록에대해서만 알아보도록 하자.
그리고 상품을 등록할때 웹페이지에서 등록하는 방법 말고도 엑셀로 등록하거나 외부 쇼핑몰들에서 API를 통해 등록하는 방법들도 있다. 엑셀과 API로 등록하는 방법을 이거 끝내고 알아보도록 하자.
우선 제품 리스트 페이지를 만든다. 제품 리스트 페이지는 기본적인 준비만 해두자.
/admin/product/product_list.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
?>
<table class="table table-sm table-bordered">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First</th>
<th scope="col">Last</th>
<th scope="col">Handle</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">3</th>
<td colspan="2">Larry the Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>
<a href="product_up.php">
<button class="btn btn-primary" type="button">제품등록</button>
</a>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
나중에 수정할거니까 지금은 넘어가자. 자 본격적으로 제품등록 페이지를 만들어보자.
/admin/product/prodcut_up.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;
}
?>
<style>
.thst{
text-align: center;
vertical-align: middle;
}
</style>
<div style="text-align:center;padding:20px;"><H3>제품등록하기</H3></div>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<th scope="row" class="thst">카테고리선택</th>
<td>
<div 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>
</div>
</td>
</tr>
<tr>
<th scope="row" class="thst">제품명</th>
<td><input type="text" class="form-control" name="name" id="name"></td>
</tr>
</tbody>
</table>
<button class="btn btn-primary" type="button">등록완료</button>
<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";
?>
대충 이런 모양이다. 이렇게 작업할 예정이다. 여기다가 기본적인걸 더 추가해보자
<?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;
}
?>
<style>
.thst{
text-align: center;
vertical-align: middle;
}
</style>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<div style="text-align:center;padding:20px;"><H3>제품등록하기</H3></div>
<table class="table table-sm table-bordered">
<tbody>
<tr>
<th scope="row" class="thst">카테고리선택</th>
<td>
<div 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>
</div>
</td>
</tr>
<tr>
<th scope="row" class="thst">제품명</th>
<td><input type="text" class="form-control" name="name" id="name"></td>
</tr>
<tr>
<th scope="row" class="thst">전시옵션</th>
<td>
<input class="form-check-input" type="checkbox" name="ismain" id="ismain" value="1">메인
<input class="form-check-input" type="checkbox" name="isnew" id="isnew" value="1">신제품
<input class="form-check-input" type="checkbox" name="isbest" id="isbest" value="1">베스트
<input class="form-check-input" type="checkbox" name="isrecom" id="isrecom" value="1">추천
</td>
</tr>
<tr>
<th scope="row" class="thst">위치지정</th>
<td>
<select class="form-select" name="locate" id="locate" aria-label="Default select example">
<option value="0">지정안함</option>
<option value="1">1번위치</option>
<option value="2">2번위치</option>
</select>
</td>
</tr>
<tr>
<th scope="row" class="thst">판매종료일</th>
<td>
<input type="text" class="form-control" style="width: 272px;" name="sale_end_date" id="sale_end_date" value="<?php echo date("Y-m-d",strtotime("+6 month"))?>">
</td>
</tr>
<tr>
<th scope="row" class="thst">제품상세설명</th>
<td>
<div id="summernote"></div>
</td>
</tr>
<tr>
<th scope="row" class="thst">썸네일</th>
<td><input type="file" class="form-control" name="thumbnail" id="thumbnail"></td>
</tr>
<tr>
<th scope="row" class="thst">추가이미지</th>
<td></td>
</tr>
<tr>
<th scope="row" class="thst">옵션</th>
<td></td>
</tr>
</tbody>
</table>
<button class="btn btn-primary" type="button">등록완료</button>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script>
$(function(){
$('#summernote').summernote({
height: 300
});
$("#sale_end_date").datepicker({ dateFormat: 'yy-mm-dd' });
});
$("#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";
?>
날짜 선택은 구글의 datepicker라는걸 사용했고 제품상세설명은 summernote를 사용했다.
summernote는 https://programmerdaddy.tistory.com/128?category=789143 여기서 좀더 자세히 설명해놓았다.
그리고 옵션은 할게 많아서 다음에 하고 이번엔 추가 이미지까지 작업해보자.
추가 이미지 부분에 이미지 추가 버튼을 달아서 이미지를 여러개 추가하도록 작업해보자.
/admin/product/product_up.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;
}
?>
<style>
.thst{
text-align: center;
vertical-align: middle;
}
</style>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<div style="text-align:center;padding:20px;"><H3>제품등록하기</H3></div>
<table class="table table-sm table-bordered">
<tbody>
<form method="post" action="pupok.php" enctype="multipart/form-data">
<input type="hidden" name="file_table_id" id="file_table_id" value="">
<tr>
<th scope="row" class="thst">카테고리선택</th>
<td>
<div 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>
</div>
</td>
</tr>
<tr>
<th scope="row" class="thst">제품명</th>
<td><input type="text" class="form-control" name="name" id="name"></td>
</tr>
<tr>
<th scope="row" class="thst">전시옵션</th>
<td>
<input class="form-check-input" type="checkbox" name="ismain" id="ismain" value="1">메인
<input class="form-check-input" type="checkbox" name="isnew" id="isnew" value="1">신제품
<input class="form-check-input" type="checkbox" name="isbest" id="isbest" value="1">베스트
<input class="form-check-input" type="checkbox" name="isrecom" id="isrecom" value="1">추천
</td>
</tr>
<tr>
<th scope="row" class="thst">위치지정</th>
<td>
<select class="form-select" name="locate" id="locate" aria-label="Default select example">
<option value="0">지정안함</option>
<option value="1">1번위치</option>
<option value="2">2번위치</option>
</select>
</td>
</tr>
<tr>
<th scope="row" class="thst">판매종료일</th>
<td>
<input type="text" class="form-control" style="width: 272px;" name="sale_end_date" id="sale_end_date" value="<?php echo date("Y-m-d",strtotime("+6 month"))?>">
</td>
</tr>
<tr>
<th scope="row" class="thst">제품상세설명</th>
<td>
<div id="summernote"></div>
</td>
</tr>
<tr>
<th scope="row" class="thst">썸네일</th>
<td><input type="file" class="form-control" name="thumbnail" id="thumbnail"></td>
</tr>
<tr>
<th scope="row" class="thst">추가이미지</th>
<td>
<input type="file" multiple name="upfile[]" id="upfile" style="display:none;">
<div id="target_file_wrap">
<a href="#" onclick="jQuery('#upfile').click()" class="btn btn-primary">이미지선택</a>
</div>
<div class="row row-cols-1 row-cols-md-6 g-4" id="imageArea">
</div>
</td>
</tr>
<tr>
<th scope="row" class="thst">옵션</th>
<td></td>
</tr>
</tbody>
</table>
<button class="btn btn-primary" type="button">등록완료</button>
</form>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script>
$(function(){
$('#summernote').summernote({
height: 300
});
$("#sale_end_date").datepicker({ dateFormat: 'yy-mm-dd' });
});
$("#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);
}
});
});
$("#upfile").change(function(){
var files = $('#upfile').prop('files');
for(var i=0; i < files.length; i++) {
attachFile(files[i]);
}
$('#upfile').val('');
});
function attachFile(file) {
var formData = new FormData();
formData.append("savefile", file);
$.ajax({
url: 'product_save_image.php',
data: formData,
cache: false,
contentType: false,
processData: false,
dataType : 'json' ,
type: 'POST',
success: function (return_data) {
if(return_data.result=="member"){
alert('로그인 하십시오.');
return;
}else if(return_data.result=="size"){
alert('10메가 이하만 첨부할 수 있습니다.');
return;
}else if(return_data.result=="image"){
alert('이미지 파일만 첨부할 수 있습니다.');
return;
}else if(return_data.result=="error"){
alert('첨부하지 못했습니다. 관리자에게 문의하십시오.');
return;
}else{
imgid = $("#file_table_id").val() + return_data.imgid + ",";
$("#file_table_id").val(imgid);
var html = "<div class='col' id='f_"+return_data.imgid+"'><div class='card h-100'><img src='/pdata/"+return_data.savename+"' class='card-img-top'><div class='card-body'><button type='button' class='btn btn-warning' onclick='file_del("+return_data.imgid+")'>삭제</button></div></div></div>";
$("#imageArea").append(html);
}
}
});
}
function file_del(imgid){
if(!confirm('삭제하시겠습니까?')){
return false;
}
var data = {
imgid : imgid
};
$.ajax({
async : false ,
type : 'post' ,
url : 'image_delete.php' ,
data : data ,
dataType : 'json' ,
error : function() {} ,
success : function(return_data) {
if(return_data.result=="member"){
alert('로그인 하십시오.');
return;
}else if(return_data.result=="my"){
alert('본인이 작성한 제품의 이미지만 삭제할 수 있습니다.');
return;
}else if(return_data.result=="no"){
alert('삭제하지 못했습니다. 관리자에게 문의하십시오.');
return;
}else{
$("#f_"+imgid).hide();
}
}
});
}
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
게시판에서 글을 등록할때 이미지 첨부를 한적이 있었다. 그때와 방법은 똑같다. 다만 그때와 다른 테이블에 넣었고 이미지도 게시판과는 다른 폴더에 넣었다.
이미지를 등록할때 필요한 파일을 만들어 보자. 일단 테이블을 만들어야 한다.
CREATE TABLE product_image_table (
`imgid` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) DEFAULT NULL,
`userid` varchar(100) DEFAULT NULL,
`filename` varchar(100) DEFAULT NULL,
`regdate` datetime DEFAULT current_timestamp(),
`status` tinyint(4) DEFAULT 1,
PRIMARY KEY (`imgid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
`imgid` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) DEFAULT NULL,
`userid` varchar(100) DEFAULT NULL,
`filename` varchar(100) DEFAULT NULL,
`regdate` datetime DEFAULT current_timestamp(),
`status` tinyint(4) DEFAULT 1,
PRIMARY KEY (`imgid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
/admin/product/product_save_image.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
if(!$_SESSION['AUID']){
$retun_data = array("result"=>"member");
echo json_encode($retun_data);
exit;
}
if($_FILES['savefile']['size']>10240000){//10메가
$retun_data = array("result"=>"size");
echo json_encode($retun_data);
exit;
}
if($_FILES['savefile']['type']!='image/jpeg' and $_FILES['savefile']['type']!='image/gif' and $_FILES['savefile']['type']!='image/png'){//이미지가 아니면, 다른 type은 and로 추가
$retun_data = array("result"=>"image");
echo json_encode($retun_data);
exit;
}
$save_dir = $_SERVER['DOCUMENT_ROOT']."/pdata/";//파일을 업로드할 디렉토리
$filename = $_FILES["savefile"]["name"];
$ext = pathinfo($filename,PATHINFO_EXTENSION);//확장자 구하기
$newfilename = date("YmdHis").substr(rand(),0,6);
$savefile = $newfilename.".".$ext;//새로운 파일이름과 확장자를 합친다
if(move_uploaded_file($_FILES["savefile"]["tmp_name"], $save_dir.$savefile)){//파일 등록에 성공하면 디비에 등록해준다.
$sql="INSERT INTO product_image_table
(userid, filename)
VALUES('".$_SESSION['UID']."', '".$savefile."')";
$result = $mysqli->query($sql) or die($mysqli->error);
$imgid = $mysqli -> insert_id;
$retun_data = array("result"=>"success", "imgid"=>$imgid, "savename"=>$savefile);
echo json_encode($retun_data);
exit;
}else{
$retun_data = array("result"=>"error");
echo json_encode($retun_data);
exit;
}
?>
맞다. 게시판에서 쓰던 그 파일이다. 그 파일을 조금 수정했다. 이미지를 저장한 후 파일명을 리턴해주는 파일이다.
그러면 아래 그림과 같이 나온다.
이미지를 등록하면 이렇게 나온다. 게시판할때랑 비슷하다. 이제 이미지 삭제를 위한 파일도 만들어보자.
/admin/product/image_delete.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
if(!$_SESSION['UID']){
$retun_data = array("result"=>"member");
echo json_encode($retun_data);
exit;
}
$imgid = $_POST['imgid'];
$result = $mysqli->query("select * from product_image_table where imgid=".$imgid) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
if($rs->userid!=$_SESSION['UID']){
$retun_data = array("result"=>"my");
echo json_encode($retun_data);
exit;
}
$sql="update product_image_table set status=0 where imgid=".$imgid;//status값을 바꿔준다.
$result=$mysqli->query($sql) or die($mysqli->error);
if($result){
//서버에 저장되어 있는 파일 삭제
$delete_file=$_SERVER["DOCUMENT_ROOT"]."/pdata/".$rs->filename;
unlink($delete_file);
$retun_data = array("result"=>"ok");
echo json_encode($retun_data);
}else{
$retun_data = array("result"=>"no");
echo json_encode($retun_data);
}
?>
테이블의 상태값을 바꿔주고 파일을 삭제한다. 그리고 삭제됐다고 리턴해준다. 그러면 화면에서 해당 이미지를 안보이게 처리해준다.
역시나 게시판에서 했던것과 똑같다. 나도 그 파일을 가져와서 쓴거다.
옵션을 하기 전에 지금까지 등록한 값을 테이블에 저장해보자.
물론 validation 체크 같은건 안했다. 그건 나중에 시간날때 해보자.
상품등록페이지의 소스를 조금 수정했다.
섬머노트의 컨텐츠를 가져와야하기때문에 . 그리고 몇가지 빠진거 추가했다.
/admin/product/product_up.php
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/header.php";
if(!$_SESSION['AUID']){
echo "<script>alert('권한이 없습니다.');history.back();</script>";
exit;
}
$query="select * from category where step=1";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
while($rs = $result->fetch_object()){
$cate1[]=$rs;
}
?>
<style>
.thst{
text-align: center;
vertical-align: middle;
}
</style>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<div style="text-align:center;padding:20px;"><H3>제품등록하기</H3></div>
<table class="table table-sm table-bordered">
<tbody>
<form method="post" action="pupok.php" onsubmit="return save()" enctype="multipart/form-data">
<input type="hidden" name="file_table_id" id="file_table_id" value="">
<input type="hidden" name="contents" id="contents" value="">
<tr>
<th scope="row" class="thst">카테고리선택</th>
<td>
<div 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>
</div>
</td>
</tr>
<tr>
<th scope="row" class="thst">제품명</th>
<td><input type="text" class="form-control" name="name" id="name"></td>
</tr>
<tr>
<th scope="row" class="thst">택배비</th>
<td><input type="number" style="width:200px;text-align:right;" class="form-control" name="delivery_fee" id="delivery_fee"></td>
</tr>
<tr>
<th scope="row" class="thst">제품가격</th>
<td><input type="number" style="width:200px;text-align:right;" class="form-control" name="price" id="price"></td>
</tr>
<tr>
<th scope="row" class="thst">세일가격</th>
<td><input type="number" style="width:200px;text-align:right;" class="form-control" name="sale_price" id="sale_price"></td>
</tr>
<tr>
<th scope="row" class="thst">세일비율</th>
<td><input type="number" style="width:200px;text-align:right;" class="form-control" name="sale_ratio" id="sale_ratio"></td>
</tr>
<tr>
<th scope="row" class="thst">재고</th>
<td><input type="number" style="width:200px;text-align:right;" class="form-control" name="cnt" id="cns"></td>
</tr>
<tr>
<th scope="row" class="thst">전시옵션</th>
<td>
<input class="form-check-input" type="checkbox" name="ismain" id="ismain" value="1">메인
<input class="form-check-input" type="checkbox" name="isnew" id="isnew" value="1">신제품
<input class="form-check-input" type="checkbox" name="isbest" id="isbest" value="1">베스트
<input class="form-check-input" type="checkbox" name="isrecom" id="isrecom" value="1">추천
</td>
</tr>
<tr>
<th scope="row" class="thst">위치지정</th>
<td>
<select class="form-select" name="locate" id="locate" aria-label="Default select example">
<option value="0">지정안함</option>
<option value="1">1번위치</option>
<option value="2">2번위치</option>
</select>
</td>
</tr>
<tr>
<th scope="row" class="thst">판매종료일</th>
<td>
<input type="text" class="form-control" style="width: 272px;" name="sale_end_date" id="sale_end_date" value="<?php echo date("Y-m-d",strtotime("+6 month"))?>">
</td>
</tr>
<tr>
<th scope="row" class="thst">제품상세설명</th>
<td>
<div id="summernote"></div>
</td>
</tr>
<tr>
<th scope="row" class="thst">썸네일</th>
<td><input type="file" class="form-control" name="thumbnail" id="thumbnail"></td>
</tr>
<tr>
<th scope="row" class="thst">추가이미지</th>
<td>
<input type="file" multiple name="upfile[]" id="upfile" style="display:none;">
<div id="target_file_wrap">
<a href="#" onclick="jQuery('#upfile').click()" class="btn btn-primary">이미지선택</a>
</div>
<div class="row row-cols-1 row-cols-md-6 g-4" id="imageArea">
</div>
</td>
</tr>
<tr>
<th scope="row" class="thst">옵션</th>
<td></td>
</tr>
</tbody>
</table>
<button class="btn btn-primary" type="submit">등록완료</button>
</form>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script>
function save(){
var markup = $('#summernote').summernote('code');
var contents=encodeURIComponent(markup);
$("#contents").val(contents);
}
$(function(){
$('#summernote').summernote({
height: 300
});
$("#sale_end_date").datepicker({ dateFormat: 'yy-mm-dd' });
});
$("#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);
}
});
});
$("#upfile").change(function(){
var files = $('#upfile').prop('files');
for(var i=0; i < files.length; i++) {
attachFile(files[i]);
}
$('#upfile').val('');
});
function attachFile(file) {
var formData = new FormData();
formData.append("savefile", file);
$.ajax({
url: 'product_save_image.php',
data: formData,
cache: false,
contentType: false,
processData: false,
dataType : 'json' ,
type: 'POST',
success: function (return_data) {
if(return_data.result=="member"){
alert('로그인 하십시오.');
return;
}else if(return_data.result=="size"){
alert('10메가 이하만 첨부할 수 있습니다.');
return;
}else if(return_data.result=="image"){
alert('이미지 파일만 첨부할 수 있습니다.');
return;
}else if(return_data.result=="error"){
alert('첨부하지 못했습니다. 관리자에게 문의하십시오.');
return;
}else{
imgid = $("#file_table_id").val() + return_data.imgid + ",";
$("#file_table_id").val(imgid);
var html = "<div class='col' id='f_"+return_data.imgid+"'><div class='card h-100'><img src='/pdata/"+return_data.savename+"' class='card-img-top'><div class='card-body'><button type='button' class='btn btn-warning' onclick='file_del("+return_data.imgid+")'>삭제</button></div></div></div>";
$("#imageArea").append(html);
}
}
});
}
function file_del(imgid){
if(!confirm('삭제하시겠습니까?')){
return false;
}
var data = {
imgid : imgid
};
$.ajax({
async : false ,
type : 'post' ,
url : 'image_delete.php' ,
data : data ,
dataType : 'json' ,
error : function() {} ,
success : function(return_data) {
if(return_data.result=="member"){
alert('로그인 하십시오.');
return;
}else if(return_data.result=="my"){
alert('본인이 작성한 제품의 이미지만 삭제할 수 있습니다.');
return;
}else if(return_data.result=="no"){
alert('삭제하지 못했습니다. 관리자에게 문의하십시오.');
return;
}else{
$("#f_"+imgid).hide();
}
}
});
}
</script>
<?php
include $_SERVER["DOCUMENT_ROOT"]."/inc/footer.php";
?>
이렇게 넘겨줘야 섬머노트의 컨텐츠를 넘겨줄 수 있다.
이제 테이블에 저장해보자.
/admin/product/pupok.php
<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
if(!$_SESSION['AUID']){
echo "<script>alert('권한이 없습니다.');history.back();</script>";
exit;
}
$cate=$_POST["cate1"].$_POST["cate2"].$_POST["cate3"];//대중소분류를 모두 저장한다.
$name=$_POST["name"];//제품명
$delivery_fee=$_POST["delivery_fee"];//택배비
$price=$_POST["price"];//가격
$sale_price=$_POST["sale_price"];//세일가
$sale_ratio=$_POST["sale_ratio"];//세일비율
$cnt=$_POST["cnt"];//재고
$contents=rawurldecode($_POST['contents']);//제품 설명
$ismain=$_POST["ismain"];//메인
$isnew=$_POST["isnew"];//신상품
$isbest=$_POST["isbest"];//베스트
$isrecom=$_POST["isrecom"];//추천
$locate=$_POST["locate"];//위치
$sale_end_date=$_POST["sale_end_date"];//판매종료일
$file_table_id=$_POST["file_table_id"];//이미지
$file_table_id=rtrim($file_table_id,",");//오른쪽 끝에 , 삭제
if($_FILES["thumbnail"]["name"]){//첨부한 파일이 있으면
if($_FILES['thumbnail']['size']>10240000){//10메가
echo "<script>alert('10메가 이하만 첨부할 수 있습니다.');history.back();</script>";
exit;
}
if($_FILES['thumbnail']['type']!='image/jpeg' and $_FILES['thumbnail']['type']!='image/gif' and $_FILES['thumbnail']['type']!='image/png'){//이미지가 아니면, 다른 type은 and로 추가
echo "<script>alert('이미지만 첨부할 수 있습니다.');history.back();</script>";
exit;
}
$save_dir = $_SERVER['DOCUMENT_ROOT']."/pdata/";//파일을 업로드할 디렉토리
$filename = $_FILES["thumbnail"]["name"];
$ext = pathinfo($filename,PATHINFO_EXTENSION);//확장자 구하기
$newfilename = date("YmdHis").substr(rand(),0,6);
$thumbnail = $newfilename.".".$ext;//새로운 파일이름과 확장자를 합친다
if(move_uploaded_file($_FILES["thumbnail"]["tmp_name"], $save_dir.$thumbnail)){
$thumbnail = "/pdata/".$thumbnail;
}else{
echo "<script>alert('이미지를 등록할 수 없습니다. 관리자에게 문의해주십시오.');history.back();</script>";
exit;
}
}
$sale_cnt = 0;//판매량
$query="INSERT INTO products
(name, cate, content, thumbnail, price, sale_price, sale_ratio, cnt, sale_cnt, isnew, isbest, isrecom, ismain, locate, userid, sale_end_date, reg_date, delivery_fee)
VALUES('$name'
, '".$cate."'
, '".$contents."'
, '".$thumbnail."'
, '".$price."'
, '".$sale_price."'
, '".$sale_ratio."'
, ".$cnt."
, ".$sale_cnt."
, '".$isnew."'
, '".$isbest."'
, '".$isrecom."'
, '".$ismain."'
, '".$locate."'
, '".$_SESSION['AUID']."'
, '".$sale_end_date."'
, now()
, '".$delivery_fee."'
)";
$rs=$mysqli->query($query) or die($mysqli->error);
$pid = $mysqli -> insert_id;
if($rs){
$upquery="update product_image_table set pid=".$pid." where imgid in (".$file_table_id.")";
$fs=$mysqli->query($upquery) or die($mysqli->error);
echo "<script>alert('등록했습니다.');location.href='/admin/product/product_list.php';</script>";
exit;
}else{
echo "<script>alert('등록하지 못했습니다. 관리자에게 문의해주십시오.');history.back();</script>";
exit;
}
?>
이렇게 해주면 된다.product테이블에 저장하고 이미지는 따로 저장해준다.
옵션은 할게 많아서 다음에 해보자
반응형
'PHP강좌 > 쇼핑몰만들기강좌' 카테고리의 다른 글
php+mysql 쇼핑몰 만들기 강좌 - #6 상품 검색하기 (2) | 2022.03.16 |
---|---|
php+mysql 쇼핑몰 만들기 강좌 - #5 상품 리스트 (2) | 2022.03.15 |
php+mysql 쇼핑몰 만들기 강좌 - #3 관리자 등록하기 (4) | 2022.02.24 |
php+mysql 쇼핑몰 만들기 강좌 - #2 상품 테이블 설계하기 (0) | 2022.02.24 |
php+mysql 쇼핑몰 만들기 강좌 - #1-1 카테고리 만들기 (1) | 2022.02.23 |