\classes\file\FileHandler.class.php 파일의 284줄,

$path_string = preg_replace("/[^a-z0-9-_\\\\\/\.]+/i", '', $path_string);

이부분을 아래와 같이 바꾸시면 됩니다. (콜론문자 추가)

$path_string = preg_replace("/[^a-z0-9-_:\\\\\/\.]+/i", '', $path_string);

 

https://github.com/xpressengine/xe-core/issues/2416

 

IIS에서 1.11.6 FileHandler.class.php 오류 · Issue #2416 · xpressengine/xe-core

$path_string = preg_replace("/[^a-z0-9-_\\\\\/\.]+/i", '', $path_string); IIS에서는 C:\~~와 같이 콜론이 경로명에 포함되기때문에 1.11.6 업데이트를 적용하면 404오류가 발생합니다. 정규식 예외문자부분에 콜론도

github.com

https://xe1.xpressengine.com/qna/23308836

 

1.11.6 버전업 이후 FileHandler.class.php 404 오류 - 묻고답하기 - XpressEngine

서버환경은 아래와 같습니다. IIS  PHP 7.1 7.2 7.3  phpext : core, bcmath, calendar, iconv, mcrypt, readline, mysqlnd, zip, zlib, libxml, openssl, simplexml, xml, wddx, xmlreader, xmlwriter, cgi-fcgi, curl, gd, gettext, mysqli, mbstring, phar,

xe1.xpressengine.com

 

관리자 로그인시 간혹 [기본 URL 설정이 안 되어 있습니다.] 라는 오류 페이지가 뜰 때가 있습니다.

웹사이트를 보면 아주 간혹이라고 하는데 저는 자주 발생하네요. 

 

원인은 /classes/module/ModuleHandler.class.php 파일의 

 

if ($host && ($host != $defaultHost && $host != $site_module_info->domain))

{

throw new Exception('msg_default_url_is_null');

}

 

부분인데... $host 값과 $defaultHost 값이 다를 때 발생하는군요. $site_module_info->domain은 어차피 다르고...

 

$host -> www.도메인명.com

$defaultHost -> 도메인명.com

$site_module_info->domain -> http://도메인명.com

 

해당 파일의 관련된 로직을 검토해 본 결과

/files/config/db.config.php 파일(최초 설치시 생성되는 파일)의 default_url 값에서 도메인명 앞에 www를 붙여주는 것으로 해결 끝!

'XE 1.11.x' 카테고리의 다른 글

IIS에서 1.11.6 FileHandler.class.php 오류  (0) 2023.02.21
xe-module-shop 설치 후 에러 해결  (0) 2018.05.12
XE 함수 (config/func.inc.php)  (0) 2017.03.09
XML쿼리 사용할 때 유의할 점  (0) 2017.02.28
XE url 요청 프로세스  (0) 2017.02.28

개발 지원이 되지 않는 xe-module-shop를 설치 후 사용을 하지 않음에도 불구하고 간혹 ShopAutoloader::loader() 어쩌구 저쩌구 하는 에러가 뜰 때가 있습니다. 해결 방법으로는 /modules/shop/libs/autoload/ShopAutoloader.class.php 파일에서 protected로 선언된 loader 함수를 public로 바꾸면 됩니다.

 

 

모듈 인스턴스 가져오기 

getModule($module_name, $type = 'view', $kind = '')


 getController($module_name)

 getModule($module_name, 'controller')

 getAdminController($module_name)

 getModule($module_name, 'controller', 'admin')

 getView($module_name)

 getModule($module_name, 'view') 

 &getMobile($module_name)

 getModule($module_name, 'mobile') 

 getAdminView($module_name)

 getModule($module_name, 'view', 'admin') 

 getModel($module_name)

 getModule($module_name, 'model') 

 getAdminModel($module_name)

 getModule($module_name, 'model', 'admin') 

 getAPI($module_name)

 getModule($module_name, 'api') 

 getWAP($module_name)

 getModule($module_name, 'wap') 

 getClass($module_name)

 getModule($module_name, 'class') 



쿼리관련

@param string $query_id (module name.query XML file)

@param object $args values of args object

@param string[] $arg_columns Column list

@return object Query result data


executeQuery($query_id, $args = NULL, $arg_columns = NULL)

executeQueryArray($query_id, $args = NULL, $arg_columns = NULL)



시퀀스 관련

XE는 각 테이블별로 ID를 관리하지 않고 전체 테이블을 대상으로 ID를 관리합니다.

그러하기에 각 테이블의 모든 레코드(Row)는 전부 고유의 키값(ID)를 가지고 있습니다.


 getNextSequence()

 새로운 시퀀스를 생성하여 세션에 등록

 setUserSequence($seq)

 지정한 시퀀스를 세션에 등록

 checkUserSequence($seq)

 지정한 시퀀스가 세션에 존재하는지 확인



URL 가져오기

Context::getUrl($num_args = 0, $args_list = array(), $domain = null, $encode = TRUE, $autoEncode = FALSE)


 getUrl('param1', 'value1', 'param2','value2', ...)

 /xe/index.php?mid=index&param1=value1&param2=value2

 getNotEncodedUrl('param1', 'value1', 'param2','value2', ...)

 /xe/index.php?mid=index&param1=value1&param2=value2

 getAutoEncodedUrl('param1', 'value1', 'param2','value2', ...)

 /xe/index.php?mid=index&param1=value1&param2=value2

 getFullUrl('param1', 'value1', 'param2','value2', ...)

 http://localhost/xe/index.php?mid=index&param1=value1&param2=value2

 getNotEncodedFullUrl('param1', 'value1', 'param2','value2', ...)

 http://localhost/xe/index.php?mid=index&param1=value1&param2=value2

 getSiteUrl('param1', 'value1', 'param2','value2', ...)

 /xe/index.php?mid=index&value1=param2&vid=param1

 getNotEncodedSiteUrl('param1', 'value1', 'param2','value2', ...)

 /xe/index.php?mid=index&value1=param2&vid=param1

 getFullSiteUrl('param1', 'value1', 'param2','value2', ...)

 http://localhost/xe/index.php?mid=index&value1=param2&vid=param1

 getCurrentPageUrl()

 http://localhost/xe/index.php?mid=index

 getScriptPath()

 /xe/



HTML 출력

 htmlHeader()

 Html 기본 Header 출력

 htmlFooter()

 Html 기본 Footer 출력

 alertScript($msg)

 alert 함수 스크립트 출력

 closePopupScript()

 window 닫기 스크립트 출력

 reload($isOpener = FALSE)

 document 다시 로드 스크립트 출력



사용 후 확인할 것들

isSiteID($domain)

cut_str($string, $cut_size = 0, $tail = '...')

zgap()

ztime($str)

getTimeGap($date, $format = 'Y.m.d')

getMonthName($month, $short = TRUE)

zdate($str, $format = 'Y-m-d H:i:s', $conversion = TRUE)

getEncodeEmailAddress($email)

debugPrint($debug_output = NULL, $display_option = TRUE, $file = '_debug_message.php')

writeSlowlog($type, $elapsed_time, $obj)

flushSlowlog()

getMicroTime()

delObjectVars($target_obj, $del_obj)

getDestroyXeVars(&$vars)

handleError($errno, $errstr, $file, $line)

getNumberingPath($no, $size = 3)

url_decode($str)

purifierHtml(&$content)

removeHackTag($content)

blockWidgetCode($content)

checkUploadedFile($file)

checkXmpTag($content)

removeSrcHack($match)

mysql_pre4_hash_password($password)

getRequestUriByServerEnviroment()

utf8RawUrlDecode($source)

_code2utf($num)

detectUTF8($string, $return_convert = FALSE, $urldecode = TRUE)

json_encode2($data)



기타 (알 필요가 있을까?)

isCrawler($agent = NULL)

stripEmbedTagForAdmin(&$content, $writer_member_srl)

requirePear()

checkCSRF()

recurciveExposureCheck(&$menu)

changeValueInUrl($key, $requestKey, $dbKey, $urlName = 'success_return_url')



XE의 경우 XML을 사용하여 쿼리를 만듭니다.

 

여기저기 소스를 참고하여 INSERT 쿼리를 하나 만들어서 실행을 해 보았더니, 제대로 INSERT가 되지 않아서 추적해 본 결과 이런 에러를 찾아냈네요.

No data supplied for parameters in prepared statement.

 

이유는 다음과 같습니다.

queries폴더 내의 XML쿼리에서 사용되는 컬럼은 반드시 schemas폴더 내의 테이블 스키마에 정의가 되어 있어야 한다는 것!

 

테스트 중이어서 부분부분 복사하여 만들었더니 이런 걸 몰랐네...구글 검색으로 XE포럼에서 찾아 다행입니다. (진작에 할껄.)

 

 

'XE 1.11.x' 카테고리의 다른 글

xe-module-shop 설치 후 에러 해결  (0) 2018.05.12
XE 함수 (config/func.inc.php)  (0) 2017.03.09
XE url 요청 프로세스  (0) 2017.02.28
CafeXE 모듈 수정해 보기  (0) 2017.02.22
XE 디버깅 설정  (0) 2017.02.17

참고사이트 - 여기저기 인터넷 글들을 읽고...


XE는 index.php 파일을 통해서 모든 요청을 처리합니다. 

index.php 파일을 호출한 적이 없으시다고요? index.php는 기본 호출 페이지이기 때문에 대부분 / 기호로만 호출이 됩니다.


XE는 module와 act로 명명된 파라미터에 데이터를 전달함으로써 요청을 인식하고 처리를 하게 됩니다.

요청 방식은 GET/POST 방식 다 유효한 것으로 짐작됩니다.


GET방식 예시

/index.php?module=모듈명&act=모듈내의처리함수


POST방식 예시

<form action="/index.php" method="POST">

    <input type="hidden" name="module" value="모듈명" />

    <input type="hidden" name="act" value="모듈내의처리함수" />

</form>


AJAX방식 예시

$.ajax({

    method: "POST",

    url: "/index.php",

    data: { module: "모듈명", act: "모듈내의처리함수" }

})

.done(function(result) {

    

});


요청 프로세스만 준수한다면, 위의 방식 외에 다른 방법을 써도 무방하리라 생각합니다. (쓸 수 있다면...)

기존적으로 위의 방법으로 처리가 가능하나 유효 데이터 검증을 위해 filter와 ruleset(1.5.x 이상) 기능을 사용해야 합니다.


'XE 1.11.x' 카테고리의 다른 글

XE 함수 (config/func.inc.php)  (0) 2017.03.09
XML쿼리 사용할 때 유의할 점  (0) 2017.02.28
CafeXE 모듈 수정해 보기  (0) 2017.02.22
XE 디버깅 설정  (0) 2017.02.17
XE 기본 모듈 제작  (0) 2017.02.10

미리 생성된 카페 레이아웃 변경하기

layouts 테이블에서 해당 layout_srl과 동일한 row를 확인하여 layout, title 컬럼 정보를 수정하면 됩니다.

수정 후에도 적용이 되지 않을 경우, /files/faceoff/{layout_srl} 폴더를 삭제해 주십시요.

 

가상사이트에서 발생하는 메인메뉴 링크(url) 오류 고치기

menu.admin.controller.php 파일의 getXmlTree, getPhpCacheCode 함수 내의 

$href = "getSiteUrl('$domain', '','mid','$node->url')";

 

를 다음과 같이 수정합니다.

if ($site_srl)

    $href = "getSiteUrl('$domain', '','mid','$node->url')";

else {

    $db_info = Context::getDBInfo();

    $http_host = ($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];

    $base_url = str_replace($http_host, '', $db_info->default_url);

    $href = sprintf('"%s%s"', $base_url, $node->url);

}

 

수정 후 캐시파일을 반드시 재생성해야 합니다.

'XE 1.11.x' 카테고리의 다른 글

XML쿼리 사용할 때 유의할 점  (0) 2017.02.28
XE url 요청 프로세스  (0) 2017.02.28
XE 디버깅 설정  (0) 2017.02.17
XE 기본 모듈 제작  (0) 2017.02.10
XE 템플릿 문법  (0) 2017.02.09

참고사이트 - https://www.xpressengine.com/tip/17899854


xe 분석을 하다보니 디버깅에 대한 고민이 생겨 정리를 해 보았습니다.


(XE설치경로)/config/config.user.inc.php

  • 기본 설정보다 우선하는 사용자 구성 파일
  • 아래의 정보를 사용자 구성 파일에 새로 작성하여 저장

<?php

    define('__DEBUG__', 0);

    define('__DEBUG_OUTPUT__', 0);

    define('__DEBUG_PROTECT__', 1);

    define('__DEBUG_PROTECT_IP__', '127.0.0.1');

    define('__DEBUG_DB_OUTPUT__', 0);

    define('__LOG_SLOW_QUERY__', 0);

    define('__LOG_SLOW_TRIGGER__', 0);

    define('__LOG_SLOW_ADDON__', 0);

    define('__LOG_SLOW_WIDGET__', 0);

    define('__DEBUG_QUERY__', 0);

    define('__OB_GZHANDLER_ENABLE__', 1);

    define('__ENABLE_PHPUNIT_TEST__', 0);

    define('__PROXY_SERVER__', 'http://domain:port/path');

    define('__ERROR_LOG__', 0);

 

__DEBUG__

어떤 종류의 디버깅 메시지를 출력할 것인지 선택합니다. (비트연산으로 복합적으로 사용 가능)

  • 0x00 : 메시지 미출력
  • 0x01 : debugPrint() 함수에 의한 메시지 출력
  • 0x02 : 출력 소요 시간, 요청/응답 정보 출력
  • 0x04 : DB 쿼리 내역 출력

__DEBUG_OUTPUT__

디버깅 메시지의 출력 방법 선택합니다.

  • 0 : files/_debug_message.php 파일에 출력 (안되던데??)
  • 1 : 웹페이지 소스보기에서 맨 하단에 주석으로 출력
  • 2. : FirePHP 콘솔 출력

선택의 여지가 없이 FirePHP 콘솔 출력을 사용할 듯 합니다. [FirePHP for Chrome]를 설치하시고 개발자도구를 열어보시면 새로운 탭이 생깁니다.


__DEBUG_PROTECT__

디버깅 메시지를 확인할 수 있는 IP 주소에 대한 범위를 지정할 수 있습니다.

  • 0 : 제한없음 (권장하지 않음)
  • 1 : 특정 IP 주소만 허락

__DEBUG_PROTECT_IP__

__DEBUG_PROTECT__가 1일 때, 디버깅 메시지를 볼 수 있게 허가된 IP 주소를 설정합니다.


__DEBUG_DB_OUTPUT__

DB 에러 메시지를 파일 출력할 것인지를 선택합니다.

  • 0 : 에러 메시지 미출력
  • 1 : files/_debug_db_query.php 파일에 출력

__LOG_SLOW_QUERY__

__LOG_SLOW_TRIGGER__

__LOG_SLOW_ADDON__

__LOG_SLOW_WIDGET__

지정된 시간(밀리초)보다 실행시간이 초과되었을 경우 파일 출력할 것인지를 선택합니다.

  • 0 : 메시지 미출력
  • 1 : files/_slowlog_xxxx.php 파일에 출력

__DEBUG_QUERY__

XML 쿼리 ID를 실행되는 query문에 주석으로 출력이 된다는 뜻인 것 같습니다. (사용법을 정확히 모르겠네.)

  • 0 : XML 쿼리 ID 미출력
  • 1 : XML 쿼리 ID 출력

__OB_GZHANDLER_ENABLE__

웹페이지 테이터를 압축 전송할지의 여부를 선택합니다.

  • 0 : 미사용
  • 1 : 사용

__ENABLE_PHPUNIT_TEST__

PHP unit 테스트 사용 여부를 선택합니다.

  • 0 : 미사용
  • 1 : 사용

그 외,

__PROXY_SERVER__, 

__ERROR_LOG__

는 생략하기로 합니다.


'XE 1.11.x' 카테고리의 다른 글

XML쿼리 사용할 때 유의할 점  (0) 2017.02.28
XE url 요청 프로세스  (0) 2017.02.28
CafeXE 모듈 수정해 보기  (0) 2017.02.22
XE 기본 모듈 제작  (0) 2017.02.10
XE 템플릿 문법  (0) 2017.02.09

참고사이트 - http://www.slideshare.net/flyskykr/xe-34832050http://www.xeschool.com/xe/xenote_module_book_about


모듈명 : myboard (다국어지원과 관련한 내용은 기술하지 않습니다.)


모듈 설정 파일


1. 정보파일 (XE설치폴더/modules/myboard/conf/info.xml)


모듈의 정보파일을 작성하여 XE core가 인식할 수 있도록 합니다.


<?xml version="1.0" encoding="UTF-8"?>

<module version="0.2">

    <title xml:lang="ko">나만의 게시판</title>

    <description xml:lang="ko">문서 모듈을 사용한 나만의 게시판 모듈입니다.</description>

    <version>1.0</version>

    <date>2017-02-10</date>

    <category>service</category>

    <author email_address="" link="opencocktail@tistory.com">

        <name xml:lang="ko">블렌더</name>

    </author>

</module>


2. 모듈파일 (XE설치폴더/modules/myboard/conf/module.xml)


<grant> 요소는 모듈에 대한 사용 허가 권한에 대한 내용으로 생성된 각 모듈별 [권한관리 > 권한설정] 에서 확인할 수 있고 <grant> 요소 내 default, target 속성에 들어갈 수 있는  값은 guest/member/manager/root 입니다. 


<action> 요소는 type 속성을 지정하여 해당 파일별로 호출할 수 있는 함수명을 정의하였습니다. standalone 속성은 반드시 mid 파라미터를 가지고 실행을 해야 하는 경우에 false로 세팅을 해야 하며, 이 속성을 사용을 하지 않으면 보안에 문제가 생길 수 있습니다. 


<?xml version="1.0" encoding="utf-8"?>

<module>

    <grants>

        <grant name="list" default="guest">

            <title xml:lang="ko">목록</title>

        </grant>

        <grant name="view" default="guest">

            <title xml:lang="ko">열람</title>

        </grant>

        <grant name="write" default="guest">

            <title xml:lang="ko">작성</title>

        </grant>

        <grant name="delete" default="guest">

            <title xml:lang="ko">삭제</title>

        </grant>

    </grants>


    <permissions>

        <permission action="dispMyboardAdminContentList" target="manager" />

        <permission action="dispMyboardAdminInsertContent" target="manager" />

        <permission action="dispMyboardAdminDeleteContent" target="manager" />

        <permission action="dispMyboardAdminGrantInfo" target="manager" />

        <permission action="dispMyboardAdminSkinInfo" target="manager" />

 

        <permission action="procMyboardAdminInsertContent" target="manager" />

        <permission action="procMyboardAdminDeleteContent" target="manager" />

    </permissions>

    

    <actions>

        <action name="dispMyboardDocumentList" type="view" index="true" />

        <action name="dispMyboardViewDocument" type="view" />

        <action name="dispMyboardInsertDocument" type="view" />

        <action name="dispMyboardDeleteDocument" type="view" />

 

        <action name="procMyBoardInsertDocument" type="controller" />

        <action name="procMyBoardDeleteDocument" type="controller" />

 

        <action name="dispMyboardAdminContentList" type="view" standalone="true" admin_index="true" />

        <action name="dispMyboardAdminInsertContent" type="view" standalone="true" />

        <action name="dispMyboardAdminDeleteContent" type="view" standalone="true" />

        <action name="dispMyboardAdminGrantInfo" type="view" standalone="true" />

        <action name="dispMyboardAdminSkinInfo" type="view" standalone="true" />

 

        <action name="procMyboardAdminInsertContent" type="controller" standalone="true" />

        <action name="procMyboardAdminDeleteContent" type="controller" standalone="true" />

    </actions>

</module>


3. 기본클래스 (XE설치폴더/modules/myboard/myboard.class.php)


모듈의 설치/업데이트/삭제 기능이 구현된 기본 클래스입니다. 클래스 선언 후 필요에 따라 추가적으로 구현을 해 주시면 됩니다.


<?php

    class myboard extends ModuleObject {

 

 

        /**

         * @brief 설치시 추가 작업이 필요할시 구현

         **/

        function moduleInstall() {

 

            return new Object();

        }

 

        /**

         * @brief 설치가 이상이 없는지 체크하는 method

         **/

        function checkUpdate() {

 

            return false;

        }

 

        /**

         * @brief 업데이트 실행

         **/

        function moduleUpdate() {

 

            return new Object(0, 'success_updated');

        }

 

        function moduleUninstall() {

 

            return new Object();

        }

 

        /**

         * @brief 캐시 파일 재생성

         **/

        function recompileCache() {

        }

 

    }

?> 


파일의 마지막에서 PHP 블록의 닫기 태그를 생략할 수 있으며, 때로는 유용합니다. include나 require를 사용할 경우, 원하지 않은 공백이 파일 마지막에 들어가지 않게 함으로써, 나중에 추가 응답 헤더를 추가할 수 있습니다. 또한 출력 버퍼링을 사용할 경우에도 포함한 파일들에 의해서 각 파트의 마지막에 원하지 않은 공백을 피할 수 있으므로 도움이 됩니다.


위의 파일 3개를 경로에 맞추어 올리면 관리자 페이지 내의 설치된 모듈에서 확인이 가능해집니다. 




'XE 1.11.x' 카테고리의 다른 글

XML쿼리 사용할 때 유의할 점  (0) 2017.02.28
XE url 요청 프로세스  (0) 2017.02.28
CafeXE 모듈 수정해 보기  (0) 2017.02.22
XE 디버깅 설정  (0) 2017.02.17
XE 템플릿 문법  (0) 2017.02.09

참고사이트 - https://github.com/xpressengine/xe-tutorial


XE 템플릿 문법은 서버 측에서 PHP 문법으로 해석되며 DB로부터 원하는 정보를 뽑아내어 사용자 화면에 출력합니다. XE 템플릿 문법을 사용하면 모듈 또는 위젯의 기능이나 내용을 허용된 범위 안에서 확장하거나 축소할 수 있습니다.


XE 템플릿 문법을 적용하여 작성하는 방법에는 다음과 같은 네가지가 있습니다.

  • HTML 주석 <!--...--> 안에 작성하는 방법
  • 가상의 <block> 요소 안에 작성하는 방법
  • HTML 요소에 직접 작성하는 방법
  • 주석이나 요소에 의존하지 않고 작성하는 방법

<block> 요소는 HTML 표준 요소가 아니라 XE core만의 가상의 HTML 요소입니다. HTML 요소의 형식을 빌려쓰고는 있지만 제어문을 실행할 뿐 실제로 화면에 요소가 출력되지는 않습니다. cond 속성 또한 XE core만의 가상의 속성으로서 조건문 역할을 합니다.  


변수


변수는 프로그램에서 미리 선언한 내용을 출력하거나 사용자들이 입력한 내용을 다시 화면에 출력할 때 필요합니다. 사용자 화면에서 볼 수 있는 대부분의 내용이 모두 변수로 출력된 것이라 해도 과언이 아닙니다.


변수의 사용 형식은 다음과 같습니다.


기본 형식

{$string}


변수의 기본 형식은 중괄호{} 안에 변수 이름을 적고 앞에 달러($) 기호를 붙이는 것입니다. 변수 이름은 문자열로 작성해야 하고 미리 선언된 이름만 사용할 수 있습니다.


변수 속의 변수 형식

{$string->string}

{$string->string->string}


변수는 또 다른 변수를 포함하고 있을 수 있는데 이런 변수를 사용하려면 하이픈과 꺾는 괄호(->)를 사용하여 변수와 변수를 연결합니다.


변수 속의 함수 형식

{$string->string()}

{$string->string(string or integer)}


변수에 함수를 연결 연결하려면 하이픈과 꺽는 괄호(->)를 사용합니다. 함수 이름 뒤에는 항상 소괄호()가 붙습니다. 소괄호에는 함수의 내용으로 문자열이나 정수를 포함할 수 있습니다. 함수 이름으로는 미리 선언된 이름만 사용할 수 있습니다.


XE core 변수


XE core 변수란 XE core에서 사용하는 변수를 말합니다. XE core 변수는  여러 모듈에서 두루 사용할 수 있습니다. 특정 모듈에서만 사용할 수 있는 변수들도 있는데 이런 변수들은 그냥 변수라고 부릅니다. XE core 변수는 다음과 같습니다. (실제로는 종류가 더 있고, 조금 다른 부분도 있습니다.)

$is_logged (사용자의 로그인 여부를 확인)

$current_url (현재 페이지 URL)

$request_url (XE core 설치  URL)

$logged_info (로그인 사용자에게 자신의 회원 정보를 보여 줌)

$module_info (현재 모듈의 정보를 보여 줌)


조건문


주어진 조건에 따라 필요한 내용을 문맥에 알맞게 출력하거나 출력하지 않아야 할 때 조건문이 필요합니다. 조건문은 if elseif else end 와 조건식으로 이루어져 있습니다. if 문이 시작되면 반드시 end 문으로 닫아서 조건문이 끝났음을 선언해야 합니다. 조건식 내용은 PHP로 해석되기 때문에  PHP에서 사용 가능한 여러가지 연산자를 사용할 수도 있습니다.


다음은 "Welcome XE!" 라는 문장을 표현하는 다양한 조건문 사용법입니다.


조건식이 참이면 포함된 내용을 출력

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

    <p>Welcome XE!</p>

<!--@end-->


조건식이 참이면 포함된 내용을 출력

<block cond="조건식">

    <p>Welcome XE!</p>

</block>


조건식이 참이면 <p>요소와 함께 포함된 내용을 출력

<p cond="조건식">

    Welcome XE!

</p>


<p>요소는 무조건 출력하는데 조건식이 참이면 attr="value" 속성과 값을 출력

<p attr="value"|cond="조건식">

    Welcome XE!

</p>


if elseif else 문을 동시에 사용하면 참 또는 거짓뿐만 아니라 여러가지 조건을 부여하고 조건에 따라 다른 결과를 출력할 수 있습니다.


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

    <p>조건A를 만족하면 이 문장을 출력합니다.</p>

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

    <p>조건A를 만족하지 못하고 조건B를 만족하면 이 문장을 출력합니다.</p>

<!--@else-->

    <p>조건A, 조건B를 동시에 만족하지 못하면 이 문장을 출력합니다.</p>

<!--@end-->


위와 같은 조건식을 XE core 1.4.4 버전부터 새로 추가된 cond 조건식으로 바꾸면 다음과 같이 더 단순하게 표현할 수 있습니다.


<p cond="조건A">조건A를 만족하면 이 문장을 출력합니다.</p>

<p cond="조건B">조건B를 만족하면 이 문장을 출력합니다.</p>

<p cond="!조건A && !조건B">조건A, 조건B를 동시에 만족하지 못하면 이 문장을 출력합니다.</p>


반복문


주어진 조건에 따라 필요한 내용을 반복해서 출력해야 할 때 반복문이 필요합니다. 반복문은 foreach end 와 조건식으로 이루어져 있습니다. foreach 문이 시작되면 반드시 end 문으로 닫아서 반복문이 끝났음을 선언해야 합니다.


$key값 없이 <li>...</li> 반복

<!--@foreach(배열변수명 as $value)-->

    <li>{$value}</li>

<!--@end-->


<block loop="배열변수명=>$value">

    <li>{$value}</li>

</block>


<li loop="배열변수명=>$value">{$value}</li>



$key값 포함 <li>...</li> 반복

<!--@foreach(배열변수명 as $key => $value)-->

    <li>{$key}/{$value}</li>

<!--@end-->


<block loop="배열변수명=>$key,$value">

    <li>{$key}/{$value}</li>

</block>


<li loop="배열변수명=>$key,$value">{$key}/{$value}</li>



$초기값 0부터 시작하여 <li>...</li> 100회 반복

<!--@foreach($i=0;$<100;$i++)-->

    <li>...</li>

<!--@end-->


<block loop="$i=0;$<100;$i++">

    <li>...</li>

</block>


<li loop="$i=0;$<100;$i++">...</li>


loop 속성은 HTML 표준 속성이 아니라 XE core만의 템플릿 문법 중 하나입니다. loopforeach 문의 조건식을 표현할 때 사용하는 가상의 속성입니다.


간단한 PHP 사용


중괄호 안에 앳(@) 기호를 포함하면 간단한 PHP 문장을 사용할 수 있습니다.


{@$is_logged = Context::get('is_logged')}


PHP문을 사용할 때 하나의 문장은 하나의 줄에 작성해야 합니다. 예를 들어 다음과 같은 문장은 PHP에서는 문제가 없지만 XE에서는 치명적인 오류를 내기도 합니다. 여러 개의 문장이 한 줄에 작성되었기 때문입니다.


{@$test = 365; $test = $test * test}


위의 문장은 다음과 같이 한 줄에 한 문장씩 작성해야 합니다.


{@

    $test = 365;

    $test = $test * $test;
}


include 문


여러 페이지에 걸쳐 반복되는 컨텐츠 블록이 있으면 별도의 파일로 분할하여 관리하는 것이 편리합니다. 하나의 파일만 수정하면 여러 페이지에 한번에 적용할 수 있기 때문입니다. include는 별도의 파일을 현재 페이지로 불러오는 명령어입니다.


<!--#include("header.html")-->

<include target="header.html" />


<include /> 요소는 HTML 표준 요소가 아니라 XE core만의 가상의 요소입니다. HTML 요소의 형식을 빌려 쓰고는 있지만 include문을 실행할 뿐 실제로 화면에 <include /> 요소가 출력되지는 않습니다. target 속성 또한 XE core만의 템플릿 문법 중 하나입니다. target 속성에는 포함(include)하려면 파일의 경로로 작성합니다.


JS & CSS 파일 참조


JS & CSS 파일을 HTML 문서에서 참조하는 방법을 설명합니다.


JS & CSS 파일 참조

<!--%import("xe.js")-->

<!--%import("xe.css")-->

또는

<load target="xe.js" />

<load target="xe.css" />


HTML 문서의 <head> 요소에서 xe.js & xe.css 파일을 참조합니다. 결과 코드는 다음과 같습니다.


<head>

    <!-- js 파일 -->

    <script type="text/javascript" src="xe.js"></script>

    <!-- css 파일 -->

    <link rel="stylesheet" type="text/css" href="xe.css" />

</head>


<body> 요소에서의 JS 파일 참조

<load target="xe.js" type="body" />


<body> 요소에서 JS 파일을 불러오면 <body> 요소가 끝나기 직전에 JS 파일 참조가 선언됩니다. 결과 코드는 다음과 같습니다.


<body>

    ......

    <script type="text/javascript" src="xe.js"></script>

</body>


CSS 파일은 HTML 문서의 <head> 요소에서만 참조할 수 있습니다. <body> 요소에서 별도의 CSS 파일을 참조하면 HTML 문법 오류가 발생합니다.


CSS 파일 media 지정

<load target="xe.css" media="print" />


CSS 파일의 대상이 되는 미디어를 선택하여 지정할 수 있습니다. 결과 코드는 다음과 같습니다.


<head>

    <link rel="stylesheet" type="text/css" href="xe.css" media="print" />

</head>


IE 조건부 주석 사용

<load target="xe.js" targetie="IE 6" />

<load target="xe.css" targetie="IE 6" />


targetie 속성을 사용하면 JS & CSS 파일을 IE의 특정 브라우저 버전에서만 해석할 수 있도록 조건부 주석으로 출력합니다. 결과 코드는 다음과 같습니다.


<!--[if IE 6]>

    <script type="text/javascript" src="xe.js"></script>

    <link rel="stylesheet" type="text/css" href="xe.css" />

<![endif]-->


이 코드는 모든 브라우저에서 주석으로 처리하지만 IE 6 브라우저는 주석으로 처리하지 않고 해석합니다.


JS & CSS 파일 참조 선언 순서 변경

<load  target="xe.js" index="-1" />

<load  target="xe.css" index="-1" />


index 속성을 사용하면 JS & CSS 파일의 선언 순서를 변경할 수 있습니다.


index 속성의 값은 양의 정수 또는 음의 정수를 사용할 수 있습니다. 음의 정수를 사용하면 더 빨리 선언할 수 있고, 양의 정수를 사용하면 더 늦게 선언할 수 있습니다. index 값을 "-1" 로 지정하면 다른 JS & CSS 파일보다 한 줄 빠른 위치에서 선언됩니다.


CSS 파일은 동일한 명령이 충돌하는 경우 나중에 선언된 값이 우선 순위를 갖게 되기 때문에 우선 순위를 높게 두어야 하는 경우 나중에 선언하는 것이 좋습니다.


XML JS 필터 적용


XML JS 필터는 XML 형식으로 입력 항목을 정의해 두면 폼을 전송할 때 유효성 검사를 자동으로 수행하는 기능입니다. 유효성 검사는 XML 기반으로 자동으로 변환된 자바스크립트가 수행하므로 사용자는 복잡한 자바스크립트를 작성할 필요가 없습니다. XML JS 필터는 유효성 검사를 통과한 폼 데이터를 어떤 모듈의 어떤 명령어로 보낼 것인지 정하는 기능도 합니다.


XML JS 필터를 적용하는 방법은 CSS, JS 파일을 참조하는 문법과 동일합니다.


<!--%import("valid.xml")-->


이렇게 XML JS 필터를 불러오면 XML 문서는 JS 문서로 컴파일되어 소스 코드로 출력됩니다. 출력 결과는 다음과 같습니다.


<body>

    ......

    <script type="text/javascript" src="valid.js"></script>

</body>


참조 파일 제거


경로가 일치하는 참조 파일 제외


<unload target="xx.xx" />


위젯 삽입하기


위젯은 XE core 또는 모듈에 포함된 정보를 사용자에게 의미있는 형태로 가공해서 보여주는 인터페이스 역할을 합니다. 웹사이트 초기화면에 최근 게시물을 나타내는 위젯과 로그인 양식을 보여주는 위젯이 XE core에 포함되어 있습니다. 위젯이 존재하는 이유는 스킨 제작자가 복잡한 프로그램 로직을 모르는 경우에도 쉽게 원하는 기능을 구현할 수 있도록 지원하기 위해서입니다.


제작자는 템플릿 코드 한 줄만으로도 원하는 기능을 구현할 수 있습니다. 위젯을 삽입하기 위한 템플릿 코드는 <img /> 요소에 widget이라는 속성을 포함하고 있습니다. <img /> 요소는 HTML 표준이기도 하지만 widget이라는 속성을 포함하면서 XE 템플릿 문법으로 해석되어 서버에서 표준 HTML로 변환됩니다.


다음은 로그인 양식을 출력하는 위젯 삽입 코드입니다.


<img widget="login_info" skin="xe_official" />


위젯을 삽입하기 위한 코드는 XE 관리자 페이지에서 사이트 설정 > 위젯 을 선택하고 코드 생성 기능을 사용하면 자동으로 생성됩니다.


주석 처리


<!--// 주석 처리 -->


'XE 1.11.x' 카테고리의 다른 글

XML쿼리 사용할 때 유의할 점  (0) 2017.02.28
XE url 요청 프로세스  (0) 2017.02.28
CafeXE 모듈 수정해 보기  (0) 2017.02.22
XE 디버깅 설정  (0) 2017.02.17
XE 기본 모듈 제작  (0) 2017.02.10

+ Recent posts