Home > 애드온 > 확장변수 다중검색 > > 후원회원 가입 받을 때 서명(싸인, 사인) 받는 법 2 - 복수의 패드 및 해당 확장변수가 필수/선택일 경우를 모두 고려함
by아포리아 postedJan 25, 2016

후원회원 가입 받을 때 서명(싸인, 사인) 받는 법 2 - 복수의 패드 및 해당 확장변수가 필수/선택일 경우를 모두 고려함

Views 166 Likes 0 Replies 0
Extra Form
입금자 성명 아포리아
필요장비 냉수,에어컨
대관시간 1800
신청공간 강의실
대관일 2011-10-10

지난번에 게시판 모듈 스킨(특히, 스케치북)을 이용해 서명 그리기를 끼워넣는 팁을 소개해드린 바 있습니다. (아래 링크 참조)

https://www.xetown.com/lakepark/520085

 

해당 게시물에서 보시는 바와 같이 @웹지기님을 통해 서명 패드가 (1) 복수로 존재하거나 (2) 필수가 아닐 수도 있는 경우 등에 대해 피드백을 받기도 했습니다.

그래서 이 두 가지 경우를 우선적으로 고려해서 반복문과 기타 구문들을 활용해서 코드를 다시 짜봤습니다.

(오늘 낮술부터 시작해서 정신이 몽롱한 관계로 지난번처럼 자세한 설명을 못드리는 점 양해 부탁드리겠습니다)

 

1. 준비물 구하기

- 앞선 게시물에도 쓰긴 했지만, 다시 한번 말씀 드리겠습니다.

- 일단 http://www.jqueryscript.net/other/Smooth-Signature-Pad-Plugin-with-jQuery-Html5-Canvas.html 로 갑니다.

- Download 받으세요.

- jquery.signaturepad.css 파일은 css 폴더에 저장해줍니다. (스케치북 스킨의 css 폴더를 말하는 거예요)

- numeric-1.2.6.min.js, bezier.js, jquery.signaturepad.js, js/json2.min.js 등의 파일은 js 폴더에 저장해줍니다. (마찬가지로 스케치북 스킨의 js 폴더)

- 그러면, 확장변수를 만들어보겠습니다.

 

2. 확장변수 만들기

- 게시판 관리 > 사용자 정의 > 추가로 들어가서 확장변수를 만듭니다.

- 여기서 '사용자 정의 이름'을 signature1로 합니다. (♦반드시 그렇게 하셔야만 소스가 제대로 돌아갑니다)

- '입력항목 이름'은 원하시는 대로 하세요. 저는 그냥 '서명'이라고 했습니다.

- '입력형식'은 무엇으로 하든 관계가 없으니 가급적이면 그냥 내버려둡니다 ㅋ

- 서명은 필수일 테니 '필수항목'에선 '예'를 체크합니다.

- '설명'은 대강 이렇게 해보죠. '윗칸에 서명을 그려 넣어주세요.'

- '검색'은 '아니오'를 권장합니다.

- 그리고 서명패드를 두 개 이상으로 추가하고 싶으시다면, 순차적으로 signature2, signature3, signature4, ... 등으로 순번을 지켜주시면 됩니다.

 

3. write_form.html 수정

- 스킨 폴더에서 write_form.html 파일을 꺼낸 뒤 수정을 시작합니다.
 

- 첫 번째. 파일 상단 부분에 보면 <form action="./" method="post" onsubmit="return procFilter(this, window.insert)" class="bd_wrt bd_wrt_main clear">라는 곳이 있을 겁니다. 얘를 다음과 같이 바꿔주세요.

{@
    if(count($extra_keys)):
        foreach($extra_keys as $val):
            $eids[] = $val->eid;
        endforeach;
    endif;
}
<form action="./" method="post" onsubmit="<!--@if(strpos($eids,'signature')!==false)-->dataURL();<!--@end-->return procFilter(this, window.insert)" class="bd_wrt bd_wrt_main clear">

- 이렇게 해야 확장변수 목록 중에 'signature'가 들어가 있는 경우에만 서명 입력 부분이 문자열로 변환돼서 서버에 전달이 됩니다. 그림이 안 그려지면요? 해당 변수가 필수인 경우에는 "서명 값은 필수입니다." 같은 경고창이 뜨면서 문서 등록이 중지되겠고, 선택인 경우에는 아무런 값도 전달하지 않은 채로 문서가 등록될 겁니다.
 

- 두 번째, 잘 찾아보시면 <table cond="count($extra_keys)" class="et_vars exForm bd_tb">이라는 부분이 있을 겁니다. 이게 바로 확장변수 입력하는 테이블이에요.

- 그 아래아래에 <tr loop="$extra_keys=>$key,$val"> 같은 태그가 있을 겁니다. 얘를 아래와 같이 수정해봅니다. 이렇게 하면 확장변수값을 입력하는 테이블은 서명 패드(들)만 빼고 입력 폼을 띄우게 됩니다.

<tr loop="$extra_keys=>$key,$val" cond="substr($val->eid,0,9)!='signature'">


- 세 번째, 마지막으로 하나 더. 확장변수 입력 table 태그 뒤에 본격적으로 서명 부분 코딩을 시작합니다. 대략 아래와 같이 해보겠습니다.(이번에는 지난번과 달리 한번에 쭉 갑니다ㅎㅎ)

<!--// 서명 받기 -->
<block cond="strpos($eids,'signature')!==false">
    <load target="css/jquery.signaturepad.css" />
    <load target="js/numeric-1.2.6.min.js" />
    <load target="js/bezier.js" />
    <load target="js/jquery.signaturepad.js" />
    <load target="js/json2.min.js" />
    {@ $i=1; }
    <div class="sigPad" style="width:296px; display:table; margin:0 auto;" loop="$extra_keys=>$key,$val" cond="substr($val->eid,0,9)=='signature'">
        <ul class="sigNav">
            <h3>{$val->name}<em cond="$val->is_required=='Y'">*</em></h3>
            <li class="clearButton"><a href="#clear">{$lang->reload}</a></li>
        </ul>
        <div class="sig sigWrapper" style="height:100px;">
            <div class="typed"></div>
            <canvas class="pad" id="cy-sig{$i}" width="294" height="100"></canvas>
            <input type="hidden" name="extra_vars{$key}" id="cy-sig_data{$i}" class="output<!--@if($val->is_required=='Y')--> cy-req<!--@end-->" value="{$oDocument->getExtraEidValue($val->eid)}">
        </div>
        <p style="margin-top:5px;text-align:center;font-size:11px;">{$val->desc}</p>
        {@ $i++ ;}
    </div>
<script>
// 서명 옵션 설정
jQuery(document).ready(function(){
    jQuery('.sigPad').signaturePad({
        drawOnly:true,
        drawBezierCurves:true,
        lineTop:90
    });
});
// 서명 패드 갯수(=n-1) 자동 설정
var n = '{$i}';
// 서명 관련 변수 정의
for(var i=1;i<n;i++) {
    eval('canvas'+i+'=document.getElementById("cy-sig'+i+'")'),
    eval('context'+i+'=canvas'+i+'.getContext("2d")'),
    eval('cv_data'+i+'=document.getElementById("cy-sig_data'+i+'")'),
    eval('req'+i+'=cv_data'+i+'.className.split(" ")[1]'),
    eval('val'+i+'=cv_data'+i+'.value');
}
// 서명 이미지값 문자열 전달 처리
function dataURL(){
    for(var i=1;i<n;i++) {
        if(eval('cv_data'+i).value != ''){
            eval('cv_data'+i).value = eval('canvas'+i).toDataURL();
        } else {
            if(eval('req'+i) == 'cy-req') {
                return false;
            } else eval('cv_data'+i).value = '';
        }
    }
}
// 수정시 서명 문자열의 이미지 로드
if(window.addEventListener) {
    for(var i=1;i<n;i++) {
        if(eval('val'+i) != '') window.addEventListener('load', cnvs2Img, false);
    }
function cnvs2Img(){
    for(var i=1;i<n;i++) {
        eval('image'+i+' = new Image()');
        eval('image'+i).src = eval('val'+i);
        eval('image'+i).onload = function(){
            for(var i=1;i<n;i++) {
                eval('context'+i).drawImage(eval('image'+i),0,0);
                if(eval('val'+i) != '') {
                    eval('cv_data'+i).value = eval('canvas'+i).toDataURL();
                } else {
                    eval('cv_data'+i).value = '';
                }
            }
        }
    }
}
}
</script>
</block>

 

4. _read.html 수정

- 주지하시듯, 게시물 본문은 _read.html. 따라서 확장변수로서 signature1~n도 여기서 일람해볼 수 있습니다. 다만, 서버로 전달된 복잡한 문자열을 다른 확장변수처럼 바로 출력할 순 없겠죠.

- 여기서 <caption class="blind">Extra Form</caption>라는 구문이 들어간 두 개의 table을 볼 수 있을 겁니다. '스킨 설정 > 본문 일반 설정 > 확장변수 위치'가 '본문 안에(기본)'인 경우엔 아래쪽 table, '제목 아래'인 경우엔 윗쪽 table이 될 겁니다.

- 이 테이블'들'에 td 태그 부분이 있습니다. 대개는 이렇게 되어 있죠. 평점 매기는 게시판을 구분 하기 위한 코드들인 거 같네요.

<td cond="$val->eid!='rating'">{$val->getValueHTML()}</td>
< td cond="$val->eid=='rating'" class="rating"><span class="starRating" title="{$val->getValueHTML()}{$lang->score}"><span style="width:{$val->getValueHTML()*10}%">{$val->getValueHTML()}</span></span></td>

- 위의 코드'들'을 다음과 같이 바꿔줍니다. 네, 바로 두 번째 줄이 핵심입니다. 서명 변수(들)에 한해서 이미지로 불러오는 거죠. 입력되어 있는 값은 이미지의 dataURL이니까요ㅎㅎ

<td cond="$val->eid!='rating'&&substr($val->eid,0,9)!='signature'">{$val->getValueHTML()}</td>
<td cond="$val->eid!='rating'&&substr($val->eid,0,9)=='signature'"><img src="{$val->getValueHTML()}" /></td>
<td cond="$val->eid=='rating'&&substr($val->eid,0,9)!='signature'" class="rating"><span class="starRating" title="{$val->getValueHTML()}{$lang->score}"><span style="width:{$val->getValueHTML()*10}%">{$val->getValueHTML()}</span></span></td>

 

이상입니다.

사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )

아포리아 DIY

게시판 사용자정의 확장변수 다중검색

List of Articles
번호 분류 제목 입금자 성명 신청공간 대관일 대관시간 필요장비
공지 0.5.3 업데이트 file
공지 0.5.2 업데이트 file
35 게시판 본문의 분류를 출력할 때 상위 카테고리도 같이 출력하기 file 윤삼 세미나실 2018-04-27 1100 화이트 보드,얼음,에어컨
34 스킨에서 댓글 cpage 자동 감지 윤삼 세미나실 2011-10-10 1200 화이트 보드,보드마카,지우개
33 에디터 프로알라 에디터로 써보는 글 윤삼 세미나실 2018-06-28 1300 화이트 보드,보드마카,지우개
32 게시판 "본문"에서 확장변수(단일/다중선택) 기본값의 다국어 출력 방법 윤삼 강의실 2018-06-28 1930 화이트 보드,보드마카,지우개
31 템플릿 템플릿 요소별 조합을 해보자! 윤삼 강의실 2018-06-23 1200 화이트 보드,보드마카,지우개
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7