스마트에디터 view페이지 연동 문의
본문
스마트에디터의 view 부분 페이지에 wr_1을 노출하고자 합니다.
$html = 0 으로 설정시 html 태그도 나오며, 1 또는 2로 설정시 html태그는 purify 되어 나옵니다.
즉 wr_1에 "<p>wr1</p><p>wr1</p>" 가 저장되어 있을 시
$html = 0 일 경우 "<p>wr1</p><p>wr1</p>" 나옴
$html = 1 일 경우 "wr1wr1" 나옴
html이 적용된 결과값이 "wr1 줄바꿈 wr1" 형태로 어떻게 하면 나오게 될까요?
view.php
<?php $view['wr_1'] = conv_content($view['wr_1'], $html); ?>
view.skin.php
<?php echo get_view_thumbnail($view['wr_1]); ?>
답변 2
먼저
/bbs/view.php 에서
conv_content를 어떻게 사용했는지를 보시면
$view['content'] = conv_content($view['wr_content'], $html, $board['as_purifier'] ? false : true);
로 되어있습니다.
commonl.lib.php 파일에 있는 conv_content에 주석을 좀 달아보겠습니다.
// 내용을 변환하는 함수
// $content : 변환할 원본 내용
// $html : HTML을 허용할지 여부 (0=텍스트, 1=HTML, 2=HTML + 자동 줄바꿈)
// $filter : HTML Purifier 필터 적용 여부 (기본 true)
function conv_content($content, $html, $filter=true)
{
// 환경설정($config)과 게시판 정보($board)를 전역에서 가져옴
// conv_content는 게시판 출력 시 자주 사용되기 때문에 글로벌 변수를 공유함
global $config, $board;
// ---------------------------------------------------------------------
// ? 1) HTML 모드일 때 (HTML 태그를 그대로 출력)
// ---------------------------------------------------------------------
if ($html)
{
$source = array(); // 치환할 패턴 목록
$target = array(); // 치환 후 결과 목록
// "//"를 제거하는 이유:
// 일부 글에서 "//"가 있는 경우 주석처럼 취급되거나 깨질 수 있어 제거함
$source[] = "//";
$target[] = "";
// html == 2 → 자동 줄바꿈 기능
// 사용자가 엔터(\n)를 치면 <br> 태그로 바꿔 화면에서 줄바꿈이 보이도록 처리
if ($html == 2) {
$source[] = "/\n/";
$target[] = "<br/>";
}
// ---------------------------------------------------------------------
// ? 1-1) <table> 태그 보정
// HTML 작성 시 <table>은 있는데 </table>을 안 닫는 실수가 자주 발생
// 브라우저가 테이블을 제대로 표시하지 못하기 때문에
// <table> 개수와 </table> 개수를 비교해서 부족한 만큼 </table>를 자동으로 추가해줌
// ---------------------------------------------------------------------
$table_begin_count = substr_count(strtolower($content), "<table");
$table_end_count = substr_count(strtolower($content), "</table");
// 닫는 태그 부족 시 자동 보정
for ($i=$table_end_count; $i<$table_begin_count; $i++)
{
$content .= "</table>";
}
// 위에서 만든 $source → $target 치환 패턴으로 내용 변환
$content = preg_replace($source, $target, $content);
// HTML 필터링: 스크립트 공격(XSS) 방지를 위해 HTML Purifier 사용
// $filter 값이 true일 때만 적용
if($filter)
$content = html_purifier($content);
}
// ---------------------------------------------------------------------
// ? 2) 텍스트 모드일 때 (HTML 태그는 전부 제거하고 순수 텍스트만 출력)
// ---------------------------------------------------------------------
else
{
// HTML 엔티티 변환
// 예: & → & / → ' ' 등
// 텍스트 모드에서도 이런 특수문자들이 깨지지 않도록 처리
$content = html_symbol($content);
// ---------------------------------------------------------------------
// ? 공백 처리
// HTML에서 공백 두 개는 하나로 보이기 때문에 로 변환해줘야 시각적으로 유지됨
// ---------------------------------------------------------------------
// 연속 공백 두 개는 + 공백으로 치환
$content = str_replace(" ", " ", $content);
// 줄바꿈 후 공백도 유지하기 위한 처리
$content = str_replace("\n ", "\n ", $content);
// get_text($content, 1)
// HTML 태그를 모두 제거하고 특수문자도 깔끔히 정리하는 함수
// 두 번째 파라미터 1은 'htmlspecialchars 처리(true)' 옵션
$content = get_text($content, 1);
// ---------------------------------------------------------------------
// ? URL 자동 링크 변환
// 예: "http://test.com" → <a href="http://test.com">http://test.com</a>
// 텍스트 안에 URL이 있을 경우 자동으로 클릭 가능한 링크로 바꿔줌
// ---------------------------------------------------------------------
$content = url_auto_link($content);
}
// 변환된 내용을 반환
return $content;
}
같은 패턴으로
wr_1도 적용하고 싶으시면
$view['content'] = conv_content($view['wr_content'], $html, $board['as_purifier'] ? false : true);
$view['wr_1'] = conv_content($view['wr_1'], $html, $board['as_purifier'] ? false : true);
로 해보세요
참고로 view.php 파일에 있는 내용입니다.
다른 파일에 적용할때는 그에 맞는 커스텀이 필요할겁니다.
!-->!-->!-->css 문제였네요. 해당 영역에 display: flex 적용하면 줄바꿈 처리가 안되었습니다. ㅠㅠ
답변을 작성하시기 전에 로그인 해주세요.