Skip Navigation

XE 레이아웃 카메론 XE LAYOUT CAMERON XE2.0.11


애드온
2020.08.14 14:56

연령구분 회원가입 애드온

(*.224.201.148) Views 97 Votes 0 Comment 0
Extra Form
원문주소
페이지 00016
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

Member_join_extend Add-on

 

14세 이상/미만 구분 회원가입 애드온 만들기

 

SMaker님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/wiki/18257064

 

회원가입시 14세 이상/미만 구분 및 약관/개인정보취급방침 동의 절차를 추가하는 애드온 입니다.
회원가입 폼인 "dispMemberSignUpForm" 액션시 애드온 호출 부분인 'after_module_proc' 에서 세션을 체크하여 중간에 애드온의 템플릿 파일로 치환하여 화면을 바꾸고 "동의" 시 애드온의 action을 추가하여 세션을 추가하고 원래의 회원가입 폼으로 전환해 주는 기능입니다.

 

creating_member_join

 

개발에 앞서 파일 및 디렉토리 준비하기

모든 모듈은 XE_ROOT(XE 설치디렉토리)/addons/ 에 위치 합니다. 앞으로 함께 만들 애드온은 member_join_extend 이기 때문에 member_join_extend 라는 디렉토리를 만들고 하위 디렉토리를 아래와 같이 만듭니다.

 

addons/member_join_extend/

  • conf/
    • info.xml
  • tpl/
    • member_join_extend.html
    • join.css
  • lang/
    • ko.lang.php
  • member_join_extend.addon.php
  • member_join_extend.js

 

member_join_extend은 회원가입 폼 action시 중간에 가로채 애드온의 템플릿으로 교체하여 화면을 출력하기 때문에 tpl 디렉토리와 템플릿 그리고 언어팩이 필요합니다.

 

애드온의 정보 파일 info.xml 작성하기

 

14세 이상/미만의 구분여부, 회원가입약관, 회원가입약관 표출여부, 개인정보취급방침, 표출여부, 개인정보수집 항목을 입력받는 확장변수(extra_vars)를 정보파일에 추가합니다. (정보파일 기본형식에서 확장변수 등록 부분)

 

▶ addons/member_join_extend/conf/info.xml

 

<extra_vars>
    <var name="use_agreement" type="select">
        <title xml:lang="ko">이용약관 표시</title>
        <description xml:lang="ko">이용약관을 표시 및 동의를 받습니다.</description>
        <options value="">
            <title xml:lang="ko">표시하지 않음</title>
        </options>
        <options value="Y">
            <title xml:lang="ko">표시함</title>
        </options>
    </var>
    <var name="agreement" type="textarea">
        <title xml:lang="ko">이용약관</title>
    </var>
    <var name="use_private_agreement" type="select">
        <title xml:lang="ko">개인정보취급방침 표시</title>
        <description xml:lang="ko">개인정보취급방침을 표시 및 동의를 받습니다.</description>
        <options value="">
            <title xml:lang="ko">표시하지 않음</title>
        </options>
        <options value="Y">
            <title xml:lang="ko">표시함</title>
        </options>
    </var>
    <var name="private_agreement" type="textarea">
        <title xml:lang="ko">개인정보취급방침</title>
    </var>
    <var name="private_gathering_agreement" type="textarea">
        <title xml:lang="ko">개인정보 수집 및 이용</title>
    </var>
    <var name="use_junior_join" type="select">
        <title xml:lang="ko">14세 이상/미만 구분</title>
        <options value="">
            <title xml:lang="ko">구분하지 않음</title>
        </options>
        <options value="Y">
            <title xml:lang="ko">구분함</title>
        </options>
    </var>
    <var name="msg_junior_join" type="textarea">
        <title xml:lang="ko">14세미만 메세지</title>
        <description xml:lang="ko">14세미만 회원가입시 출력할 메시지를 입력합니다.</description>
    </var>
</extra_vars>

 

 

block_word.addon.php 동작부분 작성하기

 

member_join_extend 애드온은 가입폼인 dispMemberSignUpForm action이 실행된 뒤인 after_module_proc 시점에서 세션을 유무를 체크해 세션이 없으면 템플릿을 애드온의 템플릿과 교체합니다.


애드온의 동의시 exec_xml()로 'MemberJoinExtendAgree' 를 호출하고 'before_module_init' 시점에서 애드온의 'MemberJoinExtendAgree' 액션을 받아 세션을 등록한 뒤 dispMemberSignUpForm 페이지를 자바스크립트로 리로드 합니다.


그리고 실제 회원 가입이 완료 되었을 경우에는 세션을 삭제합니다.

 

▶ addons/member_join_extend/member_join_extend.addon.php

 

<?php
    if(!defined("__ZBXE__")) exit();
 
    /**
     * @file member_join_extend.addon.php
     * @author sol (sol@ngleader.com)
     * @brief 회원 가입 화면 출력시 (dispMemberSignUpForm) 14세 이상/미만 구분, 이용약관 출력
     **/
 
    if($called_position == 'before_module_init'){
 
        // 실제 가입시 체크 (세션확인후 세션이 없으면 에러 표시)
        if(Context::get('act')=='procMemberInsert'){
            // session 체크
            if(!$_SESSION['member_join_extend_authed_act']){
                $this->error = "msg_not_permitted";
            }
 
        // 동의시 action 
        }else if(Context::get('act') =='MemberJoinExtendAgree'){
            // session 추가 (javascript의 exec_xml로 호출, 세션을 등록하고 XE의 출력인 XML_RPC로 success 출력)
            $_SESSION['member_join_extend_authed'] = true;
 
            // xml_rpc return 
            header("Content-Type: text/xml; charset=UTF-8");
            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
            header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
            header("Cache-Control: no-store, no-cache, must-revalidate");
            header("Cache-Control: post-check=0, pre-check=0", false);
            header("Pragma: no-cache");
            print("<response>\r\n<error>0</error>\r\n<message>success</message>\r\n</response>");
 
            Context::close();
            exit();
        }
 
    } else if($called_position == 'after_module_proc') {
 
        if(Context::get('act') == "dispMemberSignUpForm"){
 
            // 세션체크하여 애드온 실행
            if(!$_SESSION['member_join_extend_authed']){
 
                // 애드온의 템플릿과 교체
 
 
            }else{
                // 세션을 변경하고 회원가입 폼으로 보냄 
                unset($_SESSION['member_join_extend_authed']);
                $_SESSION['member_join_extend_authed_act'] = true;
            }
 
        // session 삭제
        }else if(in_array(Context::get('act'),array('procMemberInsert'))){
 
            // 세션을 삭제하고 procMemberInsert 액션 실행
            unset($_SESSION['member_join_extend_authed_act']);
        }
    }
?>

 

extra_vars와 $addon_info

 

info.xml에서 설정한 extra_vars값은 애드온에서 $addon_info 의 stdClass member variable로 사용하면 됩니다.
// 애드온의 템플릿과 교체 부분에서 아래와 같이 애드온 확장변수 값을 받아 정리한뒤 Context를 통해 템플릿에서 사용할 변수로 셋팅합니다.

 

// 애드온의 템플릿과 교체

// addon options

if($addon_info->use_agreement=='Y' && $addon_info->agreement){

    Context::set('agreement',$addon_info->agreement);

}

if($addon_info->use_private_agreement=='Y' && $addon_info->private_agreement){

    Context::set('private_agreement',$addon_info->private_agreement);

    Context::set('private_gathering_agreement',$addon_info->private_gathering_agreement);

}

if($addon_info->use_junior_join=='Y'){

    Context::set('use_junior_join',$addon_info->use_junior_join);

}

 

compile template 및 치환

 

애드온 실행 시점인 after_module_proc 부분은 모듈이 실행된 뒤 바로 애드온이 실행됩니다. member 모듈의 dispMemberSignUpForm action으로 들어왔을 때 ModuleObject class에서 dispMemberSignUpForm action이 실제 실행되고 해당 템플릿과 템플릿 위치를 설정하고 after_module_proc 시점에서 애드온이 실행되고 DisplayHandler class에서 컴파일되어 보여지게 됩니다. after_module_proc 시점에서 ModuleObject::setTemplatePath() 와 ModuleObject::setTemplateFile() 로 애드온의 템플릿 파일로 over setting 하여 애드온의 템플릿이 DisplayHandler 에 넘겨지도록합니다. (위 내용에 이어서 추가한다.)

 

// load addon lang

Context::loadLang(_XE_PATH_.'addons/member_join_extend/lang');

Context::addHtmlHeader(sprintf("<script type=\"text/javascript\">//<![CDATA[\nvar msg_junior_join ='%s'; var msg_check_agree ='%s';\n//]]></script>",trim($addon_info->msg_junior_join),Context::getLang('msg_check_agree')));

 

// change module template

Context::addJsFile('./addons/member_join_extend/member_join_extend.js',false);

$addon_tpl_path = './addons/member_join_extend/tpl';

$addon_tpl_file = 'member_join_extend.html';

 

$this->setTemplatePath($addon_tpl_path);

$this->setTemplateFile($addon_tpl_file);

 

member_join_extend.js 작성하기

 

동의서 작성시 사용할 JS파일에서는 목적한 버튼을 클릭했을때 체크폼에 체크된 갯수를 확인하고 같다면(2개가 있고 2개가 체크 되었다면) exec_xml()로 모듈에 대한 액션을 호출하고 콜백함수를 실행한다. 다른 버튼을 클릭했을 때는 안내 메시지를 alert()으로 보여준다.

 

▶ addons/member_join_extend/member_join_extend.js

 

(function($){
    $(function() {
        // agree
        $('input.member_join_agree').click(function(){
            if($('.member_join_extend :checkbox').length == $('.member_join_extend :checked').length){
                exec_xml('memberjoinextend','MemberJoinExtendAgree',new Array(), function(){ location.reload()});
            }else{
                alert(msg_check_agree);
            }
        });
 
        // junior
        $('input.junior_join').click(function(){ if(msg_junior_join) alert(msg_junior_join); });
    });
})(jQuery);

 

★ exec_xml() : XE에서 Ajax 요청(Request)을 하는 자바스크립트 함수

 

exec_xml ( 모듈명,
                act명,
                arguments,
                callback_function,
                response_tags
               );

 

 

구분 회원가입 애드온 동작의 이해

 

애드온의 실행파일과 동작의 흐름을 이해하기 위한 이미지이다. 먼저 쿠키(COOKIE)와 세션(SESSION)에 대한 이해가 필요한데, 쿠키는 클라이언트 PC(사용자 측)에서 굽고, 보관하는 것이지만 세션은 서버측에서 굽고 임시로 관리하는 전역변수와 같은 개념이다. 방문자가 사이트에 접근하면, PHP가 자동적으로(session.auto_start를 1로 설정시) 방문자에게 세션 id라고 불리는 고유 id를 할당한다. 이것은 접근하는 동안만 유지하는 한시적 방법이고 요청과 지속적인 접근에 대해 어떠한 데이터를 유지하기도 하며 이전에 저장해둔 환경을 재생성하기도 한다.

 

동작의 흐름에서 눈여겨보아야 할 것은 2가지이다. 액션과 세션, "무엇을 할 것인가?" 해야 할 일의 내용이 액션이다. "그러면 필요한 세션을 가지고 있는가?" 무척 재미있는 부분이다. 액션(해야 할 일)은 같을 수 있지만 세션의 유무에 따라 내용이 달라 질 수 있는 것이다. (일반적으로 과자 이미지는 쿠키를 표현할 때 사용하지만 세션은 딱히 대표되는 이미지가 없어서 쿠키처럼 사용하였다. 여기서는 세션이다...^^)

 

 

member_join_extend_addon

 

  • 애드온이 켜져 있다면 애드온은 항상, 언제나 코어의 흐름에 개입한다. 따라서 여러개의 애드온이 켜져 있다면 코어가 느려지는 것은 당연하다. 다만 모듈의 액션이 내게 해당한다면(act=='dispMemberSignUpForm') 작동하게 되지만 해당사항이 없다고 판단되면 원래의 코어 흐름으로 되돌아 가는 것이다. 이 애드온은 항상 2군데 호출 시점에 참견한다. "모듈 객체 생성 이전"과 "모듈의 동작 이후"이다.
  • ① 회원가입 링크를 클릭하면 비로서 액션의 조건이 일치하게 된다. 회원가입을 위한 액션은 dispMemberSignUpForm 이다. 따라서 모듈의 동작 이후 액션이 일치하는 부분에서 시작하게 되는데 이때 세션을 물어본다. "너... 세션 없니?" 당연히 없다. 따라서 내용을 실행한다.
  • ② 실행할 내용이라는 것은 별거 아니다. 애드온이 별도로 준비한 템플릿 파일을 찾아 보여준다.
  • ③ 원래의 회원가입 폼대신 보여준 것은 동의서다. 체크박스에 체크하고 동의하면 액션(해야 할 일 == MemberJoinExtendAgree)을 다시 줘서 돌려 보낸다. "넌 너무 어려!"라고 판단되면 액션은 주지 않는다.
  • ④ 새로운 액션을 들고 애드온에 재진입하였다. 물론 코어의 모듈 객체 생선 이전에서 애드온이 다시 참견한 것이지만 방금전 받았던 미션의 내용이 같기 때문에 4번으로 들어갈 수 있었다. 그러자 "세션A"를 준다. "참 잘했어요! 우선 이거 받아요!"
  • ⑤ 세션A를 갖고 있었을 뿐이다. 그냥 기다렸다. 그런데 애드온이 "모듈의 동작 이후"로 넘어갔다... 세션을 맛보지도 못했는데... 얘는 아직 해야 할 일이 있었던 것이다. dispMemberSignUpForm!
  • ⑥ 같은 액션을 가지고 있었지만 이번에는 세션이 있다. 따라서 else 구문으로 진입한다. 그러자 세션A를 뺏는다... 그리고는 세션B를 준다. "누구 약올리나?" 애드온에서 더이상 해야 할 일이 없다. 모듈이 실행되고 나면 이제 회원가입 폼을 보여 줄 것이다.
  • ⑦⑧ 회원가입 폼을 작성하고 나면 새로운 액션을 호출한다. procMemberInsert 즉 입력된 자료를 DB에 입력해야 하는데 페이지가 다시 리로드 된다.(액션을 호출하면 코어가 index.php부터 다시 시작되는 것 알고 있지!) 빨리 작성하라고 재촉하는 바람에 아직 세션B를 맛보지도 못했는데...
  • ⑨ 애드온에 다시 진입했더니 검사를 해본단다. "액션이 procMemberInsert인 놈 중에 혹시 세션B 없는 놈 있냐?" 반말이다. 무섭다. 나는 세션B가 있으니 가만히 있어야 했다. 세션B가 없으면 쫓겨날 것 같다...
  • ⑩ 모듈의 동작 이후로 넘어오자 액션이 procMemberInsert 인 놈을 찾는다..."거기 너! 세션B 이리 주고 이제 DB로 가봐!" 그나마 가지고 있던 세션B를 뺏고 회원가입 폼에 작성했던 데이터만 가지고 DB로 가라고 한다.

 

14세 이상/미만 구분 회원가입 애드온 다운로드

 

member_join_extend_addon.zip

TAG •
Attach Images or Files

Drop your files here, or click the button to the left.

Maximum File Size : 0MB (Allowed extentsions : *.*)

0 file(s) attached ( / )

제로XE/라이믹스/그누/워드프레스

회원만 쓰기 가능합니다.

List of Articles
No. Category Subject 페이지 Author Date Views
Notice Tip&Tech xe 동작순서 부운영자 2015.08.24 977
Notice Tip&Tech XE의 애드온 및 모듈의 기능 요약표 부운영자 2015.01.16 1219
Notice Tip&Tech XEReferences 부운영자 2014.11.29 875
Notice Tip&Tech XE 스킨 제작 매뉴얼 v1.1 (Korean, PDF) file 부운영자 2014.11.29 1236
Notice Tip&Tech XE 개발자 매뉴얼 v1.1 (Korean, PDF) file 부운영자 2014.11.29 1732
Notice Tip&Tech xe 레퍼런스 모음 file 부운영자 2014.10.10 2501
265 Tip&Tech PHP Warning: Division by zero https://stackoverflow.com/questions/18408640/php-warning-division-by-zero If the expected value can be 0 (therefore does not need validation), I do this to keep things quick, clean and easy: ==&gt;깜금한 처리 $percentage = $sum1 / ($sum2 ?: 1) 부운영자 2021.05.16 1
264 Tip&Tech PHP용 로그 라이브러리 공유합니다. PHP용 로그 라이브러리 공유합니다. PHP 개발할때 가장 불편한 점은 로그 출력이죠. 서버 사이드에서 실행되는 스크립트이다보니 로그가 파일로 출력되어 화면에 실시간으로 띄워서 보기가 어렵습니다. 보통 tail로 살펴보는 방법이 일반적으로 사용됩니다만 이 역시 서버의 특성상 나 혼자 접속한 개발서버라면 모르겠지만 ... 부운영자 2021.03.29 48
263 XE/라이믹스 게시글 DB 수동이동 update rx_documents set module_srl = 288812 where module_srl = 118187; update rx_comments set module_srl = 288812 where module_srl = 118187; update rx_files set module_srl = 288812 where module_srl = 118187; 부운영자 2021.03.17 27
262 매뉴얼 xml 쿼리 사용법 undefined groom.com 부운영자 2021.03.08 29
261 Tip&Tech plusad_widget 안되는것 ? &lt;div id=&quot;plusad_widget_wrap&quot;&gt; &lt;div class=&quot;plusad_point&quot; cond=&quot;$widget_info-&gt;ad_point_use == &#039;yes&#039;&quot;&gt;&lt;a href=&quot;{getUrl(&#039;&#039;,&#039;mid&#039;,$widget_info-&gt;name,&#039;act&#039;,&#039;dispPlusadlist&#039;)}&quot; title=&quot;광고를 등록하세요&quot;&gt;AD&lt;/a&gt;&lt;/div&gt; &lt;ul id=&quot;plusad_widget&quot;&gt; &lt;!--@if(!$ad_list)--&gt; &lt;li&gt; &lt;a style=&quot;font-weight:bold; color:red;&quot; h... 부운영자 2021.02.21 58
260 Tip&Tech Add chunk size setting to editor/uploader 대용량 파일 첨부 지원 by kijin · Pull Request #663 · rhymix/rhymix 라이믹스 1주년 기념 패치!!! 더이상 호스팅 업체의 업로드 용량 제한이나 클라우드플레어의 100MB 제한에 신경쓸 필요가 없도록 합니다. 단독서버라도 php.ini에서 업로드 허용 용량을 지나치게 키우면 메모리 사용량이 덩달아 늘어나므로 조금씩 나눠... 부운영자 2021.02.20 29
259 Tip&Tech 애드센스 광고 출력 안되는 심각한 문제 애드센스 광고 출력 안되는 심각한 문제 페이지 내에 반응형 광고가 포함되어 있는 경우 발생하는 큰 문제 입니다. 저도 작지만 애드센스 수입이 고정적으로 있었는데 최근 급격한 수입이 감소한 것을 이상하게만 생각하다 오늘 이것 저것 점검하면서 또 질문게시판의 게시글을 보고 점검하면서 대략 원인을 찾았습니다. 우... 부운영자 2021.02.19 24
258 XE/라이믹스 애드센스 출력이 안되는 케이스 중 하나 애드센스 출력이 안되는 케이스 중 하나 예전에는 문제가 없었던 것 같은데 최근 구글에서 변화가 있었는지 이런 케이스는 구글광고가 오류가 나고 출력이 안되니 참고해서 광고 출력 방법을 변경하셔야 할 것 같아 공유해 드립니다. 화면에 출력될 광고 여러개를 한꺼번에 요청하고 그중 일부는 display:none 등으로 처리하... 부운영자 2021.02.04 23
257 XE/라이믹스 XECon2016 - XE1 가지치기와 오픈소스 생태계의 미래. 포에시스 대표, 라이믹스 개발자... 부운영자 2021.01.05 26
256 Tip&Tech Font Awsome, XEICON 함께 사용하기 undefined xsitelab.com 부운영자 2020.11.26 135
255 Tip&Tech 트래픽 호로록 하는 도둑놈 (feat. 에디터 자동완성모듈) 트래픽 호로록 하는 도둑놈 (feat. 에디터 자동완성모듈) 자동완성모듈 기능 중 이미지 편집 기능 사용할 경우 스크립트 하나가 필요합니다. 그런데 이게 무려 2M에 가까운 용량입니다. 물론 필요한 파일은 사용해야죠. 그런데 문제는 실제 누구에게 필요한가? 를 생각하면 불필요한 트래픽이 누수되는 것을 확인할 수 있습... 부운영자 2020.10.10 133
254 워드프레스 스팸방지 이미지 엑박방지 htacces wp &lt;IfModule mod_rewrite.c&gt; Options All -Indexes RewriteEngine on # Block Bad Bots &amp; Scrapers SetEnvIfNoCase User-Agent &quot;Aboundex&quot; bad_bot SetEnvIfNoCase User-Agent &quot;80legs&quot; bad_bot SetEnvIfNoCase User-Agent &quot;360Spider&quot; bad_bot SetEnvIfNoCase User-Agent &quot;^Java&quot; bad_bot SetEnvIfNoCase User-Agent &quot;^Cogent... 부운영자 2020.10.02 179
253 워드프레스 워드프레스 설치순서 3 secret 부운영자 2020.10.02 4
252 Tip&Tech 네이버 클라우드 플랫폼의 'Chatbot' 서비스를 소개합니다 [간단 챗봇 만들기] 네이버 클라우드 플랫폼의 ´Chatbot´ 서비스를 소개합니다. 안녕하세요, 네이버 클라우드 플랫폼입니다.몇 달 전, Chatbot 서비스 출시 소식을 전해드렸었는데요.... 네이버 블로그 | 네이버 클라우드 플랫폼 - 네이버 블로그 | 네이버 클라우드 플랫폼 부운영자 2020.08.29 97
251 Tip&Tech memcache, memcached 비교 memcache, memcached 비교 PHP Client Comparison There are primarily two clients used with PHP. One is the older, mor... 네이버 블로그 | brian2님의 블로그 - 네이버 블로그 | brian2님의 블로그 탑돌이 2020.08.22 82
250 위젯 확장변수 출력 위젯 만들기 Extra_vars Widget 확장변수 출력(extra_vars) 위젯 만들기 sol님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/18235319 게시판의 게시물의 확장 변수를 출력하는 위젯입니다. Document 모듈을 이용하여 관리자가 원하는 확장변수를 순서데로 출력하는 위젯입니다. 개발에 앞서 디렉토리 준비하기 모든... 0004 부운영자 2020.08.15 104
» 애드온 연령구분 회원가입 애드온 Member_join_extend Add-on 14세 이상/미만 구분 회원가입 애드온 만들기 SMaker님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/wiki/18257064 회원가입시 14세 이상/미만 구분 및 약관/개인정보취급방침 동의 절차를 추가하는 애드온 입니다. 회원가입 폼인 &quot;dispMemberSignUpForm&quot; 액션시 애드온 호... 00016 탑돌이 2020.08.14 97
248 애드온 단어 차단 애드온 만들기 Block_Word Add-on 단어 차단 애드온 만들기 sol님의 글을 전문인용하여 재구성하였다. - http://xe.xpressengine.net/18229352 block_word 애드온은? 사용자가 쓴 게시물과 댓글이 출력될 때 애드온 설정에 등록해 놓은 문자들을 &#039;***&#039; 로 가려서 보여주는 애드온을 만들어 볼 것 입니다. 애드온에서 단어들을 입력 받고, ... 00015 탑돌이 2020.08.14 153
247 Tip&Tech 상단네비 목록(위로) 목록(아래로) 스크립트 안먹힘 위 두개 안먹힘 라이믹스 스케치북 게시판 및 스케치북 게시판 1.72 스크롤 이슈 https://xetown.com/index.php?mid=qna&amp;category=671911&amp;document_srl=757026&amp;comment_srl=757413&amp;page=1 기존에 작성했던 글입니다. 라이믹스 스케치북 게시판과 스케치북 게시판 1.7.2에서 이상하게 &quot;크롬&quot;에서만 위, 아래, 상단 바 댓글가... file 탑돌이 2020.08.14 126
246 애드온 기초 팝업 윈도우 애드온 만들기 Popup window Add-on 기초 팝업 윈도우 애드온 만들기 애드온의 작동 방법과 호출 시점을 살펴보고 확장변수를 활용하여 외부 HTML 파일을 찾아 팝업윈도우 형태로 출력해 주는 기초적인 팝업 윈도우 애드온을 만들어 본다. 팝업 윈도우 애드온의 정보 파일(info.xml) 작성하기 XE코어가 xe/ 디렉터리에 설치되어 있다면 xe/... 00014 탑돌이 2020.08.14 303
List
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 14 Next
/ 14