상품주문시 수량 증가, 감소는 어디에서 실행되나요?
본문
item.form.skin.php - 주문폼파일에 보면
<button type="button" class="sit_qty_plus btn_frmline">증가</button>
<button type="button" class="sit_qty_minus btn_frmline">감소</button>
부분이 있는데 얘네들을 누를때 수량(value="<?php echo $it['it_buy_min_qty']; ?>")이 증가, 감소되던데
이부분이 실행되는 함수나 스크립트 부분은 어디있나요?
답변 3
js/shop.js 파일에서 처리됩니다.
<script>
$(function(){
// 상품이미지 첫번째 링크
$("#sit_pvi_big a:first").addClass("visible");
// 상품이미지 미리보기 (썸네일에 마우스 오버시)
$("#sit_pvi .img_thumb").bind("mouseover focus", function(){
var idx = $("#sit_pvi .img_thumb").index($(this));
$("#sit_pvi_big a.visible").removeClass("visible");
$("#sit_pvi_big a:eq("+idx+")").addClass("visible");
});
// 상품이미지 크게보기
$(".popup_item_image").click(function() {
var url = $(this).attr("href");
var top = 10;
var left = 10;
var opt = 'scrollbars=yes,top='+top+',left='+left;
popup_window(url, "largeimage", opt);
return false;
});
});
// 바로구매, 장바구니 폼 전송
function fitem_submit(f)
{
if (document.pressed == "장바구니") {
f.sw_direct.value = 0;
} else { // 바로구매
f.sw_direct.value = 1;
}
// 판매가격이 0 보다 작다면
if (document.getElementById("it_price").value < 0) {
alert("전화로 문의해 주시면 감사하겠습니다.");
return false;
}
if($(".sit_opt_list").size() < 1) {
alert("상품의 선택옵션을 선택해 주십시오.");
return false;
}
var val, io_type, result = true;
var sum_qty = 0;
var min_qty = parseInt(<?php echo $it['it_buy_min_qty']; ?>);
var max_qty = parseInt(<?php echo $it['it_buy_max_qty']; ?>);
var $el_type = $("input[name^=io_type]");
$("input[name^=ct_qty]").each(function(index) {
val = $(this).val();
if(val.length < 1) {
alert("수량을 입력해 주십시오.");
result = false;
return false;
}
if(val.replace(/[0-9]/g, "").length > 0) {
alert("수량은 숫자로 입력해 주십시오.");
result = false;
return false;
}
if(parseInt(val.replace(/[^0-9]/g, "")) < 1) {
alert("수량은 1이상 입력해 주십시오.");
result = false;
return false;
}
io_type = $el_type.eq(index).val();
if(io_type == "0")
sum_qty += parseInt(val);
});
if(!result) {
return false;
}
if(min_qty > 0 && sum_qty < min_qty) {
alert("선택옵션 개수 총합 "+number_format(String(min_qty))+"개 이상 주문해 주십시오.");
return false;
}
if(max_qty > 0 && sum_qty > max_qty) {
alert("선택옵션 개수 총합 "+number_format(String(max_qty))+"개 이하로 주문해 주십시오.");
return false;
}
return true;
}
</script>
js/shop.js
var option_add = false;
var supply_add = false;
var isAndroid = (navigator.userAgent.toLowerCase().indexOf("android") > -1);
$(function() {
// 선택옵션
/* 가상커서 ctrl keyup 이베트 대응 */
/*
$("select.it_option").live("keyup", function(e) {
var sel_count = $("select.it_option").size();
var idx = $("select.it_option").index($(this));
var code = e.keyCode;
var val = $(this).val();
option_add = false;
if(code == 17 && sel_count == idx + 1) {
if(val == "")
return;
sel_option_process(true);
}
});
*/
/* 키보드 접근 후 옵션 선택 Enter keydown 이벤트 대응 */
$("select.it_option").live("keydown", function(e) {
var sel_count = $("select.it_option").size();
var idx = $("select.it_option").index($(this));
var code = e.keyCode;
var val = $(this).val();
option_add = false;
if(code == 13 && sel_count == idx + 1) {
if(val == "")
return;
sel_option_process(true);
}
});
if(isAndroid) {
$("select.it_option").live("touchend", function() {
option_add = true;
});
} else {
$("select.it_option").live("mouseup", function() {
option_add = true;
});
}
$("select.it_option").live("change", function() {
var sel_count = $("select.it_option").size();
var idx = $("select.it_option").index($(this));
var val = $(this).val();
var it_id = $("input[name='it_id[]']").val();
// 선택값이 없을 경우 하위 옵션은 disabled
if(val == "") {
$("select.it_option:gt("+idx+")").val("").attr("disabled", true);
return;
}
// 하위선택옵션로드
if(sel_count > 1 && (idx + 1) < sel_count) {
var opt_id = "";
// 상위 옵션의 값을 읽어 옵션id 만듬
if(idx > 0) {
$("select.it_option:lt("+idx+")").each(function() {
if(!opt_id)
opt_id = $(this).val();
else
opt_id += chr(30)+$(this).val();
});
opt_id += chr(30)+val;
} else if(idx == 0) {
opt_id = val;
}
$.post(
"./itemoption.php",
{ it_id: it_id, opt_id: opt_id, idx: idx, sel_count: sel_count },
function(data) {
$("select.it_option").eq(idx+1).empty().html(data).attr("disabled", false);
// select의 옵션이 변경됐을 경우 하위 옵션 disabled
if(idx+1 < sel_count) {
var idx2 = idx + 1;
$("select.it_option:gt("+idx2+")").val("").attr("disabled", true);
}
}
);
} else if((idx + 1) == sel_count) { // 선택옵션처리
if(option_add && val == "")
return;
var info = val.split(",");
// 재고체크
if(parseInt(info[2]) < 1) {
alert("선택하신 선택옵션상품은 재고가 부족하여 구매할 수 없습니다.");
return false;
}
if(option_add)
sel_option_process(true);
}
});
// 추가옵션
/* 가상커서 ctrl keyup 이베트 대응 */
/*
$("select.it_supply").live("keyup", function(e) {
var $el = $(this);
var code = e.keyCode;
var val = $(this).val();
supply_add = false;
if(code == 17) {
if(val == "")
return;
sel_supply_process($el, true);
}
});
*/
/* 키보드 접근 후 옵션 선택 Enter keydown 이벤트 대응 */
$("select.it_supply").live("keydown", function(e) {
var $el = $(this);
var code = e.keyCode;
var val = $(this).val();
supply_add = false;
if(code == 13) {
if(val == "")
return;
sel_supply_process($el, true);
}
});
if(isAndroid) {
$("select.it_supply").live("touchend", function() {
supply_add = true;
});
} else {
$("select.it_supply").live("mouseup", function() {
supply_add = true;
});
}
$("select.it_supply").live("change", function() {
var $el = $(this);
var val = $(this).val();
if(val == "")
return;
if(supply_add)
sel_supply_process($el, true);
});
// 수량변경 및 삭제
$("#sit_sel_option li button").live("click", function() {
var mode = $(this).text();
var this_qty, max_qty = 9999, min_qty = 1;
var $el_qty = $(this).closest("li").find("input[name^=ct_qty]");
var stock = parseInt($(this).closest("li").find("input.io_stock").val());
switch(mode) {
case "증가":
this_qty = parseInt($el_qty.val().replace(/[^0-9]/, "")) + 1;
if(this_qty > stock) {
alert("재고수량 보다 많은 수량을 구매할 수 없습니다.");
this_qty = stock;
}
if(this_qty > max_qty) {
this_qty = max_qty;
alert("최대 구매수량은 "+number_format(String(max_qty))+" 입니다.");
}
$el_qty.val(this_qty);
price_calculate();
break;
case "감소":
this_qty = parseInt($el_qty.val().replace(/[^0-9]/, "")) - 1;
if(this_qty < min_qty) {
this_qty = min_qty;
alert("최소 구매수량은 "+number_format(String(min_qty))+" 입니다.");
}
$el_qty.val(this_qty);
price_calculate();
break;
case "삭제":
if(confirm("선택하신 옵션항목을 삭제하시겠습니까?")) {
var $el = $(this).closest("li");
var del_exec = true;
if($("#sit_sel_option .sit_spl_list").size() > 0) {
// 선택옵션이 하나이상인지
if($el.hasClass("sit_opt_list")) {
if($(".sit_opt_list").size() <= 1)
del_exec = false;
}
}
if(del_exec) {
$el.closest("li").remove();
price_calculate();
} else {
alert("선택옵션은 하나이상이어야 합니다.");
return false;
}
}
break;
default:
alert("올바른 방법으로 이용해 주십시오.");
break;
}
});
// 수량직접입력
$("input[name^=ct_qty]").live("keyup", function() {
var val= $(this).val();
if(val != "") {
if(val.replace(/[0-9]/g, "").length > 0) {
alert("수량은 숫자만 입력해 주십시오.");
$(this).val(1);
} else {
var d_val = parseInt(val);
if(d_val < 1 || d_val > 9999) {
alert("수량은 1에서 9999 사이의 값으로 입력해 주십시오.");
$(this).val(1);
} else {
var stock = parseInt($(this).closest("li").find("input.io_stock").val());
if(d_val > stock) {
alert("재고수량 보다 많은 수량을 구매할 수 없습니다.");
$(this).val(stock);
}
}
}
price_calculate();
}
});
});
// 선택옵션 추가처리
function sel_option_process(add_exec)
{
var it_price = parseInt($("input#it_price").val());
var id = "";
var value, info, sel_opt, item, price, stock, run_error = false;
var option = sep = "";
info = $("select.it_option:last").val().split(",");
$("select.it_option").each(function(index) {
value = $(this).val();
item = $(this).closest("tr").find("th label").text();
if(!value) {
run_error = true;
return false;
}
// 옵션선택정보
sel_opt = value.split(",")[0];
if(id == "") {
id = sel_opt;
} else {
id += chr(30)+sel_opt;
sep = " / ";
}
option += sep + item + ":" + sel_opt;
});
if(run_error) {
alert(item+"을(를) 선택해 주십시오.");
return false;
}
price = info[1];
stock = info[2];
// 금액 음수 체크
if(it_price + parseInt(price) < 0) {
alert("구매금액이 음수인 상품은 구매할 수 없습니다.");
return false;
}
if(add_exec) {
if(same_option_check(option))
return;
add_sel_option(0, id, option, price, stock);
}
}
// 추가옵션 추가처리
function sel_supply_process($el, add_exec)
{
var val = $el.val();
var item = $el.closest("tr").find("th label").text();
if(!val) {
alert(item+"을(를) 선택해 주십시오.");
return;
}
var info = val.split(",");
// 재고체크
if(parseInt(info[2]) < 1) {
alert(info[0]+"은(는) 재고가 부족하여 구매할 수 없습니다.");
return false;
}
var id = item+chr(30)+info[0];
var option = item+":"+info[0];
var price = info[1];
var stock = info[2];
// 금액 음수 체크
if(parseInt(price) < 0) {
alert("구매금액이 음수인 상품은 구매할 수 없습니다.");
return false;
}
if(add_exec) {
if(same_option_check(option))
return;
add_sel_option(1, id, option, price, stock);
}
}
// 선택된 옵션 출력
function add_sel_option(type, id, option, price, stock)
{
var item_code = $("input[name='it_id[]']").val();
var opt = "";
var li_class = "sit_opt_list";
if(type)
li_class = "sit_spl_list";
var opt_prc;
if(parseInt(price) >= 0)
opt_prc = "(+"+number_format(String(price))+"원)";
else
opt_prc = "("+number_format(String(price))+"원)";
opt += "<li class=\""+li_class+"\">";
opt += "<input type=\"hidden\" name=\"io_type["+item_code+"][]\" value=\""+type+"\">";
opt += "<input type=\"hidden\" name=\"io_id["+item_code+"][]\" value=\""+id+"\">";
opt += "<input type=\"hidden\" name=\"io_value["+item_code+"][]\" value=\""+option+"\">";
opt += "<input type=\"hidden\" class=\"io_price\" value=\""+price+"\">";
opt += "<input type=\"hidden\" class=\"io_stock\" value=\""+stock+"\">";
opt += "<span class=\"sit_opt_subj\">"+option+"</span>";
opt += "<span class=\"sit_opt_prc\">"+opt_prc+"</span>";
opt += "<div><input type=\"text\" name=\"ct_qty["+item_code+"][]\" value=\"1\" class=\"frm_input\" size=\"5\">";
opt += "<button type=\"button\" class=\"sit_qty_plus btn_frmline\">증가</button>";
opt += "<button type=\"button\" class=\"sit_qty_minus btn_frmline\">감소</button>";
opt += "<button type=\"button\" class=\"sit_opt_del btn_frmline\">삭제</button></div>";
opt += "</li>";
if($("#sit_sel_option > ul").size() < 1) {
$("#sit_sel_option").html("<ul id=\"sit_opt_added\"></ul>");
$("#sit_sel_option > ul").html(opt);
} else{
if(type) {
if($("#sit_sel_option .sit_spl_list").size() > 0) {
$("#sit_sel_option .sit_spl_list:last").after(opt);
} else {
if($("#sit_sel_option .sit_opt_list").size() > 0) {
$("#sit_sel_option .sit_opt_list:last").after(opt);
} else {
$("#sit_sel_option > ul").html(opt);
}
}
} else {
if($("#sit_sel_option .sit_opt_list").size() > 0) {
$("#sit_sel_option .sit_opt_list:last").after(opt);
} else {
if($("#sit_sel_option .sit_spl_list").size() > 0) {
$("#sit_sel_option .sit_spl_list:first").before(opt);
} else {
$("#sit_sel_option > ul").html(opt);
}
}
}
}
price_calculate();
}
// 동일선택옵션있는지
function same_option_check(val)
{
var result = false;
$("input[name^=io_value]").each(function() {
if(val == $(this).val()) {
result = true;
return false;
}
});
if(result)
alert(val+" 은(는) 이미 추가하신 옵션상품입니다.");
return result;
}
// 가격계산
function price_calculate()
{
var it_price = parseInt($("input#it_price").val());
if(isNaN(it_price))
return;
var $el_prc = $("input.io_price");
var $el_qty = $("input[name^=ct_qty]");
var $el_type = $("input[name^=io_type]");
var price, type, qty, total = 0;
$el_prc.each(function(index) {
price = parseInt($(this).val());
qty = parseInt($el_qty.eq(index).val());
type = $el_type.eq(index).val();
if(type == "0") { // 선택옵션
total += (it_price + price) * qty;
} else { // 추가옵션
total += price * qty;
}
});
$("#sit_tot_price").empty().html("<span>총 금액 :</span> "+number_format(String(total))+"원");
}
// php chr() 대응
function chr(code)
{
return String.fromCharCode(code);
}