Xpressengine (XE)

오픈소스 CMS. 현재는 네이버 산하 오픈소스 프로젝트로 개발이 진행되고 있다.

http://www.xpressengine.com/

세션 정보를 파일이 아닌 DB를 이용하는 것에 대한 논의 http://xe.xpressengine.net/?document_srl=16803825

세션 테이블 때문에 문제라는 많은 글들

세션 테이블 구글검색

접속자도 별로 없는데

세션 테이블의 레코드 수가 백만개!!.

자동으로 정리 하도록 할 수 없나.

XE 템플릿 스크립트

XE에서만 사용되는 XE 전용의 웹 프로그래밍 언어라고 생각하면 된다. 이 스크립트는 layout.html(이하 '템플릿 파일'이라고 칭함) 파일 안에서 사용된다.

모든 언어에는 그 들만의 규칙이 있으므로, 그 규칙에 맞게 작성해야만 정상적인 작동을 한다.

XE 템플릿 스크립트에서 PHP문의 사용

XE 템플릿 스크립트는 PHP와 유사하지만, 분명 PHP는 아니다. 그렇기때문에 템플릿 스크립트에서는 PHP를 대충 사용할 수 있는 방법을 제공하고 있다. 템플릿 파일내에서 {@ 와 } 사이에 나오는 문장은 PHP문으로 해석한다.

  {@$test = 365}

이 문장은 '변수 $test 에 365 라는 값을 입력하라' 라는 의미이다.

{@
  $test = 200;
  $managed = $test + 165
}

이 문장은 '변수 $test 에 200 이라는 값을 입력하고, $test에 입력된 값(200) 과 165 을 더해서 변수 $managed 에 입력하라' 라는 의미이다.

첫번째 예제와 두번 째 예제의 사이에는 커다란 차이점이 있다. 첫번째 예제는 PHP에서 단 한문장으로 끝날 수 있는 부사람이지만 두번째 예제는 PHP에서 세미콜론(;)를 사용하여 두 개의 문장으로 작성되야 한다.

이렇게 2 문장 이상일 경우에는 PHP와 달리 두번째 예제와 같이 여러 줄에 걸쳐서 입력해야 한다. 아래와 같은 코드는 템플릿 스크립트에서 정상적으로 작동되지 않다.

  {@$test = 200; $managed = $test + 165} (X)

XE 템플릿 스크립트에서 변수의 사용

템플릿 스크립트에서는 별도의 변수 선언문이 없다. 그렇기때문에 변수를 사용하기 위해서는 위에서 본 PHP문 사용 방법을 통해 변수를 선언해야 한다.

 {@$var = 0}

'변수 $var 를 선언하고 초기값으로 0을 입력하라' 라는 의미이다.

다음과 같이 사용할 수도 있다.

{@
  $var1 = 10;
  $var2 = 20;
  $var3 = 30;
  $var4 = $var1 + $var2 + $var3
}

변수값을 출력을 하기 위해서는 { 와 } 사이에 변수를 입력해주면 된다.

{$var4}

이렇게하면 '변수 $var4의 값을 출력하라' 라는 의미가 된다. 여기서는 60 이라는 값이 출력된다.

IF 조건문의 사용

if문 또한 C 언어나 PHP 등과 유사한 모습으로 사용된다. 아래는 기본 코드이다.

<!--@if(조건식)-->

조건이 만족되면 이 부분을 실행한다.

<!--@elseif(조건식)-->

첫번 째 조건이 만족되지 않고 elseif 의 조건식을 검토하여 만족될 경우 이 곳이 실행된다.

<!--@else-->

모든 조건이 만족되지 않을 경우에는 이 곳이 실행된다.

<!--@end-->

end 는 if문의 끝을 의미한다. 그러면 if문의 예제를 하나 들어보겠다.

{@
  $var = 1;
  $webhosting = 2;
  $community = 3
}
<!--@if($var == $webhosting)-->
<p>웹호스팅에 오신 것을 환영한다</p>
<!--@elseif($var == $community)-->
<p>커뮤니티에 오신 것을 환영한다</p>
<!--@else-->
<p>매니지드에 오신 것을 환영한다.</p>
<!--@end-->

이렇게 한다면 결국은 if의 조건식도, elseif의 조건식도 만족하지 못하므로 else 가 실행이 되서

<p>매니지드에 오신 것을 환영한다</p>

라는 문장이 출력될 것 이다.

foreach 반복문의 사용

템플릿 스크립트의 foreach도 PHP의 foreach와 동일한 동작을 한다. 기본 코드는 아래와 같다.

<!--@foreach($배열변수 as $key => $value)-->
반복 실행될 문장
<!--@end-->

다음과 같은 배열이 있다고 가정해 보겠다.

{@$a = array("one"=>1, "two"=>2, "three"=>3, "etc"=>365)}

그러면 다음과 같은 코드를 이용하여 키와 값을 출력할 수 있다.

<!--@foreach($a as $key => $value)-->
<p>$a[{$key}]의 값은 {$value} 이다</p>
<!--@end-->

출력결과는 아래와 같다.

$a[one]의 값은 1 이다.
$a[two]의 값은 2 이다.
$a[three]의 값은 3 이다.
$a[etc]의 값은 365 이다.

파일의 삽입

하나의 템플릿 파일을 여러 개로 나누어서 분리한 후 include 를 이용하여 하나로 합칠 수 있다. 기본 코드는 아래와 같다.

 <!--#include('파일경로')-->

주의할 것은 include 문을 이용하여 PHP 파일을 불러와도 PHP로 해석되지 않다. 템플릿 스크립트의 include 는 분할된 XE템플릿 파일을 include 할 뿐 이다.

CSS/자바스크립트와의 연결

CSS나 자바스크립트를 사용하기 위해서는 아래 코드를 사용한다.

 <!--%import(파일경로)-->

이렇게 import 된 파일은 선언된 위치에 상관없이 HTML의 <head> 안에 자동으로 삽입된다.

XML JS Filter의 적용 방법도 CSS/자바스크립트와의 연결 방법과 같다.

모바일 모드 구분

<span cond="Mobile::isMobileCheckByAgent()">모바일모드이다.</span>
<span cond="!Mobile::isMobileCheckByAgent()">모바일모드가 아니다.</span>

변수

접속자 정보

http://www.xeschool.com/xe/xenote_useful_variable_logged_info

접속자 정보 설명
$logged_info→member_srl회원의 고유 번호. 중복 X
$logged_info→user_id 아이디
$logged_info→email_address메일 주소
$logged_info→passwrod비밀번호. MD5 형식으로 암호화 되어 있음.
$logged_info→email_id메일 주소에서 아이디 부분만 뽑아낸 것.
$logged_info→email_host메일 주소에서 호스타 부분만 뽑아낸 것.
$logged_info→user_name이름
$logged_info→nick_name닉네임
$logged_info→homepage홈페이지 주소
$logged_info→blog블로그 주소
$logged_info→birthday생일
$logged_info→allow_mailing메일링 수신
$logged_info→allow_message쪽지 수신 여부 (Y: 전체 수신, N :거부, F: 친구만 허용)
$logged_info→denied사용 중지 (Y: 사용 중지)
$logged_info→limit_date제한일
$logged_info→regdate가입일
$logged_info→last_login최근 로그인 시간
$logged_info→is_admin최고 관리자 여부 (Y: 최고 관리자, N: 최고 관리자 아님)
$logged_info→description설명
$logged_info→profile_image프로필 이미지 정보가 담긴 배열
$logged_info→profile_image→width프로필 이미지 가로 폭
$logged_info→profile_image→height프로필 이미지 세로 폭
$logged_info→profile_image→src프로필 이미지 전체 주소
$logged_info→profile_image→file프로필 이미지 경로
$logged_info→image_name이미지 이름 정보가 담긴 배열
$logged_info→image_name→width이미지 이름 가로 폭
$logged_info→image_name→height이미지 이름 세로 폭
$logged_info→image_name→src이미지 이름 전체 주소
$logged_info→image_name→file이미지 이름 경로
$logged_info→image_mark이미지 마크 정보가 담긴 배열
$logged_info→image_mark→width이미지 마크 가로 폭
$logged_info→image_mark→height이미지 마크 세로 폭
$logged_info→image_mark→src이미지 마크 전체 주소
$logged_info→image_mark→file이미지 마크 경로
$logged_info→signature서명
$logged_info→group_list소속된 그룹 정보가 담긴 배열
    • userinfo — only set for a logged user, an associative array…
      • pass — password, encrypted
      • name — full name
      • mail — email address
      • grps — groups the user belongs to (Array )
      • buid — a special id constructed from details of the user's browser and IP address

xe의 그룹 구조 key : 1 ~~~ val : admin key : 3 ~~~ val : mania

도쿠 위키와 세션만 연동

훌륭한 로긴 방식

http://www.xpressengine.com/tip/16724404

http://bb.vaslor.net/index.php?module=loginxeclient&act=dispLoginxeclientOAuth&provider=naver

템플릿에

<p><a href="{getUrl('','module','loginxeclient','act','dispLoginxeclientOAuth','provider','naver')}">네이버계정으로 로그인</a></p>

추가.

socialxe

XE 기본으로 표시되는 로그인 폼에서도 수정을 하시려면 회원 관리 모듈의 스킨 /modules/member/skins/default/login_form.html 파일을 수정하면된다. 참고로 SocialXE 공식 사이트에서는 login_form.html 파일의 내용을 아래와 같이 수정하여 사용하고 있다.

{@header("Location: " . getNotEncodedUrl('act', 'dispSocialxeLoginForm'))}

외부페이지에서 로그인 정보를 출력

http://zbxe.bluegate.kr/19

<?PHP
$logged_info = Context::get("logged_info");
if($logged_info){
echo $logged_info->nick_name."님 로그인 되었다";
} else {
echo "로그인을 먼저 하십시요";
}
?>

http://www.xpressengine.com/tip/16309252

함수 호출..

<a href="{getUrl('act','dispMemberLoginForm')}">{$lang->cmd_login}</a>
<a href="{getUrl('act','모듈아이디')}">출력하고픈말</a>

이렇게 바꾸시면 돼요^^ 그러니까

  • dispMemberLoginForm 로그인 http://openwiki.kr/bb/?act=dispMemberLoginForm
  • dispMemberInfo 마이페이지
  • dispMemberOwnDocument 내글
  • dispMemberScrappedDocument 내스크랩
  • dispMemberSavedDocument 내 문서
  • dispCommunicationMessages 쪽지함

등등 실제 주소에서 http://www.abc.com/?mid=index&act=dispCommunicationMessages

모듈정보

목록 및 선택된 글 출력 dispBoardContent list.html
태그 목록 모두 보기 dispBoardTagList tag_list.html
글 작성 화면 출력 write_form.html
문서 삭제 화면 출력 dispBoardDelete delete_form.html
댓글의 답글 화면 출력 dispBoardReplyComment (문서에 댓글)
dispBoardWriteComment (댓글에 댓글)
comment_form.html
댓글 수정 폼 출력 dispBoardModifyComment comment_form.html
댓글 삭제 화면 출력 dispBoardDeleteComment delete_comment_form.html
엮인글 삭제 화면 출력 dispBoardDeleteTrackback delete_trackback_form.html
메세지 출력 dispBoardMessage message.html
비밀번호 입력 input_password_form.html
회원 정보 보기 member_info dispMemberInfo
스크랩 목록 dispMemberScrappedDocument scrapped_list
저장함 보기 dispMemberSavedDocument saved_list
작성 글 보기 dispMemberOwnDocument document_list
회원 정보 수정 dispMemberModifyInfo modify_info
비밀번호 변경 dispMemberModifyPassword modify_password
회원 탈퇴 dispMemberLeave leave_form
오픈 아이디 탈퇴 dispMemberOpenIDLeave openid_leave_form
로그아웃 dispMemberLogout logout
저장된 글 목록 (pop) dispSavedDocumentList saved_list_popup
로그인 dispMemberLoginForm login_form
회원가입 dispMemberSignUpForm signup_form
아이디 / 비밀번호 찾기 dispMemberFindAccount find_member_account
인증메일 재발송 dispMemberResendAuthMail resend_auth_mail
임시 비밀번호 dispMemberGetTempPassword find_temp_password

confirm_member_account_mail.html 메일 인증 같음 find_member_account_mail.html 회원 정보를 메일로 찾을 때 communication 모듈

친구 보기 dispCommunicationFriend friends
쪽지함 보기 dispCommunicationMessages messages
새 쪽지 보여줌 (pop) dispCommunicationNewMessage new_message
쪽지 발송 출력 (pop) dispCommunicationSendMessage send_message
친구 추가 (pop) dispCommunicationAddFriend add_friend
친구 그룹 추가 (pop) dispCommunicationAddFriendGroup add_friend_group

글쓰기 ?mid=game&act=dispBoardWrite&page=1

글쓰기 미리 내용 넣기 http://www.xpressengine.com/tip/18022769

속도

글 등록시에만 등록속도가 현저히 떨어진다면 캐쉬 문제일 가능성이 있다.

files 폴더에 cache_123456789 라는 폴더가 쌓여있는지 먼저 확인해보고

cache_123456786
cache_123456787
cache_123456788
cache_123456789

이처럼 cache_ 숫자 가 있는 폴더를 정리 해야된다.

그렇다고 무작정 다 지우게 되면 사이트에 문제가 발생하니 cache_123456789 폴더를 백업하고 cache_123456789를 하나씩지우면서 테스트 를 해보기를 권장한다.

xe.min.css 삭제...

unload 태그가 안먹히면 이런 임시방편을 사용해보라..

<script type="text/javascript">
jQuery("link[rel=stylesheet][href*='common/css/xe.min.css']").remove();
</script>

혹시 먹히지 않는다면 아래 방법으로..

<script type="text/javascript">
jQuery(function(){
jQuery("link[rel=stylesheet][href*='common/css/xe.min.css']").remove();
});
</script>

첫째는 xe.min.css 파일을 아예 로드하지 않는 방법이다. 둘째는 파일이 로드된 뒤에 지우는 방식이다.

기본 URL 설정이 안 되어 있다.

아마 각종 해킹에 대한 보안대책의 하나로 현재의 서버 정보와 지정된 주소가 다르면 에러를 뿜는 것으로 보인다.

일반-설정-고급-기본 URL을 지정해서 해결 되는 경우도 있으나,

기본url은 xe - files - config - db.config.php 열고 $db_info→default_url 여기에 값을 넣으면 된다.

예: $db_info→default_url = 'http://openwiki.kr/';

그래도 안된다면 classes/module/ModuleHandler.class.php 파일의 130번째 줄 부근의 에러 발생 루틴을 주석처리하면 된다.

if($host && ($host != $defaultHost && $host != $site_module_info->domain))
{
  // throw new Exception('msg_default_url_is_null'); // 이걸 주석처리..
}

인쇄

http://bb.openwiki.kr/index.php?module=document&act=dispDocumentPrint&document_srl=47716&mid=tech
http://www.ilbe.com/index.php?module=document&act=dispDocumentPrint&document_srl=5286110344

사용자 관리

권한관리 설정하기 게시판에 대한 권한 관리에는 다음과 같이 여러개로 나뉩니다.

  • 접근 권한 : 게시판에 접근할 수 있는 권한을 각 회원 그룹별로 지정할 수 있다.
  • 목록 : 게시판 목록을 볼수 있는 권한을 각 회원 그룹별로 지정할 수 있다.
  • 열람 : 게시판 상세내용을 볼수 있는 권한을 각 회원 그룹별로 지정할 수 있다.
  • 글 작성 : 게시판에 글을 등록할 수 있는 권한을 각 회원 그룹별로 지정할 수 있다.
  • 댓글 작성 : 게시판에 댓글을 등록할 수 있는 권한을 각 회원 그룹별로 지정할 수 있다.
  • 관리 권한 : 게시판을 관리 할 수 있는 권한을 각 회원 그룹별로 지정할 수 있다.

관리 권한으로 설정된 그룹에 속한 회원들은 해당 게시판의 글을 마음대로 삭제하고, 수정할 수 있기 때문에 신중하게 설정해야 한다.

참고자료

  1. SOL님의 SMS로 XE 게시판에 글쓰기 http://sol.textyle.kr/23984
  2. 뎅ㅇㅣ님의 XE - JSON 모듈 만들기 http://wannabewize.tistory.com/89
  3. Hide_D님 board.api.php 사용법 http://www.xpressengine.com/18405009

역링크