팁과노하우

  • 팁과노하우 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 155건 / 1 페이지
    • 155
    • 1일 전
      2026.08.11
  • 1일 전
  • rb에디터에 실시간 글자수 카운트를 넣어보자. 에디터 원본 수정 없음.
  • 조금 귀찮은 작업을 해야합니다.에디터가 출력되는 write.skin.php 파일에서 아래 코드를 에디터가 출력되는 아래쪽에 넣어시면 됩니다.하단에 보면 글자수 카운트에 따라 카운트 숫자 색을 다르게 보이게도 적용할 수 있습니다.
    rb에디터에 글자수 카운트 기능이 들어가면 아래 코드는 사용할 필요 없습니다. ㅎㅎ
    아래 이미지처럼 에디터 조절바 바로 밑에 출력이 됩니다.




    <!-- 1. 글자 수 표시 레이아웃 (높이 조절바 밑에 이질감 없이 녹아들도록 스타일 수정) -->
    <div class="rb-word-counter" id="rb_word_counter_box" style="text-align: right; padding: 5px 8px; font-size: 11px; color: #777; background: #fafafa; border: 1px solid #ddd; margin-top: 4px; margin-bottom: 15px; display: none;">
    현재 본문 글자 수: <strong id="pure_char_count" style="color: #007bff; font-size: 11px; font-weight: bold;">0</strong>자
    <span style="font-size: 10px; color: #aaa;">(공백 포함·태그 제외)</span>
    </div>

    <!-- 2. 에디터 프레임 전체 구조 파악 및 하단 배치 스크립트 -->
    <script>
    document.addEventListener("DOMContentLoaded", function() {
    var checkCount = 0;

    var findRbEditorFrame = setInterval(function() {
    checkCount++;

    // 1. 에디터 내부의 글자 입력 iframe 탐색
    var editorIframe = document.querySelector("iframe[id^='editor_'], .se-wrapper-inner iframe, iframe");

    // 2. [핵심] 리빌더 에디터 전체를 감싸고 있는 최외곽 박스(.sun-editor)를 탐색합니다.
    var sunEditorMain = document.querySelector(".sun-editor, .se-container, [class*='editor']");
    var counterBox = document.getElementById("rb_word_counter_box");

    if (editorIframe && editorIframe.contentWindow && editorIframe.contentDocument && sunEditorMain && counterBox) {
    var iframeDoc = editorIframe.contentDocument;
    var editorBody = iframeDoc.querySelector("#editor") || iframeDoc.body;

    if (editorBody) {
    clearInterval(findRbEditorFrame);

    // [위치 조정 핵심] 에디터 전체 박스(.sun-editor) 바로 '바깥쪽 아랫줄'에 카운터 박스를 밀어 넣습니다.
    // 높이 조절바는 에디터 박스 내부에 속해 있으므로, 박스 바로 아래에 붙이면 조절바 밑에 완벽히 달라붙습니다.
    sunEditorMain.parentNode.insertBefore(counterBox, sunEditorMain.nextSibling);
    counterBox.style.display = "block"; // 화면 노출 보장

    // 최초 글자 수 세팅
    updateWordCount(editorBody.innerHTML);

    // iframe 내부 실시간 감시 기동
    var observer = new MutationObserver(function(mutations) {
    updateWordCount(editorBody.innerHTML);
    });

    observer.observe(editorBody, {
    childList: true,
    characterData: true,
    subtree: true
    });
    }
    }

    if (checkCount > 50) clearInterval(findRbEditorFrame);
    }, 300);

    // 글자 수 정제 및 출력 함수
    function updateWordCount(htmlContent) {
    if (!htmlContent) {
    document.getElementById('pure_char_count').innerText = 0;
    return;
    }

    var tempDiv = document.createElement("div");
    tempDiv.innerHTML = htmlContent;
    var pureText = tempDiv.textContent || tempDiv.innerText || "";

    // 연속된 공백 및 줄바꿈 제거 (서버 PHP 검증 규칙과 100% 일치)
    // pureText = pureText.replace(/\s+/g, '');
    // 줄바꿈이나 연속된 띄어쓰기를 딱 1칸의 스페이스로 압축하고 앞뒤 공백을 자릅니다.
    pureText = pureText.replace(/\s+/g, ' ').trim();

    var textLength = pureText.length;
    document.getElementById('pure_char_count').innerText = textLength;

    var countEl = document.getElementById('pure_char_count');
    if (textLength >= 1000) {
    countEl.style.color = '#28a745';
    } else if (textLength >= 500) {
    countEl.style.color = '#fd7e14';
    } else {
    countEl.style.color = '#007bff';
    }
    }
    });
    </script>

    write.skin.php 에 적용한 예제입니다. 적용할 위치 참고하세요.
    <!-- 내용 { -->
    <div class="rb_inp_wrap">
    <ul>
    <div class="wr_content <?php echo $is_dhtml_editor ? $config['cf_editor'] : ''; ?>">
    <?php if($board['bo_write_min'] || $board['bo_write_max']) { ?>
    <!-- 최소/최대 글자 수 사용 시 -->
    <p id="char_count_desc" class="help_text">이 게시판은 최소 <strong><?php echo $board['bo_write_min']; ?></strong>글자 이상, 최대 <strong><?php echo $board['bo_write_max']; ?></strong>글자 이하까지 글을 쓰실 수 있습니다.</p>
    <?php } ?>
    <?php echo $editor_html; // 에디터 사용시는 에디터로, 아니면 textarea 로 노출 ?>

    <?php if($board['bo_write_min'] || $board['bo_write_max']) { ?>
    <?php if(!$is_dhtml_editor) { ?>
    <div id="char_count_wrap"><span id="char_count"></span>글자</div>
    <?php } ?>
    <?php } ?>

    </div>

    <?php if(!$is_dhtml_editor) { ?>
    <style>
    .wr_content>textarea {
    overflow: hidden;
    }
    </style>
    <script>
    //에디터가 아닌경우 textarea의 높이 자동설정
    $(document).ready(function() {
    $('.wr_content > textarea').on('input', function() {
    this.style.height = 'auto'; /* 높이를 자동으로 설정합니다. */
    this.style.height = (this.scrollHeight) + 'px'; /* 스크롤 높이를 textarea에 적용합니다. */
    this.style.minHeight = '300px';
    });
    });
    </script>
    <?php } ?>
    </ul>
    </div>
    <!-- } -->

    <!-- 1. 글자 수 표시 레이아웃 (높이 조절바 밑에 이질감 없이 녹아들도록 스타일 수정) -->
    <div class="rb-word-counter" id="rb_word_counter_box" style="text-align: right; padding: 5px 8px; font-size: 11px; color: #777; background: #fafafa; border: 1px solid #ddd; margin-top: 4px; margin-bottom: 15px; display: none;">
    현재 본문 글자 수: <strong id="pure_char_count" style="color: #007bff; font-size: 11px; font-weight: bold;">0</strong>자
    <span style="font-size: 10px; color: #aaa;">(공백 포함·태그 제외)</span>
    </div>

    <!-- 2. 에디터 프레임 전체 구조 파악 및 하단 배치 스크립트 -->
    <script>
    document.addEventListener("DOMContentLoaded", function() {
    var checkCount = 0;

    var findRbEditorFrame = setInterval(function() {
    checkCount++;

    // 1. 에디터 내부의 글자 입력 iframe 탐색
    var editorIframe = document.querySelector("iframe[id^='editor_'], .se-wrapper-inner iframe, iframe");

    // 2. [핵심] 리빌더 에디터 전체를 감싸고 있는 최외곽 박스(.sun-editor)를 탐색합니다.
    var sunEditorMain = document.querySelector(".sun-editor, .se-container, [class*='editor']");
    var counterBox = document.getElementById("rb_word_counter_box");

    if (editorIframe && editorIframe.contentWindow && editorIframe.contentDocument && sunEditorMain && counterBox) {
    var iframeDoc = editorIframe.contentDocument;
    var editorBody = iframeDoc.querySelector("#editor") || iframeDoc.body;

    if (editorBody) {
    clearInterval(findRbEditorFrame);

    // [위치 조정 핵심] 에디터 전체 박스(.sun-editor) 바로 '바깥쪽 아랫줄'에 카운터 박스를 밀어 넣습니다.
    // 높이 조절바는 에디터 박스 내부에 속해 있으므로, 박스 바로 아래에 붙이면 조절바 밑에 완벽히 달라붙습니다.
    sunEditorMain.parentNode.insertBefore(counterBox, sunEditorMain.nextSibling);
    counterBox.style.display = "block"; // 화면 노출 보장

    // 최초 글자 수 세팅
    updateWordCount(editorBody.innerHTML);

    // iframe 내부 실시간 감시 기동
    var observer = new MutationObserver(function(mutations) {
    updateWordCount(editorBody.innerHTML);
    });

    observer.observe(editorBody, {
    childList: true,
    characterData: true,
    subtree: true
    });
    }
    }

    if (checkCount > 50) clearInterval(findRbEditorFrame);
    }, 300);

    // 글자 수 정제 및 출력 함수
    function updateWordCount(htmlContent) {
    if (!htmlContent) {
    document.getElementById('pure_char_count').innerText = 0;
    return;
    }

    var tempDiv = document.createElement("div");
    tempDiv.innerHTML = htmlContent;
    var pureText = tempDiv.textContent || tempDiv.innerText || "";

    // 연속된 공백 및 줄바꿈 제거 (서버 PHP 검증 규칙과 100% 일치)
    // pureText = pureText.replace(/\s+/g, '');
    // 줄바꿈이나 연속된 띄어쓰기를 딱 1칸의 스페이스로 압축하고 앞뒤 공백을 자릅니다.
    pureText = pureText.replace(/\s+/g, ' ').trim();

    var textLength = pureText.length;
    document.getElementById('pure_char_count').innerText = textLength;

    var countEl = document.getElementById('pure_char_count');
    if (textLength >= 1000) {
    countEl.style.color = '#28a745';
    } else if (textLength >= 500) {
    countEl.style.color = '#fd7e14';
    } else {
    countEl.style.color = '#007bff';
    }
    }
    });
    </script>

    <!-- 비회원 { -->
    <?php if ($is_name) { ?>
    <div class="rb_inp_wrap">
    <ul class="guest_inp_wrap">

    <lebel class="help_text">작성자 정보를 입력해주세요. 비밀번호는 게시글 수정 시 사용됩니다.</lebel>



    • Uploaded Image
    • 154
    • 1일 전
      2026.08.11
  • 1일 전
  • rb에디터에서 주소를 넣을 때 메타정보가 출력되지 않는다면...
  • rb에디터에서 글 작성하면서 주소를 넣으면 해당 주소의 메타정보가 하단에 나타납니다.혹시 주소를 넣었는데 메타정보가 뜨지 않는다면
    먼저 아래 사항을 수정해 보세요.그누보드의 config.php 파일에서 아래 내용에 정확하게 사용하고 있는 도메인을 넣어보세요. 그러면 해결이 될 수 있습니다.define('G5_DOMAIN', '');define('G5_HTTPS_DOMAIN', '');
    • 153
    • 17일 전
      2026.07.26
  • 17일 전
  • 최신글에서 사이드뷰 기능 추가하기
  • 리빌더 최신글 파일을 보면 <?php echo $list[$i]['wr_name'] ?> 이라는 글작성자의 닉네임이 출력되는 부분이 있습니다.이 부분을 <?php echo $list[$i]['name'] ?> 이렇게 바꾸면 바로 사이드뷰를 이용할 수 있게 됩니다.
    그런데, <?php echo $list[$i]['name'] ?> 지정하니 사이드뷰가 출력이 되기는 하는데, 회원 아이콘인지 뭔지 이미지가 뜨네요.그래서 기본 설정을  <?php echo $list[$i]['wr_name'] ?> 이렇게 하신건지.
    기본 설정이 사이드뷰 출력이 되게 하고, 안되게 하려면 수정으로 가는게 더 좋은 방법이 아닐까 생각해 봅니다.
    테스트를 해 보니 아래와 같이 스타일을 바꾸면 제대로 출력이 됩니다.최신글 스킨의 스타일 내용 중에 아래와 같은 부분이 있습니다..bbs_main_wrap_thumb_left_con .bbs_main_wrap_con_writer span {display: inline-block;} .bbs_main_wrap_thumb_left_con .prof_tiny_image img {width: 30px; height:auto; border-radius: 50%; margin-right: 5px;} .bbs_main_wrap_thumb_left_con .prof_tiny_name {font-size: 12px; color:#999; line-height: 20px; margin-right: 10px;}

    위 부분을 아래와 같이 바꾸면 이쁘게 "회원 아이콘+닉네임"으로 출력이 됩니다..bbs_main_wrap_thumb_left_con .bbs_main_wrap_con_writer span {display: inline-block; vertical-align: middle;} .bbs_main_wrap_thumb_left_con .prof_tiny_name { display: inline-flex; align-items: center; vertical-align: middle; font-size: 12px; color: #999; line-height: 20px; margin-right: 10px; } .bbs_main_wrap_thumb_left_con .prof_tiny_name img, .bbs_main_wrap_thumb_left_con .prof_tiny_image img { display: inline-block !important; width: 20px !important; height: 20px !important; border-radius: 50% !important; margin-right: 4px !important; object-fit: cover; vertical-align: middle; }



    • 152
    • 27일 전
      2026.07.16
  • 27일 전
  • 게시판 채팅 ㅋㅋㅋ
  • 게시판을 이용한 챗 스타일 게시판.. 재미삼아 사용해 보세요 ~~
    첨부파일을 theme/rb.basic/skin/board/ 폴더에 넣고게시판관리에서 해당 게시판을 선택하면 됩니다.
    게시판 설정에서 리스트 정렬 필드를 시간 역순, DHTML 에디터 사용을 해제PC로만 됩니다. ㅎㅎ
    tip..글작성하고 enter 누르면 자동으로 저장이 됩니다.줄바꿈은 shift+enter 입니다.




    • 151
    • 오래 전
      2026.07.12
  • 오래 전
  • 쪽지 내용 중에 링크를 클릭하면
  • 쪽지 내용 중에 링크를 클릭하면 부모창(메인 화면)을 해당 링크로 이동시키고 쪽지 팝업창은 자동으로 닫히게 하는 방법입니다.
    리빌더에 기본 추가가 되면 너무 좋을거 같네요. ( 리빌더님 한번 봐 주세요 ㅎㅎ )
    /theme/rb.basic/skin/member/rb.member의 스킨 파일 중에 memo_view.skin.php 파일에서 아래 내용을 찾아
    <p>
    <?php echo conv_content($memo['me_memo'], 0) ?>
    </p>
    ** 기존 코드에 보안부분 보완을 하고 수정 및 방법을 3가지로 나누어 봤습니다.
    (방법1) 링크를 클릭하면 쪽지창은 닫히고 부모창에 링크가 연결이 되는 방법<p id="memo_content_a_close">
    <?php echo conv_content($memo['me_memo'], 0) ?>
    </p>
    <script>
    $(document).ready(function() {
    // 쪽지 내용 안의 모든 <a> 태그를 찾아 클릭 이벤트 적용
    $('#memo_content_a_close a').on('click', function(e) {
    var linkUrl = $(this).attr('href'); // 클릭한 링크의 URL 가져오기

    if (!linkUrl) return;

    // [보안 보완] 대소문자 구분 없이 javascript: 프로토콜 및 앵커(#) 차단 (XSS 방지)
    var trimmedUrl = linkUrl.trim().toLowerCase();
    if (trimmedUrl.startsWith('javascript:') || trimmedUrl.startsWith('#')) {
    return;
    }

    e.preventDefault(); // 정상적인 링크일 때만 기본 이동 방지

    // [보완] 부모창(opener)이 존재하고 아직 닫히지 않았는지 엄격히 체크
    if (window.opener && !window.opener.closed) {

    // 만약 외부 링크라면 부모창과의 연관 관계(opener)를 끊어서 보안 강화
    var currentHost = window.location.hostname;
    try {
    var targetUrl = new URL(linkUrl, window.location.origin);
    if (targetUrl.hostname !== currentHost) {
    window.opener.opener = null; // 타겟 페이지가 원래 부모창을 제어하지 못하도록 방어
    }
    } catch(err) {
    // URL 파싱 에러시 안전을 위해 패스
    }

    // 부모창을 주소로 이동
    window.opener.location.href = linkUrl;

    // 현재 쪽지 팝업창 즉시 닫기
    self.close();
    } else {
    // [UX 보완] 만약 메인창(부모창)이 이미 닫혀 있다면, 현재 팝업창 자리에서 링크를 열어줍니다.
    window.location.href = linkUrl;
    }
    });
    });
    </script>
    (방법2) 링크를 클릭하면 쪽지창이 닫히고 내부 주소면 부모창에 링크가 연결이 되고, 외부 링크면 새창으로 링크가 연결되는 방법
    <p id="memo_content_a_close">
    <?php echo conv_content($memo['me_memo'], 0) ?>
    </p>
    <script>
    $(document).ready(function() {
    $('#memo_content_a_close a').on('click', function(e) {
    var linkUrl = $(this).attr('href');

    if (!linkUrl) return;

    // 보안 보완: 대소문자 상관없이 javascript: 또는 #으로 시작하면 기본 동작 방지
    var trimmedUrl = linkUrl.trim().toLowerCase();
    if (trimmedUrl.startsWith('javascript:') || trimmedUrl.startsWith('#')) {
    return;
    }

    e.preventDefault(); // 정상적인 링크일 때만 이동 방지 적용

    var currentHost = window.location.hostname;

    try {
    var targetUrl = new URL(linkUrl, window.location.origin);

    // 1. 내부 링크인 경우 (기존 로직 유지 + 부모창 체크 보완)
    if (targetUrl.hostname === currentHost) {
    if (window.opener && !window.opener.closed) {
    window.opener.location.href = linkUrl;
    self.close();
    } else {
    window.location.href = linkUrl;
    }
    }
    // 2. 외부 링크인 경우 (보안 보완: rel=noopener 적용)
    else {
    window.open(linkUrl, '_blank', 'noopener,noreferrer');
    }
    } catch (error) {
    // URL 파싱 에러 시 안전하게 외부 창으로 처리
    window.open(linkUrl, '_blank', 'noopener,noreferrer');
    }
    });
    });
    </script>
    (방법3) 링크를 클릭하면 쪽지창이 자동으로 닫히고 링크는 새창에서 열리는 방법
    <p id="memo_content_a_close">
    <?php echo conv_content($memo['me_memo'], 0) ?>
    </p>
    <script>
    $(document).ready(function() {
    $('#memo_content_a_close a').on('click', function(e) {
    var linkUrl = $(this).attr('href');

    if (!linkUrl) return;

    // 보안 보완: 대소문자 상관없이 javascript: 또는 #으로 시작하면 기본 동작 방지
    var trimmedUrl = linkUrl.trim().toLowerCase();
    if (trimmedUrl.startsWith('javascript:') || trimmedUrl.startsWith('#')) {
    return;
    }

    e.preventDefault();

    // 보안 보완: 모든 새 창 열기에 noopener, noreferrer 옵션 추가하여 Tabnabbing 방어
    window.open(linkUrl, '_blank', 'noopener,noreferrer');
    });
    });
    </script>



    • 150
    • 오래 전
      2026.07.08
  • 오래 전
  • 웹호스팅에서 redis를 사용할 수 있는지 확인하는 방법
  • 그누보드에서 redis를 이용한 캐시, 세션, 큐 등을 사용할 때 자체 서버를 이용하면 설치 유무를 바로 확인할 수 있는데, 웹호스팅의 경우 redis를 사용할 수 있는지 확인을 하고 적용하는게 좋습니다.웹호스팅 환경에서 Redis 서버가 설치되고 정상 작동하는지 확인하거나, Redis 관련 PHP 모듈이 설치되어 있는지 확인하는 여러 방법 중 하나입니다.
    첨부파일을 그누보드 루터에 넣고 "도메인/check_redis.php" 로 불러오면 확인할 수 있습니다.
    확인 후에는 해당 파일 삭제해 주세요.
    • 149
    • 오래 전
      2026.07.02
  • 오래 전
  • 아이디 또는 이메일로 로그인하기
  • 아이디로 로그인이메일로도 로그인이 되게 하는 방법입니다.
    bbs/login_check.php 상단의 아래 내용에서
    $mb_id = isset($_POST['mb_id']) ? trim($_POST['mb_id']) : '';
    $mb_password = isset($_POST['mb_password']) ? trim($_POST['mb_password']) : '';
    아래와 같이 변경하면 됩니다.$mb_id = isset($_POST['mb_id']) ? trim($_POST['mb_id']) : '';
    $mb_password = isset($_POST['mb_password']) ? trim($_POST['mb_password']) : '';

    // 이메일 형식 확인
    if (filter_var($mb_id, FILTER_VALIDATE_EMAIL)) {
    // 이메일이 일치하는 회원 mb_id 가져오기
    $temp = sql_fetch("select mb_id from {$g5['member_table']} where mb_email = '$mb_id'");
    $mb_id = $temp['mb_id'];
    unset($temp); // 임시변수 삭제
    }

    위와 같이 수정하면 아이디 또는 이메일 모두 로그인이 가능하게 됩니다.
    • 148
    • 오래 전
      2026.06.15
  • 오래 전
  • Rb2.2.6.2서 누락된 Gb5.6.26 패치내용 적용 (회원정보수정시 약관변경내역 로그 쌓이는문제)
  • 그누보드 5.6.26 미만 버전의 문제점인 회원정보 수정시 약관변경내역 로그가 쌓이는 문제가그누보드 5.6.26서 수정되었는데요.이번 리빌더 2.2.6.2 에서 그누보드 5.6.26의 일부내용이 적용되지 않아 글 남깁니다.
    회원이 회원정보 수정시관리자페이지 회원로그에 사진 처럼 로그가 쌓이는데요.마케팅 부분이 업데이트 되지 않아, 마케팅 부분만 로그가 쌓이는 문제 입니다.


    bbs/register_form_update.php
    에서 아래의 내용을 // 마케팅 목적의 개인정보 수집 및 이용
    $sql_marketing_date = "";
    if ($mb_marketing_agree_default !== $mb_marketing_agree) {
    $sql_marketing_date .= " , mb_marketing_date = '".G5_TIME_YMDHIS."' ";
    $agree_items[] = "마케팅 목적의 개인정보 수집 및 이용(" . ($mb_marketing_agree == 1 ? "동의" : "철회") . ")";
    }

    아래로 바꿔주세요.이젠 회원정보 수정해도 약관 로그가 안 쌓입니다. // 마케팅 목적의 개인정보 수집 및 이용
    $sql_marketing_date = "";
    if ($mb_marketing_agree_default !== null && $mb_marketing_agree_default !== $mb_marketing_agree) {
    $sql_marketing_date .= " , mb_marketing_date = '".G5_TIME_YMDHIS."' ";
    $agree_items[] = "마케팅 목적의 개인정보 수집 및 이용(" . ($mb_marketing_agree == 1 ? "동의" : "철회") . ")";
    }

    ^___^셀프 해결 완료

    수정 귀차니즘을 발생시킬수 있어 압축 파일 동봉합니다^^
    • Uploaded Image
    • 147
    • 오래 전
      2026.06.02
  • 오래 전
  • 미친 구글의 신 기능 : 구글 트라이 온(Google Try-on)
  • 구글 트라이 온(Google Try-on)은 AI 기술을 활용해 사용자가 온라인에서 의류나 신발을 가상으로 입어볼 수 있는 구글 쇼핑(Google Shopping)의 기능입니다. [1, 2]단순히 옷을 사진 위에 겹쳐놓는 것이 아니라, AI가 옷의 소재와 사용자의 신체 구조를 분석해 실제 입은 것처럼 자연스럽게 시뮬레이션해 주는 것이 특징입니다. [1, 2]???? 주요 기능 및 특징초고속 디지털 아바타 생성: 전신사진 한 장만 업로드하면, 사용자의 체형에 맞는 디지털 아바타가 생성되어 다양한 의류를 즉시 입혀볼 수 있습니다.정교한 AI 시뮬레이션: 생성형 AI가 옷이 접히는 방식, 늘어나는 질감, 드리워지는 그림자 등을 정밀하게 계산하여 실제 옷을 입었을 때의 핏을 예측합니다.반품 감소 및 쇼핑 편의성: 온라인 쇼핑 시 사이즈나 핏에 대한 고민을 줄여주어 오프라인 피팅룸과 같은 경험을 제공합니다. ???? 사용 방법쇼핑 검색: 구글 검색(Google Search) 또는 구글 쇼핑 탭에서 의류를 검색합니다.기능 활성화: 의류 상품을 클릭한 후 'Try It On(트라이 온)' 아이콘을 누릅니다.사진 업로드: 가이드에 맞춰 본인의 전신사진(밝은 조명, 상호작용하기 좋은 자세)을 업로드합니다.결과 확인: 몇 초 후, 해당 옷을 입은 자신의 모습을 확인하고 비교할 수 있습니다. ​요약 : 구글 쇼핑탭에서 마음에 드는 옷을 골라 내 사진을 업로드하면은 가상피팅룸에서 옷을 입히는 기술
    • 146
    • 오래 전
      2026.06.01
  • 오래 전
  • 오늘 출석 안하셨어요. 스티커 코드


  • 리빌더 공홈 우측에 뜨는오늘 출석 안하셨어요 스티커 코드입니다.
    출석부 부가기능이 설치되어있어야 하며로그인 한 상태이고, 오늘 출석을 하지않았다면 표기 됩니다.
    https://rebuilder.co.kr/item/573출석부 > 부가기능 | 그누보드 리빌더웹사이트 부터 쇼핑몰, 그리고 플랫폼 까지! 가볍게 만들고 묵직하게 확장하는 그누보드 리빌더https://rebuilder.co.kr/item/573

    닫기버튼을 클릭하는 경우 쿠키적용으로12시간동안 표기되지 않습니다.
    theme/테마명/tail.php 파일의 하기 코드 위쪽에 넣어주세요.편의상 CSS는 인라인으로 포함되어있습니다.
    <?php // 오늘 날짜 및 출석 여부 확인...
    <?phpinclude_once(G5_THEME_PATH."/tail.sub.php");

    <?php
    // 오늘 날짜 및 출석 여부 확인
    $_att_today = date('Ymd');
    $_att_done = false;
    if (!empty($member['mb_id'])) {
    $chk = sql_fetch("
    SELECT at_id FROM rb_attendance
    WHERE mb_id='".sql_real_escape_string($member['mb_id'])."'
    AND REPLACE(ymd,'-','')='{$_att_today}'
    LIMIT 1
    ");
    $_att_done = !empty($chk['at_id']);
    }
    ?>

    <?php if (!$_att_done && $is_member): ?>
    <div id="rb-att-float" style="
    position: fixed;
    right: -220px;
    top: 30%;
    transform: translateY(-50%);
    z-index: 97;
    transition: right 0.4s cubic-bezier(0.23, 1, 0.32, 1);
    ">
    <button onclick="rbAttFloatClose()" style="
    position: absolute;
    top: 17px;
    left: 17px;
    border: none;
    color: #fff;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    cursor: pointer;
    font-size: 11px;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    "><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><title>close_line</title><g id="close_line" fill='none' fill-rule='evenodd'><path d='M24 0v24H0V0zM12.593 23.258l-.011.002-.071.035-.02.004-.014-.004-.071-.035c-.01-.004-.019-.001-.024.005l-.004.01-.017.428.005.02.01.013.104.074.015.004.012-.004.104-.074.012-.016.004-.017-.017-.427c-.002-.01-.009-.017-.017-.018m.265-.113-.013.002-.185.093-.01.01-.003.011.018.43.005.012.008.007.201.093c.012.004.023 0 .029-.008l.004-.014-.034-.614c-.003-.012-.01-.02-.02-.022m-.715.002a.023.023 0 0 0-.027.006l-.006.014-.034.614c0 .012.007.02.017.024l.015-.002.201-.093.01-.008.004-.011.017-.43-.003-.012-.01-.01z'/><path fill='#ffffff' d='m12 13.414 5.657 5.657a1 1 0 0 0 1.414-1.414L13.414 12l5.657-5.657a1 1 0 0 0-1.414-1.414L12 10.586 6.343 4.929A1 1 0 0 0 4.93 6.343L10.586 12l-5.657 5.657a1 1 0 1 0 1.414 1.414z'/></g></svg></button>
    <a href="<?php echo G5_URL ?>/rb/attend.php" style="
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, #6e8efb, #a777e3);
    color: #fff;
    text-decoration: none;
    padding: 16px 20px;
    border-radius: 16px 0 0 16px;
    box-shadow: -4px 4px 20px rgba(0,0,0,0.2);
    font-size: 13px;
    line-height: 1.4;
    text-align: center;
    width: 180px;
    ">
    <span style="display:block; width:36px; height:36px;">
    <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
    <rect x="3" y="4" width="18" height="17" rx="3" stroke="white" stroke-width="1.8" fill="none"/>
    <path d="M3 9h18" stroke="white" stroke-width="1.8" stroke-linecap="round"/>
    <path d="M8 2v3M16 2v3" stroke="white" stroke-width="1.8" stroke-linecap="round"/>
    <path d="M7.5 14l3 3 6-6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
    </svg>
    </span>
    <span class="font-14 font-B" style="display:block; margin-top:10px;">오늘 출석 안하셨어요!</span>
    <span style="opacity:0.85;">출석체크 하러가기</span>
    </a>
    </div>
    <script>
    (function() {
    // 쿠키 확인 후 숨김 여부 결정
    function rbAttGetCookie(name) {
    var v = document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)');
    return v ? v.pop() : '';
    }
    function rbAttSetCookie(name, value, hours) {
    var d = new Date();
    d.setTime(d.getTime() + hours * 3600 * 1000);
    document.cookie = name + '=' + value + ';expires=' + d.toUTCString() + ';path=/';
    }
    window.rbAttFloatClose = function() {
    var el = document.getElementById('rb-att-float');
    if (el) el.style.right = '-220px';
    rbAttSetCookie('rb_att_float_hide', '1', 12);
    };
    if (!rbAttGetCookie('rb_att_float_hide')) {
    setTimeout(function() {
    var el = document.getElementById('rb-att-float');
    if (el) el.style.right = '0px';
    }, 600);
    }
    })();
    </script>
    <?php endif; ?>

    • Uploaded Image
    • 145
    • 오래 전
      2026.04.29
  • 오래 전
  • GROUP 그룹접속 짧은주소 사용하기
  • 1. 루트 .htaccess에 추가 -> RewriteRule ^group/([0-9a-zA-Z_]+)$ bbs/group.php?gr_id=$1 [QSA,L]2. 관리자모드 -> 게시판관리 -> 게시판 그룹설정 -> test1 생성후 ( test1은 변경 가능합니다 )3. https://도메인/group/test1 으로 접속 ( 마지막 test1은 2번의 생성한 그룹ID를 적어주시면 됩니다 )
    • 144
    • 오래 전
      2026.04.06
  • 오래 전
  • 모바일 기기에서 사이트가 고정되지 않을 때 사용하는 css
  • 모바일 기기에서 사이트가 고정되지 않고 좌우로 덜렁덜렁 흔들리거나 밀리는 현상(가로 스크롤 발생) 방지하기
    /* =========================================   모바일 가로 스크롤(좌우 흔들림) 방지========================================= */html, body {    overflow-x: hidden !important; /* 가로로 튀어나온 모든 요소를 강제로 숨김 */    width: 100%;    margin: 0;    padding: 0;}
    • 143
    • 오래 전
      2026.03.12
  • 오래 전
  • 초성 코멘트 막기
  • 성의 없는 코멘트를 막기 위한 코드입니다.
    bbs/write_comment_update.php 에 추가해 주시면 됩니다.

    // --- 초성, 자음, 모음 단독 댓글 차단 코드 시작 ---// 공백(띄어쓰기)을 제거한 후 순수하게 자음/모음만 있는지 검사.$wr_content_clean = preg_replace("/\s+/", "", $wr_content); 
    // 정규식 설명: 시작(^)부터 끝($)까지 오직 한글 자음(ㄱ-ㅎ)과 모음(ㅏ-ㅣ)으로만 구성된 경우if (preg_match("/^([ㄱ-ㅎ|ㅏ-ㅣ]+)$/u", $wr_content_clean)) {    alert("내용을 정성껏 작성해 주세요. (초성이나 자음, 모음만으로는 등록할 수 없습니다.)");    exit;}// --- 초성, 자음, 모음 단독 댓글 차단 코드 끝 ---
    • 142
    • 오래 전
      2026.03.12
  • 오래 전
  • 게시글 복사 후 다른곳에 붙여 넣기 할때 출처 표기하기
  • 리빌더님께서 코멘트 남겨주신 팁에서 상위 레벨 이상에서는 작동하지 않는 부분만 추가되었습니다.

    tail.php 또는 하단부 공통되는 페이지에 추가

    <script>document.addEventListener('copy', function (event) {    // PHP에서 현재 로그인한 사용자의 레벨을 가져옵니다. (비회원은 1)    var userLevel = <?php echo (int)$member['mb_level']; ?>;        // 작동하지 않게 할 레벨 설정 (예: 5레벨 이상은 출처 생략)    if (userLevel >= 5) {        return;     }
        var selection = window.getSelection().toString();     if (!selection) return; // 선택된 텍스트가 없으면 종료
        var siteTitle = "<?php echo addslashes($config['cf_title']); ?>";     var siteURL = window.location.href; 
        // 복사 내용 구성    var copyText = selection + "\n\n출처: " + siteTitle + "\n" + siteURL;
        // 클립보드 설정    if (event.clipboardData) {        event.clipboardData.setData('text/plain', copyText);        event.preventDefault();     }});</script>
    • 141
    • 오래 전
      2026.03.09
  • 오래 전
  • 테마 #1 이 제대로 작동안하시는분들은
  • MySQL 버전을 먼저 확인해보세요
    DB 버전이 낮으면 지원이 안되어 테마 기본 쿼리가 설치가 안되어 오류가 발생합니다제 DB버전은  MySQL 5.5.62입니다
    최소 버전은
    MySQL 5.6
    MariaDB 10.0.1이상을 사용하셔야 합니다

    혹시라도 저처럼 너무 낮은 버전을 사용하고 계신분들은 extent폴더에 있는 rb_theme.extend.php 파일을 수정해주세요
    CREATE TABLE IF NOT EXISTS `{$theme_config_tables}` ( 부분에 있는
    `reg_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,`upd_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    `reg_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`upd_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,로

    $sql = "CREATE TABLE IF NOT EXISTS `rb_theme_carousel` ( 부분에 있는
    `reg_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,->`reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    로변경후에 새로고침해보시면 작동할겁니다
    • 140
    • 오래 전
      2026.03.09
  • 오래 전
  • 이모티콘 모음집 (개구리페페/어니언/sir이모티콘5종류)
  • /plugin/editor/rb.editor/image/sticker에 업로드 하시면 됩니다.
    첨부파일 중에, 리빌더 공식 배포 버전과 중복되는 이모티콘이 있습니다.ddonggozip 인데, 제가 올려드리는 파일은 sir-ddonggozip 으로두 폴더명 중 원하시는 것만 남기고 중복되는 폴더는 삭제해 주세요
    올려드리는 모든 이미지는 저작권 문제 없는 오픈 이미지들 입니다.혹 제가 잘 모르고 올리는 거라면 알려주시면 감사하겠습니다. 바로 즉각 조치취하겠습니다.





    • Uploaded Image
    • 139
    • 오래 전
      2026.03.09
  • 오래 전
  • 험해님의 [이메일 인증 로그인 플러그인] 편의사항 수정
  • https://rebuilder.co.kr/hub/1459이메일 인증 로그인 플러그인 > 콘텐츠 허브 | 그누보드 리빌더웹사이트 부터 쇼핑몰, 그리고 플랫폼 까지! 가볍게 만들고 묵직하게 확장하는 그누보드 리빌더https://rebuilder.co.kr/hub/1459

    1. 로그인시 브라우저 타이틀에 오류 안내 표기 > 결과안내 표기로...process.php에서 13라인을 아래처럼 false 인자를 추가.alert_close('인증이 완료되었습니다. 원래 있던 브라우저 창에서 로그인이 진행됩니다.', G5_URL, false);
    2. 이메인 로그인 인증후, 내 홈페이지가 새롭게 추가로 열리는 문제가 있는데이걸 해결하는 방법 입니다.이메일 로그인은 로그인을 시도한 탭에서,로그인 인증완료시 해당 탭에 로그인 되는 방식이며! 이메일 링크를 클릭하여 로그인 인증시 추가로 실행되는내 홈페이지 탭은 아무 쓸데도 없습니다. 
    verify.php 13라인을 아래처럼 변경해 주세요.alert_close('인증이 완료되었습니다. 원래 있던 브라우저 창에서 로그인이 진행됩니다.', G5_URL, false);




    • Uploaded Image
    • 138
    • 오래 전
      2026.03.06
  • 오래 전
  • 전화번호 가운데 아스타(*) 처리
  • 안녕하세요...미니님a입니다.
    휴대폰 번호 노출 시 필요에 의해 가운데는 아스타 처리 해야 할 경우가 생겨 함수를 공유합니다.extend 폴더 내 common.extend.php 파일이 있다면 거기에 추가 없다면 아무 파일명 만드셔도 무방합니다.
    // 전화번호 가운데만 **** 표시function mask_middle_phone($phone) {    // 하이픈(-) 기준, 또는 자릿수대로 분할    if (strpos($phone, '-') !== false) {        $parts = explode('-', $phone);        if (count($parts) === 3) {            $parts[1] = '****';            return implode('-', $parts);        }    }    // 하이픈이 없고 10~11자리 숫자인 경우 (ex: 01012345678)    $digits = preg_replace('/\D/', '', $phone);    if (preg_match('/^(01[016789])(\d{3,4})(\d{4})$/', $digits, $matches)) {        return $matches[1] . '-' . '****' . '-' . $matches[3];    }    // fallback    return htmlspecialchars($phone, ENT_QUOTES);}

    로 적용 하시고, 사용은 echo ​mask_middle_phone(전번변수); 형태로 사용하면 됩니다.
    고맙습니다.
    • 137
    • 오래 전
      2026.02.23
  • 오래 전
  • [팁이라고 하기엔 뭣하지만...] 최신글/최신글 탭 제목 글자수 제한 해제 (최대한 안잘리게)
  • /루트/theme/rb.basic/skin/latest/스킨폴더//루트/theme/rb.basic/skin/latest_tabs/스킨폴더/
    각 최신글 스킨 style.css 에서아래 부분을 찾아max-width: 70%;
    70% 값을max-width: 100%;으로 변경​.
    보통 리빌더 최신게시글은 70%로 설정되어 있어, 다른 CSS랑 겹치는 부분없이 max-width: 70%; 하나만 있을거에요

    • Uploaded Image
    • 136
    • 오래 전
      2026.02.10
  • 오래 전
  • php8.2.30 관리자 페이지 내 회원 수정 페이지 구문 오류 수정
  • 안녕하세요...미니님a입니다.
    php8.4 버전대는 알 수 없으나 제가 사용하고 있는 php 8.2.30 버전대에서 다음과 같은 오류가 발생합니다.테스트 환경

    즉 최신 버전에서 테스트 하였음을 참고하시길 바랍니다.
    관리자 페이지 > 회원정보 > 아무나 수정 버튼 누르면 아래 처럼 구문 오류가 발생합니다.



    adm/member_form.php 파일을 열어 151번 / 152 / 155 / 156 수정 하도록 하겠습니다.

    151/152번 라인 코드는 다음과 같습니다.
    $mb_marketing_agree_yes = $mb['mb_marketing_agree'] ? 'checked="checked"' : '';
    $mb_marketing_agree_no = !$mb['mb_marketing_agree'] ? 'checked="checked"' : '';
    이 코드를 아래로 수정 해주세요
    $mb_marketing_agree_yes = (!empty($mb['mb_marketing_agree'])) ? 'checked="checked"' : '';
    $mb_marketing_agree_no = (empty($mb['mb_marketing_agree'])) ? 'checked="checked"' : '';

    그리고 155번/156번 라인
    $mb_thirdparty_agree_yes = $mb['mb_thirdparty_agree'] ? 'checked="checked"' : '';
    $mb_thirdparty_agree_no = !$mb['mb_thirdparty_agree'] ? 'checked="checked"' : '';

    $mb_thirdparty_agree_yes = (!empty($mb['mb_thirdparty_agree'])) ? 'checked="checked"' : '';
    $mb_thirdparty_agree_no = (empty($mb['mb_thirdparty_agree'])) ? 'checked="checked"' : '';

    고맙습니다.
    단. 해당 내용을 팁으로 작성하지만, 실제 리빌더 코드 수정이 아닌 코어 수정이므로, 참고 하시길 바랍니다.(공식 sir 에 제보할 예정입니다.)
    • Uploaded Image

검색

게시물 검색