$list[$i]['wr_name']을 

substr($list[$i]['wr_name'],0,-12)."**"

 

로 표시

 

 

http://gnustudy.com/bbs/board.php?bo_table=skin_board&wr_id=21

 

 

xe 는  php-xml 이 필수이기 때문에

sudo apt-get install php7.2-xml 

 

설치 해줘야한다 

 

https://sir.kr/yc5_tip/842

영카트 모바일 페이지에서는 기본적으로 시중가격이 노출되지 않습니다. 
모바일에서도 시중가격을 출력하는 방법입니다. 


1. 수정파일 : 
상품리스트 : mobile/skin/shop/basic/list.10.skin.php 
메인페이지 : mobile/skin/shop/basic/main.10.skin.php 


    if ($this->view_it_price) { 
        echo "<div class=\"sct_cost\">\n"; 
        echo display_price(get_price($row), $row['it_tel_inq'])."\n"; 
        echo "</div>\n"; 
    } 

윗부분을 이렇게 수정. 

    if ($this->view_it_cust_price || $this->view_it_price) { 

        echo "<div class=\"sct_cost\">\n"; 

        if ($this->view_it_cust_price && $row['it_cust_price']) { 
            echo "<strike>".display_price($row['it_cust_price'])."</strike>\n"; 
        } 

        if ($this->view_it_price) { 
            echo display_price(get_price($row), $row['it_tel_inq'])."\n"; 
        } 

        echo "</div>\n"; 

    } 


2. 수정파일 : mobile/shop/list.php (상품리스트) 

$list->set_view('it_price', true); 

윗부분 바로 아래에 한 줄 추가 

$list->set_view('it_cust_price', true); 

같은 파일에서 총 두 군데에 있으니 유의하세요. 
두번째 부분이 상품목록 스킨입니다. 


3. 수정파일 : mobile/shop/index.php (메인페이지) 

$list->set_view('it_cust_price', false); 
false 를 true 로 변경 
$list->set_view('it_cust_price', true);

출처 : http://gnustudy.com/bbs/board.php?bo_table=yc_tip&wr_id=51

여분 필드를 사용하는 방법이며 수정 방법은 게시판 방식과 거의 동일합니다

http://gnustudy.com/bbs/board.php?bo_table=yc_tip&wr_id=26 

 

1:1 문의 DB 테이블에도 여분 필드가 존재하는데 qa_1 번과 qa_2 번을 사용했습니다.

 

 

1. adm/qa_config.php 파일 수정

 

1-1.

 

적당한 위치에 추가

 

<tr>
    <th scope="row"><label for="qa_1">모바일 상단 파일 경로</label></th>
    <td>
        <input type="text" name="qa_1" value="<?php echo $qaconfig['qa_1'] ?>" id="qa_1" class="frm_input" size="50">
    </td>
</tr>
<tr>
    <th scope="row"><label for="qa_2">모바일 하단 파일 경로</label></th>
    <td>
        <input type="text" name="qa_2" value="<?php echo $qaconfig['qa_2'] ?>" id="qa_2" class="frm_input" size="50">
    </td>
</tr>

 

1-2.

 

여분 필드 개수 설정 부분을 $i=3 으로 수정

<?php for ($i=3; $i<=5; $i++) { ?>

 

 

추가 후 관리자 페이지 1:1문의 설정에서 이렇게 모바일 상단 하단 파일을 별도로 지정할 수 있습니다.

 


 

테마를 사용하지 않는 경우

 

상단 파일 경로 : ../shop/shop.head.php
하단 파일 경로 : ../shop/shop.tail.php
모바일 상단 파일 경로 : ../mobile/shop/shop.head.php
모바일 하단 파일 경로 : ../mobile/shop/shop.tail.php

 

테마를 사용하고 있는 경우 (basic 테마를 예로 들면)

 

상단 파일 경로 : ../theme/basic/shop/shop.head.php
하단 파일 경로 : ../theme/basic/shop/shop.tail.php
모바일 상단 파일 경로 : ../theme/basic/mobile/shop/shop.head.php
모바일 하단 파일 경로 : ../theme/basic/mobile/shop/shop.tail.php
 

 

 

2. bbs/qahead.php 파일 수정 

 

if (G5_IS_MOBILE) {
    // 모바일의 경우 설정을 따르지 않는다.
    include_once('./_head.php');
    echo conv_content($qaconfig['qa_mobile_content_head'], 1);
} else {

 

여기를 이렇게 수정.

 

if (G5_IS_MOBILE) {
    if($qaconfig['qa_1'] && is_include_path_check($qaconfig['qa_1']))
        @include ($qaconfig['qa_1']);
    else
        include ('./_head.php');
    echo conv_content($qaconfig['qa_content_head'], 1);
} else {

 

 

3. bbs/qatail.php 파일 수정

 

if (G5_IS_MOBILE) {
    echo conv_content($qaconfig['qa_mobile_content_tail'], 1);
    // 모바일의 경우 설정을 따르지 않는다.
    include_once('./_tail.php');
} else {

 

여기를 이렇게 수정.

 

if (G5_IS_MOBILE) {
    echo conv_content($qaconfig['qa_content_tail'], 1);
    if($qaconfig['qa_2'] && is_include_path_check($qaconfig['qa_2']))
        @include ($qaconfig['qa_2']);
    else
        include ('./_tail.php');
} else {

 

 

4. bbs/_common.php 파일 수정

 

파일 하단 ?> 바로 위에 추가

 

if (preg_match("/.*\/bbs\/(qalist|qawrite|qaview)\.php?/", $_SERVER['REQUEST_URI'])) define('_SHOP_', true);

 

 

# 참고사항

 

FAQ 페이지 팁도 같이 사용하는 경우에

http://gnustudy.com/bbs/board.php?bo_table=yc_tip&wr_id=50 

 

위 팁 내용 중 faq.php 파일 상단에 넣는 define('_SHOP_', true); 이 부분은 저기서 하지 말고

4. bbs/_common.php 파일 수정 여기에 같이 설정해도 됩니다.

 

이렇게 faq 를 하나 더 추가하면 됩니다.

 

if (preg_match("/.*\/bbs\/(qalist|qawrite|qaview|faq)\.php?/", $_SERVER['REQUEST_URI'])) define('_SHOP_', true);

 

{@

$args->module_srl = 모듈번호;

$output = executeQuery('document.getDocumentCount', $args);

}

{$output->data->count} 

출처 : https://www.xpressengine.com/tip/22827295




제 경우 XE 는 1.2 인가까지 쓰면서 이미지 슬라이더 등도 만들고 나름 노력했으나;

제로보드 4 가 여전히 더 편해서 다시는 안쓰기로 했었습니다.


그러다가 워드프레스로 옮겨탈까 하던 중에 제로보드 XE 가 버젼이 많이 업되어서 좋겠구나 하고 왔지요.


예약 게시판 하나 만들다가 뚜껑이 열려서 마구 헤맨 결과를 여기 적어 드립니다.


팁들로 하나씩 시리즈로 작성할게요.


참고로, 고수님들에게는 쓰레기 팁이고, 노가다로 그냥 자신의 스킨을 개조해서 쓰실 분들께는

간단하게 제작할 수 있는 팁입니다.


그러니, 고수분들은 가볍게 뒤로가기를 눌러주세요...



완전 초보분들도 따라하기 쉽게 쓸게요.




사용자 정의를 활용하여 폼 형식으로 개발하는 무식한 방법(1)


사용자 변수를 만든 XE가 초보 입장에서는 잘못이다.


우선 사용자 정의 변수를 만든 XE 가 이 뛰어난 기능을 엉망으로 쓰게 해둔 것에서 하나씩 보도록 하죠.



(XE 설치폴더)/modules/board/skins/해당스킨/write_form.html 파일에서 보게 되면,


<table cond="count($extra_keys)" class="et_vars exForm bd_tb">
  <caption><strong><em>*</em></strong> <small>: {$lang->is_required}</small></caption>
  <tr loop="$extra_keys=>$key,$val">
   <th scope="row"><em cond="$val->is_required=='Y'">*</em> {$val->name}</th>
     <td>
     {$val->getFormHTML()}
     </td>
  </tr>
</table>


이런 부분이 있을 것입니다.


이 부분에 간단히 코드를 추가합니다.


<table cond="count($extra_keys)" class="et_vars exForm bd_tb">
  <caption><strong><em>*</em></strong> <small>: {$lang->is_required}</small></caption>
  <tr loop="$extra_keys=>$key,$val">
   <th scope="row"><em cond="$val->is_required=='Y'">*</em> {$val->name}</th>
     <td>{$val->getFormHTML()}<br><br>
    module_srl : {$val->module_srl}, <br>
    idx : {$val->idx}, <br>
    name : {$val->name}, <br>
    type : {$val->type}, <br>
    default : {$val->default}, <br>
    desc : {$val->desc}, <br>
    is_required : {$val->is_required}, <br>
    search : {$val->search}, <br>
    value : {$val->value}, <br>
    eid : {$val->eid}, <br>
    total : {print_r($val)}
   </td>
  </tr>
</table>


이렇게 해주면 name 값을 처리하는 것이나 val 을 통해서 어떤 값들이 넘겨지게 되는 지를 확인 가능합니다.


그런데 여기에서 문제가 있죠.




<tr loop="$extra_keys=>$key,$val">
 

코드 상의 문제...라고 볼 수도 있습니다.


고수님들께서 보시기엔 아무 문제 없이 쉽게 해결하겠지만,


이렇게 되어 있어서 사용자 변수를 키값과 밸류값으로 그냥 뿌리는 형식으로 처리하면서,


 {$val->getFormHTML()}


이 함수에 넣고 그냥 폼으로 출력되게 하는 아주 간단한 구현을 해놓은 것입니다.


레이아웃이나, 메뉴 등에서만해도 끌올 등이 되는 등 아주 편한데,

이 값으로 해놓다보니, 우리 초보들은 사용자 정의를 입맛에 맞게 쓸 수가 없습니다.


간단히 설명해드리자면 idx 값에 숫자가 증가하면서 그게 인덱스가 되는 무식한 방법이죠.

그냥 사용자 정의 변수 1~n 번까지 루프 돌아서 뿌려버려~

이게 전부인 거죠.


일단 초보 단계에서 이걸 해결하는 방법은 위의 코드를 아예 주석으로 처리하고,

처리하기 전에 html 을 소스 보기로 보면서 무식하게 부분별로 형식을 지정해주는 거죠.


그런데 이렇게 한다고 해도 문제가 발생합니다.

우선, 수정을 눌렀을 때에 값 전달이 표기가 안됩니다.

그 다음으로는 입력시의 모양과 출력시의 모양이 달라집니다 -_-;


뭐, 출력시의 모양이 더 중요한 곳인 지, 입력시의 모양이 더 중요한 곳인 지는 각자의 판단에 달려있겠죠.


그래서 우선 위에 설명한 것처럼 idx 로 사용자 정의 변수를 쓰는 방식을 개조해야 합니다.



(XE설치경로)/modules/board/board.view.php 파일에서,


/**
* use context::set to setup extra variables
**/
  $oDocumentModel = getModel('document');
  $extra_keys = $oDocumentModel->getExtraKeys($this->module_info->module_srl);
  Context::set('extra_keys'$extra_keys);



이 부분을 찾아서 그 바로 아래에,

/**
* add extra variables to order(sorting) target
**/

if (is_array($extra_keys))

{
  

// extra_keys_map : extra_keys가 있을 때, 맵을 추가로 구성

   $extra_keys_map = array();

foreach($extra_keys as $val)

{

$extra_keys_map[$val->eid] = $val; // 맵에 값 할당 by diaimm

    $this->order_target[] = $val->eid;
}
      Context::set('extra_keys_map', $extra_keys_map); //맵을 view 로 전달해주는 거죠

}



이런 식으로 코드를 추가해둡니다.



아, 이런 이제서야 발견했습니다;; 확장 컴포넌트에 코드 입력이 있네요;

아놔 -_-;


// apply xml_js_filter on header
        $oDocumentController = getController('document');
        $oDocumentController->addXmlJsFilter($this->module_info->module_srl);


이 부분을 찾아서,


// if the document exists, then setup extra variabels on context
        if($oDocument->isExists() && !$savedDoc) {
            $extra_keys = $oDocument->getExtraVars();
            Context::set('extra_keys', $extra_keys);
 
            // 아래 코드에서 extra_keys 값이 있을 때 추가로 맵을 구성
            if (is_array($extra_keys))
            {
                $extra_keys_map = array();
                foreach($extra_keys as $val)
                {
                    $extra_keys_map[$val->eid] = $val;
                }
 
                Context::set('extra_keys_map', $extra_keys_map);
            }
            //여기까지
        }


그 밑에 이런 식으로 추가해주는 거죠.


이렇게 해주는 이유는 앞에서 말씀드린 것처럼 기본적으로 XE 에서는 사용자 정의 변수 자체를

아주 가볍게 보고 별 쓰잘데기 없지만 원하는 사람도 있으니까... 라는 정도로 코딩을 해둔 때문입니다.

(아, 이건 그냥 초보가 느끼는 심정 그대로 썼습니다 -0-)


그냥 보면 사용자 변수 이렇게 쓰이니까, 개발자 분들은 쉽게 사용하세요 정도로 안내해준 것인 듯 한데,

초보들에게는 때에 따라서 매우 필요한 기능이 제대로 활용하기 어려우니까 쪼끔 분노게이지 상승하는 거죠.


어쨌든, view 에서 index 를 쓰게 만들어서 idx 를 이용해서 변수를 순차로 매기는 것에서 순서를 무시하고도

값을 전달하고 받는 것에 문제가 없게끔 하는 첫 작업인 거죠.


그렇게 해주면 idx 가 아닌 사용자 정의 변수 이름 그대로 쓸 수 있습니다.


예를 들어서 사용자 변수 명을 testInput 라고 만들었다고 칩니다.


  <table cond="count($extra_keys)" border="1" cellspacing="0" summary="Extra Form" class="extraVarsList" width=100%>
   <caption><em>*</em> : {$lang->is_required}</caption>
   <tr>
    <th scope="row"><em>*</em> 테스트 입력</th>
    <td> <input type="text" name="extra_vars1" value="" class="text" />
      <p>여기가 설명 부분이 되겠죠</p>
    </td>
   </tr>


게시판에 글 쓰기를 하고 앞에서 말씀드린 부분을 주석처리하기 전에 보게 되면,

이런 식으로 소스코드를 볼 수 있을 것입니다.


따라서 주석 처리를 해주고 write_form.html 자체에 저 코드를 추가하면, 아무런 이상없이 쓰게 된다는 거죠.


저기서 보게 될 중요한 점은 어디에서 testInput 는 존재하지 않습니다.

즉, 변수명은 받기만하고 쓰잘데기없는 값처럼 둔갑하는 거죠.

extra_vars1 이라고 해서 여기 숫자만 중요합니다.


뭥미?


그렇다는 것은 사용자 변수를 20개 만들었는데...


아차! 하나 빼먹음... 하는 순간...

입력 순서를 원하는대로 받으려면,


끌 올도 못하는데 새로고침 무지 하면서 올리기 버튼 눌러야 합니다.

(맨 위로 올림도 없고 그냥 무식하게 계속 올려야 합니다)

아니 이미 존재하는 모듈상에 코드가 존재하잖아요, 끌어 올리기...

모듈로 따로 개발하고 코딩한 이유가 그런 거 섞어쓰기 편하려던 목적 같은데...

객체지향... 내가 메뉴에서 마우스로 끌어 올리고 내리고 하는 코드 몰라도 그렇게 되게끔...


더 열받는 것은 잘못 누르면 다시 내려가요 ㅠㅠ


게다가 여러가지 테스트를 해보면 전화번호나 기타 값을 해보면 html 코드에 보면 id=extra_var3-1055

이런 식으로 각 기본값들에 대해서 엄청난 숫자 번호까지 매기는데, 이 값도 전혀 쓸모 없습니다.

순차적으로 이것도 그냥 인덱스죠.


그러니 무식한 코딩을 쓴 후에는 변수값 하나 추가하는 순간 멘붕인거죠.


그래서 앞에 과정을 해둔 것입니다.


위의 코드를 수정해보면,


<input type="text" name="extra_vars1" placeholder="{$extra_keys_map['testInput']->name}" style="width:155px;" value="{$extra_keys_map['testInput']->value}" class="text" />


이렇게 바꿔주는 거죠.



이제 우리가 활용하게 되는 것은,

extra_vars숫자 (사용자 정의 에서 나오는 앞의 숫자값입니다) 와 사용자 변수명이 되었습니다.


간단히 설명드리겠습니다.

placeholder 값은 당연히 입력 칸에 살짝 흐리게,

비 로그인 상태에서 글쓰기 할 때에, 비밀번호 -> 이렇게 써서 입력 받잖아요? 그런 태그 속성입니다.

사용자 정의 이름 입력할 때에 Ex) extra_vars_1 이라는 것도 마찬가지로 구현되어 있죠.

실제로는 밑줄 없습니다. 밑줄빼기도 아니고... 이건 뭐;;;


아무튼,


{$extra_keys_map['testInput']->name} 이게 사용자 변수의 입력항목 이름이 되는 거죠.


그리고 이 부분이 중요합니다.


style="width:155px;"


이게 입력 칸의 너비 조절이 되는 거죠.

size 로는 안됩니다. 원래 형식이 들어 있는 Extravar.class.php 에서 고친다고 해도 저렇게 고쳐줘야 작동합니다.


이제 이렇게 해준 상태에서,


가장 중요한 부분이죠.

이것 때문에 이 긴 글을 읽고 있는데 말입니다;



value="{$extra_keys_map['testInput']->value}"


이렇게 해주면 값 전달이 되어서 수정시에도 제대로 되겠죠.


그리고 지금은 맵을 두가지로 쓰기 때문에 루프 돌 때에도 사용자 변수명으로 if 써서 foreach 등에 끼어들기가 쉽습니다.

변수명 자체를 활용할 수 있으니까요.


오늘은 여기까지 설명하구요,


다음에는 사용자 정의 변수 형식에 우리 입맛대로 쑤셔 넣는 방법을 배우겠습니다.


그걸 해줘야, 시간이든, 해외 국제 전화번호든...

우리 넣고 싶은 값을 다 넣을 수 있죠.


코딩같은 코딩은 이번만 조금 다루고, 다음부터는 일단 무조건 노가다입니다.

$sudo vi /etc/nginx/sites-available/default 


에서


# fastcgi_pass 127.0.0.1:9000

fastcgi_pass unix:/var/run/php5-fpm.sock;




Nginx rewite 설정하기

sungbum hong edited this page  · 7 revisions

이 페이지에서는 Nginx에 XE를 설치할 경우, rewrite 설정 방법에 대하여 설명합니다.

개요

XE에서는 짧은주소의 사용을 위하여 rewrite rule을 사용하고 있습니다. 웹서버로 apache를 사용할 경우, apache의 rewrite_mod와 .htaccess 파일을 사용하여 rewrite를 구동시킵니다. 하지만 웹서버가 Nginx일 경우에는, rewrite를 위하여 별도의 설정이 필요합니다.

설정 방법

설정방법은 크게 두가지 과정을 거칩니다.

  1. xe를 위한 rewrite rule이 기록된 xe_rewrite.conf 파일을 작성
  2. nginx의 설정파일인 nginx.conf 파일에 새로 작성한 xe_rewrite.conf 파일을 include하기

xe_rewrite.conf 작성하기

nginx의 conf 디렉토리로 이동합니다.
(NGINX_DIR은 실제 자신의 서버에 nginx가 설치된 디렉토리 경로로 치환해야 합니다.)

# cd NGINX_DIR/conf

xe_rewrite.conf 파일을 새로 작성합니다.

# pwd
NGINX_DIR/conf
# vi xe_rewrite.conf

xe_rewrite.conf 파일의 편집기에서 아래의 내용을 붙여넣습니다.

# reserve XE Layout Template Source File (*.html)
rewrite ^/(layouts|m.layouts)/(.+)/(.+).html$ /index.php last;

# conf, query, schema
rewrite ^/(modules|addons|widgets)/(.+)/(conf|queries|schemas)/(.+).xml$ /index.php last;

# static files
rewrite ^/(.+)/files/(member_extra_info|attach|cache|faceOff)/(.*) /files/$2/$3 last;
rewrite ^/(.+)/(files|modules|widgets|widgetstyles|layouts|m.layouts|addons)/(.*) /$2/$3 last;

# rss, blogAPI
rewrite ^/(rss|atom)$ /index.php?module=rss&act=$1 last;
rewrite ^/([a-zA-Z0-9_]+)/(rss|atom|api)$ /index.php?mid=$1&act=$2 last;
rewrite ^/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(rss|atom|api)$ /index.php?vid=$1&mid=$2&act=$3 last;

# trackback
rewrite ^/([0-9]+)/(.+)/trackback$ /index.php?document_srl=$1&key=$2&act=trackback last;
rewrite ^/([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ /index.php?vid=$1&document_srl=$2&key=$3&act=trackback last;

# administrator page
rewrite ^/admin/?$ /index.php?module=admin last;

# document permanent link
rewrite ^/([0-9]+)$ /index.php?document_srl=$1 last;

# mid link
rewrite ^/([a-zA-Z0-9_]+)/?$ /index.php?mid=$1 last;

# mid + document link
rewrite ^/([a-zA-Z0-9_]+)/([0-9]+)$ /index.php?mid=$1&document_srl=$2 last;

# vid + mid link
rewrite ^/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ /index.php?vid=$1&mid=$2 last;

# vid + mid + document link
rewrite ^/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)$ /index.php?vid=$1&mid=$2&document_srl=$3 last;

# mid + entry title
rewrite ^/([a-zA-Z0-9_]+)/entry/(.+)$ /index.php?mid=$1&entry=$2 last;

# vid + mid + entry title
rewrite ^/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ /index.php?vid=$1&mid=$2&entry=$3 last;

nginx.conf 수정하기

nginx.conf 파일을 편집기로 엽니다.

# pwd
NGINX_DIR/conf
# vi nginx.conf

nginx.conf를 아래와 같이 수정합니다.

http {
    include       mime.types;
    default_type  application/octet-stream;

    ....중략....

    server {
        listen      80;
        server_name  www.mydomain.com;
        root /home/public_html;
        index index.php;

        ....중략 ....

        # xe rewrite 적용하기
        include xe-rewrite.conf;
    }
}

위의 코드에서 봐야할 설정은 include xe-rewrite.conf입니다. xe 사이트에 대해 설정되어 있는 server 항목 안에 include xe-rewrite.conf; 코드가 위치하면 됩니다.

nginx 재시작

nginx를 재시작합니다.

# sudo service nginx restart

다시 XE를 설치를 진행합니다. 설치 진행 과정에서 짧은 주소에 관한 안내가 나타나지 않는다면, 짧은 주소를 정상적으로 사용할 수 있습니다.



출처 : https://github.com/xpressengine/xe-core/wiki/Nginx-rewite-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0


XE 코어 백업과 복원하기

XE의 백업과 복원은 포장이사로...

XE 코어로 만든 웹사이트를 업그레이드하거나 다른 서버로 이사를 가야 할 때 백업과 복원은 필수입니다. 그런데 FTP 프로그램을 이용해 파일을 하나하나 내려받고 다시 서버에 올린다면 XE 코어는 정상적으로 작동하지 않습니다. 왜냐하면 여러분이 호스팅 서비스를 이용해 계정을 할당 받고 사용하게 되면 아래 그림과 같이 html이라는 사용자 폴더(root, 서버환경에 따라 public_html 또는 www라는 폴더를 사용)를 이용하게 되는데 이 폴더 안에는 여러분이 사용중인 폴더와 XE 코어가 만들어서 사용하는 files 디렉터리가 함께 있기 때문입니다. files 디렉터리는 xe 디렉터리 안에 있고 웹사이트의 운영내용 및 설정 파일들을 XE 코어가 수시로 점검하고 수정하고 첨부 파일들을 저장하는데 사용하고 있습니다. 이 files 디렉터리는 FTP를 이용해 다운로드 하거나 이동, 복사 할 수 없습니다.

웹사이트 운영시 함께 할당 받는 또 하나는 데이터베이스(DB)입니다. DB는 쉽게 말해 엑셀문서를 닮았다고 설명드린 적이 있습니다. 데이터 하나하나를 쪼개어 저장하는 아주 강력한 친구입니다. 하지만 무척 까탈스러운 친구라 말붙이기도 어렵고 접근하기 조차 쉽지 않습니다. 하지만 XE 코어를 도와 항상 열심히 일하는 아주 근면성실한 친구이기 때문에 믿음직스럽습니다.

image

웹사이트를 백업한다는 것은 보통 html 폴더(root) 전체를 하나의 파일로 묶는 것을 말하는데 반드시 잊지말아야 하는 것은 DB에 저장되어 있는 자료 역시 압축파일로 받아 두어야 합니다. 만약 DB를 백업 받아두고 다시 복원해 주지 않으면 XE 코어는 정상적으로 작동하지 않습니다. 따라서 계정의 백업은 디렉터리의 백업과 DB 백업으로 나누어 작업하게 됩니다. XE 코어와 DB의 상호작용은 관리자 페이지에 있는 캐시파일 재생성 버튼으로 연동을 유지하게 됩니다. 이렇게 XE 코어를 백업 받거나 복원하기 위해서는 반드시 포장을 잘 해 두어야하며 또는 부득이하게 다른 서버 계정으로 이사를 가야한다면 반드시 포장이사를 맡겨야 합니다...^^ (필요에 따라서는 XE 디렉터리만 포장해도 상관 없으며 index.html 문서는 별도로 작성하고 필요한 파일만 가져가도 됩니다.)


1. 파일 및 디렉터리의 백업과 복원

계정의 백업 작업은 FTP를 이용해서 할 수 없습니다. 오직 SSH 또는 Putty 프로그램을 이용해 서버에 접속하고 텔넷 명령어를 사용해서 백업 및 복원 명령어를 입력해야 합니다. SSH를 이용해 서버에 접속하게 되면 최상위 디렉터리 바깥에서 디렉터리 전체를 하나의 파일로 묶어주는 명령어를 입력합니다. 최상위 디렉터리(root)는 서버 환경에 따라서 html, www 또는 public_html로 사용할 수 있습니다. ls 명령어를 입력해 보고 html, www, public_html 디렉터리만 보인다면 루트 디렉터리 바깥에 있는 것이 맞습니다.

tar -cvfpz backuphtml.tar.gz html

html은 압축하고자 하는 디렉터리의 이름이고 backuphtml.tar.gz는 백업 작업의 결과로 만들어질 압축파일 이름입니다. tar의 옵션의 c는 파일 및 디렉터리를 하나로 묶어 새 저장 파일을 만들라는 뜻입니다.

이렇게 만들어진 backuphtml.tar.gz 압축파일은 루트 디렉터리 바깥에 있고 서버에 그대로 두어도 상관은 없지만(서버용량이 가능하다면) 추후에 작업을 위해서는 FTP 프로그램을 이용해 다운로드 받아 두는 것이 좋습니다. 그리고 압축파일 네이밍을 할 때 백업일자를 같이 써주면 언제 백업 받아둔 것이지 쉽게 확인할 수도 있겠지요. 예) backuphtml_20110630.tar.gz

디렉터리의 백업파일을 복원하는 것은 마찬가지로 루트 디렉터리 바깥에서 아래의 명령어를 입력하는 것으로 쉽게 작업하실 수 있습니다. 이번에는 옵션에 c가 아니라 압축을 해제하는 옵션 x를 주게 됩니다. 만약 다른 계정에서 해제하려면 FTP를 이용해 백업 받은 압축 파일을 미리 업로드 해 두어야 합니다.

tar -xvfpz backuphtml.tar.gz

압축이 풀리게 되면 자동으로 html 디렉터리 안에 모든 파일이 원상태로 복구됩니다. 만약 다른 계정에서 html 디렉터리가 없다면 html 디렉터리를 만들고 압축된 파일을 그 안에 풀어 놓게 되는데 이때 html 디렉터리 안의 모든 내용을 새로운 계정 환경의 루트(root) 디렉터리 안으로 옮겨 주어야 합니다.(※ 아래 "다른 서버 계정으로 이사가기" 참고) 옵션 -p는 모든 퍼미션(권한) 정보를 포함하여 압축을 하기도 하고 해제하기도 하지만 만약을 위해 chmod 707 xe 명령을 실행하여 xe 디렉터리의 권한설정을 다시한번 실행해 주어도 좋습니다.

chmod 707 xe

TIP - 간혹 xe 디렉터리 안에 xe가 만들고 사용하는 files 디렉터리의 권한 문제로 오류가 발생하기도 합니다.
이런 경우 chmod -R 707 xe/files 명령어로 files 디렉터리를 포함하여 하위 폴더까지 권한을 재설정해 줍니다. 기타 오류에 대해서는 이용중인 호스팅 웹서버의 root 권한이 필요한 경우가 있습니다. 이런 경우 서비스 제공 회사와 상의하는 것이 바람직합니다.


2. 데이터베이스(DB)의 백업과 복원

DB의 백업은 파일을 압축하는 방법이 아니라 DB에서 사용할 수 있는 sql 문서를 한장 만들어 받아 두는 것입니다. DB는 까탈스러운 친구라고 했죠? 자료를 좀 백업해 달라고 요청을 하면 달랑 서류 한장만 넘겨 줍니다...^^ 그런데 이것을 압축 파일이라고도 부르는 이유는 모든 내용을 텍스트로만 작성하기 때문에 압축한다는 의미로 표현하는 것입니다. CD를 굽는다고 표현하는 것과 같습니다. 이 문서는 나중에 복원을 할때도 DB에게 보여주기만 하면 된답니다. DB를 백업하는 명령어는 아래와 같습니다.

mysqldump -u 아이디 -p 디비네임 > backupdb.sql

DB의 본래 이름은 데이터베이스 관리 시스템(Database Management System, DBMS)인데 이 친구가 쓰는 말은 SQL(Structured Query Language, 구조화 질의어)이라는 언어를 씁니다. 좀 유별납니다...^^ 그래서 정중하게 mysql님 DB를 좀 출력(dump)해 주시죠!(dump is a Unix program used to backup file systems.) 라고 해야 합니다. 명령어가 아닌 정중한 부탁을 해야 합니다. 그러면 backupdb.sql 문서를 내놓습니다. 이 문서 안에는 XE 코어에서 사용하는 테이블의 종류와 갯수 및 내용(스키마), 그리고 그동안 누가 로그인해서 어떤 글들을 썼는지, 그리고 어떤 첨부파일이 어느 디렉터리에 보관되고 있었고, 레이아웃은 어떤 것을 자주 쓰는지, 메뉴는 어떤 것들이 있는지 하는 아주 소소한 것들까지 적어 놓은 가계부와 같습니다.

DB를 복원하려면 위에서 받아둔 sql 문서를 다시 DB에게 보여주기만 하면 됩니다. 이때는 화살표를 반대로 꺽어주면 되죠!

mysql -u 아이디 -p 디비네임 < backupdb.sql

출력(dump) 해 달라는 부탁은 할 필요없습니다. 화살표만 mysql 쪽으로 꺽어서 sql 문서를 보여주기만 하면 됩니다. -p 다음에 비밀번호가 없는 것은 나중에 password: 라고 입력을 기다리기 때문에 그때 입력하면 됩니다. 아이디와 디비네임은 여러분의 계정 아이디와 DB의 네임을 입력하시면 됩니다.(서버에 따라 계정의 아이디와 DB네임, 비밀번호가 다를 수 있습니다.)

TIP - 아이디와 옵션 -u는 붙여 쓰기도 합니다. 즉 옵션 -u 다음의 문자열은 DB의 아이디로 인식합니다.


캐시파일 재생성 하기

루트 디렉터리와 그 안의 모든 파일들을 백업하고 DB 역시 백업한 후에 다시 복원 작업을 거치게 되면 반드시 XE 관리자로 로그인 한 후에 캐시파일을 재생성 해 주어야 합니다. 만약 관리자로 로그인이 되지 않는 경우, 하얀 백지로 웹사이트가 표시 된다면 xe/files/cache 디렉터리를 삭제(rm -rf cache)한 후에 아래 관리자 주소를 웹브라우저 주소 입력칸에 직접 입력하여 관리자로 로그인 합니다. /xe/는 코어 설치폴더 이름입니다.

  • http://웹사이트 주소/xe/?module=admin
  • http://웹사이트 주소/xe/?module=admin&act=dispAdminConfig

관리자 로그인 후 캐시파일을 재생성하게 되면 XE 코어가 정상적으로 작동하게 됩니다.

TIP - 텔넷 명령어 rm -rf cache 로도 xe/files/cache 디렉터리가 삭제되지 않으면 nobody 권한문제 때문입니다. 호스팅 회사에 문의하여 삭제를 요청하는 것이 좋습니다. 간혹 php 문서를 활용한 권한수정도 통하지 않는 경우가 있습니다. 이런 경우 SuperUser 권한으로 nobody권한을 다시 조정해 줘야 합니다.


다른 서버 계정으로 이사가기

위의 과정은 같은 서버의 계정에서 필요에 따라 계정을 백업하거나 복원할 때 사용하는 방법입니다. 그럼 다른 서버의 계정으로 이사를 가야 한다면 어떻게 할까요?

image

백업된 디렉터리 압축파일과 DB에게서 받아 두었던 sql 문서를 복원하는 방법은 위와 동일합니다. 다만, 새로운 서버의 설정값들이 변경되기 때문에 이에 따른 수정할 부분이 추가됩니다. 우선 최상위 디렉터리(root)의 이름이 html이 아니라고 한다면 FTP로 업로드한 후 압축을 풀었을 때 html 디렉터리 안에 모든 파일과 폴더가 풀어져 있습니다. 이것을 새로 이사 간 서버의 루트 디렉터리(public_html 또는 www) 안으로 옮겨 주어야 합니다. 이때 사용하는 명령어는 아래와 같습니다.

mv html/* public_html

html 안의 모든(*) 파일과 폴더를 public_html 디렉터리 안으로 이동하라!(move) 는 뜻입니다. 완료가 되면 FTP를 이용해서 xe 디렉터리 안에 .htaccess 파일이 제대로 있는지도 확인해 보시고 재 확인차 chmod 707 xe 명령을 이용해 권한설정을 한번 더 확인해 줍니다.

TIP 1 - 리눅스 명령어 mv 에서 와일드카드(*)를 사용하면 도트(.)로 시작되는 파일이름(숨김파일)을 포함하도록 확장되지 않습니다. 이런경우 [mv 디렉터리/* 이동할 디렉터리] 와 [mv 디렉터리/.htaccess 이동할 디렉터리] 이렇게 2번 나누어서 실행하거나 또는 [mv 디렉터리/{*,.htaccess} 이동할 디렉터리/]처럼 여러 대상을 포함시켜 이동할 수 있습니다. 아래 예제와 같이 명령어를 실행하면 .htaccess 파일도 함께 이동할 수 있습니다.
예제) mv html/{*,.htaccess} public_html/
또는 mv html/{*,.*} public_html/ 도 같은 역할이지만 서버환경 옵션설정에 따라 허용되지 않을 수 있습니다.
숨김파일은 ls -a 옵션을 사용하여 확인할 수 있습니다.

TIP 2 - 숨김파일까지 한꺼번에 이동하려면 shopt -s dotglob 명령어를 우선 실행한후 mv 명령어를 이용해 와일드카드(*)를 사용하면 한번에 이동이 가능합니다.
shopt -s dotglob
mv html/* public_html/

그리고 다른 서버로 이사를 간 경우에는 XE 코어가 이전 서버에서 사용했던 xe/files/cache 디렉터리가 더이상 필요없습니다. 새로운 설정값을 다시 만들어야 하기 때문에 rm -rf cache 명령을 이용해 cache 디렉터리를 완전히 삭제해야 합니다.

★중요★
새로운 서버의 아이디와 DB네임으로 DB를 복원한 후에는 반드시 /xe/files/config/db.config.php 문서를 FTP를 이용해 서버에서 내려받고 그 안에 적힌 이전 서버의 내용을 새로운 서버의 아이디와 비밀번호, DB네임, 사이트 주소 등을 수정하여 XE 코어에게 이곳은 새로운 서버라는 것을 알려 주세요. 만약 아래 내용처럼 수정을 하여 업로드 한 후에도 문제가 발생하게 되면 설정 중에 localhost 등과 같이 기타 서버에서 사용하는 설정 방법을 호스팅사에 문의하여 수정해야 합니다.

db.config.php 파일 수정 :

<?php if(!defined("__ZBXE__")) exit();
$db_info->master_db = array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost','db_userid' => 'DB아이디','db_password' => 'DB비밀번호','db_database' => 'DB이름','db_table_prefix' => 'xe_');
$db_info->slave_db = array(array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost','db_userid' => 'DB아이디','db_password' => 'DB비밀번호','db_database' => 'DB이름','db_table_prefix' => 'xe_'));
$db_info->default_url = 'http://홈페이지 URL/xe/';
$db_info->lang_type = 'ko';
$db_info->use_rewrite = 'Y';
$db_info->time_zone = '+0900';
?>
  • 'db_hostname' => 'localhost'
  • 'db_userid' => 'DB아이디'
  • 'db_password' => 'DB비밀번호'
  • 'db_database' => 'DB이름'

db.config.php 파일을 수정한 후 다시 업로드하여 원본 파일을 덮어씌운 후에 관리자로 로그인하게 되면 반드시 캐시파일을 재생성하여 변경된 서버 계정의 환경 설정값들을 새로운 캐시파일로 생성하도록 하고 XE 코어와 DB가 연동하게 되면 XE 포장이사는 무사히 마치게 됩니다. 만약 /xe/files/cache 디렉터리가 rm -rf 명령어로도 삭제되지 않는다면 호스팅 회사에 문의하여 삭제를 요청하시면 곧바로 삭제를 해 줍니다.


포장이사 도움말

XE 코어의 백업과 복원, 서버 계정의 이전은 그리 쉬운 작업은 분명히 아닙니다. 왜냐하면 같은 계정 안에서의 백업 및 복원작업은 상대적으로 문제가 적은 반면에 다른 서버의 계정으로 이사를 가는 것은, 이사라는 일이 늘 그렇듯 그릇이 깨지기도 하고 가구에 스크레치가 나기도 하는 등 새로운 문제점들이 늘 발생할 수 있습니다. 새로운 서버의 설정과 운영에 따라 문제가 발생된 경우에는 호스팅사의 도움을 요청하는 것이 바람직합니다.

★ 무작정 XE를 백업 받고 새로운 서버로 이사를 가기보다는 호스팅 회사에 문의를 하여 백업 받은 XE 코어를 복원할 수 있는지에 대한 여부와 환경 설정에 필요한 자문을 구하는 것이 바람직합니다. 일반적인 경우 호스팅 서비스 회사는 이에 대한 안내를 자세히 해주며 백업파일이 있는 경우 호스팅 회사가 무료로 직접 압축파일을 해제하고 복원 해 주기도 합니다.

일반적인 문제발생의 원인은 이전 서버에서 파일 및 폴더을 압축할 때 nobody 권한에 따른 설정들이 새로운 서버에서 제대로 적용되지 않기 때문에 작은 문제들이 발생 되곤 한답니다.(호스팅 회사의 안내) 따라서 XE 코어 운영에 최적화된 좋은 호스팅 서비스 회사를 선택하고 XE 코어의 백업 파일을 제대로 포장한 후에 서버 이전을 진행하는 것이 가장 확실한 방법임을 추천합니다.
(※ 위와 같은 기본적인 텔넷 명령어들이 받아들여지지 않는 서버 계정은 추천하지 않습니다.)



출처 : http://www.xeschool.com/xe/step1_52

XpressEngine 메일인증 사용시 , 메일이 안올 때 해결법 (현재 코어 버전 1.5.4.1)

/xe/classes/mail/Mail.class.php

Mail.class.php 파일을 받아서 편집기로 열어보면, 137번째줄 정도에

function Mail() { }

이런 함수가 있다. 여기에 한줄을 추가해준다

$this->useGmailAccount("관리자메일계정", "비밀번호");

덮어씌워주고 메일 발송해보면, 발신인 관리자메일계정으로 메일이 가는것을 확인할수 있음 끝


function Mail() { $this->useGmailAccount("관리자메일계정", "비밀번호"); }





***추가(2016.08.07)


sudo apt-get install update

sudo apt-get install sendmail

sudo nano /etc/hosts

sudo apt-get install phpmailer


다 해줘..


https://accounts.google.com/DisplayUnlockCaptcha

https://www.google.com/settings/security/lesssecureapps?rfn=27&rfnc=1&asae=2&anexp=lbe2-R1_A


구글계정 들어가서 승인눌러라


+ Recent posts