xe1 addon 개발시 주의 사항

Web Tech/PHP 2017. 2. 11. 00:03

class나 function 선언시 function_exists나 class_exists를 이용하지 않으면 미리보기시 해당 class나 function이 두번 선언되어서 에러가 발생할 수 있음


상수 define, defined를 이용하거나  function_exists나 class_exists를 이용하여 회피


아래 예제 코드는 xeschool 에 있는 pop opener입니다.


예제 코드

<?php

    if(!defined("__XE__")) exit();

    if(Context::get('module') == 'admin') return;


    if($called_position == 'before_module_proc') {

        // 팝업 스크립트 처리

        function getPopupScript($val) {


            if($val->content) {

                $order = array("\r\n", "\n", "\r");

                $replace = '';

                $val->content = str_replace($order, $replace, $val->content);

                $val->content = str_replace("'", '&#39;', $val->content);

            }


            $popup_content = "{id:'".$val->popup_srl."'"

                .($val->popup_type?",popup_type:'".$val->popup_type."'":"")

                .($val->content?",content:'".$val->content."'":"")

                .($val->popup_url?",url:'".$val->popup_url."'":"")

                .($val->popup_link?",link:'".$val->popup_link."'":"")

                .($val->popup_link_type?",link_type:'".$val->popup_link_type."'":"")

                .($val->open_type?",open_type:'".$val->open_type."'":"")

                .($val->top?",top:'".$val->top."'":"")

                .($val->left?",left:'".$val->left."'":"")

                .($val->width?",width:'".$val->width."'":"")

                .($val->height?",height:'".$val->height."'":"")

                .($val->exp_days?",exp_days:'".$val->exp_days."'":"")

.($val->popup_style?",popup_style:'".$val->popup_style."'":"")

.($val->popup_checkbox?",popup_checkbox:'".$val->popup_checkbox."'":"")

.($val->element_id?",element_id:'".$val->element_id."'":"")

                ."}";


            return $popup_content;

        }


        // jQuery로 팝업 열기

        function setPopupScript($popupList) {


            Context::addCssFile('./addons/popup_opener/popup_opener.css');

            Context::addJsFile('./addons/popup_opener/jquery.popup_opener.1.5.4.3.js');


Context::loadLang(_XE_PATH_.'modules/popup/lang');

$msg_xe_popup = Context::getLang('msg_popup_do_not_display');


            $addPopupScript = '<script type="text/javascript">//<![CDATA['."\n";

$addPopupScript .= "var msg_popup_do_not_display = '".$msg_xe_popup."';\n";

$addPopupScript .= 'jQuery(function(){'."\n";


            if($popupList) {

                if(!is_array($popupList)) $popupList = array($popupList);


                foreach($popupList as $val){

                    $addPopupScript .= "jQuery('<div></div>',{id:'xe_popup".$val->popup_srl."'})";

                    $addPopupScript .= ".css({'position':'absolute','width':'".$val->width."px'})";

                    $addPopupScript .= ".xe_popup(".getPopupScript($val).");\n";

                }

            }


            $addPopupScript .= '});'."\n";

            $addPopupScript .= '//]]></script>'."\n";


            Context::addHtmlFooter($addPopupScript);

        }


// 팝업 본문 구하기

function getPopupContent($document_srl) {

$oDocumentModel = &getModel('document');

$oDocument = $oDocumentModel->getDocument($document_srl);


return $oDocument->get('content');

}


if($this->module_info->module_srl) {


$oModuleModel = &getModel('module');

$isActionPopupOpen = false;


// 팝업 모듈 확인

$args->site_srl = $this->module_info->site_srl;

            $popup_module_info = $oModuleModel->getModuleInfoByMid('popup', $args->site_srl);

            if(!$popup_module_info) return;


// 유효일자 팝업 목록 구하기

$args->curdate = date("Ymd", mktime());

$output = executeQueryArray('popup.getPopupValidDate', $args);

if(!$output->toBool()) return;


if(count($output->data) > 0) {

foreach($output->data as $k => $pop) {

$pop->element_id = $addon_info->element_id;


if($pop->target_type == 'action' && $this->act == $pop->target_actions) {

$pop->content = getPopupContent($pop->document_srl);

$actionPopupList[$k] = $pop;

$isActionPopupOpen = true;

} else if ($pop->target_type == 'module') {

if ($this->module_srl == $pop->target_srl || $popup_module_info->module_srl == $pop->target_srl) {

$pop->content = getPopupContent($pop->document_srl);

$modulePopupList[$k] = $pop;

}

}

}

}


// 팝업 세팅

if($isActionPopupOpen) setPopupScript($actionPopupList);

else setPopupScript($modulePopupList);

}


    }

?>


수정 코드

<?php

if (!defined('popup_opener_addon_func_loaded')) {

define('popup_opener_addon_func_loaded', 1);


// 팝업 스크립트 처리

function getPopupScript($val) {


if ($val->content) {

$order        = array("\r\n", "\n", "\r");

$replace      = '';

$val->content = str_replace($order, $replace, $val->content);

$val->content = str_replace("'", '&#39;', $val->content);

}


$popup_content = "{id:'" . $val->popup_srl . "'"

. ($val->popup_type ? ",popup_type:'" . $val->popup_type . "'" : "")

. ($val->content ? ",content:'" . $val->content . "'" : "")

. ($val->popup_url ? ",url:'" . $val->popup_url . "'" : "")

. ($val->popup_link ? ",link:'" . $val->popup_link . "'" : "")

. ($val->popup_link_type ? ",link_type:'" . $val->popup_link_type . "'" : "")

. ($val->open_type ? ",open_type:'" . $val->open_type . "'" : "")

. ($val->top ? ",top:'" . $val->top . "'" : "")

. ($val->left ? ",left:'" . $val->left . "'" : "")

. ($val->width ? ",width:'" . $val->width . "'" : "")

. ($val->height ? ",height:'" . $val->height . "'" : "")

. ($val->exp_days ? ",exp_days:'" . $val->exp_days . "'" : "")

. ($val->popup_style ? ",popup_style:'" . $val->popup_style . "'" : "")

. ($val->popup_checkbox ? ",popup_checkbox:'" . $val->popup_checkbox . "'" : "")

. ($val->element_id ? ",element_id:'" . $val->element_id . "'" : "")

. "}";


return $popup_content;

}


// jQuery로 팝업 열기

function setPopupScript($popupList) {


Context::addCssFile('./addons/popup_opener/popup_opener.css');

Context::addJsFile('./addons/popup_opener/jquery.popup_opener.1.5.4.3.js');


Context::loadLang(_XE_PATH_ . 'modules/popup/lang');

$msg_xe_popup = Context::getLang('msg_popup_do_not_display');


$addPopupScript = '<script type="text/javascript">//<![CDATA[' . "\n";

$addPopupScript .= "var msg_popup_do_not_display = '" . $msg_xe_popup . "';\n";

$addPopupScript .= 'jQuery(function(){' . "\n";


if ($popupList) {

if (!is_array($popupList)) $popupList = array($popupList);


foreach ($popupList as $val) {

$addPopupScript .= "jQuery('<div></div>',{id:'xe_popup" . $val->popup_srl . "'})";

$addPopupScript .= ".css({'position':'absolute','width':'" . $val->width . "px'})";

$addPopupScript .= ".xe_popup(" . getPopupScript($val) . ");\n";

}

}


$addPopupScript .= '});' . "\n";

$addPopupScript .= '//]]></script>' . "\n";


Context::addHtmlFooter($addPopupScript);

}


// 팝업 본문 구하기

function getPopupContent($document_srl) {

$oDocumentModel = &getModel('document');

$oDocument      = $oDocumentModel->getDocument($document_srl);


return $oDocument->get('content');

}


}



if (!defined("__XE__")) exit();

if (Context::get('module') == 'admin') return;


if ($called_position == 'before_module_proc') {

if ($this->module_info->module_srl) {


$oModuleModel      = &getModel('module');

$isActionPopupOpen = false;


// 팝업 모듈 확인

$args->site_srl    = $this->module_info->site_srl;

$popup_module_info = $oModuleModel->getModuleInfoByMid('popup', $args->site_srl);

if (!$popup_module_info) return;


// 유효일자 팝업 목록 구하기

$args->curdate = date("Ymd", mktime());

$output        = executeQueryArray('popup.getPopupValidDate', $args);

if (!$output->toBool()) return;


if (count($output->data) > 0) {

foreach ($output->data as $k => $pop) {

$pop->element_id = $addon_info->element_id;


if ($pop->target_type == 'action' && $this->act == $pop->target_actions) {

$pop->content        = getPopupContent($pop->document_srl);

$actionPopupList[$k] = $pop;

$isActionPopupOpen   = true;

} else if ($pop->target_type == 'module') {

if ($this->module_srl == $pop->target_srl || $popup_module_info->module_srl == $pop->target_srl) {

$pop->content        = getPopupContent($pop->document_srl);

$modulePopupList[$k] = $pop;

}

}

}

}


// 팝업 세팅

if ($isActionPopupOpen) setPopupScript($actionPopupList);

else setPopupScript($modulePopupList);

}


}

posted by ned3y2k

MySQL 5에서 4로 다운그레이 할때

Web Tech 2012. 11. 27. 18:29

# mysqldump -udbid -ppassword --compatible=mysql40  --default-character-set=euckr dbname > outputfilename.sql


mysql 4.0인 경우는 당연히 utf8을 지원하는 스펙이 없어서 위 처럼 한다.

'Web Tech' 카테고리의 다른 글

html5 form element kit  (0) 2012.01.10
C#, VB.net로 만든 코드를 웹으로~  (0) 2011.10.07
플래쉬 소스  (0) 2011.06.07
posted by ned3y2k

MAMP 사용 환경에서 MySQL 쿼리 디버그 팁

Web Tech/PHP 2012. 5. 19. 01:57

혹 이것보다 좋은 방법 있으신분 공유 부탁드립니다!!!


sudo /Applications/MAMP/bin/stopMysql.sh


/Applications/MAMP/Library/bin/mysqld --defaults-file=/Applications/MAMP/tmp/mysql/my.cnf --basedir=/Applications/MAMP/Library --datadir=/Library/Application\ Support/appsolute/MAMP\ PRO/db/mysql --plugin-dir=/Applications/MAMP/Library/lib/plugin --tmpdir=/Applications/MAMP/tmp/mysql/tmpdir --log-error=/Applications/MAMP/logs/mysql_error_log.err --pid-file=/Applications/MAMP/tmp/mysql/mysql.pid --socket=/Applications/MAMP/tmp/mysql/mysql.sock --port=3306 --log=/Users/ned3y2k/log.txt&


tail -f /Users/ned3y2k/log.txt


Mac에서만 됩니다!

기타 환경에서는 참고 하셔서 명령어 좀 바꾸시길!


테스트 환경은 아래와 같습니다.


posted by ned3y2k

html 마크업시... callto:0000 아이폰(웹킷) 처리방법

Web Tech/Javascript 2012. 5. 12. 20:24

아이폰에서는 callto 형식을 인식 할수 없다.

데스크탑에서는 인식하겠지만...


<a href="callto:0123456789">call me</a>

아이폰인 경우는 링크를 교체해주도록 한다.

window.onload = function () {
 
if (navigator.userAgent.match (/iPhone/i)) {
   
var a = document.getElementsByTagName ("a");
   
for (var i = 0; i < a.length; i++) {
     
if (a[i].getAttribute ('href').search (/callto:/i) === 0) {
        a
[i].setAttribute ('href', a[i].getAttribute ('href').replace (/^callto:/, "tel:"));
     
}
   
}
 
}
};

posted by ned3y2k

JQuery를 이용한 Input 입력 제한

Web Tech/Javascript 2012. 3. 17. 03:27

숫자만 입력해야 하는 경우에 아래 내용을 그대로 사용하시면 됩니다.

function pressKeyCheck(e) {
 if (e.charCode < 0x30 || e.charCode > 0x39) {
  return false;
 }
}

$('input[name=?]').keypress(pressKeyCheck);

0x30과 0x39는 아스키 테이블 기준 숫자 0~9까지입니다,.
posted by ned3y2k

CSS를 이용하여 A 태그 안에 있는 내용 이미지로 대처

Web Tech/CSS & HTML 2012. 3. 12. 22:26
posted by ned3y2k

CGI 프로그래밍 예제

Web Tech/PHP 2012. 2. 13. 03:31
윈도우 환경에서 사용 가능한 CGI 예제입니다.
posix 환경에서도 별 차이 없을것으로 예상됩니다만 iostream 이나 namespace 쓰는 부분에서 틀릴수 있습니다.
컴파일 프로그램은 Visual Studio입니다.

#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Content-type: text/html" << std::endl <<std:: endl
<< "<html>" << std::endl
<< "<head>" << std::endl
<< "<title>CGI Test" << std::endl
<< "" << std::endl
<< "<body>" << std::endl
<< "<h1><em>" << std::endl
<< "Hello, World!" << std::endl
<< "</em></h1>" << std::endl
<< "</body>" << std::endl
<< "</html>";
return 0;
}

php 작업 하는데 뭐 이런게 필요하냐고 물어 보시는분 있겠지만 재미로 한번 해보시기 바랍니다!
posix 환경용(apache용) 코드는 파일 첨부로 게시합니다.
php cgi를 추가 하는 방식처럼 추가하면 됩니다.

2012. 4. 6 내용추가합니다.

GET, REQUEST등 각종 REQUEST를 처리하기 위해서는 an ANSI C library for CGI Programming 라이브러리가 추가로 필요합니다.

posted by ned3y2k

반응형 웹 예제

Web Tech/CSS & HTML 2012. 1. 10. 03:52
http://handcraftedpixels.co.uk/
http://dic.daum.net 
posted by ned3y2k