<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT의 신</title>
    <link>https://selfdevelope.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 12 Jun 2026 19:53:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>xemaker</managingEditor>
    <item>
      <title>라이믹스 입력 폼</title>
      <link>https://selfdevelope.tistory.com/1095</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전글에 insDoc.html 파일이 있으니 입력 html은 그것을 참고 하면 되고..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이믹스마다 좀 다른게 있는지 수정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insDoc 폴더를 하나 만들고 거기에 insDoc.html, insert_proc.php 파일 2개를 넣고 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 호스팅에서 하니까 기존 파일에 ,member_srl,email_address,homepage,ipaddress 이 부분이 필수라고 해서 추가한 버전이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781244894705&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
ob_start();
error_reporting(0);
ini_set('display_errors', 0);

define('__XE__', true);
require_once('../config/config.inc.php');
$oContext = &amp;amp;Context::getInstance();
$oContext-&amp;gt;init();

header('Content-Type: application/json');

try {
    // 1. 데이터 수집
    $title = &quot;후원신청서 - &quot; . ($_POST['member_name'] ?: '무명후원자');
    $member_name = $_POST['member_name'] ?? '미입력';
    $support_type = $_POST['support_type'] ?? '정기후원';
    $support_category = $_POST['support_category'] ?? '미선택';
    $support_amount = $_POST['support_amount'] ?? '0';
    $member_type = $_POST['member_type'] ?? '개인';
    $phone = $_POST['phone'] ?? '미입력';
    $email = $_POST['email'] ?? '미입력';
    $bank_name = $_POST['bank_name'] ?? '미선택';
    $account_num = $_POST['account_num'] ?? '미입력';
    $pay_date = $_POST['pay_date'] ?? '미지정';
    
    // 서명 데이터 (Base64)
    $signature_data = $_POST['signature_image'] ?? ''; 

    // --- 추가: 약관 동의 데이터 수집 (반복문 처리) ---
    $agreement_list_html = &quot;&quot;;
    for ($i = 0; $i &amp;lt; 5; $i++) {
        $t_title   = $_POST[&quot;term_title_$i&quot;]; // HTML hidden 필드에서 전달됨
        $t_content = $_POST[&quot;term_content_$i&quot;]; // HTML hidden 필드에서 전달됨
        $t_agree   = ($_POST[&quot;agree_$i&quot;] == 'Y') ? '동의/확인함' : '미동의';

        if($t_title) {
            $agreement_list_html .= &quot;
                &amp;lt;div style='margin-bottom:12px; border-bottom:1px dashed #ccc; padding-bottom:8px;'&amp;gt;
                    &amp;lt;div style='font-weight:bold; font-size:13px; color:#333;'&amp;gt;▣ {$t_title}&amp;lt;/div&amp;gt;
                    &amp;lt;div style='font-size:11px; color:#666; margin:4px 0; line-height:1.4;'&amp;gt;{$t_content}&amp;lt;/div&amp;gt;
                    &amp;lt;div style='font-size:12px;'&amp;gt;결과: &amp;lt;span style='color:#007aff; font-weight:bold;'&amp;gt;{$t_agree}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&quot;;
        }
    }

    $module_srl = 2301; 
    $oDB = DB::getInstance();
    $document_srl = getNextSequence();
    $regdate = date('YmdHis');

    // 2. 정적 HTML 파일 생성 경로 설정
    $html_save_dir = '../files/saved_html/';
    if(!is_dir($html_save_dir)) mkdir($html_save_dir, 0777, true);

    $html_filename = &quot;support_{$document_srl}.html&quot;;
    $html_web_path = '/rx/files/saved_html/' . $html_filename;
    $html_full_path = $html_save_dir . $html_filename;

    // 3. 서류 디자인 (증빙용 HTML)
    $saved_html_content = '
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;후원신청서 증빙 - ' . htmlspecialchars($member_name) . '&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body { font-family: &quot;Malgun Gothic&quot;, sans-serif; padding: 30px; line-height: 1.5; color: #333; }
            .doc-wrap { max-width: 700px; margin: 0 auto; border: 1px solid #000; padding: 30px; }
            h1 { text-align: center; font-size: 24px; text-decoration: underline; margin-bottom: 30px; }
            table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
            th, td { border: 1px solid #ccc; padding: 10px; font-size: 14px; }
            th { background: #f4f4f4; width: 30%; text-align: left; }
            .sig-box { text-align: center; margin-top: 40px; border-top: 2px solid #333; padding-top: 20px; }
            .sig-image { border: 1px solid #eee; width: 250px; height: 100px; margin-top: 10px; }
            .term-area { margin-top:30px; border:1px solid #eee; padding:15px; background:#fafafa; page-break-before: always; }
            @media print { .no-print { display: none; } }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;no-print&quot; style=&quot;text-align:right;&quot;&amp;gt;&amp;lt;button onclick=&quot;window.print()&quot;&amp;gt;PDF 저장 / 인쇄&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;doc-wrap&quot;&amp;gt;
            &amp;lt;h1&amp;gt;후 원 신 청 서&amp;lt;/h1&amp;gt;
            &amp;lt;p style=&quot;text-align:right;&quot;&amp;gt;접수번호: ' . $document_srl . '&amp;lt;/p&amp;gt;
            
            &amp;lt;h3&amp;gt;1. 후원 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . $support_type . ' / ' . $support_category . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . number_format((int)$support_amount) . ' 원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;2. 후원자 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($member_name) . ' (' . $member_type . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;3. 결제 정보 (CMS)&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;은행명&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($bank_name) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;계좌번호&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;매월 ' . $pay_date . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;div class=&quot;term-area&quot;&amp;gt;
                &amp;lt;h3&amp;gt;4. 이용 약관 및 동의 기록&amp;lt;/h3&amp;gt;
                ' . $agreement_list_html . '
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;sig-box&quot;&amp;gt;
                &amp;lt;p&amp;gt;본인은 위와 같이 정기 후원을 신청하며, 개인정보 활용 및 약관에 동의합니다.&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;' . date('Y년 m월 d일') . '&amp;lt;/p&amp;gt;
                &amp;lt;p style=&quot;font-size:18px; font-weight:bold;&quot;&amp;gt;신청인: ' . htmlspecialchars($member_name) . ' (인)&amp;lt;/p&amp;gt;
                &amp;lt;img src=&quot;' . $signature_data . '&quot; class=&quot;sig-image&quot; alt=&quot;서명&quot;&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;';

    file_put_contents($html_full_path, $saved_html_content);

    // 4. 게시판 본문에 저장될 상세 내용 구성
    $db_content = '
    &amp;lt;div class=&quot;sponsorship-detail&quot; style=&quot;font-family:sans-serif; line-height:1.6; max-width:600px; border:1px solid #ddd; padding:20px;&quot;&amp;gt;
        &amp;lt;h2 style=&quot;border-bottom:2px solid #007aff; padding-bottom:10px; color:#333;&quot;&amp;gt;후원 신청 상세 정보&amp;lt;/h2&amp;gt;
        
        &amp;lt;table style=&quot;width:100%; border-collapse:collapse; margin-top:15px;&quot;&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;width:30%; padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($support_type) . ' / ' . htmlspecialchars($support_category) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;&amp;lt;strong&amp;gt;' . number_format((int)$support_amount) . '원&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($member_name) . ' (' . htmlspecialchars($member_type) . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;은행/계좌&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($bank_name) . ' / ' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;매월 ' . htmlspecialchars($pay_date) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; padding:15px; border:1px solid #e1e1e1; background:#fcfcfc;&quot;&amp;gt;
            &amp;lt;h4 style=&quot;margin:0 0 10px 0; color:#007aff;&quot;&amp;gt;[약관 동의 기록]&amp;lt;/h4&amp;gt;
            ' . $agreement_list_html . '
        &amp;lt;/div&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; text-align:center; background:#f5f5f5; padding:10px;&quot;&amp;gt;
            &amp;lt;p style=&quot;font-size:12px; color:#666; margin-bottom:5px;&quot;&amp;gt;[후원자 서명 확인]&amp;lt;/p&amp;gt;
            &amp;lt;img src=&quot;' . $signature_data . '&quot; style=&quot;width:200px; height:80px; border:1px solid #ccc; background:#fff;&quot; alt=&quot;서명&quot;&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; padding:15px; border:2px solid #007aff; background:#f0f8ff; text-align:center;&quot;&amp;gt;
            &amp;lt;strong style=&quot;color:#007aff;&quot;&amp;gt;[증빙용 문서 다운로드]&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;a href=&quot;' . $html_web_path . '&quot; target=&quot;_blank&quot; style=&quot;font-size:15px; font-weight:bold; color:#d9534f; text-decoration:underline;&quot;&amp;gt;
                ▶ 서명 포함된 후원신청서(HTML) 열기
            &amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;';

    // 5. DB 저장
    $password = $_POST['password'] ?: '1111';
    $hash_password = getModel('member')-&amp;gt;hashPassword($password);

    $query = &quot;INSERT INTO documents (document_srl, module_srl, title, content,user_name, nick_name, password, regdate, last_update, list_order, update_order, status,member_srl,email_address,homepage,ipaddress) 
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'SECRET',?,?,?,?)&quot;;
    
    $args = array($document_srl, $module_srl, $title, $db_content, $member_name,$member_name, $hash_password, $regdate, $regdate, $document_srl*-1, $document_srl*-1,0,$email,'a',0);
    $oDB-&amp;gt;prepare($query)-&amp;gt;execute($args);

    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; 0, 'message' =&amp;gt; '후원 신청이 정상적으로 완료되었습니다.'));

} catch (Exception $e) {
    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; $e-&amp;gt;getMessage()));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>라이믹스</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1095</guid>
      <comments>https://selfdevelope.tistory.com/1095#entry1095comment</comments>
      <pubDate>Fri, 12 Jun 2026 15:16:52 +0900</pubDate>
    </item>
    <item>
      <title>자바 IllegalStateException 중복로그인 방지 중 에러. 톰캣9</title>
      <link>https://selfdevelope.tistory.com/1094</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이상하게.. 세션, 즉, 중복로그인 처리 로직 중에서 에러가 나는 부분이 있었다. 삽질을 오래 하다가.. 세션 null 처리 때문이 원인인것을 알아냈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 세션이 null 만 체크하면 안된다. 세션이 null 이 아니면 continue 처리를 했는데, null이 아닌데 그 안에 요소를 접근하려고 하니 IllegalStateException 이 발생하였다. continue를 하려면 IllegalStateException에서 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null은 아니지만 그 안의 요소를 null 인듯 하다. 그러니 세션 null 만 처리 하면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781153159264&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (oldSession != null) {
    try {
        // 톰캣 9 이상에서는 만료된 세션일 경우 아래 메서드 실행 시 즉시 예외가 발생합니다.
        java.util.Enumeration&amp;lt;String&amp;gt; names = oldSession.getAttributeNames();
        
        System.out.println(&quot;=== HttpSession Attribute List ===&quot;);
        java.util.Collections.list(names).forEach(name -&amp;gt; {
            Object value = oldSession.getAttribute(name);
            System.out.printf(&quot;Key: %s | Value: %s%n&quot;, name, value);
        });
        System.out.println(&quot;==================================&quot;);
        
    } catch (IllegalStateException e) {
        //   톰캣이 세션을 이미 만료시켰다고 판단한 경우, 에러로 튕기지 않고 안전하게 스킵합니다.
        System.out.println(&quot;[안내] 현재 oldSession이 이미 만료/무효화된 세션이므로 조회를 건너뜁니다.&quot;);
        // continue; // 만약 반복문(for/while) 내부라면 다음 루프로 넘어가도록 continue 실행
    }
} else {
    System.out.println(&quot;oldSession이 null입니다.&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1781163996889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HttpSession session = request.getSession();

session.invalidate(); //   세션 알맹이를 파기함 (자물쇠 채움)

// ❌ 여전히 null이 아닙니다! 이 조건문은 통과해버립니다.
if (session == null) {
    System.out.println(&quot;이 글은 출력되지 않습니다.&quot;);
}

//   알맹이가 파기되었기 때문에 아래 줄에서 IllegalStateException 발생!
String id = session.getId();&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자바(Java)</category>
      <category>IllegalStateException</category>
      <category>자바 IllegalStateException</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1094</guid>
      <comments>https://selfdevelope.tistory.com/1094#entry1094comment</comments>
      <pubDate>Thu, 11 Jun 2026 13:48:57 +0900</pubDate>
    </item>
    <item>
      <title>javax.mail.internet.AddressException: Local address contains control or whitespace in string</title>
      <link>https://selfdevelope.tistory.com/1093</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;메일을 전송하려는데 오류가 발생했다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;javax.mail.internet.AddressException: Local address contains control or whitespace in string&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #fbfcfd; color: #24292e; text-align: left;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;message.setFrom(new InternetAddress(&quot;관리자&quot;,&quot;관리자&quot;,&quot;UTF-8&quot;));//보내는 사람&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 관리자 메일 주소는 없고, 그냥 관리자라고만 표시가 될까해서 위에 처럼 했더니 안됬다. 그래서 아래 처럼 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1777462449646&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message.setFrom(new InternetAddress(&quot;no-reply&quot;,&quot;관리자&quot;,&quot;UTF-8&quot;));//보내는 사람&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 되었다.&lt;/p&gt;</description>
      <category>AI</category>
      <category>javax.mail.internet.AddressException</category>
      <category>Local address contains control or whitespace in string</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1093</guid>
      <comments>https://selfdevelope.tistory.com/1093#entry1093comment</comments>
      <pubDate>Wed, 29 Apr 2026 20:34:59 +0900</pubDate>
    </item>
    <item>
      <title>전자정부 프레임워크 웹스퀘어 컴포넌트 속성 property 창이 잘 안나올때</title>
      <link>https://selfdevelope.tistory.com/1092</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;전자정부 프레임워크에서 웹스퀘어 컴포넌트 속성 property 창이 잘 안나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이러지..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고 한참을 삽질 했는데..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국에는..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전자정부 프레임워크 (이클립스) 상단에 여러 아이콘들이 보이는데, WebSquare(old)가 있었다. 그것을 클릭하니 제대로 Property가 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하.. 어렵다..&lt;/p&gt;</description>
      <category>웹스퀘어</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1092</guid>
      <comments>https://selfdevelope.tistory.com/1092#entry1092comment</comments>
      <pubDate>Mon, 30 Mar 2026 13:50:25 +0900</pubDate>
    </item>
    <item>
      <title>cannot access central (https //repo.maven.apache.org/maven2) in offline mode</title>
      <link>https://selfdevelope.tistory.com/1091</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이클립스 Preference &amp;gt; Mave &amp;gt; User Settings &amp;gt; User Settings 부분에 settings.xml 파일이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 안에 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O5ppB/dJMcacCnIUJ/RnKST4LpWwmwKIl15XlsI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O5ppB/dJMcacCnIUJ/RnKST4LpWwmwKIl15XlsI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O5ppB/dJMcacCnIUJ/RnKST4LpWwmwKIl15XlsI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO5ppB%2FdJMcacCnIUJ%2FRnKST4LpWwmwKIl15XlsI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;516&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>자바(Java)</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1091</guid>
      <comments>https://selfdevelope.tistory.com/1091#entry1091comment</comments>
      <pubDate>Mon, 16 Mar 2026 13:58:00 +0900</pubDate>
    </item>
    <item>
      <title>라이믹스 입력폼. 동의여부까지 저장.양식에도 출력</title>
      <link>https://selfdevelope.tistory.com/1090</link>
      <description>&lt;pre id=&quot;code_1773205468884&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
&amp;lt;title&amp;gt;후원신청하기 완벽 연동본 (서명 포함)&amp;lt;/title&amp;gt;

&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/signature_pad@4.0.0/dist/signature_pad.umd.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
    /* 1. 전체 래퍼 */
    .dm-form-wrap {
        max-width: 800px;
        margin: 0 auto;
        padding: 40px 20px;
        font-family: 'Noto Sans KR', sans-serif;
        color: #333;
    }

    /* 2. 타이틀 영역 */
    .dm-form-title {
        font-size: 26px;
        font-weight: 700;
        margin-bottom: 15px;
        padding-bottom: 15px;
        border-bottom: 2px solid #333;
        color: #111;
    }

    .dm-sub-title {
        font-size: 19px;
        font-weight: 700;
        margin-top: 50px;
        margin-bottom: 15px;
        color: #007aff;
        position: relative;
        padding-left: 12px;
    }

    .dm-sub-title::before {
        content: '';
        display: block;
        width: 4px;
        height: 18px;
        background: #007aff;
        position: absolute;
        left: 0;
        top: 5px;
    }

    /* 3. 입력 테이블 스타일 */
    .dm-form-table {
        width: 100%;
        border-top: 2px solid #333;
        border-collapse: collapse;
    }

    .dm-form-table th, .dm-form-table td {
        padding: 15px;
        border-bottom: 1px solid #ddd;
        font-size: 15px;
        vertical-align: middle;
        line-height: 1.5;
    }

    .dm-form-table th {
        background: #f7f9fb;
        width: 180px;
        font-weight: 700;
        text-align: left;
        color: #333;
        word-break: keep-all;
    }

    /* 입력창 공통 스타일 */
    .dm-input, .dm-select {
        width: 100%;
        padding: 10px;
        border: 1px solid #ccc;
        border-radius: 4px;
        box-sizing: border-box;
        font-size: 15px;
        position: relative;
        z-index: 10;
    }

    .dm-input:focus, .dm-select:focus {
        border-color: #007aff;
        outline: none;
    }

    /* 라디오/체크박스 클릭 오류 해결 (철벽 방어) */
    .dm-radio-group .dm-radio-item {
        display: inline-block;
        margin-right: 20px;
        margin-bottom: 8px;
    }
    
    .dm-radio-group .dm-radio-item-block {
        display: block;
        margin-bottom: 10px;
    }

    .dm-radio-group input[type=&quot;radio&quot;], 
    .dm-radio-group input[type=&quot;checkbox&quot;] { 
        margin-right: 6px; 
        width: 18px;
        height: 18px;
        vertical-align: middle;
        cursor: pointer;
        position: relative;
        z-index: 10; 
    }

    .dm-radio-group label {
        cursor: pointer;
        vertical-align: middle;
        word-break: keep-all;
        position: relative;
        z-index: 10;
    }

    /* 부가 설명 텍스트 */
    .dm-help-text {
        display: block;
        font-size: 13px;
        color: #666;
        margin-top: 5px;
    }

    /* 4. 약관 동의 그룹 */
    .dm-term-group { margin-bottom: 25px; }
    .dm-term-title { font-weight: 700; margin-bottom: 8px; font-size: 15px; color: #222; }
    .dm-term-box {
        border: 1px solid #ddd;
        background: #f9f9f9;
        padding: 15px;
        font-size: 14px;
        color: #555;
        line-height: 1.6;
        border-radius: 4px;
        margin-bottom: 10px;
    }
    .dm-agree-check { text-align: left; font-size: 15px; font-weight: 700; }

    /* 5. 스마트폰 서명란 전용 스타일 */
    .dm-signature-wrap {
        border: 2px dashed #007aff;
        border-radius: 8px;
        background: #fdfdfd;
        position: relative;
        margin-top: 15px;
    }
    .dm-signature-pad {
        width: 100%;
        height: 200px;
        touch-action: none;
    }
    .dm-sig-clear-btn {
        position: absolute;
        top: 10px;
        right: 10px;
        background: #fff;
        border: 1px solid #ccc;
        padding: 5px 10px;
        font-size: 12px;
        border-radius: 4px;
        cursor: pointer;
    }

    /* 6. 버튼 영역 */
    .dm-btn-wrap { margin-top: 50px; text-align: center; }
    .dm-btn {
        display: inline-block;
        min-width: 160px;
        padding: 15px 30px;
        font-size: 18px;
        font-weight: 700;
        text-align: center;
        border: none;
        cursor: pointer;
        border-radius: 5px;
    }
    .dm-btn-submit { background: #007aff; color: #fff; }
    .dm-btn-cancel { background: #666; color: #fff; margin-left: 10px; }

    /* 모바일 반응형 처리 */
    @media screen and (max-width: 768px) {
        .dm-form-table th, .dm-form-table td { display: block; width: 100%; border-bottom: none; padding: 10px 15px; }
        .dm-form-table th { background: none; padding-bottom: 0; padding-top: 20px; font-size: 15px; color: #007aff; }
        .dm-form-table td { border-bottom: 1px solid #eee; padding-bottom: 20px; }
        .dm-radio-group .dm-radio-item { display: block; margin-bottom: 10px; }
        .dm-btn { width: 100%; margin-left: 0; margin-bottom: 10px; }
    }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;dm-form-wrap&quot; id=&quot;pdf-content-area&quot;&amp;gt;
    
    &amp;lt;div class=&quot;dm-form-title&quot;&amp;gt;후원신청서&amp;lt;/div&amp;gt;
    &amp;lt;p style=&quot;margin-bottom: 30px; color: #555; line-height: 1.6;&quot;&amp;gt;
        아이들의 꿈을 응원해주셔서 감사합니다.&amp;lt;br&amp;gt;
        &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt; 표시는 필수 질문입니다.
    &amp;lt;/p&amp;gt;

    &amp;lt;input type=&quot;hidden&quot; id=&quot;agency_email&quot; name=&quot;agency_email&quot; value=&quot;dongmyeong@example.com&quot;&amp;gt;

    &amp;lt;form id=&quot;sponsorship_form&quot; action=&quot;#&quot; method=&quot;post&quot;&amp;gt;
        
        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;1. 후원 방식 및 종류&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 방식 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;st_1&quot; name=&quot;support_type&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;st_1&quot;&amp;gt;정기후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;st_2&quot; name=&quot;support_type&quot;&amp;gt;
                        &amp;lt;label for=&quot;st_2&quot;&amp;gt;일시후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 종류 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_1&quot; name=&quot;support_category&quot; value=&quot;아동숙사(1인실) 리모델링 후원&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;sc_1&quot;&amp;gt;아동숙사(1인실) 리모델링 후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_2&quot; name=&quot;support_category&quot; value=&quot;아동 결연 후원 (아동에게만 후원)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_2&quot;&amp;gt;아동 결연 후원 (아동에게만 후원)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_3&quot; name=&quot;support_category&quot; value=&quot;지정 후원 (후원자 의도에 맞게)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_3&quot;&amp;gt;지정 후원 (후원자 의도에 맞게)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_4&quot; name=&quot;support_category&quot; value=&quot;비지정 후원 (기관 용도에 맞게)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_4&quot;&amp;gt;비지정 후원 (기관 용도에 맞게)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 금액 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_1&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_1&quot;&amp;gt;100,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_2&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_2&quot;&amp;gt;50,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_3&quot; name=&quot;support_amount&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;sa_3&quot;&amp;gt;30,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_4&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_4&quot;&amp;gt;20,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_5&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_5&quot;&amp;gt;기타:&amp;lt;/label&amp;gt;
                        &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; style=&quot;width: 150px; margin-left: 8px; display: inline-block;&quot;&amp;gt; 원
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;2. 후원회원정보&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;회원구분 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;mt_1&quot; name=&quot;member_type&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;mt_1&quot;&amp;gt;개인&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;mt_2&quot; name=&quot;member_type&quot;&amp;gt;
                        &amp;lt;label for=&quot;mt_2&quot;&amp;gt;단체&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원회원명(단체명) &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;member_name&quot; class=&quot;dm-input&quot; placeholder=&quot;이름을 입력하세요&quot; required&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;기부금영수증&amp;lt;br&amp;gt;발급여부 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;rr_1&quot; name=&quot;receipt_req&quot;&amp;gt;
                        &amp;lt;label for=&quot;rr_1&quot;&amp;gt;발급신청 (하단 질문에 주민등록번호를 입력해주세요)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;rr_2&quot; name=&quot;receipt_req&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;rr_2&quot;&amp;gt;신청안함&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;주민등록번호 입력 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예) 800101-1234567&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;국세청 연말정산간소화서비스를 통해 기부금영수증을 발급받으시려면 주민등록번호를 입력해주세요.&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;연락처 (휴대전화) &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;phone&quot; class=&quot;dm-input&quot; placeholder=&quot;예) 010-0000-0000&quot; required&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;이메일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;email&quot; name=&quot;email&quot; class=&quot;dm-input&quot; placeholder=&quot;example@email.com&quot;&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;주소 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;우편물 수령 주소를 입력해주세요&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;(기부금 영수증 발송 등에 활용)&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;3. 출금 정보&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;예금주명 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예금주 성함&quot;&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;예금주 생년월일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예금주 생년월일 6자리&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;(주민번호 앞 6자리)&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;은행 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;select class=&quot;dm-select&quot; name=&quot;bank_name&quot; style=&quot;max-width: 300px;&quot;&amp;gt;
                        &amp;lt;option&amp;gt;은행을 선택해주세요&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;SC제일은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;국민은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;우리은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;하나은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;농협&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;기타은행&amp;lt;/option&amp;gt;
                    &amp;lt;/select&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;계좌번호 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; name=&quot;account_num&quot; required&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;자동이체 출금일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_1&quot; name=&quot;pay_date&quot; value=&quot;1일&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;pd_1&quot;&amp;gt;1일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_2&quot; name=&quot;pay_date&quot; value=&quot;5일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_2&quot;&amp;gt;5일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_3&quot; name=&quot;pay_date&quot; value=&quot;10일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_3&quot;&amp;gt;10일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_4&quot; name=&quot;pay_date&quot; value=&quot;15일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_4&quot;&amp;gt;15일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;4. 이용 동의서 및 서명&amp;lt;/div&amp;gt;
		
		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[전자기부금영수증 안내] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				* 우리 기관은 기부금에 대해 전자기부금영수증을 발급합니다.&amp;lt;br&amp;gt;
				* 발급된 영수증은 국세청 연말정산 간소화 서비스에 자동 반영되며, 별도의 종이 영수증은 제공되지 않습니다.&amp;lt;br&amp;gt;
				* 기부금 내역은 국세청 홈택스(www.hometax.go.kr)에서 확인하실 수 있습니다.
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_0&quot; value=&quot;전자기부금영수증 안내&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_0&quot; value=&quot;우리 기관은 기부금에 대해 전자기부금영수증을 발급합니다. 발급된 영수증은 국세청 연말정산 간소화 서비스에 자동 반영되며, 별도의 종이 영수증은 제공되지 않습니다. 기부금 내역은 국세청 홈택스에서 확인하실 수 있습니다.&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_0&quot; name=&quot;agree_0&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_0&quot;&amp;gt;확인했습니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[CMS자동이체 안내사항] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				CMS 자동이체 신청을 위해 후원신청 완료 후 ARS를 통해 '출금동의 증빙자료' 제출 과정이 진행됩니다.
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_1&quot; value=&quot;CMS자동이체 안내사항&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_1&quot; value=&quot;CMS 자동이체 신청을 위해 후원신청 완료 후 ARS를 통해 '출금동의 증빙자료' 제출 과정이 진행됩니다.&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_1&quot; name=&quot;agree_1&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_1&quot;&amp;gt;확인했습니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[금융거래 정보 제공 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				본 신청과 관련하여 본인은 위 금융거래정보(거래은행명, 계좌번호)를 출금이체 신규 신청하는 때로부터 해지 신청할 때까지 (사)비영리아이티지원센터와 CMS 출금이체 계약을 체결한 수납기관에 제공하는 것에 대하여 '금융실명거래 및 비밀보장에 관한 법률'의 규정에 따라 동의합니다.
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_2&quot; value=&quot;금융거래 정보 제공 동의서&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_2&quot; value=&quot;본 신청과 관련하여 본인은 위 금융거래정보를 출금이체 신규 신청 시부터 해지 시까지 수납기관에 제공하는 것에 대하여 금융실명거래 및 비밀보장에 관한 법률에 따라 동의합니다.&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_2&quot; name=&quot;agree_2&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_2&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[개인정보 이용 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				1. 수집 및 이용목적 : CMS출금이체를 통한 요금 수납&amp;lt;br&amp;gt;
				2. 수집항목 : 성명, 휴대전화, 금융기관명, 계좌번호&amp;lt;br&amp;gt;
				3. 보유 및 이용기간 : 수집 및 이용동의일로부터 CMS출금이체 종료일(해지일)후 5년
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_3&quot; value=&quot;개인정보 이용 동의서&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_3&quot; value=&quot;1. 수집 및 이용목적 : CMS출금이체를 통한 요금 수납 2. 수집항목 : 성명, 휴대전화, 금융기관명, 계좌번호 3. 보유 및 이용기간 : 수집 및 이용동의일로부터 CMS출금이체 종료일후 5년&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_3&quot; name=&quot;agree_3&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_3&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[개인정보 3자 제공 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				신청자는 개인정보에 대해 금융결제원에게 제공하는 것을 거부할 권리가 있습니다. * 정보를 제공받는 자 : 금융결제원, 후원기관 * 제공목적 : CMS 출금이체 서비스 제공 및 출금동의확인
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_4&quot; value=&quot;개인정보 3자 제공 동의서&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_4&quot; value=&quot;정보를 제공받는 자 : 금융결제원, 후원기관 / 제공목적 : CMS 출금이체 서비스 제공 및 출금동의확인, 출금이체 신규등록 및 해지 사실통지&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_4&quot; name=&quot;agree_4&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_4&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-term-group&quot; style=&quot;margin-top:40px;&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;후원자 서명 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;p style=&quot;font-size:14px; color:#666; margin-bottom:10px;&quot;&amp;gt;아래 네모 박스 안에 마우스나 손가락으로 서명해 주세요.&amp;lt;/p&amp;gt;
            &amp;lt;div class=&quot;dm-signature-wrap&quot;&amp;gt;
                &amp;lt;canvas id=&quot;signature-pad&quot; class=&quot;dm-signature-pad&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
                &amp;lt;button type=&quot;button&quot; class=&quot;dm-sig-clear-btn&quot; id=&quot;clear-signature&quot;&amp;gt;다시 쓰기&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-btn-wrap&quot;&amp;gt;
            &amp;lt;button type=&quot;submit&quot; class=&quot;dm-btn dm-btn-submit&quot;&amp;gt;제출 및 서명완료&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;

    &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    // 1. 도화지(Canvas) 세팅
    const canvas = document.getElementById('signature-pad');
    
    function resizeCanvas() {
        const ratio =  Math.max(window.devicePixelRatio || 1, 1);
        canvas.width = canvas.offsetWidth * ratio;
        canvas.height = canvas.offsetHeight * ratio;
        canvas.getContext(&quot;2d&quot;).scale(ratio, ratio);
    }
    window.addEventListener(&quot;resize&quot;, resizeCanvas);
    resizeCanvas();

    // 2. 서명 패드 라이브러리 실행
    const signaturePad = new SignaturePad(canvas, {
        penColor: &quot;rgb(0, 0, 0)&quot;,
        backgroundColor: &quot;rgb(255, 255, 255)&quot;
    });

    // 3. 다시 쓰기 버튼
    document.getElementById('clear-signature').addEventListener('click', function () {
        signaturePad.clear();
    });

    // 4. 폼 제출 시 이벤트

       

        //const emailAddress = document.getElementById('agency_email').value;
        
        //alert(`완벽합니다! 서명이 확인되었습니다.\n\n실제 서버가 연동되면, 이 신청서 내용 전체가 PDF로 변환되어 [ ${emailAddress} ](으)로 즉시 발송됩니다.`);
	
	
	document.getElementById('sponsorship_form').addEventListener('submit', function (event) {
    event.preventDefault();

    if (signaturePad.isEmpty()) {
        alert(&quot;후원자 서명을 작성해 주세요.&quot;);
        return;
    }
	
	// 모든 체크박스 동의 여부 재검증 (브라우저 validation 지원용)
    if(!this.checkValidity()) {
        alert(&quot;모든 필수 항목에 동의해 주세요.&quot;);
        return;
    }

    // 서명 데이터를 Base64 문자열로 추출
    const signatureImage = signaturePad.toDataURL();

    // 폼 데이터를 가져와서 서명 데이터 추가
    const formData = new FormData(this);
    formData.append('signature_image', signatureImage);
    
    // AJAX 전송
    $.ajax({
        url: '/rx/insert_form/insert_proc.php',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
            if(response.error === 0) {
                alert(response.message);
                location.reload();
            } else {
                alert(&quot;오류: &quot; + response.message);
            }
        }
    });
});

&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773205489043&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
ob_start();
error_reporting(0);
ini_set('display_errors', 0);

define('__XE__', true);
require_once('../config/config.inc.php');
$oContext = &amp;amp;Context::getInstance();
$oContext-&amp;gt;init();

header('Content-Type: application/json');

try {
    // 1. 데이터 수집
    $title = &quot;후원신청서 - &quot; . ($_POST['member_name'] ?: '무명후원자');
    $member_name = $_POST['member_name'] ?? '미입력';
    $support_type = $_POST['support_type'] ?? '정기후원';
    $support_category = $_POST['support_category'] ?? '미선택';
    $support_amount = $_POST['support_amount'] ?? '0';
    $member_type = $_POST['member_type'] ?? '개인';
    $phone = $_POST['phone'] ?? '미입력';
    $email = $_POST['email'] ?? '미입력';
    $bank_name = $_POST['bank_name'] ?? '미선택';
    $account_num = $_POST['account_num'] ?? '미입력';
    $pay_date = $_POST['pay_date'] ?? '미지정';
    
    // 서명 데이터 (Base64)
    $signature_data = $_POST['signature_image'] ?? ''; 

    // --- 추가: 약관 동의 데이터 수집 (반복문 처리) ---
    $agreement_list_html = &quot;&quot;;
    for ($i = 0; $i &amp;lt; 5; $i++) {
        $t_title   = $_POST[&quot;term_title_$i&quot;]; // HTML hidden 필드에서 전달됨
        $t_content = $_POST[&quot;term_content_$i&quot;]; // HTML hidden 필드에서 전달됨
        $t_agree   = ($_POST[&quot;agree_$i&quot;] == 'Y') ? '동의/확인함' : '미동의';

        if($t_title) {
            $agreement_list_html .= &quot;
                &amp;lt;div style='margin-bottom:12px; border-bottom:1px dashed #ccc; padding-bottom:8px;'&amp;gt;
                    &amp;lt;div style='font-weight:bold; font-size:13px; color:#333;'&amp;gt;▣ {$t_title}&amp;lt;/div&amp;gt;
                    &amp;lt;div style='font-size:11px; color:#666; margin:4px 0; line-height:1.4;'&amp;gt;{$t_content}&amp;lt;/div&amp;gt;
                    &amp;lt;div style='font-size:12px;'&amp;gt;결과: &amp;lt;span style='color:#007aff; font-weight:bold;'&amp;gt;{$t_agree}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&quot;;
        }
    }

    $module_srl = 51; 
    $oDB = DB::getInstance();
    $document_srl = getNextSequence();
    $regdate = date('YmdHis');

    // 2. 정적 HTML 파일 생성 경로 설정
    $html_save_dir = '../files/saved_html/';
    if(!is_dir($html_save_dir)) mkdir($html_save_dir, 0777, true);

    $html_filename = &quot;support_{$document_srl}.html&quot;;
    $html_web_path = '/rx/files/saved_html/' . $html_filename;
    $html_full_path = $html_save_dir . $html_filename;

    // 3. 서류 디자인 (증빙용 HTML)
    $saved_html_content = '
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;후원신청서 증빙 - ' . htmlspecialchars($member_name) . '&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body { font-family: &quot;Malgun Gothic&quot;, sans-serif; padding: 30px; line-height: 1.5; color: #333; }
            .doc-wrap { max-width: 700px; margin: 0 auto; border: 1px solid #000; padding: 30px; }
            h1 { text-align: center; font-size: 24px; text-decoration: underline; margin-bottom: 30px; }
            table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
            th, td { border: 1px solid #ccc; padding: 10px; font-size: 14px; }
            th { background: #f4f4f4; width: 30%; text-align: left; }
            .sig-box { text-align: center; margin-top: 40px; border-top: 2px solid #333; padding-top: 20px; }
            .sig-image { border: 1px solid #eee; width: 250px; height: 100px; margin-top: 10px; }
            .term-area { margin-top:30px; border:1px solid #eee; padding:15px; background:#fafafa; page-break-before: always; }
            @media print { .no-print { display: none; } }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;no-print&quot; style=&quot;text-align:right;&quot;&amp;gt;&amp;lt;button onclick=&quot;window.print()&quot;&amp;gt;PDF 저장 / 인쇄&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;doc-wrap&quot;&amp;gt;
            &amp;lt;h1&amp;gt;후 원 신 청 서&amp;lt;/h1&amp;gt;
            &amp;lt;p style=&quot;text-align:right;&quot;&amp;gt;접수번호: ' . $document_srl . '&amp;lt;/p&amp;gt;
            
            &amp;lt;h3&amp;gt;1. 후원 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . $support_type . ' / ' . $support_category . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . number_format((int)$support_amount) . ' 원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;2. 후원자 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($member_name) . ' (' . $member_type . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;3. 결제 정보 (CMS)&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;은행명&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($bank_name) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;계좌번호&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;매월 ' . $pay_date . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;div class=&quot;term-area&quot;&amp;gt;
                &amp;lt;h3&amp;gt;4. 이용 약관 및 동의 기록&amp;lt;/h3&amp;gt;
                ' . $agreement_list_html . '
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;sig-box&quot;&amp;gt;
                &amp;lt;p&amp;gt;본인은 위와 같이 정기 후원을 신청하며, 개인정보 활용 및 약관에 동의합니다.&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;' . date('Y년 m월 d일') . '&amp;lt;/p&amp;gt;
                &amp;lt;p style=&quot;font-size:18px; font-weight:bold;&quot;&amp;gt;신청인: ' . htmlspecialchars($member_name) . ' (인)&amp;lt;/p&amp;gt;
                &amp;lt;img src=&quot;' . $signature_data . '&quot; class=&quot;sig-image&quot; alt=&quot;서명&quot;&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;';

    file_put_contents($html_full_path, $saved_html_content);

    // 4. 게시판 본문에 저장될 상세 내용 구성
    $db_content = '
    &amp;lt;div class=&quot;sponsorship-detail&quot; style=&quot;font-family:sans-serif; line-height:1.6; max-width:600px; border:1px solid #ddd; padding:20px;&quot;&amp;gt;
        &amp;lt;h2 style=&quot;border-bottom:2px solid #007aff; padding-bottom:10px; color:#333;&quot;&amp;gt;후원 신청 상세 정보&amp;lt;/h2&amp;gt;
        
        &amp;lt;table style=&quot;width:100%; border-collapse:collapse; margin-top:15px;&quot;&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;width:30%; padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($support_type) . ' / ' . htmlspecialchars($support_category) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;&amp;lt;strong&amp;gt;' . number_format((int)$support_amount) . '원&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($member_name) . ' (' . htmlspecialchars($member_type) . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;은행/계좌&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($bank_name) . ' / ' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;매월 ' . htmlspecialchars($pay_date) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; padding:15px; border:1px solid #e1e1e1; background:#fcfcfc;&quot;&amp;gt;
            &amp;lt;h4 style=&quot;margin:0 0 10px 0; color:#007aff;&quot;&amp;gt;[약관 동의 기록]&amp;lt;/h4&amp;gt;
            ' . $agreement_list_html . '
        &amp;lt;/div&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; text-align:center; background:#f5f5f5; padding:10px;&quot;&amp;gt;
            &amp;lt;p style=&quot;font-size:12px; color:#666; margin-bottom:5px;&quot;&amp;gt;[후원자 서명 확인]&amp;lt;/p&amp;gt;
            &amp;lt;img src=&quot;' . $signature_data . '&quot; style=&quot;width:200px; height:80px; border:1px solid #ccc; background:#fff;&quot; alt=&quot;서명&quot;&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; padding:15px; border:2px solid #007aff; background:#f0f8ff; text-align:center;&quot;&amp;gt;
            &amp;lt;strong style=&quot;color:#007aff;&quot;&amp;gt;[증빙용 문서 다운로드]&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;a href=&quot;' . $html_web_path . '&quot; target=&quot;_blank&quot; style=&quot;font-size:15px; font-weight:bold; color:#d9534f; text-decoration:underline;&quot;&amp;gt;
                ▶ 서명 포함된 후원신청서(HTML) 열기
            &amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;';

    // 5. DB 저장
    $password = $_POST['password'] ?: '1111';
    $hash_password = getModel('member')-&amp;gt;hashPassword($password);

    $query = &quot;INSERT INTO documents (document_srl, module_srl, title, content, nick_name, password, regdate, last_update, list_order, update_order, status) 
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'SECRET')&quot;;
    
    $args = array($document_srl, $module_srl, $title, $db_content, $member_name, $hash_password, $regdate, $regdate, $document_srl*-1, $document_srl*-1);
    $oDB-&amp;gt;prepare($query)-&amp;gt;execute($args);

    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; 0, 'message' =&amp;gt; '후원 신청이 정상적으로 완료되었습니다.'));

} catch (Exception $e) {
    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; $e-&amp;gt;getMessage()));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>라이믹스</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1090</guid>
      <comments>https://selfdevelope.tistory.com/1090#entry1090comment</comments>
      <pubDate>Mon, 16 Mar 2026 13:36:46 +0900</pubDate>
    </item>
    <item>
      <title>라이믹스 입력폼. 동의여부까지 저장.양식에도 출력</title>
      <link>https://selfdevelope.tistory.com/1089</link>
      <description>&lt;pre id=&quot;code_1773205468884&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
&amp;lt;title&amp;gt;후원신청하기 완벽 연동본 (서명 포함)&amp;lt;/title&amp;gt;

&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/signature_pad@4.0.0/dist/signature_pad.umd.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
    /* 1. 전체 래퍼 */
    .dm-form-wrap {
        max-width: 800px;
        margin: 0 auto;
        padding: 40px 20px;
        font-family: 'Noto Sans KR', sans-serif;
        color: #333;
    }

    /* 2. 타이틀 영역 */
    .dm-form-title {
        font-size: 26px;
        font-weight: 700;
        margin-bottom: 15px;
        padding-bottom: 15px;
        border-bottom: 2px solid #333;
        color: #111;
    }

    .dm-sub-title {
        font-size: 19px;
        font-weight: 700;
        margin-top: 50px;
        margin-bottom: 15px;
        color: #007aff;
        position: relative;
        padding-left: 12px;
    }

    .dm-sub-title::before {
        content: '';
        display: block;
        width: 4px;
        height: 18px;
        background: #007aff;
        position: absolute;
        left: 0;
        top: 5px;
    }

    /* 3. 입력 테이블 스타일 */
    .dm-form-table {
        width: 100%;
        border-top: 2px solid #333;
        border-collapse: collapse;
    }

    .dm-form-table th, .dm-form-table td {
        padding: 15px;
        border-bottom: 1px solid #ddd;
        font-size: 15px;
        vertical-align: middle;
        line-height: 1.5;
    }

    .dm-form-table th {
        background: #f7f9fb;
        width: 180px;
        font-weight: 700;
        text-align: left;
        color: #333;
        word-break: keep-all;
    }

    /* 입력창 공통 스타일 */
    .dm-input, .dm-select {
        width: 100%;
        padding: 10px;
        border: 1px solid #ccc;
        border-radius: 4px;
        box-sizing: border-box;
        font-size: 15px;
        position: relative;
        z-index: 10;
    }

    .dm-input:focus, .dm-select:focus {
        border-color: #007aff;
        outline: none;
    }

    /* 라디오/체크박스 클릭 오류 해결 (철벽 방어) */
    .dm-radio-group .dm-radio-item {
        display: inline-block;
        margin-right: 20px;
        margin-bottom: 8px;
    }
    
    .dm-radio-group .dm-radio-item-block {
        display: block;
        margin-bottom: 10px;
    }

    .dm-radio-group input[type=&quot;radio&quot;], 
    .dm-radio-group input[type=&quot;checkbox&quot;] { 
        margin-right: 6px; 
        width: 18px;
        height: 18px;
        vertical-align: middle;
        cursor: pointer;
        position: relative;
        z-index: 10; 
    }

    .dm-radio-group label {
        cursor: pointer;
        vertical-align: middle;
        word-break: keep-all;
        position: relative;
        z-index: 10;
    }

    /* 부가 설명 텍스트 */
    .dm-help-text {
        display: block;
        font-size: 13px;
        color: #666;
        margin-top: 5px;
    }

    /* 4. 약관 동의 그룹 */
    .dm-term-group { margin-bottom: 25px; }
    .dm-term-title { font-weight: 700; margin-bottom: 8px; font-size: 15px; color: #222; }
    .dm-term-box {
        border: 1px solid #ddd;
        background: #f9f9f9;
        padding: 15px;
        font-size: 14px;
        color: #555;
        line-height: 1.6;
        border-radius: 4px;
        margin-bottom: 10px;
    }
    .dm-agree-check { text-align: left; font-size: 15px; font-weight: 700; }

    /* 5. 스마트폰 서명란 전용 스타일 */
    .dm-signature-wrap {
        border: 2px dashed #007aff;
        border-radius: 8px;
        background: #fdfdfd;
        position: relative;
        margin-top: 15px;
    }
    .dm-signature-pad {
        width: 100%;
        height: 200px;
        touch-action: none;
    }
    .dm-sig-clear-btn {
        position: absolute;
        top: 10px;
        right: 10px;
        background: #fff;
        border: 1px solid #ccc;
        padding: 5px 10px;
        font-size: 12px;
        border-radius: 4px;
        cursor: pointer;
    }

    /* 6. 버튼 영역 */
    .dm-btn-wrap { margin-top: 50px; text-align: center; }
    .dm-btn {
        display: inline-block;
        min-width: 160px;
        padding: 15px 30px;
        font-size: 18px;
        font-weight: 700;
        text-align: center;
        border: none;
        cursor: pointer;
        border-radius: 5px;
    }
    .dm-btn-submit { background: #007aff; color: #fff; }
    .dm-btn-cancel { background: #666; color: #fff; margin-left: 10px; }

    /* 모바일 반응형 처리 */
    @media screen and (max-width: 768px) {
        .dm-form-table th, .dm-form-table td { display: block; width: 100%; border-bottom: none; padding: 10px 15px; }
        .dm-form-table th { background: none; padding-bottom: 0; padding-top: 20px; font-size: 15px; color: #007aff; }
        .dm-form-table td { border-bottom: 1px solid #eee; padding-bottom: 20px; }
        .dm-radio-group .dm-radio-item { display: block; margin-bottom: 10px; }
        .dm-btn { width: 100%; margin-left: 0; margin-bottom: 10px; }
    }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;dm-form-wrap&quot; id=&quot;pdf-content-area&quot;&amp;gt;
    
    &amp;lt;div class=&quot;dm-form-title&quot;&amp;gt;후원신청서&amp;lt;/div&amp;gt;
    &amp;lt;p style=&quot;margin-bottom: 30px; color: #555; line-height: 1.6;&quot;&amp;gt;
        아이들의 꿈을 응원해주셔서 감사합니다.&amp;lt;br&amp;gt;
        &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt; 표시는 필수 질문입니다.
    &amp;lt;/p&amp;gt;

    &amp;lt;input type=&quot;hidden&quot; id=&quot;agency_email&quot; name=&quot;agency_email&quot; value=&quot;dongmyeong@example.com&quot;&amp;gt;

    &amp;lt;form id=&quot;sponsorship_form&quot; action=&quot;#&quot; method=&quot;post&quot;&amp;gt;
        
        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;1. 후원 방식 및 종류&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 방식 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;st_1&quot; name=&quot;support_type&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;st_1&quot;&amp;gt;정기후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;st_2&quot; name=&quot;support_type&quot;&amp;gt;
                        &amp;lt;label for=&quot;st_2&quot;&amp;gt;일시후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 종류 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_1&quot; name=&quot;support_category&quot; value=&quot;아동숙사(1인실) 리모델링 후원&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;sc_1&quot;&amp;gt;아동숙사(1인실) 리모델링 후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_2&quot; name=&quot;support_category&quot; value=&quot;아동 결연 후원 (아동에게만 후원)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_2&quot;&amp;gt;아동 결연 후원 (아동에게만 후원)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_3&quot; name=&quot;support_category&quot; value=&quot;지정 후원 (후원자 의도에 맞게)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_3&quot;&amp;gt;지정 후원 (후원자 의도에 맞게)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_4&quot; name=&quot;support_category&quot; value=&quot;비지정 후원 (기관 용도에 맞게)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_4&quot;&amp;gt;비지정 후원 (기관 용도에 맞게)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 금액 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_1&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_1&quot;&amp;gt;100,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_2&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_2&quot;&amp;gt;50,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_3&quot; name=&quot;support_amount&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;sa_3&quot;&amp;gt;30,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_4&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_4&quot;&amp;gt;20,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_5&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_5&quot;&amp;gt;기타:&amp;lt;/label&amp;gt;
                        &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; style=&quot;width: 150px; margin-left: 8px; display: inline-block;&quot;&amp;gt; 원
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;2. 후원회원정보&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;회원구분 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;mt_1&quot; name=&quot;member_type&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;mt_1&quot;&amp;gt;개인&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;mt_2&quot; name=&quot;member_type&quot;&amp;gt;
                        &amp;lt;label for=&quot;mt_2&quot;&amp;gt;단체&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원회원명(단체명) &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;member_name&quot; class=&quot;dm-input&quot; placeholder=&quot;이름을 입력하세요&quot; required&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;기부금영수증&amp;lt;br&amp;gt;발급여부 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;rr_1&quot; name=&quot;receipt_req&quot;&amp;gt;
                        &amp;lt;label for=&quot;rr_1&quot;&amp;gt;발급신청 (하단 질문에 주민등록번호를 입력해주세요)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;rr_2&quot; name=&quot;receipt_req&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;rr_2&quot;&amp;gt;신청안함&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;주민등록번호 입력 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예) 800101-1234567&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;국세청 연말정산간소화서비스를 통해 기부금영수증을 발급받으시려면 주민등록번호를 입력해주세요.&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;연락처 (휴대전화) &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;phone&quot; class=&quot;dm-input&quot; placeholder=&quot;예) 010-0000-0000&quot; required&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;이메일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;email&quot; name=&quot;email&quot; class=&quot;dm-input&quot; placeholder=&quot;example@email.com&quot;&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;주소 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;우편물 수령 주소를 입력해주세요&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;(기부금 영수증 발송 등에 활용)&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;3. 출금 정보&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;예금주명 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예금주 성함&quot;&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;예금주 생년월일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예금주 생년월일 6자리&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;(주민번호 앞 6자리)&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;은행 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;select class=&quot;dm-select&quot; name=&quot;bank_name&quot; style=&quot;max-width: 300px;&quot;&amp;gt;
                        &amp;lt;option&amp;gt;은행을 선택해주세요&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;SC제일은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;국민은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;우리은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;하나은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;농협&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;기타은행&amp;lt;/option&amp;gt;
                    &amp;lt;/select&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;계좌번호 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; name=&quot;account_num&quot; required&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;자동이체 출금일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_1&quot; name=&quot;pay_date&quot; value=&quot;1일&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;pd_1&quot;&amp;gt;1일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_2&quot; name=&quot;pay_date&quot; value=&quot;5일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_2&quot;&amp;gt;5일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_3&quot; name=&quot;pay_date&quot; value=&quot;10일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_3&quot;&amp;gt;10일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_4&quot; name=&quot;pay_date&quot; value=&quot;15일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_4&quot;&amp;gt;15일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;4. 이용 동의서 및 서명&amp;lt;/div&amp;gt;
		
		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[전자기부금영수증 안내] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				* 우리 기관은 기부금에 대해 전자기부금영수증을 발급합니다.&amp;lt;br&amp;gt;
				* 발급된 영수증은 국세청 연말정산 간소화 서비스에 자동 반영되며, 별도의 종이 영수증은 제공되지 않습니다.&amp;lt;br&amp;gt;
				* 기부금 내역은 국세청 홈택스(www.hometax.go.kr)에서 확인하실 수 있습니다.
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_0&quot; value=&quot;전자기부금영수증 안내&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_0&quot; value=&quot;우리 기관은 기부금에 대해 전자기부금영수증을 발급합니다. 발급된 영수증은 국세청 연말정산 간소화 서비스에 자동 반영되며, 별도의 종이 영수증은 제공되지 않습니다. 기부금 내역은 국세청 홈택스에서 확인하실 수 있습니다.&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_0&quot; name=&quot;agree_0&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_0&quot;&amp;gt;확인했습니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[CMS자동이체 안내사항] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				CMS 자동이체 신청을 위해 후원신청 완료 후 ARS를 통해 '출금동의 증빙자료' 제출 과정이 진행됩니다.
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_1&quot; value=&quot;CMS자동이체 안내사항&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_1&quot; value=&quot;CMS 자동이체 신청을 위해 후원신청 완료 후 ARS를 통해 '출금동의 증빙자료' 제출 과정이 진행됩니다.&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_1&quot; name=&quot;agree_1&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_1&quot;&amp;gt;확인했습니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[금융거래 정보 제공 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				본 신청과 관련하여 본인은 위 금융거래정보(거래은행명, 계좌번호)를 출금이체 신규 신청하는 때로부터 해지 신청할 때까지 (사)비영리아이티지원센터와 CMS 출금이체 계약을 체결한 수납기관에 제공하는 것에 대하여 '금융실명거래 및 비밀보장에 관한 법률'의 규정에 따라 동의합니다.
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_2&quot; value=&quot;금융거래 정보 제공 동의서&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_2&quot; value=&quot;본 신청과 관련하여 본인은 위 금융거래정보를 출금이체 신규 신청 시부터 해지 시까지 수납기관에 제공하는 것에 대하여 금융실명거래 및 비밀보장에 관한 법률에 따라 동의합니다.&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_2&quot; name=&quot;agree_2&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_2&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[개인정보 이용 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				1. 수집 및 이용목적 : CMS출금이체를 통한 요금 수납&amp;lt;br&amp;gt;
				2. 수집항목 : 성명, 휴대전화, 금융기관명, 계좌번호&amp;lt;br&amp;gt;
				3. 보유 및 이용기간 : 수집 및 이용동의일로부터 CMS출금이체 종료일(해지일)후 5년
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_3&quot; value=&quot;개인정보 이용 동의서&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_3&quot; value=&quot;1. 수집 및 이용목적 : CMS출금이체를 통한 요금 수납 2. 수집항목 : 성명, 휴대전화, 금융기관명, 계좌번호 3. 보유 및 이용기간 : 수집 및 이용동의일로부터 CMS출금이체 종료일후 5년&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_3&quot; name=&quot;agree_3&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_3&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[개인정보 3자 제공 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
			&amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
				신청자는 개인정보에 대해 금융결제원에게 제공하는 것을 거부할 권리가 있습니다. * 정보를 제공받는 자 : 금융결제원, 후원기관 * 제공목적 : CMS 출금이체 서비스 제공 및 출금동의확인
			&amp;lt;/div&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_title_4&quot; value=&quot;개인정보 3자 제공 동의서&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;term_content_4&quot; value=&quot;정보를 제공받는 자 : 금융결제원, 후원기관 / 제공목적 : CMS 출금이체 서비스 제공 및 출금동의확인, 출금이체 신규등록 및 해지 사실통지&quot;&amp;gt;
			&amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
				&amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_4&quot; name=&quot;agree_4&quot; value=&quot;Y&quot; required&amp;gt; &amp;lt;label for=&quot;ag_4&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-term-group&quot; style=&quot;margin-top:40px;&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;후원자 서명 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;p style=&quot;font-size:14px; color:#666; margin-bottom:10px;&quot;&amp;gt;아래 네모 박스 안에 마우스나 손가락으로 서명해 주세요.&amp;lt;/p&amp;gt;
            &amp;lt;div class=&quot;dm-signature-wrap&quot;&amp;gt;
                &amp;lt;canvas id=&quot;signature-pad&quot; class=&quot;dm-signature-pad&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
                &amp;lt;button type=&quot;button&quot; class=&quot;dm-sig-clear-btn&quot; id=&quot;clear-signature&quot;&amp;gt;다시 쓰기&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-btn-wrap&quot;&amp;gt;
            &amp;lt;button type=&quot;submit&quot; class=&quot;dm-btn dm-btn-submit&quot;&amp;gt;제출 및 서명완료&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;

    &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    // 1. 도화지(Canvas) 세팅
    const canvas = document.getElementById('signature-pad');
    
    function resizeCanvas() {
        const ratio =  Math.max(window.devicePixelRatio || 1, 1);
        canvas.width = canvas.offsetWidth * ratio;
        canvas.height = canvas.offsetHeight * ratio;
        canvas.getContext(&quot;2d&quot;).scale(ratio, ratio);
    }
    window.addEventListener(&quot;resize&quot;, resizeCanvas);
    resizeCanvas();

    // 2. 서명 패드 라이브러리 실행
    const signaturePad = new SignaturePad(canvas, {
        penColor: &quot;rgb(0, 0, 0)&quot;,
        backgroundColor: &quot;rgb(255, 255, 255)&quot;
    });

    // 3. 다시 쓰기 버튼
    document.getElementById('clear-signature').addEventListener('click', function () {
        signaturePad.clear();
    });

    // 4. 폼 제출 시 이벤트

       

        //const emailAddress = document.getElementById('agency_email').value;
        
        //alert(`완벽합니다! 서명이 확인되었습니다.\n\n실제 서버가 연동되면, 이 신청서 내용 전체가 PDF로 변환되어 [ ${emailAddress} ](으)로 즉시 발송됩니다.`);
	
	
	document.getElementById('sponsorship_form').addEventListener('submit', function (event) {
    event.preventDefault();

    if (signaturePad.isEmpty()) {
        alert(&quot;후원자 서명을 작성해 주세요.&quot;);
        return;
    }
	
	// 모든 체크박스 동의 여부 재검증 (브라우저 validation 지원용)
    if(!this.checkValidity()) {
        alert(&quot;모든 필수 항목에 동의해 주세요.&quot;);
        return;
    }

    // 서명 데이터를 Base64 문자열로 추출
    const signatureImage = signaturePad.toDataURL();

    // 폼 데이터를 가져와서 서명 데이터 추가
    const formData = new FormData(this);
    formData.append('signature_image', signatureImage);
    
    // AJAX 전송
    $.ajax({
        url: '/rx/insert_form/insert_proc.php',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
            if(response.error === 0) {
                alert(response.message);
                location.reload();
            } else {
                alert(&quot;오류: &quot; + response.message);
            }
        }
    });
});

&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773205489043&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
ob_start();
error_reporting(0);
ini_set('display_errors', 0);

define('__XE__', true);
require_once('../config/config.inc.php');
$oContext = &amp;amp;Context::getInstance();
$oContext-&amp;gt;init();

header('Content-Type: application/json');

try {
    // 1. 데이터 수집
    $title = &quot;후원신청서 - &quot; . ($_POST['member_name'] ?: '무명후원자');
    $member_name = $_POST['member_name'] ?? '미입력';
    $support_type = $_POST['support_type'] ?? '정기후원';
    $support_category = $_POST['support_category'] ?? '미선택';
    $support_amount = $_POST['support_amount'] ?? '0';
    $member_type = $_POST['member_type'] ?? '개인';
    $phone = $_POST['phone'] ?? '미입력';
    $email = $_POST['email'] ?? '미입력';
    $bank_name = $_POST['bank_name'] ?? '미선택';
    $account_num = $_POST['account_num'] ?? '미입력';
    $pay_date = $_POST['pay_date'] ?? '미지정';
    
    // 서명 데이터 (Base64)
    $signature_data = $_POST['signature_image'] ?? ''; 

    // --- 추가: 약관 동의 데이터 수집 (반복문 처리) ---
    $agreement_list_html = &quot;&quot;;
    for ($i = 0; $i &amp;lt; 5; $i++) {
        $t_title   = $_POST[&quot;term_title_$i&quot;]; // HTML hidden 필드에서 전달됨
        $t_content = $_POST[&quot;term_content_$i&quot;]; // HTML hidden 필드에서 전달됨
        $t_agree   = ($_POST[&quot;agree_$i&quot;] == 'Y') ? '동의/확인함' : '미동의';

        if($t_title) {
            $agreement_list_html .= &quot;
                &amp;lt;div style='margin-bottom:12px; border-bottom:1px dashed #ccc; padding-bottom:8px;'&amp;gt;
                    &amp;lt;div style='font-weight:bold; font-size:13px; color:#333;'&amp;gt;▣ {$t_title}&amp;lt;/div&amp;gt;
                    &amp;lt;div style='font-size:11px; color:#666; margin:4px 0; line-height:1.4;'&amp;gt;{$t_content}&amp;lt;/div&amp;gt;
                    &amp;lt;div style='font-size:12px;'&amp;gt;결과: &amp;lt;span style='color:#007aff; font-weight:bold;'&amp;gt;{$t_agree}&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&quot;;
        }
    }

    $module_srl = 51; 
    $oDB = DB::getInstance();
    $document_srl = getNextSequence();
    $regdate = date('YmdHis');

    // 2. 정적 HTML 파일 생성 경로 설정
    $html_save_dir = '../files/saved_html/';
    if(!is_dir($html_save_dir)) mkdir($html_save_dir, 0777, true);

    $html_filename = &quot;support_{$document_srl}.html&quot;;
    $html_web_path = '/rx/files/saved_html/' . $html_filename;
    $html_full_path = $html_save_dir . $html_filename;

    // 3. 서류 디자인 (증빙용 HTML)
    $saved_html_content = '
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;후원신청서 증빙 - ' . htmlspecialchars($member_name) . '&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body { font-family: &quot;Malgun Gothic&quot;, sans-serif; padding: 30px; line-height: 1.5; color: #333; }
            .doc-wrap { max-width: 700px; margin: 0 auto; border: 1px solid #000; padding: 30px; }
            h1 { text-align: center; font-size: 24px; text-decoration: underline; margin-bottom: 30px; }
            table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
            th, td { border: 1px solid #ccc; padding: 10px; font-size: 14px; }
            th { background: #f4f4f4; width: 30%; text-align: left; }
            .sig-box { text-align: center; margin-top: 40px; border-top: 2px solid #333; padding-top: 20px; }
            .sig-image { border: 1px solid #eee; width: 250px; height: 100px; margin-top: 10px; }
            .term-area { margin-top:30px; border:1px solid #eee; padding:15px; background:#fafafa; page-break-before: always; }
            @media print { .no-print { display: none; } }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;no-print&quot; style=&quot;text-align:right;&quot;&amp;gt;&amp;lt;button onclick=&quot;window.print()&quot;&amp;gt;PDF 저장 / 인쇄&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;doc-wrap&quot;&amp;gt;
            &amp;lt;h1&amp;gt;후 원 신 청 서&amp;lt;/h1&amp;gt;
            &amp;lt;p style=&quot;text-align:right;&quot;&amp;gt;접수번호: ' . $document_srl . '&amp;lt;/p&amp;gt;
            
            &amp;lt;h3&amp;gt;1. 후원 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . $support_type . ' / ' . $support_category . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . number_format((int)$support_amount) . ' 원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;2. 후원자 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($member_name) . ' (' . $member_type . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;3. 결제 정보 (CMS)&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;은행명&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($bank_name) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;계좌번호&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;매월 ' . $pay_date . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;div class=&quot;term-area&quot;&amp;gt;
                &amp;lt;h3&amp;gt;4. 이용 약관 및 동의 기록&amp;lt;/h3&amp;gt;
                ' . $agreement_list_html . '
            &amp;lt;/div&amp;gt;

            &amp;lt;div class=&quot;sig-box&quot;&amp;gt;
                &amp;lt;p&amp;gt;본인은 위와 같이 정기 후원을 신청하며, 개인정보 활용 및 약관에 동의합니다.&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;' . date('Y년 m월 d일') . '&amp;lt;/p&amp;gt;
                &amp;lt;p style=&quot;font-size:18px; font-weight:bold;&quot;&amp;gt;신청인: ' . htmlspecialchars($member_name) . ' (인)&amp;lt;/p&amp;gt;
                &amp;lt;img src=&quot;' . $signature_data . '&quot; class=&quot;sig-image&quot; alt=&quot;서명&quot;&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;';

    file_put_contents($html_full_path, $saved_html_content);

    // 4. 게시판 본문에 저장될 상세 내용 구성
    $db_content = '
    &amp;lt;div class=&quot;sponsorship-detail&quot; style=&quot;font-family:sans-serif; line-height:1.6; max-width:600px; border:1px solid #ddd; padding:20px;&quot;&amp;gt;
        &amp;lt;h2 style=&quot;border-bottom:2px solid #007aff; padding-bottom:10px; color:#333;&quot;&amp;gt;후원 신청 상세 정보&amp;lt;/h2&amp;gt;
        
        &amp;lt;table style=&quot;width:100%; border-collapse:collapse; margin-top:15px;&quot;&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;width:30%; padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($support_type) . ' / ' . htmlspecialchars($support_category) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;&amp;lt;strong&amp;gt;' . number_format((int)$support_amount) . '원&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($member_name) . ' (' . htmlspecialchars($member_type) . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;은행/계좌&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($bank_name) . ' / ' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;매월 ' . htmlspecialchars($pay_date) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; padding:15px; border:1px solid #e1e1e1; background:#fcfcfc;&quot;&amp;gt;
            &amp;lt;h4 style=&quot;margin:0 0 10px 0; color:#007aff;&quot;&amp;gt;[약관 동의 기록]&amp;lt;/h4&amp;gt;
            ' . $agreement_list_html . '
        &amp;lt;/div&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; text-align:center; background:#f5f5f5; padding:10px;&quot;&amp;gt;
            &amp;lt;p style=&quot;font-size:12px; color:#666; margin-bottom:5px;&quot;&amp;gt;[후원자 서명 확인]&amp;lt;/p&amp;gt;
            &amp;lt;img src=&quot;' . $signature_data . '&quot; style=&quot;width:200px; height:80px; border:1px solid #ccc; background:#fff;&quot; alt=&quot;서명&quot;&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div style=&quot;margin-top:20px; padding:15px; border:2px solid #007aff; background:#f0f8ff; text-align:center;&quot;&amp;gt;
            &amp;lt;strong style=&quot;color:#007aff;&quot;&amp;gt;[증빙용 문서 다운로드]&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;
            &amp;lt;a href=&quot;' . $html_web_path . '&quot; target=&quot;_blank&quot; style=&quot;font-size:15px; font-weight:bold; color:#d9534f; text-decoration:underline;&quot;&amp;gt;
                ▶ 서명 포함된 후원신청서(HTML) 열기
            &amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;';

    // 5. DB 저장
    $password = $_POST['password'] ?: '1111';
    $hash_password = getModel('member')-&amp;gt;hashPassword($password);

    $query = &quot;INSERT INTO documents (document_srl, module_srl, title, content, nick_name, password, regdate, last_update, list_order, update_order, status) 
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'SECRET')&quot;;
    
    $args = array($document_srl, $module_srl, $title, $db_content, $member_name, $hash_password, $regdate, $regdate, $document_srl*-1, $document_srl*-1);
    $oDB-&amp;gt;prepare($query)-&amp;gt;execute($args);

    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; 0, 'message' =&amp;gt; '후원 신청이 정상적으로 완료되었습니다.'));

} catch (Exception $e) {
    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; $e-&amp;gt;getMessage()));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1089</guid>
      <comments>https://selfdevelope.tistory.com/1089#entry1089comment</comments>
      <pubDate>Wed, 11 Mar 2026 14:04:59 +0900</pubDate>
    </item>
    <item>
      <title>라이믹스 후원 입력폼. 동의서 및 양식,서식으로 저장 및 출력</title>
      <link>https://selfdevelope.tistory.com/1088</link>
      <description>&lt;pre id=&quot;code_1773203099355&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
&amp;lt;title&amp;gt;후원신청하기 완벽 연동본 (서명 포함)&amp;lt;/title&amp;gt;

&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/signature_pad@4.0.0/dist/signature_pad.umd.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;style&amp;gt;
    /* 1. 전체 래퍼 */
    .dm-form-wrap {
        max-width: 800px;
        margin: 0 auto;
        padding: 40px 20px;
        font-family: 'Noto Sans KR', sans-serif;
        color: #333;
    }

    /* 2. 타이틀 영역 */
    .dm-form-title {
        font-size: 26px;
        font-weight: 700;
        margin-bottom: 15px;
        padding-bottom: 15px;
        border-bottom: 2px solid #333;
        color: #111;
    }

    .dm-sub-title {
        font-size: 19px;
        font-weight: 700;
        margin-top: 50px;
        margin-bottom: 15px;
        color: #007aff;
        position: relative;
        padding-left: 12px;
    }

    .dm-sub-title::before {
        content: '';
        display: block;
        width: 4px;
        height: 18px;
        background: #007aff;
        position: absolute;
        left: 0;
        top: 5px;
    }

    /* 3. 입력 테이블 스타일 */
    .dm-form-table {
        width: 100%;
        border-top: 2px solid #333;
        border-collapse: collapse;
    }

    .dm-form-table th, .dm-form-table td {
        padding: 15px;
        border-bottom: 1px solid #ddd;
        font-size: 15px;
        vertical-align: middle;
        line-height: 1.5;
    }

    .dm-form-table th {
        background: #f7f9fb;
        width: 180px;
        font-weight: 700;
        text-align: left;
        color: #333;
        word-break: keep-all;
    }

    /* 입력창 공통 스타일 */
    .dm-input, .dm-select {
        width: 100%;
        padding: 10px;
        border: 1px solid #ccc;
        border-radius: 4px;
        box-sizing: border-box;
        font-size: 15px;
        position: relative;
        z-index: 10;
    }

    .dm-input:focus, .dm-select:focus {
        border-color: #007aff;
        outline: none;
    }

    /* 라디오/체크박스 클릭 오류 해결 (철벽 방어) */
    .dm-radio-group .dm-radio-item {
        display: inline-block;
        margin-right: 20px;
        margin-bottom: 8px;
    }
    
    .dm-radio-group .dm-radio-item-block {
        display: block;
        margin-bottom: 10px;
    }

    .dm-radio-group input[type=&quot;radio&quot;], 
    .dm-radio-group input[type=&quot;checkbox&quot;] { 
        margin-right: 6px; 
        width: 18px;
        height: 18px;
        vertical-align: middle;
        cursor: pointer;
        position: relative;
        z-index: 10; 
    }

    .dm-radio-group label {
        cursor: pointer;
        vertical-align: middle;
        word-break: keep-all;
        position: relative;
        z-index: 10;
    }

    /* 부가 설명 텍스트 */
    .dm-help-text {
        display: block;
        font-size: 13px;
        color: #666;
        margin-top: 5px;
    }

    /* 4. 약관 동의 그룹 */
    .dm-term-group { margin-bottom: 25px; }
    .dm-term-title { font-weight: 700; margin-bottom: 8px; font-size: 15px; color: #222; }
    .dm-term-box {
        border: 1px solid #ddd;
        background: #f9f9f9;
        padding: 15px;
        font-size: 14px;
        color: #555;
        line-height: 1.6;
        border-radius: 4px;
        margin-bottom: 10px;
    }
    .dm-agree-check { text-align: left; font-size: 15px; font-weight: 700; }

    /* 5. 스마트폰 서명란 전용 스타일 */
    .dm-signature-wrap {
        border: 2px dashed #007aff;
        border-radius: 8px;
        background: #fdfdfd;
        position: relative;
        margin-top: 15px;
    }
    .dm-signature-pad {
        width: 100%;
        height: 200px;
        touch-action: none;
    }
    .dm-sig-clear-btn {
        position: absolute;
        top: 10px;
        right: 10px;
        background: #fff;
        border: 1px solid #ccc;
        padding: 5px 10px;
        font-size: 12px;
        border-radius: 4px;
        cursor: pointer;
    }

    /* 6. 버튼 영역 */
    .dm-btn-wrap { margin-top: 50px; text-align: center; }
    .dm-btn {
        display: inline-block;
        min-width: 160px;
        padding: 15px 30px;
        font-size: 18px;
        font-weight: 700;
        text-align: center;
        border: none;
        cursor: pointer;
        border-radius: 5px;
    }
    .dm-btn-submit { background: #007aff; color: #fff; }
    .dm-btn-cancel { background: #666; color: #fff; margin-left: 10px; }

    /* 모바일 반응형 처리 */
    @media screen and (max-width: 768px) {
        .dm-form-table th, .dm-form-table td { display: block; width: 100%; border-bottom: none; padding: 10px 15px; }
        .dm-form-table th { background: none; padding-bottom: 0; padding-top: 20px; font-size: 15px; color: #007aff; }
        .dm-form-table td { border-bottom: 1px solid #eee; padding-bottom: 20px; }
        .dm-radio-group .dm-radio-item { display: block; margin-bottom: 10px; }
        .dm-btn { width: 100%; margin-left: 0; margin-bottom: 10px; }
    }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div class=&quot;dm-form-wrap&quot; id=&quot;pdf-content-area&quot;&amp;gt;
    
    &amp;lt;div class=&quot;dm-form-title&quot;&amp;gt;후원신청서&amp;lt;/div&amp;gt;
    &amp;lt;p style=&quot;margin-bottom: 30px; color: #555; line-height: 1.6;&quot;&amp;gt;
        아이들의 꿈을 응원해주셔서 감사합니다.&amp;lt;br&amp;gt;
        &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt; 표시는 필수 질문입니다.
    &amp;lt;/p&amp;gt;

    &amp;lt;input type=&quot;hidden&quot; id=&quot;agency_email&quot; name=&quot;agency_email&quot; value=&quot;dongmyeong@example.com&quot;&amp;gt;

    &amp;lt;form id=&quot;sponsorship_form&quot; action=&quot;#&quot; method=&quot;post&quot;&amp;gt;
        
        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;1. 후원 방식 및 종류&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 방식 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;st_1&quot; name=&quot;support_type&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;st_1&quot;&amp;gt;정기후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;st_2&quot; name=&quot;support_type&quot;&amp;gt;
                        &amp;lt;label for=&quot;st_2&quot;&amp;gt;일시후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 종류 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_1&quot; name=&quot;support_category&quot; value=&quot;건축 후원&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;sc_1&quot;&amp;gt;건축 후원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_2&quot; name=&quot;support_category&quot; value=&quot;아동 결연 후원 (아동에게만 후원)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_2&quot;&amp;gt;아동 결연 후원 (아동에게만 후원)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_3&quot; name=&quot;support_category&quot; value=&quot;지정 후원 (후원자 의도에 맞게)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_3&quot;&amp;gt;지정 후원 (후원자 의도에 맞게)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sc_4&quot; name=&quot;support_category&quot; value=&quot;비지정 후원 (기관 용도에 맞게)&quot;&amp;gt;
                        &amp;lt;label for=&quot;sc_4&quot;&amp;gt;비지정 후원 (기관 용도에 맞게)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원 금액 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_1&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_1&quot;&amp;gt;100,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_2&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_2&quot;&amp;gt;50,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_3&quot; name=&quot;support_amount&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;sa_3&quot;&amp;gt;30,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_4&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_4&quot;&amp;gt;20,000원&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;sa_5&quot; name=&quot;support_amount&quot;&amp;gt;
                        &amp;lt;label for=&quot;sa_5&quot;&amp;gt;기타:&amp;lt;/label&amp;gt;
                        &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; style=&quot;width: 150px; margin-left: 8px; display: inline-block;&quot;&amp;gt; 원
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;2. 후원회원정보&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;회원구분 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;mt_1&quot; name=&quot;member_type&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;mt_1&quot;&amp;gt;개인&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;mt_2&quot; name=&quot;member_type&quot;&amp;gt;
                        &amp;lt;label for=&quot;mt_2&quot;&amp;gt;단체&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;후원회원명(단체명) &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;member_name&quot; class=&quot;dm-input&quot; placeholder=&quot;이름을 입력하세요&quot; required&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;기부금영수증&amp;lt;br&amp;gt;발급여부 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;rr_1&quot; name=&quot;receipt_req&quot;&amp;gt;
                        &amp;lt;label for=&quot;rr_1&quot;&amp;gt;발급신청 (하단 질문에 주민등록번호를 입력해주세요)&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item-block&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;rr_2&quot; name=&quot;receipt_req&quot; checked&amp;gt;
                        &amp;lt;label for=&quot;rr_2&quot;&amp;gt;신청안함&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;주민등록번호 입력 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예) 800101-1234567&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;국세청 연말정산간소화서비스를 통해 기부금영수증을 발급받으시려면 주민등록번호를 입력해주세요.&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;연락처 (휴대전화) &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;phone&quot; class=&quot;dm-input&quot; placeholder=&quot;예) 010-0000-0000&quot; required&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;이메일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;email&quot; name=&quot;email&quot; class=&quot;dm-input&quot; placeholder=&quot;example@email.com&quot;&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;주소 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;우편물 수령 주소를 입력해주세요&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;(기부금 영수증 발송 등에 활용)&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;3. 출금 정보&amp;lt;/div&amp;gt;
        &amp;lt;table class=&quot;dm-form-table&quot;&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;예금주명 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예금주 성함&quot;&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;예금주 생년월일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; placeholder=&quot;예금주 생년월일 6자리&quot;&amp;gt;
                    &amp;lt;span class=&quot;dm-help-text&quot;&amp;gt;(주민번호 앞 6자리)&amp;lt;/span&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;은행 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;select class=&quot;dm-select&quot; name=&quot;bank_name&quot; style=&quot;max-width: 300px;&quot;&amp;gt;
                        &amp;lt;option&amp;gt;은행을 선택해주세요&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;SC제일은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;국민은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;우리은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;하나은행&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;농협&amp;lt;/option&amp;gt;
                        &amp;lt;option&amp;gt;기타은행&amp;lt;/option&amp;gt;
                    &amp;lt;/select&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;계좌번호 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td&amp;gt;
                    &amp;lt;input type=&quot;text&quot; class=&quot;dm-input&quot; name=&quot;account_num&quot; required&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
                &amp;lt;th&amp;gt;자동이체 출금일 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/th&amp;gt;
                &amp;lt;td class=&quot;dm-radio-group&quot;&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_1&quot; name=&quot;pay_date&quot; value=&quot;1일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_1&quot;&amp;gt;1일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_2&quot; name=&quot;pay_date&quot; value=&quot;5일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_2&quot;&amp;gt;5일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_3&quot; name=&quot;pay_date&quot; value=&quot;10일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_3&quot;&amp;gt;10일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;dm-radio-item&quot;&amp;gt;
                        &amp;lt;input type=&quot;radio&quot; id=&quot;pd_4&quot; name=&quot;pay_date&quot; value=&quot;15일&quot;&amp;gt;
                        &amp;lt;label for=&quot;pd_4&quot;&amp;gt;15일&amp;lt;/label&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;

        &amp;lt;div class=&quot;dm-sub-title&quot;&amp;gt;4. 이용 동의서 및 서명&amp;lt;/div&amp;gt;
        
        &amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[CMS자동이체 안내사항] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
                CMS 자동이체 신청을 위해 후원신청 완료 후 ARS를 통해 '출금동의 증빙자료' 제출 과정이 진행됩니다.
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
                &amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_1&quot; required&amp;gt; &amp;lt;label for=&quot;ag_1&quot;&amp;gt;확인했습니다.&amp;lt;/label&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[금융거래 정보 제공 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
                본 신청과 관련하여 본인은 위 금융거래정보(거래은행명, 계좌번호)를 출금이체 신규 신청하는 때로부터 해지 신청할 때까지 (사)비영리아이티지원센터와 CMS 출금이체 계약을 체결한 수납기관에 제공하는 것에 대하여 '금융실명거래 및 비밀보장에 관한 법률'의 규정에 따라 동의합니다.
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
                &amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_2&quot; required&amp;gt; &amp;lt;label for=&quot;ag_2&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[개인정보 이용 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
                1. 수집 및 이용목적 : CMS출금이체를 통한 요금 수납&amp;lt;br&amp;gt;
                2. 수집항목 : 성명, 휴대전화, 금융기관명, 계좌번호&amp;lt;br&amp;gt;
                3. 보유 및 이용기간 : 수집 및 이용동의일로부터 CMS출금이체 종료일(해지일)후 5년&amp;lt;br&amp;gt;
                * 신청자는 개인정보 수집 및 이용을 거부할 권리가 있으며, 권리행사시 출금이체 신청이 거부될 수 있습니다.
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
                &amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_3&quot; required&amp;gt; &amp;lt;label for=&quot;ag_3&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-term-group&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;[개인정보 3자 제공 동의서] &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-term-box&quot;&amp;gt;
                신청자는 개인정보에 대해 금융결제원에게 제공하는 것을 거부할 권리가 있습니다. 또한 개인정보 관리 책임자에게 요청시 즉시 필요한 조치를 취하겠습니다.&amp;lt;br&amp;gt;
                * 정보를 제공받는 자 : 금융결제원, 후원기관&amp;lt;br&amp;gt;
                * 제공목적 : CMS 출금이체 서비스 제공 및 출금동의확인, 출금이체 신규등록 및 해지 사실통지
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;dm-agree-check dm-radio-group&quot;&amp;gt;
                &amp;lt;input type=&quot;checkbox&quot; id=&quot;ag_4&quot; required&amp;gt; &amp;lt;label for=&quot;ag_4&quot;&amp;gt;동의합니다.&amp;lt;/label&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-term-group&quot; style=&quot;margin-top:40px;&quot;&amp;gt;
            &amp;lt;div class=&quot;dm-term-title&quot;&amp;gt;후원자 서명 &amp;lt;span style=&quot;color:red&quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;p style=&quot;font-size:14px; color:#666; margin-bottom:10px;&quot;&amp;gt;아래 네모 박스 안에 마우스나 손가락으로 서명해 주세요.&amp;lt;/p&amp;gt;
            &amp;lt;div class=&quot;dm-signature-wrap&quot;&amp;gt;
                &amp;lt;canvas id=&quot;signature-pad&quot; class=&quot;dm-signature-pad&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
                &amp;lt;button type=&quot;button&quot; class=&quot;dm-sig-clear-btn&quot; id=&quot;clear-signature&quot;&amp;gt;다시 쓰기&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class=&quot;dm-btn-wrap&quot;&amp;gt;
            &amp;lt;button type=&quot;submit&quot; class=&quot;dm-btn dm-btn-submit&quot;&amp;gt;제출 및 서명완료&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;

    &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    // 1. 도화지(Canvas) 세팅
    const canvas = document.getElementById('signature-pad');
    
    function resizeCanvas() {
        const ratio =  Math.max(window.devicePixelRatio || 1, 1);
        canvas.width = canvas.offsetWidth * ratio;
        canvas.height = canvas.offsetHeight * ratio;
        canvas.getContext(&quot;2d&quot;).scale(ratio, ratio);
    }
    window.addEventListener(&quot;resize&quot;, resizeCanvas);
    resizeCanvas();

    // 2. 서명 패드 라이브러리 실행
    const signaturePad = new SignaturePad(canvas, {
        penColor: &quot;rgb(0, 0, 0)&quot;,
        backgroundColor: &quot;rgb(255, 255, 255)&quot;
    });

    // 3. 다시 쓰기 버튼
    document.getElementById('clear-signature').addEventListener('click', function () {
        signaturePad.clear();
    });

    // 4. 폼 제출 시 이벤트
    document.getElementById('sponsorship_form').addEventListener('submit', function (event) {
        event.preventDefault(); // 기본 새로고침 방지

        if (signaturePad.isEmpty()) {
            alert(&quot;후원자 서명을 작성해 주세요.&quot;);
            return;
        }

        const emailAddress = document.getElementById('agency_email').value;
        
        //alert(`완벽합니다! 서명이 확인되었습니다.\n\n실제 서버가 연동되면, 이 신청서 내용 전체가 PDF로 변환되어 [ ${emailAddress} ](으)로 즉시 발송됩니다.`);
    });
	
	
	document.getElementById('sponsorship_form').addEventListener('submit', function (event) {
    event.preventDefault();

    if (signaturePad.isEmpty()) {
        alert(&quot;후원자 서명을 작성해 주세요.&quot;);
        return;
    }

    // 서명 데이터를 Base64 문자열로 추출
    const signatureImage = signaturePad.toDataURL();

    // 폼 데이터를 가져와서 서명 데이터 추가
    const formData = new FormData(this);
    formData.append('signature_image', signatureImage);
    
    // AJAX 전송
    $.ajax({
        url: '/rx/insert_form/insert_proc.php',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
            if(response.error === 0) {
                alert(response.message);
                location.reload();
            } else {
                alert(&quot;오류: &quot; + response.message);
            }
        }
    });
});

&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773203125219&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
ob_start();
error_reporting(0);
ini_set('display_errors', 0);

define('__XE__', true);
require_once('../config/config.inc.php');
$oContext = &amp;amp;Context::getInstance();
$oContext-&amp;gt;init();

header('Content-Type: application/json');

try {
    // 1. 데이터 수집 (폼의 name 속성 기준)
    $title = &quot;후원신청서 - &quot; . ($_POST['member_name'] ?: '무명후원자');
    $member_name = $_POST['member_name'] ?? '미입력';
    $support_type = $_POST['support_type'] ?? '정기후원';
    $support_category = $_POST['support_category'] ?? '미선택';
    $support_amount = $_POST['support_amount'] ?? '0';
    $member_type = $_POST['member_type'] ?? '개인';
    $phone = $_POST['phone'] ?? '미입력';
    $email = $_POST['email'] ?? '미입력';
    $bank_name = $_POST['bank_name'] ?? '미선택';
    $account_num = $_POST['account_num'] ?? '미입력';
    $pay_date = $_POST['pay_date'] ?? '미지정';
    
    // 서명 데이터 (Base64 이미지 문자열)
    $signature_data = $_POST['signature_image'] ?? ''; 

    $module_srl = 51; // 실제 게시판 모듈 번호 확인 필요
    $oDB = DB::getInstance();
    $document_srl = getNextSequence();
    $regdate = date('YmdHis');

    // 2. 정적 HTML 파일 생성 경로 설정
    $html_save_dir = '../files/saved_html/';
    if(!is_dir($html_save_dir)) mkdir($html_save_dir, 0777, true);

    $html_filename = &quot;support_{$document_srl}.html&quot;;
    $html_web_path = '/rx/files/saved_html/' . $html_filename;
    $html_full_path = $html_save_dir . $html_filename;

    // 3. 서류 디자인 (제공해주신 폼 스타일 반영)
    $saved_html_content = '
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;후원신청서 증빙 - ' . htmlspecialchars($member_name) . '&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body { font-family: &quot;Malgun Gothic&quot;, sans-serif; padding: 30px; line-height: 1.5; color: #333; }
            .doc-wrap { max-width: 700px; margin: 0 auto; border: 1px solid #000; padding: 30px; }
            h1 { text-align: center; font-size: 24px; text-decoration: underline; margin-bottom: 30px; }
            table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
            th, td { border: 1px solid #ccc; padding: 10px; font-size: 14px; }
            th { background: #f4f4f4; width: 30%; text-align: left; }
            .sig-box { text-align: center; margin-top: 40px; border-top: 2px solid #333; padding-top: 20px; }
            .sig-image { border: 1px solid #eee; width: 250px; height: 100px; margin-top: 10px; }
            @media print { .no-print { display: none; } }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;no-print&quot; style=&quot;text-align:right;&quot;&amp;gt;&amp;lt;button onclick=&quot;window.print()&quot;&amp;gt;PDF 저장 / 인쇄&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;doc-wrap&quot;&amp;gt;
            &amp;lt;h1&amp;gt;후 원 신 청 서&amp;lt;/h1&amp;gt;
            &amp;lt;p style=&quot;text-align:right;&quot;&amp;gt;접수번호: ' . $document_srl . '&amp;lt;/p&amp;gt;
            
            &amp;lt;h3&amp;gt;1. 후원 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . $support_type . ' / ' . $support_category . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;후원금액&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . number_format((int)$support_amount) . ' 원&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;2. 후원자 정보&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($member_name) . ' (' . $member_type . ')&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;연락처&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;이메일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;h3&amp;gt;3. 결제 정보 (CMS)&amp;lt;/h3&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;은행명&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($bank_name) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;계좌번호&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;출금희망일&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;매월 ' . $pay_date . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;

            &amp;lt;div class=&quot;sig-box&quot;&amp;gt;
                &amp;lt;p&amp;gt;본인은 위와 같이 정기 후원을 신청하며, 개인정보 활용에 동의합니다.&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;' . date('Y년 m월 d일') . '&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;신청인: ' . htmlspecialchars($member_name) . ' (인)&amp;lt;/p&amp;gt;
                &amp;lt;img src=&quot;' . $signature_data . '&quot; class=&quot;sig-image&quot; alt=&quot;서명&quot;&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;';

    file_put_contents($html_full_path, $saved_html_content);

   // 4. 게시판 본문에 저장될 상세 내용 구성 (HTML 테이블 형태)
	$db_content = '
	&amp;lt;div class=&quot;sponsorship-detail&quot; style=&quot;font-family:sans-serif; line-height:1.6; max-width:600px; border:1px solid #ddd; padding:20px;&quot;&amp;gt;
		&amp;lt;h2 style=&quot;border-bottom:2px solid #007aff; padding-bottom:10px; color:#333;&quot;&amp;gt;후원 신청 상세 정보&amp;lt;/h2&amp;gt;
		
		&amp;lt;table style=&quot;width:100%; border-collapse:collapse; margin-top:15px;&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;width:30%; padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원방식/종류&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($support_type) . ' / ' . htmlspecialchars($support_category) . '&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;후원금액&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;&amp;lt;strong&amp;gt;' . number_format((int)$support_amount) . '원&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;성명(단체명)&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($member_name) . ' (' . htmlspecialchars($member_type) . ')&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;연락처&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($phone) . '&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;이메일&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($email) . '&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;은행/계좌&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;' . htmlspecialchars($bank_name) . ' / ' . htmlspecialchars($account_num) . '&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th style=&quot;padding:8px; border:1px solid #ddd; background:#f9f9f9; text-align:left;&quot;&amp;gt;출금희망일&amp;lt;/th&amp;gt;
				&amp;lt;td style=&quot;padding:8px; border:1px solid #ddd;&quot;&amp;gt;매월 ' . htmlspecialchars($pay_date) . '&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;

		&amp;lt;div style=&quot;margin-top:20px; text-align:center; background:#f5f5f5; padding:10px;&quot;&amp;gt;
			&amp;lt;p style=&quot;font-size:12px; color:#666; margin-bottom:5px;&quot;&amp;gt;[후원자 서명 확인]&amp;lt;/p&amp;gt;
			&amp;lt;img src=&quot;' . $signature_data . '&quot; style=&quot;width:200px; height:80px; border:1px solid #ccc; background:#fff;&quot; alt=&quot;서명&quot;&amp;gt;
		&amp;lt;/div&amp;gt;

		&amp;lt;div style=&quot;margin-top:20px; padding:15px; border:2px solid #007aff; background:#f0f8ff; text-align:center;&quot;&amp;gt;
			&amp;lt;strong style=&quot;color:#007aff;&quot;&amp;gt;[증빙용 문서 다운로드]&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;
			&amp;lt;a href=&quot;' . $html_web_path . '&quot; target=&quot;_blank&quot; style=&quot;font-size:15px; font-weight:bold; color:#d9534f; text-decoration:underline;&quot;&amp;gt;
				▶ 서명 포함된 후원신청서(HTML) 열기
			&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;';


    // 5. DB 저장
    $password = $_POST['password'] ?: '1111';
    $hash_password = getModel('member')-&amp;gt;hashPassword($password);

    $query = &quot;INSERT INTO documents (document_srl, module_srl, title, content, nick_name, password, regdate, last_update, list_order, update_order, status) 
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'SECRET')&quot;;
    
    $args = array($document_srl, $module_srl, $title, $db_content, $member_name, $hash_password, $regdate, $regdate, $document_srl*-1, $document_srl*-1);
    $oDB-&amp;gt;prepare($query)-&amp;gt;execute($args);

    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; 0, 'message' =&amp;gt; '후원 신청이 정상적으로 완료되었습니다.'));

} catch (Exception $e) {
    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; $e-&amp;gt;getMessage()));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Wili/dJMcagxVhSm/hoHMaNP7fojKyrYDsLtMDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Wili/dJMcagxVhSm/hoHMaNP7fojKyrYDsLtMDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Wili/dJMcagxVhSm/hoHMaNP7fojKyrYDsLtMDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Wili%2FdJMcagxVhSm%2FhoHMaNP7fojKyrYDsLtMDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;620&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JdDey/dJMcabwCCpS/ZajZmL15aoxEpeMCbfkKH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JdDey/dJMcabwCCpS/ZajZmL15aoxEpeMCbfkKH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JdDey/dJMcabwCCpS/ZajZmL15aoxEpeMCbfkKH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJdDey%2FdJMcabwCCpS%2FZajZmL15aoxEpeMCbfkKH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;842&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>라이믹스</category>
      <category>라이믹스 입력폼</category>
      <category>입력폼</category>
      <category>후원신청서</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1088</guid>
      <comments>https://selfdevelope.tistory.com/1088#entry1088comment</comments>
      <pubDate>Wed, 11 Mar 2026 13:26:34 +0900</pubDate>
    </item>
    <item>
      <title>라이믹스 입력폼. 양식(서식)으로 출력.pdf가능</title>
      <link>https://selfdevelope.tistory.com/1087</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;/insert_form/insert_form.html&lt;/p&gt;
&lt;pre id=&quot;code_1773141191363&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form id=&quot;myCustomForm&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;title&quot; placeholder=&quot;제목&quot; required&amp;gt;&amp;lt;br&amp;gt;
    &amp;lt;textarea name=&quot;content&quot; placeholder=&quot;내용&quot; required&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;nick_name&quot; placeholder=&quot;닉네임&quot;&amp;gt;
    &amp;lt;input type=&quot;password&quot; name=&quot;password&quot; placeholder=&quot;비밀번호&quot;&amp;gt;
    &amp;lt;button type=&quot;button&quot; onclick=&quot;submitToRhymix()&quot;&amp;gt;등록하기&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;

&amp;lt;script src=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;

// 라이믹스의 자동 CSRF 토큰 할당 기능을 일시적으로 우회
if(typeof jQuery !== 'undefined' &amp;amp;&amp;amp; !jQuery.fn.addCSRFTokenToForm) {
    jQuery.fn.addCSRFTokenToForm = function() { return this; };
}

function submitToRhymix() {
    var formData = jQuery('#myCustomForm').serialize();
    
    console.log(&quot;데이터 전송 시작...&quot;, formData); // 확인용

    $.ajax({
		// 알려주신 경로를 절대 경로로 정확히 기입합니다.
		url: '/rx/insert_form/insert_proc.php', 
		type: 'POST',
		data: formData,
		dataType: 'json',
		success: function(response) {
			if (response &amp;amp;&amp;amp; response.error === 0) {
				alert(response.message); // &quot;등록이 완료되었습니다.&quot;
				location.reload(); // 또는 메인 페이지로 이동: location.href = '/';
			} else {
				alert('에러: ' + response.message);
			}
		},
		error: function(xhr) {
			console.error(&quot;에러 상태:&quot;, xhr.status);
			console.error(&quot;응답 내용:&quot;, xhr.responseText);
			alert('파일을 찾을 수 없습니다(404). 경로가 /rx/insert_form/insert_proc.php 가 맞는지 확인해주세요.');
		}
	});
	
	
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/insert_form/insert_proc.php&lt;/p&gt;
&lt;pre id=&quot;code_1773141210394&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
// 1. 에러 출력 방지 및 버퍼링 (JSON 응답 오염 방지)
ob_start();
error_reporting(0);
ini_set('display_errors', 0);

define('__XE__', true);

// 2. 라이믹스 로드
require_once('../config/config.inc.php');
$oContext = &amp;amp;Context::getInstance();
$oContext-&amp;gt;init();

// 3. 데이터 받기
$title = $_POST['title'] ?? '';
$content = $_POST['content'] ?? '';
$nick_name = $_POST['nick_name'] ?: '비회원';
$password = $_POST['password'] ?: '1111';
$module_srl = 51; // 실제 게시판 모듈 번호에 맞게 수정하세요.

header('Content-Type: application/json');

try {
    if(!$title || !$content) throw new Exception('필수 데이터가 누락되었습니다.');

    // 4. 비밀번호 암호화 (라이믹스 방식)
    $memberModel = getModel('member');
    $hash_password = $memberModel-&amp;gt;hashPassword($password);

    // 5. 문서 번호 및 날짜 생성
    $oDB = DB::getInstance();
    $document_srl = getNextSequence();
    $regdate = date('YmdHis');

    // 6. [중요] 정적 HTML 인쇄 파일 생성 로직
    $html_save_dir = '../files/saved_html/';
    if(!is_dir($html_save_dir)) mkdir($html_save_dir, 0777, true);

    $html_filename = &quot;print_{$document_srl}.html&quot;;
    $html_web_path = '/rx/files/saved_html/' . $html_filename; // 브라우저 접근 경로
    $html_full_path = $html_save_dir . $html_filename;         // 서버 물리 저장 경로

    // 인쇄용 HTML 디자인 구성
    $saved_html_content = '
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang=&quot;ko&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
        &amp;lt;title&amp;gt;접수 확인서 - ' . htmlspecialchars($title) . '&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body { font-family: &quot;Malgun Gothic&quot;, sans-serif; color: #333; padding: 50px; line-height: 1.6; }
            .receipt-box { border: 2px solid #000; padding: 40px; max-width: 800px; margin: 0 auto; position: relative; }
            h1 { text-align: center; text-decoration: underline; margin-bottom: 50px; font-size: 30px; letter-spacing: 5px; }
            table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }
            th, td { border: 1px solid #000; padding: 12px; text-align: left; }
            th { background: #f9f9f9; width: 25%; font-weight: bold; }
            .content-area { min-height: 350px; border: 1px solid #000; padding: 20px; margin-top: 10px; white-space: pre-wrap; background: #fff; }
            .footer-info { text-align: center; margin-top: 40px; font-weight: bold; font-size: 18px; }
            .stamp { position: absolute; bottom: 60px; right: 60px; width: 80px; height: 80px; border: 3px double red; border-radius: 50%; color: red; text-align: center; line-height: 80px; transform: rotate(-15deg); font-weight: bold; }
            @media print { .no-print { display: none; } body { padding: 0; } .receipt-box { border: 1px solid #000; } }
        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;no-print&quot; style=&quot;text-align:right; margin-bottom:20px;&quot;&amp;gt;
            &amp;lt;button onclick=&quot;window.print()&quot; style=&quot;padding:10px 20px; cursor:pointer;&quot;&amp;gt;이 확인서 인쇄/PDF저장&amp;lt;/button&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;receipt-box&quot;&amp;gt;
            &amp;lt;h1&amp;gt;접 수 확 인 서&amp;lt;/h1&amp;gt;
            &amp;lt;table&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;접수번호&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . $document_srl . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;접수일자&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . date('Y-m-d H:i') . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;성 명&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($nick_name) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;제 목&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;' . htmlspecialchars($title) . '&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
            &amp;lt;/table&amp;gt;
            &amp;lt;div style=&quot;font-weight:bold; margin-top:20px;&quot;&amp;gt;[접수 내용]&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;content-area&quot;&amp;gt;' . nl2br(htmlspecialchars($content)) . '&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;footer-info&quot;&amp;gt;' . date('Y년 m월 d일') . '&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;신한DS 귀중&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;stamp&quot;&amp;gt;접수확인&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;';

    // 파일 물리적 저장
    file_put_contents($html_full_path, $saved_html_content);

    // 7. [핵심] 본문(content) 하단에 관리자용 인쇄 링크 삽입
    $admin_link_tag = '
    &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;hr&amp;gt;
    &amp;lt;div style=&quot;padding:15px; background:#f0f7ff; border:1px dashed #007bff; border-radius:5px;&quot;&amp;gt;
        &amp;lt;p style=&quot;margin:0; font-weight:bold; color:#0056b3;&quot;&amp;gt;[관리자 전용 기능]&amp;lt;/p&amp;gt;
        &amp;lt;a href=&quot;' . $html_web_path . '&quot; target=&quot;_blank&quot; onclick=&quot;window.open(this.href, \'_blank\', \'width=950,height=900\'); return false;&quot; style=&quot;color:#ff0000; text-decoration:underline; font-size:1.1em;&quot;&amp;gt;
            ▶ 접수확인서 인쇄하기 (정적 HTML 파일 열기)
        &amp;lt;/a&amp;gt;
        &amp;lt;p style=&quot;margin:5px 0 0 0; font-size:12px; color:#666;&quot;&amp;gt;* 이 링크는 등록 시점의 내용을 고정 보관한 파일로 연결됩니다.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;';

    $db_content = $content . $admin_link_tag;

    // 8. DB 저장
    $query = &quot;INSERT INTO documents 
              (document_srl, module_srl, title, content, user_id, nick_name, password, regdate, last_update, list_order, update_order, comment_status, status) 
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ALLOW', 'SECRET')&quot;;

    $args = array(
        $document_srl, $module_srl, $title, $db_content, 
        0, $nick_name, $hash_password, 
        $regdate, $regdate, 
        $document_srl * -1, $document_srl * -1
    );

    $stmt = $oDB-&amp;gt;prepare($query);
    $result = $stmt-&amp;gt;execute($args);

    if(!$result) throw new Exception('DB 저장 실패');

    // 9. 최종 응답
    ob_end_clean();
    echo json_encode(array(
        'error' =&amp;gt; 0, 
        'message' =&amp;gt; '등록이 완료되었습니다.',
        'document_srl' =&amp;gt; $document_srl
    ));

} catch (Exception $e) {
    ob_end_clean();
    echo json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; $e-&amp;gt;getMessage()));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>라이믹스</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1087</guid>
      <comments>https://selfdevelope.tistory.com/1087#entry1087comment</comments>
      <pubDate>Tue, 10 Mar 2026 20:14:13 +0900</pubDate>
    </item>
    <item>
      <title>라이믹스 입력폼. 비밀번호 암호화</title>
      <link>https://selfdevelope.tistory.com/1086</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전글과 비슷하지만 패스워드를 암호화함. 그래야 나중에 조회시 사용할 수 있음.&lt;/p&gt;
&lt;pre id=&quot;code_1773116112545&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
// 1. 에러가 화면에 텍스트로 찍히면 JSON이 깨지므로 일단 끕니다.
error_reporting(0);
ini_set('display_errors', 0);

define('__XE__', true);

// 2. 경로 자동 탐색 (현재 파일 위치 기준으로 config 파일을 찾습니다)
$config_path = $_SERVER['DOCUMENT_ROOT'] . '/config/config.inc.php';
if (!file_exists($config_path)) {
    // 만약 루트가 아니라면 상대 경로로 다시 시도
    $config_path = dirname(__FILE__) . '/../config/config.inc.php';
}

if (!file_exists($config_path)) {
    header('Content-Type: application/json');
    die(json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; 'Config file not found.')));
}

require_once($config_path);
$oContext = &amp;amp;Context::getInstance();
$oContext-&amp;gt;init();

// 3. 입력값 받기
$title = $_POST['title'];
$content = $_POST['content'];
$nick_name = $_POST['nick_name'] ?: '비회원';
$password = $_POST['password'] ?: '1111';
$module_srl = 51; 

header('Content-Type: application/json');

try {
    if(!$title || !$content) throw new Exception('제목 또는 내용이 비어있습니다.');

    // 4. 라이믹스 비밀번호 해싱
    $memberModel = getModel('member');
    if(!$memberModel) throw new Exception('Member 모델 로드 실패');
    $hash_password = $memberModel-&amp;gt;hashPassword($password);

    // 5. DB 입력
    $oDB = DB::getInstance();
    $document_srl = getNextSequence();
    $regdate = date('YmdHis');

    $query = &quot;INSERT INTO documents 
              (document_srl, module_srl, title, content, user_id, nick_name, password, regdate, last_update, list_order, update_order, comment_status, status) 
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&quot;;

    $args = array(
        $document_srl, $module_srl, $title, $content, 
        0, $nick_name, $hash_password, 
        $regdate, $regdate, 
        $document_srl * -1, $document_srl * -1,
        'ALLOW', 'SECRET'
    );

    $stmt = $oDB-&amp;gt;prepare($query);
    $result = $stmt-&amp;gt;execute($args);

    if($result) {
        echo json_encode(array('error' =&amp;gt; 0, 'message' =&amp;gt; 'success'));
    } else {
        throw new Exception('DB Insert 실패');
    }

} catch (Exception $e) {
    // 에러 발생 시에도 JSON 규격에 맞춰 응답
    echo json_encode(array('error' =&amp;gt; -1, 'message' =&amp;gt; $e-&amp;gt;getMessage()));
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>라이믹스</category>
      <category>라이믹스 입력폼</category>
      <author>xemaker</author>
      <guid isPermaLink="true">https://selfdevelope.tistory.com/1086</guid>
      <comments>https://selfdevelope.tistory.com/1086#entry1086comment</comments>
      <pubDate>Tue, 10 Mar 2026 13:15:50 +0900</pubDate>
    </item>
  </channel>
</rss>