덧. 팁을 좀 더 업그레이드했습니다. https://xetown.com/lakepark/526822 이하의 팁도 활용가능하지만, 서명을 여러 개 받거나, 필수뿐 아니라 선택사항으로도 설정하시려는 경우에는 위 링크의 팁을 활용하시는 게 적절합니다.

 

 

후원회원 가입 등의 페이지를 개발할 때가 있을 겁니다.

관건은 이용자로부터 서명(사인, 싸인)을 어떻게 받을 거냐는 거겠죠.

이용자한테 후원신청서를 출력해서 직접 서명한 다음에 팩스로 전송해달라는 사이트도 있더군요;;;

 

이 팁을 활용하면 PC에서든 모바일에서든 이용자가 직접 서명을 그려서 서버에 전달할 수가 있습니다.

게시판 모듈의 확장변수를 이용한 방법인데, 다양한 방식으로 응용이 가능하리라고 판단됩니다.

 

스케치북 스킨 기준으로 설명을 드리겠습니다.

 

1. 준비물 구하기

- 앞선 게시물(https://xetown.com/square/519687)에도 썼듯이, 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. 확장변수 만들기

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

- 여기서는 '사용자 정의 이름'을 signature로 한다고 가정하겠습니다.

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

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

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

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

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

- 그리고 반드시 그럴 필요는 없지만 signature 변수를 사용자 정의 목록에서 맨 마지막으로 해주세요. 제가 알려드리는 팁은 그걸 전제로 작성됩니다;;;

- 그럼, 슬슬 소스 수정을 시작해볼까요?

 

3. write_form.html 수정

- 스킨 폴더에서 write_form.html 파일을 꺼낸 뒤 수정을 시작합니다. 잘 찾아보시면 <table cond="count($extra_keys)" class="et_vars exForm bd_tb">이라는 부분이 있을 겁니다. 이게 바로 확장변수 입력하는 테이블이에요.

- 그 아래아래에 <tr loop="$extra_keys=>$key,$val"> 같은 태그가 있을 겁니다. 얘를 아래와 같이 수정해봅니다. 이렇게 하면 테이블은 서명 부분만 빼고 입력 폼을 띄우게 되겠죠?

<tr loop="$extra_keys=>$key,$val" cond="$val->eid!='signature'">

- 확장변수 입력 table 태그 뒤에 본격적으로 서명 부분 코딩을 시작합니다. 대략 아래와 같이 해보겠습니다.

<!--// 서명 받기 -->
    <!--@if($extra_keys[count($extra_keys)]->eid=='signature')--> // 사용자 정의 목록의 맨 마지막이 signature 변수인 경우에 출력
    {@ $i=count($extra_keys) ;} // 목록 마지막에 있는 signature 변수의 키값을 간략하게 재정의
    <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" /> // 1번 항목의 준비물들을 불러옴
    <div class="sigPad" style="width:296px; display:table; margin:0 auto;"> // 모바일 최소 가로사이즈(320px) - 확장변수 입력 화면의 padding값(12px*2) = 296px ... 그리고 가운데 정렬
        <ul class="sigNav">
            <h3>{$extra_keys[$i]->name}<em>*</em></h3> // 사용자 정의에서 설정한 '입력항목 이름' 출력 ... 서명은 필수이므로 * 표시를 조건없이 출력
            <li class="clearButton"><a href="#clear">{$lang->reload}</a></li> // 서명 그리기 초기화를 위한 '새로고침' 링크
        </ul>
        <div class="sig sigWrapper" style="height:100px;"> // 높이는 각자 원하는 대로 취향껏
            <div class="typed"></div> // 에러 메시지가 뜨는 부분인데, XE에선 그닥 사용하는 일이 없긴 함
            <canvas class="pad" id="cy_sig" width="294" height="100"></canvas> // 서명 그려넣는 부분. 넓이는 위의 296px - border값(1px*2), 높이는 윗윗줄에서 설정한 값
            <input type="hidden" name="extra_vars{$i}" id="cy_sig_data" class="output" value="{$oDocument->getExtraEidValue($extra_keys[$i]->eid)}"> // canvas의 그림이 전달되는 입력폼. type이 hidden이므로 사용자에겐 표시 안 됨
        </div>
        <p style="margin-top:5px;text-align:center;font-size:11px;">{$extra_keys[$i]->desc}</p> // 사용자정의 설명 부분인데 이것도 각자 취향껏
    </div>
    <!--@end-->

- 그 다음엔 윗 부분 아래쯤에 '서명js의 옵션 설정', '그려진 이미지의 문자열 전달 처리', 그리고 (게시물 수정시에 불러올) '문자열의 이미지 처리'를 위해 다음과 같은 스크립트 코드를 넣어줍니다.

<!--// 서명 옵션 설정 및 서명 이미지값 문자열 전달 처리 -->
<script>
jQuery(document).ready(function(){
    jQuery('.sigPad').signaturePad({ // 기본 옵션을 설정하는데, 자세한 설명은 위의 링크 페이지를 참조해보세요^^
        drawOnly:true,
        drawBezierCurves:true,
        lineTop:90 // 이건 canvas에 깔아놓는 기본 밑줄 같은 겁니다. 숫자는 top값을 의미하죠
    });
});
function toDataURL(){ // 이 함수를 통해 canvas의 그림이 문자열로 변환됩니다. 해당 문자열은 확장변수의 입력값이 되는 거죠ㅋ
    var canvas = document.getElementById('cy_sig'),
        cv_data = document.getElementById('cy_sig_data');
    if(cv_data.value != ''){ // 여기에 조건을 주긴 했는데, 제가 무슨 정신으로 이런 조건을 줬는지는 잘 기억이 안 나네요. 어쨌든 잘 작동할 겁니다;;
        cv_data.value = canvas.toDataURL();
    } else {
        return false;
    }
}
</script>

<!--// 서명 수정시 기존 서명 출력 처리 -->
<script cond="$oDocument->getExtraEidValue('signature')"> // 수정 화면에서 서명이 기입력되어 있을 때만 작동하는 스크립트라는 뜻이겠죠.
if(window.addEventListener) {
    window.addEventListener('load', InitEvent, false);
}
function InitEvent(){
    var canvas = document.getElementById('cy_sig'),
        context = canvas.getContext('2d'),
        cv_data = document.getElementById('cy_sig_data');
    var image = new Image();
    image.src = "{$oDocument->getExtraEidValue('signature')}"; // 서명 폼의 문자열 값으로 이미지 url을 만들어줍니다.
    image.onload = function(){ // 해당 이미지는 캔버스에 그림으로 그려지게 되죠.
        context.drawImage(image,0,0);
        cv_data.value = canvas.toDataURL();
    }
}
</script>

- 마지막으로 하나 더 남았습니다. 위의 toDataURL 함수를 실행시켜줘야 하니까요. 파일 상단 부분에 보면 <form action="/" method="post" onsubmit="return procFilter(this, window.insert)" class="bd_wrt bd_wrt_main clear">라는 곳이 있을 겁니다. 얘를 다음과 같이 바꿔주세요.

<form action="/" method="post" onsubmit="<!--@if($extra_keys[count($extra_keys)]->eid=='signature')-->toDataURL();<!--@end-->return procFilter(this, window.insert)" class="bd_wrt bd_wrt_main clear">

- 이렇게 해야 글 등록시에 서명 입력 부분이 문자열로 변환돼서 서버에 전달이 됩니다. 그림이 안 그려지면요? 아까 숨겨놨던 인풋 박스에 아무런 값도 전달이 안 되면서 "서명 값은 필수입니다." 같은 경고창이 뜨겠죠.

- 이렇게 서명 입력 화면을 손봤으니, 이제는 출력 화면 차례겠네요.

 

4. _read.html 수정

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

- 여기서 <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'&&$val->eid!='signature'">{$val->getValueHTML()}</td>
<td cond="$val->eid!='rating'&&$val->eid=='signature'"><img src="{$val->getValueHTML()}" /></td>
<td cond="$val->eid=='rating'&&$val->eid!='signature'" class="rating"><span class="starRating" title="{$val->getValueHTML()}{$lang->score}"><span style="width:{$val->getValueHTML()*10}%">{$val->getValueHTML()}</span></span></td>

- 혹시 모르니 두 군데 테이블 모두 위와 같이 바꿔주시는 게 좋을 것 같습니다. 강력 권장.

 

... 이상입니다.

혹시 버그가 있을지 모르겠지만, 제 기억으로는 이 정도 선이었던 거 같아요;;;

유용하게 쓰시면 좋겠네요 :)

여러분들도 좋은 정보 있으면 많이 알려주세요~~

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile

    아차차, 스샷;;;

    2.png

  • profile
    드디어 상세한 설명이!! 감사합니다~
  • profile profile
    헉헉... 힘들어요;;;
  • profile profile
    고생하셨어요~ 토닥토닥~
  • ?
    후원게시판에 적용하는 팁이죠?
  • ? profile
    네, 게시판의 사용자정의 확장변수를 활용하는 팁입니다~
  • ?
    감사합니다!!
  • profile
    와 대단한 팁이네요~ 굿
  • profile profile
    canvas 말씀 안 해주셨으면 이 팁도 없었을 거예요ㅎㅎ
  • profile
    담당의 사인 그리고 운영자의 사인 두개를 넣으려면 어떻게 응용해야 할까요 ?
  • profile

    불러오는 js 때문인지 아니면 추가되는 스크립트 때문인지  CK에디터가 열리지 않아요.

  • profile profile

    .

  • profile profile
    아.. 요건 주석이 많이 달렸는데 그걸 제거하지 않아서 그렇네요.
  • profile profile
    아, 그럼 CK에디터는 괜찮으신 거죠? ㄷㄷㄷ
  • profile profile
    네. 일단 에디터는 불러와 졌는데 아래 댓글 처럼 스크립트가 열리고 닫히는데 문법이 오류가 있는지 뭔가 잘 안됩니다.
  • profile
    <script>
    jQuery(document).ready(function(){
    jQuery('.sigPad').signaturePad({
    drawOnly:true,
    drawBezierCurves:true,
    lineTop:90
    });
    function toDataURL(){
    var canvas = document.getElementById('cy_sig'),
    cv_data = document.getElementById('cy_sig_data');
    if(cv_data.value != ''){
    cv_data.value = canvas.toDataURL();
    } else {
    return false;
    }
    }
    </script>

    여기가 뭔가 이상한지 에러가 나면서 정상 동작이 안되는 듯 합니다.
  • profile
    테스트 삼아 여기에 지금 해 보고 있습니다.
    http://mygateway.link/QA
  • profile
    본문 내용에 스크립트가 바뀐건지 ?
    <script>
    jQuery(document).ready(function(){
    jQuery('.sigPad').signaturePad({
    drawOnly:true,
    drawBezierCurves:true,
    lineTop:90
    });
    });
    function toDataURL(){
    var canvas = document.getElementById('cy_sig'),
    cv_data = document.getElementById('cy_sig_data');
    if(cv_data.value != ''){
    cv_data.value = canvas.toDataURL();
    } else {
    return false;
    }
    }
    </script>

    현재 설명대로 넣으면 CK에디터가 열리지 않네요.
  • profile
    아.. js 파일이 여러폴더에 있어 1개 업로드가 누락되어서 그런거네요.
  • profile profile
    어엇? 방금 테스트용 게시판 들어가봤는데 어떻게 하신 건지 입력이 되네요?
  • profile profile
    네. js 파일 1개가 누락된거 확인하고 업로드 해줬습니다.
  • profile profile
    아, 네... 어쩐지 아까 보니 .sig와 .sigNav 태그가 display:none에서 block으로 바뀌질 않았더라구요...
    다행입니다~
  • profile

    테스트 사이트에서 어느정도 테스트로 시도해 보았느데요.

     

    sign.png

    필수항목이 세로로 나오는거를 수정하고..

     

    그리고 제가 실제 적용해야할  서명 두개를 입력 받으려면 어떻게 해야 할까요 ?

    글 쓰기 권한이 담당자,운영자 두명입니다.

    그래서 두명 모두 사인을 하는 형식이 필요한데요...

  • profile
    필수항목 세로 문제는
    .exForm caption { display: inline; }
    이걸 css에 추가하면 될 듯 합니다.
  • profile profile

    1. 일단 필수항목이 세로로 나오는 건,
    - 다른 사용자정의가 없다보니 tr 태그 루프가 안돌아서 사라져버리고, 그 때문에 캡션(필수항목)이 갈 곳을 잃어버린 거 같아요.
    - 이럴 땐 테이블을 <table cond="count($extra_keys)>1" class="et_vars exForm bd_tb"> 로 조건을 바꾸는 것도 방법이겠지 싶어요. 이 때 숫자 1은 서명 패드가 한 개라는 뜻이겠죠.

    2. 그리고 사인 패드 두 개를 넣는 건, 일단 짐작으로는
    - (1) $extra_keys[count($extra_keys)]로 받아오던 변수를 원래대로 $extra_keys 루프로 $val에 담아 각각의 $val->eid나 $val->idx로 받아주고,
    - (2) canvas와 input의 id를 서로 다르게 해서 스크립트로 넘겨주면 될 것 같은데요
    - 짐작으로만 그렇고 일단은 해봐야 알 것 같아요. 해당 제이쿼리 플러그인에서 두 개 이상의 패드를 지원하는지는 잘 모르겠거든요;;;

  • profile profile
    네, caption 태그의 display 기본 속성이 table-caption으로 주어져 있는 거 같더라구요
  • profile profile

    그냥 꼼수를 좀 써서 모바일쪽에만(마우스로 그리기 힘들어.. 터치패드로 그리게 하기 위하여..) 회원그룹으로 글 작성자를 판단한 다음

    두개의 사용자정의를 각각 사용해서 서명을 받도록 해 볼 수 도 있겠습니다.

    이경우
    <form action="/" method="post" onsubmit="<!--@if($extra_keys[count($extra_keys)]->eid=='signature')-->toDataURL();<!--@end-->

    이것의 처리를 어떻게 바꿔주면 될까요 ?

    signature1 이 추가될 예정입니다.

     

     

    아.. 그리고 사이즈를 좀 키우니 밑줄의 위치가 위로 가서 서명 후에도 위쪽에 줄이 생기는 이미지로 저장이 되던데요. 밑줄 자체를 없애려면 어디서 없애야 할까요 ?

  • profile profile
    서명1과 서명2가 모두 목록 최하단에 있다면,
    <!--@if($extra_keys[count($extra_keys)-1]->eid=='signature1'&&$extra_keys[count($extra_keys)]->eid=='signature2')-->
    로 하면 될 거 같아요.

    근데, 아까 좀 해봤는데요.
    서명 패드를 두 개로 나눠서 id값이랑 스크립트 내 변수 정의를 다르게 하면, 입력이랑 출력은 잘 되는데, 수정시에는 문제가 발생하더라구요.
    서명을 한 개만 받을 땐 InitEvent 함수에서 Image() 메소드를 써도 수정시에 기존 값이 잘 출력됐었는데, 두 개를 받을 땐 두 가지 서명이 서로 중복되는 현상이 나타나더군요.
    이 부분은 연구를 좀 더 해봐야겠습니다;;;
  • profile profile
    밑줄 없애기는 옵션에서 lineTop의 값을 캔버스 높이보다 더 많이 줘봤더니 됐던 거 같아요.
  • profile profile

    .

  • profile profile
    서명(싸인)을을 작성할때만 적용해줘도 되니 jquery.signaturepad.css 파일에 넣어보세요.
  • profile profile

    서명 패드 두 개 넣는 건 대강 이렇게 되는군요.

    (말씀 드렸던 대로 서명 변수 두 개가 사용자정의 목록 맨끝에 있으며, 각각의 변수명은 signature와 signature2인 것으로 하겠습니다)

    <!--// 서명 받기 -->
    {@ $i=count($extra_keys) ;}
    <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" />
    <div class="sigPad" style="width:296px; display:table; margin:0 auto;">
        <ul class="sigNav">
            <h3>{$extra_keys[$i-1]->name}<em>*</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" width="294" height="100"></canvas>
            <input type="hidden" name="extra_vars{$i-1}" id="cy_sig_data" class="output" value="{$oDocument->getExtraEidValue($extra_keys[$i-1]->eid)}">
        </div>
        <p style="margin-top:5px;text-align:center;font-size:11px;">{$extra_keys[$i-1]->desc}</p>
    </div>
    
    <div class="sigPad" style="width:296px; display:table; margin:0 auto;">
        <ul class="sigNav">
            <h3>{$extra_keys[$i]->name}<em>*</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_sig2" width="294" height="100"></canvas>
            <input type="hidden" name="extra_vars{$i}" id="cy_sig_data2" class="output" value="{$oDocument->getExtraEidValue($extra_keys[$i]->eid)}">
        </div>
        <p style="margin-top:5px;text-align:center;font-size:11px;">{$extra_keys[$i]->desc}</p>
    </div>

    그러고보니 잘만 하면 루프를 돌릴 수도 있겠단 생각이 들긴 하네요ㅎㅎ

    여기 맞춰서 스크립트 부분은 아래와 같이 합니다.

    <!--// 서명 옵션 설정 및 서명 이미지값 문자열 전달 처리 -->
    <script>
    jQuery(document).ready(function(){
        jQuery('.sigPad').signaturePad({
            drawOnly:true,
            drawBezierCurves:true,
            lineTop:90
        });
    });
    
    function toDataURL(){
        var canvas = document.getElementById('cy_sig'),
            cv_data = document.getElementById('cy_sig_data');
        if(cv_data.value != ''){
            cv_data.value = canvas.toDataURL();
        } else {
            return false;
        }
        var canvas2 = document.getElementById('cy_sig2'),
            cv_data2 = document.getElementById('cy_sig_data2');
        if(cv_data2.value != ''){
            cv_data2.value = canvas2.toDataURL();
        } else {
            return false;
        }
    }
    </script>
    
    <!--// 서명 수정시 기존 서명 출력 처리 -->
    <script cond="$oDocument->getExtraEidValue('signature')&&$oDocument->getExtraEidValue('signature2')">
    if(window.addEventListener) {
        window.addEventListener('load', InitEvent, false);
    }
    
    function InitEvent(){
        var canvas = document.getElementById('cy_sig'),
            context = canvas.getContext('2d'),
            cv_data = document.getElementById('cy_sig_data');
        var img = new Image();
        img.src = "{$oDocument->getExtraEidValue('signature')}";
        img.onload = function(){
            context.drawImage(img,0,0);
            cv_data.value = canvas.toDataURL();
        };
    
        var canvas2 = document.getElementById('cy_sig2'),
            context2 = canvas2.getContext('2d'),
            cv_data2 = document.getElementById('cy_sig_data2');
        var img2 = new Image();
        img2.src = "{$oDocument->getExtraEidValue('signature2')}";
        img2.onload = function(){
            context2.drawImage(img2,0,0);
            cv_data2.value = canvas2.toDataURL();
        };
    }
    </script>

    얘네도 왠지 루프 돌리고 싶지만, 일단은....ㅋㅋ

    그리고, 출력 부분도 바꿔줘야겠죠.

    <!--@if($val->eid!='rating')-->
    <td cond="$val->eid!='signature'&&$val->eid!='signature2'">{$val->getValueHTML()}</td>
    <td cond="$val->eid=='signature'"><img src="{$val->getValueHTML()}" /></td>
    <td cond="$val->eid=='signature2'"><img src="{$val->getValueHTML()}" /></td>
    <!--@else-->
    <td class="rating"><span class="starRating" title="{$val->getValueHTML()}{$lang->score}"><span style="width:{$val->getValueHTML()*10}%">{$val->getValueHTML()}</span></span></td>
    <!--@end-->

    이상입니다~

  • profile profile
    감사합니다. 자세한 답변까지 다 해주셔서 적용만 해 보면 되겠네요. 해보고 자야 겠습니다 ㅋ

    <!--@if($extra_keys[count($extra_keys)-1]->eid=='signature'&&$extra_keys[count($extra_keys)]->eid=='signature2')-->

    여기도 이렇게 되면 되는거겠네요 ?
  • profile profile
    제 경우엔 $mid로 걸어놓긴 했지만, 아마도 그럴 거 같아요^^
  • profile profile

    지금 해보고 있는데요. 순서로 따지면 맨아랫쪽 사용자정의는 이름과 설명이 나오는데 그 위에 것이 출력이 안되는 현상이 있네요.

    저희가 후원도우미 애드온으로 사용자정의 1개가 자동으로 추가되는 것이 있는데 그것 때문은 아닌지 생각이 들기도 합니다.

     

    --> 이건 애드온에서 만들어지는 사용자정의를 맨 마지막으로 계산하고 한칸씩 밀어서 다시 수정하니 해결 된듯 합니다.

     

  • profile profile

    한가지 추가 문제가 저희는 두개를 다른 사람이 사인을 하기때문에 둘 중 하나가 비어 있을 수 잇는데 이럴 경우는 이미지로 저장이 안되는 것 같습니다.

  • profile profile

    마지막 해결하지 못한 하나가 더 있습니다.

     

    Screenshot_20170307-010210.png

     

    모바일에서는 위와 같이 되어서 서명을 그릴 수가 없네요. PC에서 그린다음 저장한 후 모바일에서 수정만하고 서명 건드리지 않고 저장을 다시해보면 서명이 사라지지 않는 것으로 보아 그려진 것이 저 선 위쪽으로 있는 듯 합니다.

    오늘은 여기 까지 하고 이만 자야겠네요.

     

  • profile profile
    1. 옵션에서 라인 top 포지션은 원상복구하구요;;; 라인 색상을 배경색에 맞추면 모바일에서도 흰 색 패드로 나오는 거 같습니다. lineColour:'#ffffff'

    2. 이런 방법이 떠오릅니다.

    (1) 담당자와 운영자가 서로 다른 아이디 또는 회원그룹이라면 $logged_info 조건에 맞춰 서명패드 div를 차별적으로 감추는 겁니다.

    <div class="sigPad" style="width:296px; display:table; margin:0 auto;" cond="$logged_info->user_id=='xetown'">

    (2) 그리고, 담당자인 경우엔 운영자 서명 패드에 기서명된 값이 없다면 인풋의 value 속성에 특정값을 줍니다. 운영자인 경우엔 그 반대일 테구요. 이렇게 하면 입력 화면에서 다른 회원(그룹)의 서명을 수정할 수 없고 또한 필수항목 검사도 무사히 통과할 수 있을 거 같습니다.

    value="<!--@if($oDocument->getExtraEidValue($extra_keys[$i]->eid))->{$oDocument->getExtraEidValue($extra_keys[$i]->eid)}"<!--@else-->특정값<!--@end-->"

    ... 이 특정값과 그에 관련된 조건을 어떻게 해야 할지는 좀 더 연구를 해보셔야 할 거 같습니다.
  • profile profile

    그럼 모바일부터 해결해 보려고 하는데요.
    top 포지션은 원래대로 입니다. 변경해보아도 변화는 없구요. 그런데 lineColour:'#ffffff' 하고 그려지지 않는 것 하고 관련이 있을까요 ?

    지금 모바일에서는 스크린샷 처럼 보이면서 그려지지 않구요.
    PC버전 보기로 해서 그리면 라인이 정상적으로 아래에 그려져 있고 그림도 그려지더라구요.

     

     

    ->> 모바일 보드 스킨과 겹치는 클래스명 때문이네요.

  • profile
    멋집니다. 저도 이거 꼭 필요했는데 역시 해결 안되는게 없군요^^
  • profile profile
    잘 응용해서 쓰시면 좋을 거 같아요^^
  • profile
    모바일에서 이상한 것은 모바일 보드스킨의 클래스와 겹치는게 있어서 그랬네요.
    해결 된듯 합니다.

    .pad {
    position: relative;
    display: block !important;
    }

    저희 모바일에서 pad 부분에서 가리는 css가 있어서 위와 같이 display: block !important; 추가해 주고 해결 되었습니다.

    마지막으로
    value="<!--@if($oDocument->getExtraEidValue($extra_keys[$i]->eid))->{$oDocument->getExtraEidValue($extra_keys[$i]->eid)}"<!--@else-->특정값<!--@end-->"

    특정값 힌트좀 주세요. 아까 주셨던거라도...
    우선 흰공백으로라도 처리해도 차선이 될 것 같습니다.
  • profile

    아니면...

     

    sing.png

    지금은 필요없는 경우는 이렇게  그려 넣으려고 하는데 이 값을 찾아내서 특정값에 넣어면 될까요 ??

     

    담당사인 없이 운영자만 할 경우 담당 전결로 처리할 경우 도움이 될 듯 해서요.

     

     

    현재는 무조건 상대방 사인까지 임의로 저렇게 표시를 하고 저장해야 하는 상황인 듯합니다.

  • profile

    아.. 참고로 저희는 필수가 아니고 필요할때만 서명을 합니다. 위에 필수 검사 이야기가 나와서 그런데 그러면 차라리 입력이 없으면 없는 것으로 하게 할 수는 없을까요?

  • profile profile
    위 이미지들의 입력값은 각각의 이미지 url과 동일하니 이미지 우클릭해서 나오는 data~~로 시작하는 파일 정보를 복사해서 '특정값' 부분에 붙여넣으시면 될 거예요.

    그리고 선택사항으로 하려면 toDataURL 함수 중 if 구문을 벗겨내면 됩니다. else return false; 도 지우시구요. cv_data.value = canvas.toDataURL;만 살리는 거죠.
  • profile profile
    아.. 그럼 선택사항으로 해봐야 겠습니다. 위 이미지값으로 하려니 어렵네요. 너무 길어서 그런지 오타가 있는지 에러가 나서요.
  • profile profile
    필수/선택에 자동으로 대응하게 할 방법도 없지 않을 거 같은데, 그건 오늘 하루 종일 외부에 있게 돼서 시간이 좀 걸릴 거 같아요;;;
  • profile profile
    MID로 조건 변경하고 else return false; 로 조정하면 될까요 ?
    MID 조건도 필요 없나요 ?
  • profile profile
    선택사항으로 하면 해결될 것도 같은데, 한번 해보시고 말씀해주세요. 그래도 안 된다면 연구 좀 해봐야 할 거 같아요~
  • profile profile
    그런데 이렇게 하면 수정시에 기록해 놓은 이미지가 않보이는데요 ?
  • profile
    2번째 스크립트 조건에서 || 으로 바꾸니 보이네요.
    큰 도움되었습니다. 감사합니다.

    이제 각자 필요한 서명만 보이도록 처리하면 마무리 되겠네요.
    정말 감사합니다.
  • profile profile
    필수가 아니라 선택이니 or로 해야겠군요.
    화이팅입니다~
  • profile profile
    감사합니다! 저희가 사용하는 방식으로 모두 마무리했습니다!!!
    이제 보호소후원업무에 공지글이나 자금집행 공지 등 담당자와 저의 사인을 넣어 담당과 제가 긴밀하게 협의후 진행하는 모습을 회원들께 보여드릴 수 있게 되었습니다.

    정말 멋진 팁입니다.
  • profile
    마지막으로 한가지 피드백 드리면.
    두개 서명 받을때 조건으로 하나를 출력안되게 하면 서명입력이 안됩니다!
    저희는 그냥 두개 다 보이게 했어요~~~
  • profile profile
    네, 그것도 감안해서 다시 한번 짜보도록 할게요! :)
  • profile
    멋집니다.
    한 번 써봐야겠습니다
  • ?
    라이믹스 2.1.2 버전 php 7.4에서도 잘 사용하고 있습니다. 다시한번 감사드립니다. ^^