테스트 사이트 - 개발 중인 베타 버전입니다

선택옵션을 radio로 변경하고 선택까지 되게 했는데 가격이 반영이 안되는 이유가 무엇을까요?

BKG0320 5년 전 조회 5,649

 

shop.lib.php 소스이고

 

</p>

<p><?php

//==============================================================================

// 쇼핑몰 라이브러리 모음 시작

//==============================================================================</p>

<p>/*

간편 사용법 : 상품유형을 1~5 사이로 지정합니다.

$disp = new item_list(1);

echo $disp->run();</p>

<p>

유형+분류별로 노출하는 경우 상세 사용법 : 상품유형을 지정하는 것은 동일합니다.

$disp = new item_list(1);

// 사용할 스킨을 바꿉니다.

$disp->set_list_skin("type_user.skin.php");

// 1단계분류를 20으로 시작되는 분류로 지정합니다.

$disp->set_category("20", 1);

echo $disp->run();</p>

<p>

분류별로 노출하는 경우 상세 사용법

// type13.skin.php 스킨으로 3개씩 2줄을 폭 150 사이즈로 분류코드 30 으로 시작되는 상품을 노출합니다.

$disp = new item_list(0, "type13.skin.php", 3, 2, 150, 0, "30");

echo $disp->run();</p>

<p>

이벤트로 노출하는 경우 상세 사용법

// type13.skin.php 스킨으로 3개씩 2줄을 폭 150 사이즈로 상품을 노출합니다.

// 스킨의 경로는 스킨 파일의 절대경로를 지정합니다.

$disp = new item_list(0, G5_SHOP_SKIN_PATH.'/list.10.skin.php', 3, 2, 150, 0);

// 이벤트번호를 설정합니다.

$disp->set_event("12345678");

echo $disp->run();</p>

<p>참고) 영카트4의 display_type 함수와 사용방법이 비슷한 class 입니다.

      display_category 나 display_event 로 사용하기 위해서는 $type 값만 넘기지 않으면 됩니다.

*/</p>

<p>class item_list

{

    // 상품유형 : 기본적으로 1~5 까지 사용할수 있으며 0 으로 설정하는 경우 상품유형별로 노출하지 않습니다.

    // 분류나 이벤트로 노출하는 경우 상품유형을 0 으로 설정하면 됩니다.

    protected $type;</p>

<p>    protected $list_skin;

    protected $list_mod;

    protected $list_row;

    protected $img_width;

    protected $img_height;</p>

<p>    // 상품상세보기 경로

    protected $href = "";</p>

<p>    // select 에 사용되는 필드

    protected $fields = "*";</p>

<p>    // 분류코드로만 사용하는 경우 상품유형($type)을 0 으로 설정하면 됩니다.

    protected $ca_id = "";

    protected $ca_id2 = "";

    protected $ca_id3 = "";</p>

<p>    // 노출순서

    protected $order_by = "it_order, it_id desc";</p>

<p>    // 상품의 이벤트번호를 저장합니다.

    protected $event = "";</p>

<p>    // 스킨의 기본 css 를 다른것으로 사용하고자 할 경우에 사용합니다.

    protected $css = "";</p>

<p>    // 상품의 사용여부를 따져 노출합니다. 0 인 경우 모든 상품을 노출합니다.

    protected $use = 1;</p>

<p>    // 모바일에서 노출하고자 할 경우에 true 로 설정합니다.

    protected $is_mobile = false;</p>

<p>    // 기본으로 보여지는 필드들

    protected $view_it_id    = false;       // 상품코드

    protected $view_it_img   = true;        // 상품이미지

    protected $view_it_name  = true;        // 상품명

    protected $view_it_basic = true;        // 기본설명

    protected $view_it_price = true;        // 판매가격

    protected $view_it_cust_price = false;  // 소비자가

    protected $view_it_icon = false;        // 아이콘

    protected $view_sns = false;            // SNS

    protected $view_star = false;           // 별점</p>

<p>    // 몇번째 class 호출인지를 저장합니다.

    protected $count = 0;</p>

<p>    // true 인 경우 페이지를 구한다.

    protected $is_page = false;</p>

<p>    // 페이지 표시를 위하여 총 상품수를 구합니다.

    public $total_count = 0;</p>

<p>    // sql limit 의 시작 레코드

    protected $from_record = 0;</p>

<p>    // 외부에서 쿼리문을 넘겨줄 경우에 담아두는 변수

    protected $query = "";</p>

<p>    // $type        : 상품유형 (기본으로 1~5까지 사용)

    // $list_skin   : 상품리스트를 노출할 스킨을 설정합니다. 스킨위치는 skin/shop/쇼핑몰설정스킨/type??.skin.php

    // $list_mod    : 1줄에 몇개의 상품을 노출할지를 설정합니다.

    // $list_row    : 상품을 몇줄에 노출할지를 설정합니다.

    // $img_width   : 상품이미지의 폭을 설정합니다.

    // $img_height  : 상품이미지의 높이을 설정합니다. 0 으로 설정하는 경우 썸네일 이미지의 높이는 폭에 비례하여 생성합니다.

    //function __construct($type=0, $list_skin='', $list_mod='', $list_row='', $img_width='', $img_height=0, $ca_id='') {

    function __construct($list_skin='', $list_mod='', $list_row='', $img_width='', $img_height=0) {

        $this->list_skin  = $list_skin;

        $this->list_mod   = $list_mod;

        $this->list_row   = $list_row;

        $this->img_width  = $img_width;

        $this->img_height = $img_height;

        $this->set_href(G5_SHOP_URL.'/item.php?it_id=');

        $this->count++;

    }</p>

<p>    function set_type($type) {

        $this->type = $type;

        if ($type) {

            $this->set_list_skin($this->list_skin);

            $this->set_list_mod($this->list_mod);

            $this->set_list_row($this->list_row);

            $this->set_img_size($this->img_width, $this->img_height);

        }

    }</p>

<p>    // 분류코드로 검색을 하고자 하는 경우 아래와 같이 인수를 넘겨줍니다.

    // 1단계 분류는 (분류코드, 1)

    // 2단계 분류는 (분류코드, 2)

    // 3단계 분류는 (분류코드, 3)

    function set_category($ca_id, $level=1) {

        if ($level == 2) {

            $this->ca_id2 = $ca_id;

        } else if ($level == 3) {

            $this->ca_id3 = $ca_id;

        } else {

            $this->ca_id = $ca_id;

        }

    }</p>

<p>    // 이벤트코드를 인수로 넘기게 되면 해당 이벤트에 속한 상품을 노출합니다.

    function set_event($ev_id) {

        $this->event = $ev_id;

    }</p>

<p>    // 리스트 스킨을 바꾸고자 하는 경우에 사용합니다.

    // 리스트 스킨의 위치는 skin/shop/쇼핑몰설정스킨/type??.skin.php 입니다.

    // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다.

    function set_list_skin($list_skin) {

        global $default;

        if ($this->is_mobile) {

            $this->list_skin = $list_skin ? $list_skin : G5_MSHOP_SKIN_PATH.'/'.preg_replace('/[^A-Za-z0-9 _ .-]/', '', $default['de_mobile_type'.$this->type.'_list_skin']);

        } else {

            $this->list_skin = $list_skin ? $list_skin : G5_SHOP_SKIN_PATH.'/'.preg_replace('/[^A-Za-z0-9 _ .-]/', '', $default['de_type'.$this->type.'_list_skin']);

        }

    }</p>

<p>    // 1줄에 몇개를 노출할지를 사용한다.

    // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다.

    function set_list_mod($list_mod) {

        global $default;

        if ($this->is_mobile) {

            $this->list_mod = $list_mod ? $list_mod : $default['de_mobile_type'.$this->type.'_list_mod'];

        } else {

            $this->list_mod = $list_mod ? $list_mod : $default['de_type'.$this->type.'_list_mod'];

        }

    }</p>

<p>    // 몇줄을 노출할지를 사용한다.

    // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다.

    function set_list_row($list_row) {

        global $default;

        if ($this->is_mobile) {

            $this->list_row = $list_row ? $list_row : $default['de_mobile_type'.$this->type.'_list_row'];

        } else {

            $this->list_row = $list_row ? $list_row : $default['de_type'.$this->type.'_list_row'];

        }

        if (!$this->list_row)

            $this->list_row = 1;

    }</p>

<p>    // 노출이미지(썸네일생성)의 폭, 높이를 설정합니다. 높이를 0 으로 설정하는 경우 쎰네일 비율에 따릅니다.

    // 특별히 설정하지 않는 경우 상품유형을 사용하는 경우는 쇼핑몰설정 값을 그대로 따릅니다.

    function set_img_size($img_width, $img_height=0) {

        global $default;

        if ($this->is_mobile) {

            $this->img_width = $img_width ? $img_width : $default['de_mobile_type'.$this->type.'_img_width'];

            $this->img_height = $img_height ? $img_height : $default['de_mobile_type'.$this->type.'_img_height'];

        } else {

            $this->img_width = $img_width ? $img_width : $default['de_type'.$this->type.'_img_width'];

            $this->img_height = $img_height ? $img_height : $default['de_type'.$this->type.'_img_height'];

        }

    }</p>

<p>    // 특정 필드만 select 하는 경우에는 필드명을 , 로 구분하여 "field1, field2, field3, ... fieldn" 으로 인수를 넘겨줍니다.

    function set_fields($str) {

        $this->fields = $str;

    }</p>

<p>    // 특정 필드로 정렬을 하는 경우 필드와 정렬순서를 , 로 구분하여 "field1 desc, field2 asc, ... fieldn desc " 으로 인수를 넘겨줍니다.

    function set_order_by($str) {

        $this->order_by = $str;

    }</p>

<p>    // 사용하는 상품외에 모든 상품을 노출하려면 0 을 인수로 넘겨줍니다.

    function set_use($use) {

        $this->use = $use;

    }</p>

<p>    // 모바일로 사용하려는 경우 true 를 인수로 넘겨줍니다.

    function set_mobile($mobile=true) {

        $this->is_mobile = $mobile;

    }</p>

<p>    // 스킨에서 특정 필드를 노출하거나 하지 않게 할수 있습니다.

    // 가령 소비자가는 처음에 노출되지 않도록 설정되어 있지만 노출을 하려면

    // ("it_cust_price", true) 와 같이 인수를 넘겨줍니다.

    // 이때 인수로 넘겨주는 값은 스킨에 정의된 필드만 가능하다는 것입니다.

    function set_view($field, $view=true) {

        $this->{"view_".$field} = $view;

    }</p>

<p>    // anchor 태그에 하이퍼링크를 다른 주소로 걸거나 아예 링크를 걸지 않을 수 있습니다.

    // 인수를 "" 공백으로 넘기면 링크를 걸지 않습니다.

    function set_href($href) {

        $this->href = $href;

    }</p>

<p>    // ul 태그의 css 를 교체할수 있다. "sct sct_abc" 를 인수로 넘기게 되면

    // 기존의 ul 태그에 걸린 css 는 무시되며 인수로 넘긴 css 가 사용됩니다.

    function set_css($css) {

        $this->css = $css;

    }</p>

<p>    // 페이지를 노출하기 위해 true 로 설정할때 사용합니다.

    function set_is_page($is_page) {

        $this->is_page = $is_page;

    }</p>

<p>    // select ... limit 의 시작값

    function set_from_record($from_record) {

        $this->from_record = $from_record;

    }</p>

<p>    // 외부에서 쿼리문을 넘겨줄 경우에 담아둡니다.

    function set_query($query) {

        $this->query = $query;

    }</p>

<p>    // class 에 설정된 값으로 최종 실행합니다.

    function run() {</p>

<p>        global $g5, $config, $member, $default;

        

        $list = array();</p>

<p>        if ($this->query) {</p>

<p>            $sql = $this->query;

            $result = sql_query($sql);

            $this->total_count = @sql_num_rows($result);</p>

<p>        } else {</p>

<p>            $where = array();

            if ($this->use) {

                $where[] = " it_use = '1' ";

            }</p>

<p>            if ($this->type) {

                $where[] = " it_type{$this->type} = '1' ";

            }</p>

<p>            if ($this->ca_id || $this->ca_id2 || $this->ca_id3) {

                $where_ca_id = array();

                if ($this->ca_id) {

                    $where_ca_id[] = " ca_id like '{$this->ca_id}%' ";

                }

                if ($this->ca_id2) {

                    $where_ca_id[] = " ca_id2 like '{$this->ca_id2}%' ";

                }

                if ($this->ca_id3) {

                    $where_ca_id[] = " ca_id3 like '{$this->ca_id3}%' ";

                }

                $where[] = " ( " . implode(" or ", $where_ca_id) . " ) ";

            }</p>

<p>            if ($this->order_by) {

                $sql_order = " order by {$this->order_by} ";

            }</p>

<p>            if ($this->event) {

                $sql_select = " select {$this->fields} ";

                $sql_common = " from `{$g5['g5_shop_event_item_table']}` a left join `{$g5['g5_shop_item_table']}` b on (a.it_id = b.it_id) ";

                $where[] = " a.ev_id = '{$this->event}' ";

            } else {

                $sql_select = " select {$this->fields} ";

                $sql_common = " from `{$g5['g5_shop_item_table']}` ";

            }

            $sql_where = " where " . implode(" and ", $where);

            $sql_limit = " limit " . $this->from_record . " , " . ($this->list_mod * $this->list_row);</p>

<p>            $sql = $sql_select . $sql_common . $sql_where . $sql_order . $sql_limit;

            $result = sql_query($sql);</p>

<p>            if ($this->is_page) {

                $sql2 = " select count(*) as cnt " . $sql_common . $sql_where;

                $row2 = sql_fetch($sql2);

                $this->total_count = $row2['cnt'];

            }

        }</p>

<p>        if( isset($result) && $result ){

            while ($row=sql_fetch_array($result)) {

                

                if( isset($row['it_seo_title']) && ! $row['it_seo_title'] ){

                    shop_seo_title_update($row['it_id']);

                }</p>

<p>                $list[] = $row;

            }</p>

<p>            if(function_exists('sql_data_seek')){

                sql_data_seek($result, 0);

            }

        }</p>

<p>        $file = $this->list_skin;</p>

<p>        if ($this->list_skin == "") {

            return $this->count."번 item_list() 의 스킨파일이 지정되지 않았습니다.";

        } else if (!file_exists($file)) {

            return $file." 파일을 찾을 수 없습니다.";

        } else {

            ob_start();

            $list_mod = $this->list_mod;

            include($file);

            $content = ob_get_contents();

            ob_end_clean();

            return $content;

        }

    }

}</p>

<p>// 장바구니 건수 검사

function get_cart_count($cart_id)

{

    global $g5, $default;</p>

<p>    $sql = " select count(ct_id) as cnt from {$g5['g5_shop_cart_table']} where od_id = '$cart_id' ";

    $row = sql_fetch($sql);

    $cnt = (int)$row['cnt'];

    return $cnt;

}</p>

<p>

// 이미지를 얻는다

function get_image($img, $width=0, $height=0, $img_id='')

{

    global $g5, $default;</p>

<p>    $full_img = G5_DATA_PATH.'/item/'.$img;</p>

<p>    if (file_exists($full_img) && $img)

    {

        if (!$width)

        {

            $size = getimagesize($full_img);

            $width = $size[0];

            $height = $size[1];

        }

        $str = '<img src="'.G5_DATA_URL.'/item/'.$img.'" alt="" width="'.$width.'" height="'.$height.'"';</p>

<p>        if($img_id)

            $str .= ' id="'.$img_id.'"';</p>

<p>        $str .= '>';

    }

    else

    {

        $str = '<img src="'.G5_SHOP_URL.'/img/no_image.gif" alt="" ';

        if ($width)

            $str .= 'width="'.$width.'" height="'.$height.'"';

        else

            $str .= 'width="'.$default['de_mimg_width'].'" height="'.$default['de_mimg_height'].'"';</p>

<p>        if($img_id)

            $str .= ' id="'.$img_id.'"'.

        $str .= '>';

    }</p>

<p>    return $str;

}</p>

<p>

// 상품 이미지를 얻는다

function get_it_image($it_id, $width, $height=0, $anchor=false, $img_id='', $img_alt='', $is_crop=false)

{

    global $g5;</p>

<p>    if(!$it_id || !$width)

        return '';</p>

<p>    $row = get_shop_item($it_id, true);</p>

<p>    if(!$row['it_id'])

        return '';</p>

<p>    $filename = $thumb = $img = '';</p>

<p>    for($i=1;$i<=10; $i++) {

        $file = G5_DATA_PATH.'/item/'.$row['it_img'.$i];

        if(is_file($file) && $row['it_img'.$i]) {

            $size = @getimagesize($file);

            if($size[2] < 1 || $size[2] > 3)

                continue;</p>

<p>            $filename = basename($file);

            $filepath = dirname($file);

            $img_width = $size[0];

            $img_height = $size[1];</p>

<p>            break;

        }

    }</p>

<p>    if($img_width && !$height) {

        $height = round(($width * $img_height) / $img_width);

    }</p>

<p>    if($filename) {

        //thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_height, $is_create, $is_crop=false, $crop_mode='center', $is_sharpen=true, $um_value='80/0.5/3')

        $thumb = thumbnail($filename, $filepath, $filepath, $width, $height, false, $is_crop, 'center', false, $um_value='80/0.5/3');

    }</p>

<p>    if($thumb) {

        $file_url = str_replace(G5_PATH, G5_URL, $filepath.'/'.$thumb);

        $img = '<img src="'.$file_url.'" width="'.$width.'" height="'.$height.'" alt="'.$img_alt.'"';

    } else {

        $img = '<img src="'.G5_SHOP_URL.'/img/no_image.gif" width="'.$width.'"';

        if($height)

            $img .= ' height="'.$height.'"';

        $img .= ' alt="'.$img_alt.'"';

    }</p>

<p>    if($img_id)

        $img .= ' id="'.$img_id.'"';

    $img .= '>';</p>

<p>    if($anchor)

        $img = $img = '<a href="'.shop_item_url($it_id).'">'.$img.'</a>';</p>

<p>    return run_replace('get_it_image_tag', $img, $thumb, $it_id, $width, $height, $anchor, $img_id, $img_alt, $is_crop);

}</p>

<p>// 상품이미지 썸네일 생성

function get_it_thumbnail($img, $width, $height=0, $id='', $is_crop=false)

{

    $str = '';</p>

<p>    if ( $replace_tag = run_replace('get_it_thumbnail_tag', $str, $img, $width, $height, $id, $is_crop) ){

        return $replace_tag;

    }</p>

<p>    $file = G5_DATA_PATH.'/item/'.$img;

    if(is_file($file))

        $size = @getimagesize($file);</p>

<p>    if($size[2] < 1 || $size[2] > 3)

        return '';</p>

<p>    $img_width = $size[0];

    $img_height = $size[1];

    $filename = basename($file);

    $filepath = dirname($file);</p>

<p>    if($img_width && !$height) {

        $height = round(($width * $img_height) / $img_width);

    }</p>

<p>    $thumb = thumbnail($filename, $filepath, $filepath, $width, $height, false, $is_crop, 'center', false, $um_value='80/0.5/3');</p>

<p>    if($thumb) {

        $file_url = str_replace(G5_PATH, G5_URL, $filepath.'/'.$thumb);

        $str = '<img src="'.$file_url.'" width="'.$width.'" height="'.$height.'"';

        if($id)

            $str .= ' id="'.$id.'"';

        $str .= ' alt="">';

    }</p>

<p>    return $str;

}</p>

<p>

// 이미지 URL 을 얻는다.

function get_it_imageurl($it_id)

{

    global $g5;</p>

<p>    $row = get_shop_item($it_id, true);

    $filepath = '';</p>

<p>    for($i=1; $i<=10; $i++) {

        $img = $row['it_img'.$i];

        $file = G5_DATA_PATH.'/item/'.$img;

        if(!is_file($file))

            continue;</p>

<p>        $size = @getimagesize($file);

        if($size[2] < 1 || $size[2] > 3)

            continue;</p>

<p>        $filepath = $file;

        break;

    }</p>

<p>    if($filepath)

        $str = str_replace(G5_PATH, G5_URL, $filepath);

    else

        $str = G5_SHOP_URL.'/img/no_image.gif';</p>

<p>    return $str;

}</p>

<p>

// 상품의 재고 (창고재고수량 - 주문대기수량)

function get_it_stock_qty($it_id)

{

    global $g5;</p>

<p>    $sql = " select it_stock_qty from {$g5['g5_shop_item_table']} where it_id = '$it_id' ";

    $row = sql_fetch($sql);

    $jaego = (int)$row['it_stock_qty'];</p>

<p>    // 재고에서 빼지 않았고 주문인것만

    $sql = " select SUM(ct_qty) as sum_qty

               from {$g5['g5_shop_cart_table']}

              where it_id = '$it_id'

                and io_id = ''

                and ct_stock_use = 0

                and ct_status in ('주문', '입금', '준비') ";

    $row = sql_fetch($sql);

    $daegi = (int)$row['sum_qty'];</p>

<p>    return $jaego - $daegi;

}</p>

<p>

// 옵션의 재고 (창고재고수량 - 주문대기수량)

function get_option_stock_qty($it_id, $io_id, $type)

{

    global $g5;</p>

<p>    $sql = " select io_stock_qty

                from {$g5['g5_shop_item_option_table']}

                where it_id = '$it_id' and io_id = '$io_id' and io_type = '$type' and io_use = '1' ";

    $row = sql_fetch($sql);

    $jaego = (int)$row['io_stock_qty'];</p>

<p>    // 재고에서 빼지 않았고 주문인것만

    $sql = " select SUM(ct_qty) as sum_qty

               from {$g5['g5_shop_cart_table']}

              where it_id = '$it_id'

                and io_id = '$io_id'

                and io_type = '$type'

                and ct_stock_use = 0

                and ct_status in ('주문', '입금', '준비') ";

    $row = sql_fetch($sql);

    $daegi = (int)$row['sum_qty'];</p>

<p>    return $jaego - $daegi;

}</p>

<p>

// 큰 이미지

function get_large_image($img, $it_id, $btn_image=true)

{

    global $g5;</p>

<p>    if (file_exists(G5_DATA_PATH.'/item/'.$img) && $img != '')

    {

        $size   = getimagesize(G5_DATA_PATH.'/item/'.$img);

        $width  = $size[0];

        $height = $size[1];

        $str = '<a href="javascript:popup_large_image(\''.$it_id.'\', \''.$img.'\', '.$width.', '.$height.', \''.G5_SHOP_URL.'\')">';

        if ($btn_image)

            $str .= '큰이미지</a>';

    }

    else

        $str = '';

    return $str;

}</p>

<p>

// 금액 표시

function display_price($price, $tel_inq=false)

{

    if ($tel_inq)

        $price = '전화문의';

    else

        $price = number_format($price, 0).'원';</p>

<p>    return $price;

}</p>

<p>

// 금액표시

// $it : 상품 배열

function get_price($it)

{

    global $member;</p>

<p>    if ($it['it_tel_inq']) return '전화문의';</p>

<p>    $price = $it['it_price'];</p>

<p>    return (int)$price;

}</p>

<p>

// 포인트 표시

function display_point($point)

{

    return number_format($point, 0).'점';

}</p>

<p>

// 포인트를 구한다

function get_point($amount, $point)

{

    return (int)($amount * $point / 100);

}</p>

<p>

// 상품이미지 업로드

function it_img_upload($srcfile, $filename, $dir)

{

    if($filename == '')

        return '';</p>

<p>    $size = @getimagesize($srcfile);

    if($size[2] < 1 || $size[2] > 3)

        return '';</p>

<p>    //php파일도 getimagesize 에서 Image Type Flag 를 속일수 있다

    if (!preg_match('/\.(gif|jpe?g|png)$/i', $filename))

        return '';</p>

<p>    if(!is_dir($dir)) {

        @mkdir($dir, G5_DIR_PERMISSION);

        @chmod($dir, G5_DIR_PERMISSION);

    }</p>

<p>    $pattern = "/[#\&\+\-%@=\/\\:;,'\"\^`~\|\!\?\*\$#<>\(\)\[\]\{\}]/";</p>

<p>    $filename = preg_replace("/\s+/", "", $filename);

    $filename = preg_replace( $pattern, "", $filename);</p>

<p>    $filename = preg_replace_callback(

                          "/[가-힣]+/",

                          create_function('$matches', 'return base64_encode($matches[0]);'),

                          $filename);</p>

<p>    $filename = preg_replace( $pattern, "", $filename);

    $prepend = '';</p>

<p>    // 동일한 이름의 파일이 있으면 파일명 변경

    if(is_file($dir.'/'.$filename)) {

        for($i=0; $i<20; $i++) {

            $prepend = str_replace('.', '_', microtime(true)).'_';</p>

<p>            if(is_file($dir.'/'.$prepend.$filename)) {

                usleep(mt_rand(100, 10000));

                continue;

            } else {

                break;

            }

        }

    }</p>

<p>    $filename = $prepend.$filename;</p>

<p>    upload_file($srcfile, $filename, $dir);</p>

<p>    $file = str_replace(G5_DATA_PATH.'/item/', '', $dir.'/'.$filename);</p>

<p>    return $file;

}</p>

<p>

// 파일을 업로드 함

function upload_file($srcfile, $destfile, $dir)

{

    if ($destfile == "") return false;

    // 업로드 한후 , 퍼미션을 변경함

    @move_uploaded_file($srcfile, $dir.'/'.$destfile);

    @chmod($dir.'/'.$destfile, G5_FILE_PERMISSION);

    return true;

}</p>

<p>

function message($subject, $content, $align="left", $width="450")

{

    $str = "

        <table width=\"$width\" cellpadding=\"4\" align=\"center\">

            <tr><td class=\"line\" height=\"1\"></td></tr>

            <tr>

                <td align=\"center\">$subject</td>

            </tr>

            <tr><td class=\"line\" height=\"1\"></td></tr>

            <tr>

                <td>

                    <table width=\"100%\" cellpadding=\"8\" cellspacing=\"0\">

                        <tr>

                            <td class=\"leading\" align=\"$align\">$content</td>

                        </tr>

                    </table>

                </td>

            </tr>

            <tr><td class=\"line\" height=\"1\"></td></tr>

        </table>

        


        ";

    return $str;

}</p>

<p>

// 시간이 비어 있는지 검사

function is_null_time($datetime)

{

    // 공란 0 : - 제거

    //$datetime = ereg_replace("[ 0:-]", "", $datetime); // 이 함수는 PHP 5.3.0 에서 배제되고 PHP 6.0 부터 사라집니다.

    $datetime = preg_replace("/[ 0:-]/", "", $datetime);

    if ($datetime == "")

        return true;

    else

        return false;

}</p>

<p>

// 출력유형, 스킨파일, 1라인이미지수, 총라인수, 이미지폭, 이미지높이

// 1.02.01 $ca_id 추가

//function display_type($type, $skin_file, $list_mod, $list_row, $img_width, $img_height, $ca_id="")

function display_type($type, $list_skin='', $list_mod='', $list_row='', $img_width='', $img_height='', $ca_id='')

{

    global $member, $g5, $config, $default;</p>

<p>    if (!$default["de_type{$type}_list_use"]) return "";</p>

<p>    $list_skin  = $list_skin  ? $list_skin  : $default["de_type{$type}_list_skin"];

    $list_mod   = $list_mod   ? $list_mod   : $default["de_type{$type}_list_mod"];

    $list_row   = $list_row   ? $list_row   : $default["de_type{$type}_list_row"];

    $img_width  = $img_width  ? $img_width  : $default["de_type{$type}_img_width"];

    $img_height = $img_height ? $img_height : $default["de_type{$type}_img_height"];</p>

<p>    // 상품수

    $items = $list_mod * $list_row;</p>

<p>    // 1.02.00

    // it_order 추가

    $sql = " select * from {$g5['g5_shop_item_table']} where it_use = '1' and it_type{$type} = '1' ";

    if ($ca_id) $sql .= " and ca_id like '$ca_id%' ";

    $sql .= " order by it_order, it_id desc limit $items ";

    $result = sql_query($sql);

    /*

    if (!sql_num_rows($result)) {

        return false;

    }

    */</p>

<p>    //$file = G5_SHOP_PATH.'/'.$skin_file;

    $file = G5_SHOP_SKIN_PATH.'/'.$list_skin;

    if (!file_exists($file)) {

        return G5_SHOP_SKIN_URL.'/'.$list_skin.' 파일을 찾을 수 없습니다.';

    } else {

        $td_width = (int)(100 / $list_mod);

        ob_start();

        include $file;

        $content = ob_get_contents();

        ob_end_clean();

        return $content;

    }

}</p>

<p>

// 모바일 유형별 상품 출력

function mobile_display_type($type, $skin_file, $list_row, $img_width, $img_height, $ca_id="")

{

    global $member, $g5, $config;</p>

<p>    // 상품수

    $items = $list_row;</p>

<p>    // 1.02.00

    // it_order 추가

    $sql = " select * from {$g5['g5_shop_item_table']} where it_use = '1' and it_type{$type} = '1' ";

    if ($ca_id) $sql .= " and ca_id like '$ca_id%' ";

    $sql .= " order by it_order, it_id desc limit $items ";

    $result = sql_query($sql);

    /*

    if (!sql_num_rows($result)) {

        return false;

    }

    */</p>

<p>    $file = G5_MSHOP_PATH.'/'.$skin_file;

    if (!file_exists($file)) {

        echo $file.' 파일을 찾을 수 없습니다.';

    } else {

        //$td_width = (int)(100 / $list_mod);

        include $file;

    }

}</p>

<p>

// 분류별 출력

// 스킨파일번호, 1라인이미지수, 총라인수, 이미지폭, 이미지높이 , 분류번호

function display_category($no, $list_mod, $list_row, $img_width, $img_height, $ca_id="")

{

    global $member, $g5;</p>

<p>    // 상품수

    $items = $list_mod * $list_row;</p>

<p>    $sql = " select * from {$g5['g5_shop_item_table']} where it_use = '1'";

    if ($ca_id)

        $sql .= " and ca_id LIKE '{$ca_id}%' ";

    $sql .= " order by it_order, it_id desc limit $items ";

    $result = sql_query($sql);

    if (!sql_num_rows($result)) {

        return false;

    }</p>

<p>    $file = G5_SHOP_PATH.'/maintype'.$no.'.inc.php';

    if (!file_exists($file)) {

        echo $file.' 파일을 찾을 수 없습니다.';

    } else {

        $td_width = (int)(100 / $list_mod);

        include $file;

    }

}</p>

<p>

// 별

function get_star($score)

{

    $star = round($score);

    if ($star > 5) $star = 5;

    else if ($star < 0) $star = 0;</p>

<p>    return $star;

}</p>

<p>

// 별 이미지

function get_star_image($it_id)

{

    global $g5;</p>

<p>    $sql = "select (SUM(is_score) / COUNT(*)) as score from {$g5['g5_shop_item_use_table']} where it_id = '$it_id' and is_confirm = 1 ";

    $row = sql_fetch($sql);</p>

<p>    return (int)get_star($row['score']);

}</p>

<p>

// 메일 보내는 내용을 HTML 형식으로 만든다.

function email_content($str)

{

    global $g5;</p>

<p>    $s = "";

    $s .= "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset={$g5['charset']}\"><title>메일</title>\n";

    $s .= "<body>\n";

    $s .= $str;

    $s .= "</body>\n";

    $s .= "</html></p>

<p>

 

shop.js는 댓글로 올리겠습니다.

 

선택옵션 select를 radio로 변경 후, radio버튼을 클릭하였음에도 불구하고

 

제품의 원래 가격이 가격에 반영이 되지 않고,

 

구매하기 버튼을 클릭 시 선택옵션을 선택하지 않았다는 경고창이 뜹니다.

 

이유를 잘 몰라 고수여러분께 도움을 요청드립니다 ㅠㅠ

댓글을 작성하려면 로그인이 필요합니다.

답변 1개

BKG0320
5년 전

shop.js 코드입니다.

 

</p>

<p>var option_add = false;

var supply_add = false;

var isAndroid = (navigator.userAgent.toLowerCase().indexOf("android") > -1);

var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);</p>

<p>$(function() {

    // 선택옵션

    /* 가상커서 ctrl keyup 이베트 대응 */

    /*

    $(document).on("keyup", "select.it_option", function(e) {

        var sel_count = $("select.it_option").size();

        var idx = $("select.it_option").index($(this));

        var code = e.keyCode;

        var val = $(this).val();</p>

<p>        option_add = false;

        if(code == 17 && sel_count == idx + 1) {

            if(val == "")

                return;</p>

<p>            sel_option_process(true);

        }

    });

    */</p>

<p>    /* 키보드 접근 후 옵션 선택 Enter keydown 이벤트 대응 */

    $(document).on("keydown", "select.it_option", function(e) {

        var sel_count = $("select.it_option").size();

        var idx = $("select.it_option").index($(this));

        var code = e.keyCode;

        var val = $(this).val();</p>

<p>        option_add = false;

        if(code == 13 && sel_count == idx + 1) {

            if(val == "")

                return;</p>

<p>            sel_option_process(true);

        }

    });</p>

<p>    if(isAndroid) {

        $(document).on("touchend", "select.it_option", function() {

            option_add = true;

        });

    } else {

        var it_option_events = isSafari ? "mousedown" : "mouseup";</p>

<p>        $(document).on(it_option_events, "select.it_option", function(e) {

            option_add = true;

        });

    }</p>

<p>    $(document).on("change", "select.it_option", function() {

        var sel_count = $("select.it_option").size(),

            idx = $("select.it_option").index($(this)),

            val = $(this).val(),

            it_id = $("input[name='it_id[]']").val(),

            post_url = (typeof g5_shop_url !== "undefined") ? g5_shop_url+"/itemoption.php" : "./itemoption.php",

            $this = $(this),

            op_0_title = $this.find("option:eq(0)").text();</p>

<p>        // 선택값이 없을 경우 하위 옵션은 disabled

        if(val == "") {

            $("select.it_option:gt("+idx+")").val("").attr("disabled", true);

            return;

        }</p>

<p>        $this.trigger("select_it_option_change", [$this]);</p>

<p>        // 하위선택옵션로드

        if(sel_count > 1 && (idx + 1) < sel_count) {

            var opt_id = "";</p>

<p>            // 상위 옵션의 값을 읽어 옵션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();

                });</p>

<p>                opt_id += chr(30)+val;

            } else if(idx == 0) {

                opt_id = val;

            }</p>

<p>            $.post(

                post_url,

                { it_id: it_id, opt_id: opt_id, idx: idx, sel_count: sel_count, op_title : op_0_title },

                function(data) {

                    $("select.it_option").eq(idx+1).empty().html(data).attr("disabled", false);</p>

<p>                    // select의 옵션이 변경됐을 경우 하위 옵션 disabled

                    if(idx+1 < sel_count) {

                        var idx2 = idx + 1;

                        $("select.it_option:gt("+idx2+")").val("").attr("disabled", true);

                    }</p>

<p>                    $this.trigger("select_it_option_post", [$this, idx, sel_count, data]);

                }

            );

        } else if((idx + 1) == sel_count) { // 선택옵션처리

            if(option_add && val == "")

                return;</p>

<p>            var info = val.split(",");

            // 재고체크

            if(parseInt(info[2]) < 1) {

                alert("선택하신 선택옵션상품은 재고가 부족하여 구매할 수 없습니다.");

                return false;

            }</p>

<p>            if(option_add)

                sel_option_process(true);

        }

    });</p>

<p>    // 추가옵션

    /* 가상커서 ctrl keyup 이베트 대응 */

    /*

    $(document).on("keyup", "select.it_supply", function(e) {

        var $el = $(this);

        var code = e.keyCode;

        var val = $(this).val();</p>

<p>        supply_add = false;

        if(code == 17) {

            if(val == "")

                return;</p>

<p>            sel_supply_process($el, true);

        }

    });

    */</p>

<p>    /* 키보드 접근 후 옵션 선택 Enter keydown 이벤트 대응 */

    $(document).on("keydown", "input.it_supply", function(e) {

        var $el = $(this);

        var code = e.keyCode;

        var val = $(this).val();</p>

<p>        supply_add = false;

        if(code == 13) {

            if(val == "")

                return;</p>

<p>            sel_supply_process($el, true);

        }

    });</p>

<p>    if(isAndroid) {

        $(document).on("touchend", "input.it_supply", function() {

            supply_add = true;

        });

    } else {

        var it_supply_events = isSafari ? "mousedown" : "mouseup";

        

        $(document).on(it_supply_events, "input.it_supply", function(e) {

            supply_add = true;

        });

    }</p>

<p>    $(document).on("change", "input.it_supply", function() {

        var $el = $(this);

        var val = $(this).val();</p>

<p>        if(val == "")

            return;</p>

<p>        if(supply_add)

            sel_supply_process($el, true);

    });</p>

<p>    // 수량변경 및 삭제

    $(document).on("click", "#sit_sel_option li button", function() {

        var $this = $(this),

            mode = $this.text(),

            this_qty, max_qty = 9999, min_qty = 1,

            $el_qty = $(this).closest("li").find("input[name^=ct_qty]"),

            stock = parseInt($(this).closest("li").find("input.io_stock").val());</p>

<p>        switch(mode) {

            case "증가":

                this_qty = parseInt($el_qty.val().replace(/[^0-9]/, "")) + 1;

                if(this_qty > stock) {

                    alert("재고수량 보다 많은 수량을 구매할 수 없습니다.");

                    this_qty = stock;

                }</p>

<p>                if(this_qty > max_qty) {

                    this_qty = max_qty;

                    alert("최대 구매수량은 "+number_format(String(max_qty))+" 입니다.");

                }</p>

<p>                $el_qty.val(this_qty);

                $this.trigger("sit_sel_option_success", [$this, mode, this_qty]);

                price_calculate();

                break;</p>

<p>            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);

                $this.trigger("sit_sel_option_success", [$this, mode, this_qty]);

                price_calculate();

                break;</p>

<p>            case "삭제":

                if(confirm("선택하신 옵션항목을 삭제하시겠습니까?")) {

                    var $el = $(this).closest("li");

                    var del_exec = true;</p>

<p>                    if($("#sit_sel_option .sit_spl_list").size() > 0) {

                        // 선택옵션이 하나이상인지

                        if($el.hasClass("sit_opt_list")) {

                            if($(".sit_opt_list").size() <= 1)

                                del_exec = false;

                        }

                    }</p>

<p>                    if(del_exec) {

                        // 지우기전에 호출해야 trigger 를 호출해야 합니다.

                        $this.trigger("sit_sel_option_success", [$this, mode, ""]);

                        $el.closest("li").remove();

                        price_calculate();

                    } else {

                        alert("선택옵션은 하나이상이어야 합니다.");

                        return false;

                    }

                }

                break;</p>

<p>            default:

                alert("올바른 방법으로 이용해 주십시오.");

                break;

        }

    });</p>

<p>    // 수량직접입력

    $(document).on("keyup", "input[name^=ct_qty]", function() {

        var $this = $(this),

            val= $this.val(),

            force_val = 0;</p>

<p>        if(val != "") {

            if(val.replace(/[0-9]/g, "").length > 0) {

                alert("수량은 숫자만 입력해 주십시오.");

                force_val = 1;

                $(this).val(force_val);

            } else {

                var d_val = parseInt(val);

                if(d_val < 1 || d_val > 9999) {

                    alert("수량은 1에서 9999 사이의 값으로 입력해 주십시오.");

                    force_val = 1;

                    $(this).val(force_val);

                } else {

                    var stock = parseInt($(this).closest("li").find("input.io_stock").val());

                    if(d_val > stock) {

                        alert("재고수량 보다 많은 수량을 구매할 수 없습니다.");

                        force_val = stock;

                        $(this).val(force_val);

                    }

                }

            }

            

            $this.trigger("change_option_qty", [$this, val, force_val]);</p>

<p>            price_calculate();

        }

    });

});</p>

<p>// 선택옵션 추가처리

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 = $("input.it_option:last").val().split(",");</p>

<p>    $("input.it_option").each(function(index) {</p>

<p>        value = $(this).val();

        item = $(this).closest(".get_item_options").length ? $(this).closest(".get_item_options").find("label[for^=it_option]").text() : "";

        

        if( !item ){

            item = $(this).closest("tr").length ? $(this).closest("tr").find("th label").text() : "";

        }</p>

<p>        if(!value) {

            run_error = true;

            return false;

        }</p>

<p>        // 옵션선택정보

        sel_opt = value.split(",")[0];</p>

<p>        if(id == "") {

            id = sel_opt;

        } else {

            id += chr(30)+sel_opt;

            sep = " / ";

        }</p>

<p>        option += sep + item + ":" + sel_opt;

    });</p>

<p>    if(run_error) {

        alert(item+"을(를) 선택해 주십시오.");

        return false;

    }</p>

<p>    price = info[1];

    stock = info[2];</p>

<p>    // 금액 음수 체크

    if(it_price + parseInt(price) < 0) {

        alert("구매금액이 음수인 상품은 구매할 수 없습니다.");

        return false;

    }</p>

<p>    if(add_exec) {

        if(same_option_check(option))

            return;</p>

<p>//        add_sel_option(0, id, option, price, stock);

        add_sel_option(0, id, option, price, stock, item);

    }

}</p>

<p>// 추가옵션 추가처리

function sel_supply_process($el, add_exec)

{

    if( $el.triggerHandler( 'shop_sel_supply_process',{add_exec:add_exec} ) !== false ){

        var val = $el.val();

        var item = $el.closest(".get_item_supply").length ? $el.closest(".get_item_supply").find("label[for^=it_supply]").text() : "";

        

        if( !item ){

            item = $el.closest("tr").length ? $el.closest("tr").find("th label").text() : "";

        }</p>

<p>        if(!val) {

            alert(item+"을(를) 선택해 주십시오.");

            return;

        }</p>

<p>        var info = val.split(",");</p>

<p>        // 재고체크

        if(parseInt(info[2]) < 1) {

            alert(info[0]+"은(는) 재고가 부족하여 구매할 수 없습니다.");

            return false;

        }</p>

<p>        var id = item+chr(30)+info[0];

        var option = item+":"+info[0];

        var price = info[1];

        var stock = info[2];</p>

<p>        // 금액 음수 체크

        if(parseInt(price) < 0) {

            alert("구매금액이 음수인 상품은 구매할 수 없습니다.");

            return false;

        }</p>

<p>        if(add_exec) {

            if(same_option_check(option))

                return;</p>

<p>//            add_sel_option(1, id, option, price, stock);

            add_sel_option(1, id, option, price, stock, item); // item 추가

            

        }

    }

}</p>

<p>// 선택된 옵션 출력

function add_sel_option(type, id, option, price, stock, item)

{

    var item_code = $("input[name='it_id[]']").val();

    var opt = "";

    var li_class = "sit_opt_list";

    

    if(type)

        li_class = "sit_spl_list";</p>

<p>    var opt_prc;

    

    if(parseInt(price) >= 0)

        opt_prc = "(+"+number_format(String(price))+"원)";

    

    else

        opt_prc = "("+number_format(String(price))+"원)";</p>

<p>    opt += "<li class=\""+li_class+"\">";

    opt += "<input type=\"hidden\" name=\"io_type["+item_code+"][]\" value=\""+type+"\">";

    opt += "<input type=\"text\" 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 += "<input type=\"hidden\" name=\"io_eq_"+item+"\" value=\""+item+"\">"; // 구분 용도 추가

    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>";</p>

<p>    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) {

            

            $("input[name=io_eq_"+item+"]").parent("li").remove(); // 기존에 등록된 <input>의 <li>태그를 삭제

            

            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);

                }

            }

        }

    }</p>

<p>    price_calculate();</p>

<p>    $("#sit_sel_option").trigger("add_sit_sel_option", [opt]);

}</p>

<p>// 동일선택옵션있는지

function same_option_check(val)

{

    var result = false;

    $("input[name^=io_value]").each(function() {

        if(val == $(this).val()) {

            result = true;

            return false;

        }

    });</p>

<p>    if(result)

        alert(val+" 은(는) 이미 추가하신 옵션상품입니다.");</p>

<p>    return result;

}</p>

<p>// 가격계산

function price_calculate()

{

    var it_price = parseInt($("input#it_price").val());</p>

<p>    if(isNaN(it_price))

        return;</p>

<p>    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;</p>

<p>    $el_prc.each(function(index) {

        price = parseInt($(this).val());

        qty = parseInt($el_qty.eq(index).val());

        type = $el_type.eq(index).val();</p>

<p>        if(type == "0") { // 선택옵션

            total += (it_price + price) * qty;

        } else { // 추가옵션

            total += price * qty;

        }

    });</p>

<p>    $("#sit_tot_price").empty().html("<span>총 금액 :</span> "+number_format(String(total))+"원");</p>

<p>    $("#sit_tot_price").trigger("price_calculate", [total]);

}</p>

<p>// php chr() 대응

function chr(code)

{

    return String.fromCharCode(code);

}</p>

<p>//$(".get_item_supply > .td_sit_sel > label").on("click",function(){

//    $(this).siblings("input").prop("checked", true);

//});</p>

<p>/* 키보드 접근 후 옵션 선택 Enter keydown 이벤트 대응 */

$('input[name=it_supply]:radio').click(function(e) { 

    var $el = $(this);

    var code = e.keyCode;

    var val = $(this).val();</p>

<p>    supply_add = false;

    if(code == 13) {

        if(val == "")

            return;</p>

<p>        sel_supply_process($el, true);

    }

});</p>

<p>if(isAndroid) {

    $("input[name=it_supply].radio").live("touchend", function() {

        supply_add = true;

    });

} else {

    $('input[name=it_supply]:radio').click(function() { 

        supply_add = true;

    });

}</p>

<p>    $('input[name=it_supply]:radio').click(function() { 

    var $el = $(this);

    var val = $(this).val();</p>

<p>    if(val == "")

        return;</p>

<p>    if(supply_add)

        sel_supply_process($el, true);

});</p>

<p>

 

고수 여러분 도와주셨으면 좋겠습니다 ㅠㅠ

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

b
beelzebub
4년 전
요거 혹시 해결하셨는지요?


저도 여기에서 막혀있어서 문의드립니다.

감사합니다 ㅠㅠ

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인