네이버 스마트 에디터가 링크연결시 자꾸 self로 연결되어서 짜증이 많이 났는데 

아무리 뒤져봐도 적당한 설명이 없더군요... 

심지어 4년전, 심지어 지금은 있지도 않은 코드에 대해서 설명하는 링크도 있었구요.... 

(제가 초보여서 잘 모를수도 있습니다.) 

요즘 자바스크립트 공부하면서 만들어봤습니다. 다양한 사이트에서 정보를 얻었습니다. 

이곳에도 질문답변에서 답변에 자바스크립트를 이용할 수 있다는 힌트가 있었습니다. 

방법은 쉬운데....게시판 각 스킨마다 적용을 해주셔야 합니다. 

그래도 중요한 원본소스는 건드릴 필요가 없으니 저처럼 초보분들에게 유용할 듯 싶습니다. 







게시판 view 페이지에 

section id="bo_v_atc" 부분을 찾습니다. 

그 section 맨 마지막에 (혹은 중간 아무데나... 정확히 말하면 주석으로 본문시작하고 나서 끝바로 위) 

다음을 추가합니다. 


<script> 
jQuery("#bo_v_atc a").each(function () 
{  
if (jQuery(this).attr("target") == "_self") 
return; 
else if (jQuery(this).attr("target") !== "_self") 
{jQuery(this).attr("target", "_blank");}  
}) 
</script> 




게시판 내용부분에 대해서 self로 직접 적용한 경우에는 그냥 냅두고 

적용하지 않고 그대로 두면 저절로 blank로 변경시켜버리는 소스입니다. 

네이버스마트에디터2 는 그냥 복사해서 링크를 붙여넣으면 self도 blank도 표시가 되어있지 않은 점을 이용햇습니다. 

if문을 이리저리 바꾸면 다양한 경우에 응용할 수 있습니다. 

저같은 경우는 딱히 다른 경우의 수가 필요없어서 저렇게 2가지 조건만 넣었습니다. 


혹시나 시험해보시고 싶으신 분은 홈페이지 www.happyshopping.co.kr 게시판 클릭해보시면 아실거 같아요~ 



id="bo_v_atc"에다가 하는 이유는 그냥 셀렉터를 a라고 해버리면... 

다른 메뉴들도 전부 새창으로 떠버리는 문제가 발생했기 때문입니다. 

(이건 직접 해보셔야 확실히 아실듯 ^^) 

음성 캡챠는 모바일로 웹사이트를 접속하는 경우에는 mp3 파일을 모두 다운로드 받아야 시작하거나 일부 스마트폰에선 먹통이 되는 현상이 있는것 같습니다. 

그래서 기존 문자 캡챠는 그대로 두고 음성 캡챠만 없애는 방법을 찾다가 혹시 필요하신 분이 있을 것 같아서 작성합니다.


아직까진 아무런 문제는 없는 것 같은데요, 혹시라도 문제가 있으면 알려주세요. 

G5가 설치된 폴더에서 

/plugin/kcapcha 폴더 내부에 kcaptcha.lib.php 파일을 찾습니다. 


이 파일의 아래 부분을 주석 처리하면 됩니다. 

243줄  //  if (G5_IS_MOBILE) $html .= '<audio src="#" id="captcha_audio" controls></audio>'; //음성 캡챠 삭제를 위해서 주석처리 

246줄 //    if (!G5_IS_MOBILE) $html .= "\n".'<button type="button" id="captcha_mp3"><span></span>숫자음성듣기</button>'; //음성 캡챠 삭제를 위해서 주석처리 

그리고 캡챠 문자는 6자리인데요. 


모바일에서 보면 이것도 번거롭네요. 


그래서 4자리로 줄이려면 아래 파일을 수정하시면 됩니다. 

/plugin/kcapcha/kcaptcha_config.php 파일의 아래 내용을 수정 

# CAPTCHA string length 
//$length = mt_rand(5,6); # random 5 or 6 
$length = 4; // 기존 6에서 4로 변경 

[참고사항] 

위의 사항을 적용한 뒤, 관리자 페이지에서 환경설정을 변경하면 음성캡챠를 선택하지 않았다고 나옵니다. 
따라서 아래와 같이 관리자 페이지의 음성캡챠 부분을 주석처리 해주셔야 합니다. 

G5/adm/config_form.php 파일을 열어서 

27줄 ~ 44줄 주석처리 
460줄~ 474줄 까지 주석 처리하면 됩니다. 

에디터에서 cf_captcha_mp3를 검색어로 찾으면 쉽게 해당 부분을 찾아가실 수 있습니다. 

캡챠 기능이 강제 사용옵션으로 되어 있어서 차라리 에디터처럼 사용하지 않은 상태가 기본값이고


필요한 분들만 옵션을 선택해서 사용하시는 게 좋을 것 같습니다.

http://www.happyjung.com/lecture/1709

 

회원을 대신해서 글을 작성해줘야하는 경우가 있습니다. 
이때 해당 게시글을 요청한 회원이 직접 관리하도록 하려면, phpMyAdmin 등의 도움을 받아야만 가능하죠? 
이것을 게시판에서 직접 제어하는 방법입니다. 


2017-03-12  update_writer.php : 변경저장 할때 이름 --> 닉네임 저장되도록 수정  
                $row['mb_name'] 를 $orw['mb_nick'] 으로 변경 
2017-03-12  update_writer.php : 게시판 설정에서 이름 / 닉네임 확인후 업데이트 되도록 변경 
2017-03-26  update_writer.php : 로직 개선 


1. 그누보드5 / skin / board / 스킨 / view.skin.php  의 적절한 위치에 아래 코드를 추가합니다. 
        <?php if($is_admin == 'super') { ?> 
        <div class="tbl_frm01 tbl_wrap"> 
            <table> 
                <tbody> 
                <form name="update_id" action="<?php echo $board_skin_url; ?>/update_writer.php" method="post" style="padding:0; margin:0;"> 
                <input type="hidden" name="bo_table" value="<?php echo $g5['write_prefix'] . $bo_table; ?>"> 
                <input type="hidden" name="REQUEST_URI" value="<?php echo $_SERVER['REQUEST_URI']; ?>"> 
                <input type="hidden" name="wr_id" value="<?php echo $wr_id; ?>"> 
                <tr> 
                    <th scope="row">아이디 변경</th> 
                    <td><input type="text" name="mb_id" style="width:120px;" class="frm_input" value="<?php echo $view['mb_id']; ?>"></td> 
                    <th style="text-align:center;"><div class="btn_list"><input type="submit" value=" 저장 " class="btn_list"></div></th> 
                </tr> 
                </form> 
                </tbody> 
            </table> 
        </div> 
        <?php } ?> 


2. 그누보드5 / skin / board / 스킨 / _common.php  파일 생성 
<?php 
// 그누보드5 / skin / board / 스킨 / _common.php 일때 
include_once('../../../common.php'); 
// 그누보드5 / theme / 테마 / skin / board / 스킨 / _common.php 일때 
//include_once('../../../../../common.php'); 
?> 


3. 그누보드5 / skin / board / 스킨 / update_writer.php  파일생성 
<?php 
include_once "_common.php"; 

if($is_admin=='super') { 
    $g5_write = explode(G5_TABLE_PREFIX."write_",$_POST['bo_table']); 
    
    $sql = " select bo_use_name from ".$g5['board_table']." where bo_table = '".$g5_write[1]."' "; 
    $result_usename = sql_query($sql); 
    $result_usename2 = sql_fetch_array($result_usename); 
    $bo_usename = $result_usename2['bo_use_name']; 
    
    $sql = " select mb_name, mb_nick, mb_email, mb_homepage from ".$g5['member_table']." where mb_id = '".$_POST['mb_id']."' "; 
    $row = sql_fetch($sql); 
    
    if ($bo_use_name=="1") { $row_name = $row['mb_name']; } 
    else { $row_name = $row['mb_nick']; } 
    
    $sql = " update ".$_POST['bo_table']." set wr_name = '". $row_name ."', wr_email = '". $row['mb_email'] ."', wr_homepage = '". $row['mb_homepage'] ."', mb_id = '". $_POST['mb_id'] ."' where wr_id = '". $_POST['wr_id'] ."' "; 
    sql_query($sql); 
} 
?> 
<script> 
  location.href="<?php echo $_POST[REQUEST_URI]?>" ; 
</script> 

1. 바탕화면에 즐겨찾기 추가할때 생기는 바탕화면 아이콘 이미지 
<link rel="apple-touch-icon" href="이미지경로" /> 

2. 전화걸기 
<a href="tel:0000-0000">조안전화번호</a> 

3. 문자보내기 
<a href="sms:*** 개인정보보호를 위한 휴대폰번호 노출방지 ***">조안문자보내기</a>

최대한 그누보드 코드를 이해하면서 다른부분은 수정 안하면서 구현하려고 해봤습니다. 아직 미숙한지라 틀린부분이나 버그 있으면 알려주시면 감사하겠습니다. 

특정 게시판(보통 공지게시판이겠지요)에 공지로 글을 작성하면 다른 모든 게시판에서도 공지가 보이도록 하는 코드입니다. bbs폴더에 list.php에서 공지처리부분 바로 위에 아래 코드를 복사붙여넣기 해주시기만 하면 됩니다. 

아래코드 삽입시 예를들어 notice게시판에 공지1,2를 올리고 자유게시판에 공지3,4를 올리면 자유게시판으로 갔을때 공지1,2가 제일 위에 보이고 그 아래로 공지3,4가 보이고 그 아래로 일반글이 보이게 됩니다. 

01// 공지 처리(추가)
02$board_notice_name='notice'// 전체 공지를 줄 게시판명 (공지게시판을 따로 두어야함..)
03$board_notice=sql_fetch(" select * from `g5_board` where `bo_table`='$board_notice_name' ");
04if (!$sca && !$stx && $board['bo_table']!=$board_notice_name) {
05    $arr_notice explode(',', trim($board_notice['bo_notice']));
06    $from_notice_idx = ($page - 1) * $page_rows;
07    if($from_notice_idx < 0)
08        $from_notice_idx = 0;
09    $board_notice_count count($arr_notice);
10    $total_count+=$board_notice_count;
11 
12    for ($k=0; $k<$board_notice_count$k++) {
13        if (trim($arr_notice[$k]) == ''continue;
14 
15        $row = sql_fetch(" select * from `g5_write_".$board_notice_name."` where wr_id = '{$arr_notice[$k]}' ");
16 
17        if (!$row['wr_id']) continue;
18 
19        $notice_array[] = 0;
20 
21        if($k $from_notice_idxcontinue;
22 
23        $list[$i] = get_list($row$board_notice$board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']);
24        $list[$i]['is_notice'] = true;
25 
26        $i++;
27        $notice_count++;
28 
29        if($notice_count >= $list_page_rows)
30            break;
31    }
32}
33 
34 
35// 공지 처리(원본)
36if (!$sca && !$stx) {
37......(후략)


그누 기본이 아닌 추가 시스템에서 간혹 numeric들어간 부분때문에 페이지가 다운 되는 현상이 지속적으로 발생 하더군요. 

그래서 저는 
./js/wrest.js 약 145줄부터 시작하는 함수를 다음과 같이 변경 하여 사용중입니다. 


01// 숫자인지검사
02// 배부른꿀꿀이님 추가 (http://dasir.com) 2003-06-24
03function wrestNumeric(fld)
04{
05    if (!wrestTrim(fld)) return;
06 
07    if(isNaN(fld.value) == true) {
08 
09         wrestMsg = wrestItemname(fld) + " : 숫자가 아닙니다.\n";
10         wrestFld = fld;
11    }
12    /*
13    if (fld.value.length > 0) {
14         
15        for (i = 0; i < fld.value.length; i++) {
16            if (fld.value.charAt(i) < 0 || fld.value.charAt(i) > 9) {
17                wrestMsg = wrestItemname(fld) + " : 숫자가 아닙니다.\n";
18                wrestFld = fld;
19            }
20        }
21    }
22    */
23}


https://soundcloud.com 




'Embed'로 들어가면 소스를 복사할 수 있습니다. 




원 소스의 너비가 100%, 높이가 450px로 되어 있습니다. 
적당한 크기로 수정해서 사용하십시오. 





'plugin/htmlpurifier/safeiframe.txt' 파일을 열어 마지막 줄에 

'w.soundcloud.com/' 삽입 

1 # iframe 허용 도메인을 한줄에 하나씩만 적으세요.
2 # 도메인 뒤에 가급적 / 를 붙여주세요.
3 www.youtube(?:-nocookie)?.com/
4 serviceapi.rmcnmv.naver.com/
5 videofarm.daum.net/
6 player.vimeo.com/
7 w.soundcloud.com/




그누보드5 lib/thumbnail.lib.php 파일의 thumbnail 함수를 아래 코드로 수정합니다. 

001function thumbnail($filename$source_path$target_path$thumb_width$thumb_height$is_create$is_crop=false, $crop_mode='center'$is_sharpen=false, $um_value='80/0.5/3')
002{
003    global $g5;
004 
005    if(!$thumb_width && !$thumb_height)
006        return;
007 
008    $source_file "$source_path/$filename";
009 
010    if(!is_file($source_file)) // 원본 파일이 없다면
011        return;
012 
013    $size = @getimagesize($source_file);
014    if($size[2] < 1 || $size[2] > 3) // gif, jpg, png 에 대해서만 적용
015        return;
016 
017    if (!is_dir($target_path)) {
018        @mkdir($target_path, G5_DIR_PERMISSION);
019        @chmod($target_path, G5_DIR_PERMISSION);
020    }
021 
022    // 디렉토리가 존재하지 않거나 쓰기 권한이 없으면 썸네일 생성하지 않음
023    if(!(is_dir($target_path) && is_writable($target_path)))
024        return '';
025 
026    // Animated GIF는 썸네일 생성하지 않음
027    if($size[2] == 1) {
028        if(is_animated_gif($source_file))
029            return basename($source_file);
030    }
031 
032    $ext array(1 => 'gif', 2 => 'jpg', 3 => 'png');
033 
034    $thumb_filename = preg_replace("/\.[^\.]+$/i"""$filename); // 확장자제거
035    $thumb_file "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$ext[$size[2]];
036 
037    $thumb_time = @filemtime($thumb_file);
038    $source_time = @filemtime($source_file);
039 
040    if (file_exists($thumb_file)) {
041        if ($is_create == false && $source_time $thumb_time) {
042            return basename($thumb_file);
043        }
044    }
045 
046    // 원본파일의 GD 이미지 생성
047    $src = null;
048    $degree = 0;
049 
050    if ($size[2] == 1) {
051        $src = imagecreatefromgif($source_file);
052    else if ($size[2] == 2) {
053        $src = imagecreatefromjpeg($source_file);
054 
055        if(function_exists('exif_read_data')) {
056            // exif 정보를 기준으로 회전각도 구함
057            $exif = @exif_read_data($source_file);
058            if(!empty($exif['Orientation'])) {
059                switch($exif['Orientation']) {
060                    case 8:
061                        $degree = 90;
062                        break;
063                    case 3:
064                        $degree = 180;
065                        break;
066                    case 6:
067                        $degree = -90;
068                        break;
069                }
070 
071                // 회전각도 있으면 이미지 회전
072                if($degree) {
073                    $src = imagerotate($src$degree, 0);
074 
075                    // 세로사진의 경우 가로, 세로 값 바꿈
076                    if($degree == 90 || $degree == -90) {
077                        $tmp $size;
078                        $size[0] = $tmp[1];
079                        $size[1] = $tmp[0];
080                    }
081                }
082            }
083        }
084    else if ($size[2] == 3) {
085        $src = imagecreatefrompng($source_file);
086        imagealphablending($src, true);
087    else {
088        return;
089    }
090 
091    if(!$src)
092        return;
093 
094    $is_large = true;
095    // width, height 설정
096    if($thumb_width) {
097        if(!$thumb_height) {
098            $thumb_height round(($thumb_width $size[1]) / $size[0]);
099        else {
100            if($size[0] < $thumb_width || $size[1] < $thumb_height)
101                $is_large = false;
102        }
103    else {
104        if($thumb_height) {
105            $thumb_width round(($thumb_height $size[0]) / $size[1]);
106        }
107    }
108 
109    $dst_x = 0;
110    $dst_y = 0;
111    $src_x = 0;
112    $src_y = 0;
113    $dst_w $thumb_width;
114    $dst_h $thumb_height;
115    $src_w $size[0];
116    $src_h $size[1];
117 
118    $ratio $dst_h $dst_w;
119 
120    if($is_large) {
121        // 크롭처리
122        if($is_crop) {
123            switch($crop_mode)
124            {
125                case 'center':
126                    if($size[1] / $size[0] >= $ratio) {
127                        $src_h round($src_w $ratio);
128                        $src_y round(($size[1] - $src_h) / 2);
129                    else {
130                        $src_w round($size[1] / $ratio);
131                        $src_x round(($size[0] - $src_w) / 2);
132                    }
133                    break;
134                default:
135                    if($size[1] / $size[0] >= $ratio) {
136                        $src_h round($src_w $ratio);
137                    else {
138                        $src_w round($size[1] / $ratio);
139                    }
140                    break;
141            }
142        }
143 
144        $dst = imagecreatetruecolor($dst_w$dst_h);
145 
146        if($size[2] == 3) {
147            imagealphablending($dst, false);
148            imagesavealpha($dst, true);
149        }
150    else {
151        $dst = imagecreatetruecolor($dst_w$dst_h);
152 
153        if($src_w $dst_w) {
154            if($src_h >= $dst_h) {
155                $dst_x round(($dst_w $src_w) / 2);
156                $src_h $dst_h;
157            else {
158                $dst_x round(($dst_w $src_w) / 2);
159                $dst_y round(($dst_h $src_h) / 2);
160                $dst_w $src_w;
161                $dst_h $src_h;
162            }
163        else {
164            if($src_h $dst_h) {
165                $dst_y round(($dst_h $src_h) / 2);
166                $dst_h $src_h;
167                $src_w $dst_w;
168            }
169        }
170 
171        if($size[2] == 3) {
172            $bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127);
173            imagefill($dst, 0, 0, $bgcolor);
174            imagealphablending($dst, false);
175            imagesavealpha($dst, true);
176        else {
177            $bgcolor = imagecolorallocate($dst, 255, 255, 255); // 배경색
178            imagefill($dst, 0, 0, $bgcolor);
179        }
180    }
181 
182    imagecopyresampled($dst$src$dst_x$dst_y$src_x$src_y$dst_w$dst_h$src_w$src_h);
183 
184    // sharpen 적용
185    if($is_sharpen && $is_large) {
186        $val explode('/'$um_value);
187        UnsharpMask($dst$val[0], $val[1], $val[2]);
188    }
189 
190    if($size[2] == 1) {
191        imagegif($dst$thumb_file);
192    else if($size[2] == 3) {
193        if(!defined('G5_THUMB_PNG_COMPRESS'))
194            $png_compress = 5;
195        else
196            $png_compress = G5_THUMB_PNG_COMPRESS;
197 
198        imagepng($dst$thumb_file$png_compress);
199    else {
200        if(!defined('G5_THUMB_JPG_QUALITY'))
201            $jpg_quality = 90;
202        else
203            $jpg_quality = G5_THUMB_JPG_QUALITY;
204 
205        imagejpeg($dst$thumb_file$jpg_quality);
206    }
207 
208    chmod($thumb_file, G5_FILE_PERMISSION); // 추후 삭제를 위하여 파일모드 변경
209 
210    imagedestroy($src);
211    imagedestroy($dst);
212 
213    return basename($thumb_file);
214}



충분한 테스트를 거치지 못해 오류가 있을 수 있습니다. 오류가 있을 경우 댓글로 남겨주시기 바랍니다.

+ Recent posts