2007. 09. 19. 16:30 sandbox를 beta 0.1.5로 배포하기 위해서 trunk로 copy

git-svn-id: http://xe-core.googlecode.com/svn/trunk@2627 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-09-19 07:35:10 +00:00
commit 507bca7816
147 changed files with 4111 additions and 2075 deletions

281
LICENSE Normal file
View file

@ -0,0 +1,281 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">Google Analytics</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 9. 19">
<name xml:lang="ko">제로</name>
<description xml:lang="ko">
Google Analytics 코드를 사이트에 추가할 수 있습니다.
</description>
</author>
<extra_vars>
<var name="uacct">
<title xml:lang="ko">uacct</title>
<description xml:lang="ko">Google Analytics 코드의 _uacct 값을 입력해주세요.</description>
</var>
</extra_vars>
</addon>

View file

@ -0,0 +1,27 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file google_analytics.addon.php
* @author zero (zero@nzeo.com)
* @brief google analytics 코드를 사이트에 추가함
**/
// 관리자 모듈이면 패스~
if(Context::get('module')=='admin') return;
// 한번만 출력시키기 위해 전역변수에 호출되었음을 체크해 놓음 (called position과 상관없음)
if($GLOBALS['_called_ga_']) return;
$GLOBALS['_called_ga_'] = true;
$js_code = <<<EndOfCss
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "{$addon_info->uacct}";
urchinTracker();
</script>
EndOfCss;
Context::addHtmlFooter($js_code);
?>

View file

@ -336,13 +336,14 @@
$flag = true; $flag = true;
foreach($obj as $key=>$val) { foreach($obj as $key=>$val) {
if(!$val) continue; if(!$val) continue;
if($val && !iconv($charset,'UTF-8',$val)) $flag = false; if($val && iconv($charset,$charset,$val)!=$val) $flag = false;
} }
if($flag == true) { if($flag == true) {
foreach($obj as $key => $val) $obj->{$key} = iconv($charset,'UTF-8',$val); foreach($obj as $key => $val) $obj->{$key} = iconv($charset,'UTF-8',$val);
return $obj; return $obj;
} }
} }
return $obj;
} }
/** /**
@ -868,7 +869,7 @@
function _transEditorComponent($matches) { function _transEditorComponent($matches) {
// IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌 // IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌
$buff = $matches[0]; $buff = $matches[0];
$buff = preg_replace_callback('/([^=^"^ ]*)=([^ ]*)/i', array($this, _fixQuotation), $buff); $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', array($this, _fixQuotation), $buff);
$buff = str_replace("&","&amp;",$buff); $buff = str_replace("&","&amp;",$buff);
// 위젯에서 생성된 코드 (img, div태그내에 editor_widget코드 존재)의 parameter를 추출 // 위젯에서 생성된 코드 (img, div태그내에 editor_widget코드 존재)의 parameter를 추출

View file

@ -133,6 +133,7 @@
$url_info = parse_url($url); $url_info = parse_url($url);
if(!$url_info['port']) $url_info['port'] = 80; if(!$url_info['port']) $url_info['port'] = 80;
if(!$url_info['path']) $url_info['path'] = '/';
$fp = @fsockopen($url_info['host'], $url_info['port']); $fp = @fsockopen($url_info['host'], $url_info['port']);
if(!$fp) return; if(!$fp) return;
@ -149,7 +150,7 @@
$url_info['path'] = $path; $url_info['path'] = $path;
} }
$header = sprintf("GET %s HTTP/2.0\r\nHost: %s\r\nReferer: %s://%s\r\nRequestUrl: %s\r\nConnection: Close\r\n\r\n", $url_info['path'], $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri()); $header = sprintf("GET %s HTTP/1.0\r\nHost: %s\r\nReferer: %s://%s\r\nRequestUrl: %s\r\nConnection: Close\r\n\r\n", $url_info['path'], $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri());
@fwrite($fp, $header); @fwrite($fp, $header);
@ -164,6 +165,7 @@
} }
@fclose($ft); @fclose($ft);
@fclose($fp); @fclose($fp);
@chmod($target_filename, 0644);
return true; return true;
} }
@ -271,6 +273,7 @@
@imagewbmp($thumb, $target_file, 100); @imagewbmp($thumb, $target_file, 100);
break; break;
} }
@chmod($target_file, 0644);
} }
} }
?> ?>

View file

@ -19,6 +19,7 @@
var $act = NULL; ///< action var $act = NULL; ///< action
var $mid = NULL; ///< 모듈의 객체명 var $mid = NULL; ///< 모듈의 객체명
var $document_srl = NULL; ///< 문서 번호 var $document_srl = NULL; ///< 문서 번호
var $module_srl = NULL; ///< 모듈의 번호
var $module_info = NULL; ///< 모듈의 정보 var $module_info = NULL; ///< 모듈의 정보
@ -31,7 +32,7 @@
* 인자를 넘겨주지 않으면 페이지 요청받은 Request Arguments를 이용하여 * 인자를 넘겨주지 않으면 페이지 요청받은 Request Arguments를 이용하여
* 변수를 세팅한다. * 변수를 세팅한다.
**/ **/
function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '') { function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') {
// 설치가 안되어 있다면 install module을 지정 // 설치가 안되어 있다면 install module을 지정
if(!Context::isInstalled()) { if(!Context::isInstalled()) {
$this->module = 'install'; $this->module = 'install';
@ -52,6 +53,9 @@
if(!$document_srl) $this->document_srl = (int)Context::get('document_srl'); if(!$document_srl) $this->document_srl = (int)Context::get('document_srl');
else $this->document_srl = (int)$document_srl; else $this->document_srl = (int)$document_srl;
if(!$module_srl) $this->module_srl = (int)Context::get('module_srl');
else $this->module_srl = (int)$module_srl;
// 기본 변수들의 검사 (XSS방지를 위한 기초적 검사) // 기본 변수들의 검사 (XSS방지를 위한 기초적 검사)
if($this->module && !eregi("^([a-z0-9\_\-]+)$",$this->module)) die(Context::getLang("msg_invalid_request")); if($this->module && !eregi("^([a-z0-9\_\-]+)$",$this->module)) die(Context::getLang("msg_invalid_request"));
if($this->mid && !eregi("^([a-z0-9\_\-]+)$",$this->mid)) die(Context::getLang("msg_invalid_request")); if($this->mid && !eregi("^([a-z0-9\_\-]+)$",$this->mid)) die(Context::getLang("msg_invalid_request"));
@ -70,12 +74,22 @@
$oModuleModel = &getModel('module'); $oModuleModel = &getModel('module');
// document_srl이 있으면 document_srl로 모듈과 모듈 정보를 구함 // document_srl이 있으면 document_srl로 모듈과 모듈 정보를 구함
if($this->document_srl && !$this->mid) $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); if($this->document_srl && !$this->mid && !$this->module_srl) {
if($this->module && $module_info->module != $this->module) unset($module_info); $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
}
// 아직 모듈을 못 찾았고 $mid값이 있으면 $mid로 모듈을 구함 // 아직 모듈을 못 찾았고 $mid값이 있으면 $mid로 모듈을 구함
if(!$module_info && $this->mid) $module_info = $oModuleModel->getModuleInfoByMid($this->mid); if(!$module_info && $this->mid) {
if($this->module && $module_info->module != $this->module) unset($module_info); $module_info = $oModuleModel->getModuleInfoByMid($this->mid);
if($this->module && $module_info->module != $this->module) unset($module_info);
}
// 모듈을 여전히(;;) 못 찾고 $module_srl이 있으면 해당 모듈을 구함
if(!$module_info && $this->module_srl) {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($this->module_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
}
// 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄 // 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄
if(!$module_info && !$this->module) $module_info = $oModuleModel->getModuleInfoByMid(); if(!$module_info && !$this->module) $module_info = $oModuleModel->getModuleInfoByMid();

View file

@ -92,15 +92,7 @@
$grant->is_admin = false; $grant->is_admin = false;
} }
// act값에 admin이 들어 있는데 관리자가 아닌 경우 오류 표시 // module.xml 에 있는 권한 정보를 정리
if(substr_count($this->act, 'Admin')) {
if(!$is_logged) {
$this->setAct("dispMemberLoginForm");
} elseif(!$grant->is_admin) {
return $this->stop('msg_not_permitted_act');
}
}
if($module_info->grants) { if($module_info->grants) {
foreach($module_info->grants as $key => $val) { foreach($module_info->grants as $key => $val) {
if(!$xml_info->grant->{$key}) { if(!$xml_info->grant->{$key}) {
@ -160,6 +152,21 @@
} }
} }
// 현재 action값에 따른 최고 관리 권한 부여
if($this->act && $xml_info->permission) {
$permission_target = $xml_info->permission->{$this->act};
if($permission_target && $grant->{$permission_target}) {
foreach($grant as $key => $val) $grant->{$key} = true;
}
}
// act값에 admin이 들어 있는데 관리자가 아닌 경우 오류 표시
if(substr_count($this->act, 'Admin')) {
// 로그인 되어 있지 않다면 무조건 금지
if(!$is_logged) $this->setAct("dispMemberLoginForm");
elseif(!$grant->is_admin) $this->stop('msg_not_permitted_act');
}
// 권한변수 설정 // 권한변수 설정
$this->grant = $grant; $this->grant = $grant;
Context::set('grant', $grant); Context::set('grant', $grant);

View file

@ -477,7 +477,16 @@ function chkMemberMenu(evt) {
if(obj && obj.className && obj.className.search("member_")!=-1) break; if(obj && obj.className && obj.className.search("member_")!=-1) break;
obj = obj.parentNode; obj = obj.parentNode;
} }
if(!obj || !obj.className || obj.className.search("member_")==-1) return; if(!obj || !obj.className || obj.className.search("member_")==-1) {
// IE6의 경우 닫았던 select박스를 모두 표시
if(xIE6) {
var list = xGetElementsByTagName("SELECT");
for (var i=0; i<list.length; i++) {
list[i].style.visibility = list[i].getAttribute("old_visibility");
}
}
return;
}
if(obj.className.indexOf('member_-1')>=0) return; if(obj.className.indexOf('member_-1')>=0) return;
@ -541,6 +550,16 @@ function displayMemberMenu(ret_obj, response_tags, params) {
} }
if(html) { if(html) {
// IE6의 경우 select박스를 모두 숨겨버림
if(xIE6) {
var list = xGetElementsByTagName("SELECT");
for (var i=0; i<list.length; i++) {
list[i].setAttribute("old_visibility", list[i].style.visibility);
list[i].style.visibility = 'hidden';
}
}
// 레이어 출력
xInnerHtml('membermenuarea', "<div class=\"box\">"+html+"</div>"); xInnerHtml('membermenuarea', "<div class=\"box\">"+html+"</div>");
xWidth(area, xWidth(area)); xWidth(area, xWidth(area));
xLeft(area, params["page_x"]); xLeft(area, params["page_x"]);

View file

@ -26,6 +26,7 @@
$lang->cmd_cancel = 'Cancel'; $lang->cmd_cancel = 'Cancel';
$lang->cmd_back = 'Go Back'; $lang->cmd_back = 'Go Back';
$lang->cmd_vote = 'Vote'; $lang->cmd_vote = 'Vote';
$lang->cmd_copy = 'Copy';
$lang->cmd_move = 'Move'; $lang->cmd_move = 'Move';
$lang->cmd_move_up = 'Up'; $lang->cmd_move_up = 'Up';
$lang->cmd_move_down = 'Down'; $lang->cmd_move_down = 'Down';

View file

@ -26,6 +26,7 @@
$lang->cmd_cancel = 'Cancelar'; $lang->cmd_cancel = 'Cancelar';
$lang->cmd_back = 'Atrás'; $lang->cmd_back = 'Atrás';
$lang->cmd_vote = 'Recomendar'; $lang->cmd_vote = 'Recomendar';
$lang->cmd_copy = 'Copia';
$lang->cmd_move = 'Mover'; $lang->cmd_move = 'Mover';
$lang->cmd_move_up = 'Arriba'; $lang->cmd_move_up = 'Arriba';
$lang->cmd_move_down = 'Abajo'; $lang->cmd_move_down = 'Abajo';

View file

@ -26,6 +26,7 @@
$lang->cmd_cancel = 'Decommander'; $lang->cmd_cancel = 'Decommander';
$lang->cmd_back = 'Retour'; $lang->cmd_back = 'Retour';
$lang->cmd_vote = 'Voter'; $lang->cmd_vote = 'Voter';
$lang->cmd_copy = 'Copie';
$lang->cmd_move = 'Deplacer'; $lang->cmd_move = 'Deplacer';
$lang->cmd_move_up = 'Relever'; $lang->cmd_move_up = 'Relever';
$lang->cmd_move_down = 'Abaisser'; $lang->cmd_move_down = 'Abaisser';

View file

@ -26,6 +26,7 @@
$lang->cmd_cancel = 'キャンセル'; $lang->cmd_cancel = 'キャンセル';
$lang->cmd_back = '戻る'; $lang->cmd_back = '戻る';
$lang->cmd_vote = '推薦'; $lang->cmd_vote = '推薦';
$lang->cmd_copy = 'コピー';
$lang->cmd_move = '移動'; $lang->cmd_move = '移動';
$lang->cmd_move_up = '上へ'; $lang->cmd_move_up = '上へ';
$lang->cmd_move_down = '下へ'; $lang->cmd_move_down = '下へ';

View file

@ -26,6 +26,7 @@
$lang->cmd_cancel = '취소'; $lang->cmd_cancel = '취소';
$lang->cmd_back = '돌아가기'; $lang->cmd_back = '돌아가기';
$lang->cmd_vote = '추천'; $lang->cmd_vote = '추천';
$lang->cmd_copy = '복사';
$lang->cmd_move = '이동'; $lang->cmd_move = '이동';
$lang->cmd_move_up = '위로'; $lang->cmd_move_up = '위로';
$lang->cmd_move_down = '아래로'; $lang->cmd_move_down = '아래로';

View file

@ -26,6 +26,7 @@
$lang->cmd_cancel = '取消'; $lang->cmd_cancel = '取消';
$lang->cmd_back = '返回'; $lang->cmd_back = '返回';
$lang->cmd_vote = '推荐'; $lang->cmd_vote = '推荐';
$lang->cmd_copy = '副本';
$lang->cmd_move = '查看'; $lang->cmd_move = '查看';
$lang->cmd_move_up = '向上'; $lang->cmd_move_up = '向上';
$lang->cmd_move_down = '向下'; $lang->cmd_move_down = '向下';
@ -120,7 +121,7 @@
$lang->regdate = '登录日期'; $lang->regdate = '登录日期';
$lang->last_update = '最后更新'; $lang->last_update = '最后更新';
$lang->signup_date = '注册日期'; $lang->signup_date = '注册日期';
$lang->last_login = '最近登'; $lang->last_login = '最近登';
$lang->first_page = '第一页'; $lang->first_page = '第一页';
$lang->last_page = '最后一页'; $lang->last_page = '最后一页';
$lang->search_target = '搜索目标'; $lang->search_target = '搜索目标';

View file

@ -1,23 +1,31 @@
<?php <?php
$year = sprintf("%04d",$_REQUEST['year']); ####################
$month = sprintf("%02d",$_REQUEST['month']); ## 연도 범위 설정 ##
// 최대
$max_year = 2900;//년 (우주가 사라지는 날 까지)
// 최소
$min_year = 1900;//년 (0년 부터)
####################
$year = $_REQUEST['year'];
$month = $_REQUEST['month'];
$method = $_REQUEST['method']; $method = $_REQUEST['method'];
$fo_id = $_REQUEST['fo_id']; $fo_id = $_REQUEST['fo_id'];
$callback_func = $_REQUEST['callback_func']; $callback_func = $_REQUEST['callback_func'];
$day_str = $_REQUEST['day_str']; $day_str = $_REQUEST['day_str']; // 날짜 (ex. 20080101)
if($day_str && strlen($day_str)) { if($day_str && strlen($day_str)) {
$year = substr($day_str,0,4); $year = substr($day_str, 0, 4);
$month = substr($day_str,4,2); $month = substr($day_str, 4, 2);
} }
if(!(int)$year) $year = date("Y"); if($year < $min_year || $year > $max_year) $year = date("Y");
if(!(int)$month) $month = date("m"); if(!(int)$month || $month < 1 || $month > 12) $month = date("n");
switch($method) { switch($method) {
case 'prev_year' : case 'prev_year' :
$year = date("Y", mktime(0,0,0,1,1,$year)-60*60*24); $year --;
break; break;
case 'prev_month' : case 'prev_month' :
$month --; $month --;
@ -34,16 +42,75 @@
} }
break; break;
case 'next_year' : case 'next_year' :
$year = date("Y", mktime(0,0,0,12,31,$year)+60*60*24); $year ++;
break; break;
} }
$start_week = date("w", mktime(0,0,0,$month,1,$year)); // 긴 이름
$month_day = date("t", mktime(0,0,0,$month,1,$year)); $monthLongName = array(1 => "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
$before_month_month_day = date("t", mktime(0,0,0,$month,1,$year)-60*60*24);
// 짧은 이름
$monthShortName = array(1 => "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
// 요일 이름
$dayName = array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
/*
* @brief 윤년 검사
*/
function isLeapYear($year) {
if ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0) return true;
else return false;
}
/*
* @brief 날짜 계산
*/
function convertDatetoDay($year, $month, $day = 0) {
$numOfLeapYear = 0; // 윤년의 수
// 전년도까지의 윤년의 수를 구한다.
for($i = 0; $i < $year; $i++) {
if(isLeapYear($i)) $numOfLeapYear++;
}
// 전년도까지의 일 수를 구한다.
$toLastYearDaySum = ($year-1) * 365 + $numOfLeapYear;
// 올해의 현재 월까지의 일수 계산
$thisYearDaySum = 0;
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
$endOfMonth = array(1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
for($i = 1; $i < $month; $i++) {
$thisYearDaySum += $endOfMonth[$i];
}
// 윤년이고, 2월이 포함되어 있으면 1일을 증가시킨다.
if ($month > 2 && isLeapYear($year)) $thisYearDaySum++;
if(isLeapYear($year)) $endOfMonth[2] = 29;
if($day) {
$thisYearDaySum += $day;
return $toLastYearDaySum + $thisYearDaySum - 1;
} else {
return $endOfMonth[$month];
}
}
/*
* @brief 요일 구하기
*/
function getDayOfWeek($year, $month, $day) {
// 0~6의 값을 반환한다. 결과가 0이면 일요일이다.
return convertDatetoDay($year, $month, $day) % 7;
}
$start_week = getDayOfWeek($year, $month, 1);
$month_day = convertDatetoDay($year, $month);
$before_month_month_day = convertDatetoDay( $month == 1 ? $year - 1 : $year, $month == 1 ? 12 : $month - 1);
$next_year = date("m", mktime(0,0,0,12,31, $year)+60*60*24);
$next_month = date("m", mktime(0,0,0,$month,$month_day, $year)+60*60*24);
?> ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ko" xmlns="http://www.w3.org/1999/xhtml"> <html lang="ko" xmlns="http://www.w3.org/1999/xhtml">
@ -67,8 +134,8 @@
return; return;
} }
var date_obj = opener.xGetElementById("date_<?=$fo_id?>"); var date_obj = opener.xGetElementById("date_<?php echo $fo_id?>");
var str_obj = opener.xGetElementById("str_<?=$fo_id?>"); var str_obj = opener.xGetElementById("str_<?php echo $fo_id?>");
if(date_obj) date_obj.value = date_val; if(date_obj) date_obj.value = date_val;
@ -82,99 +149,112 @@
</script> </script>
</head> </head>
<body> <body>
<div id="popup_content" > <div id="popup_content" >
<div id="popHeadder"> <div id="popHeadder">
<h1>Calendar</h1> <h1>Calendar</h1>
</div> </div>
<form action="./calendar.php" method="get"> <form action="./calendar.php" method="get">
<input type="hidden" name="fo_id" value="<?=$fo_id?>"/> <input type="hidden" name="fo_id" value="<?php echo $fo_id?>"/>
<input type="hidden" name="callback_func" value="<?=$callback_func?>"/> <input type="hidden" name="callback_func" value="<?php echo $callback_func?>"/>
<div id="popBody"> <div id="popBody">
<div class="calendar"> <div class="calendar">
<div class="yymm"> <div class="yymm">
<div class="yy"> <div class="yy">
<a href="./calendar.php?fo_id=<?=$fo_id?>&amp;year=<?=$year?>&amp;month=<?=$month?>&amp;method=prev_year&amp;callback_func=<?=$callback_func?>" class="left"><img src="./images/buttonLeft2.gif" alt="prev" width="11" height="11" /></a><?=$year?><a href="./calendar.php?fo_id=<?=$fo_id?>&amp;year=<?=$year?>&amp;month=<?=$month?>&amp;method=next_year&amp;callback_func=<?=$callback_func?>" class="right"><img src="./images/buttonRight2.gif" alt="next" width="11" height="11" /></a> <a href="./calendar.php?fo_id=<?php echo $fo_id?>&amp;year=<?php echo $year?>&amp;month=<?php echo $month?>&amp;method=prev_year&amp;callback_func=<?php echo $callback_func?>" class="left"><img src="./images/buttonLeft2.gif" alt="<?php echo $year - 1?>" width="11" height="11" /></a><?php echo $year?><a href="./calendar.php?fo_id=<?php echo $fo_id?>&amp;year=<?php echo $year?>&amp;month=<?php echo $month?>&amp;method=next_year&amp;callback_func=<?php echo $callback_func?>" class="right"><img src="./images/buttonRight2.gif" alt="<?php echo $year + 1?>" width="11" height="11" /></a>
</div> </div>
<div class="mm"> <div class="mm">
<p><?=date("M", mktime(0,0,0,$month,1,$year))?></p> <p><?php echo $monthLongName[$month]?></p>
<a href="./calendar.php?fo_id=<?=$fo_id?>&amp;year=<?=$year?>&amp;month=<?=$month?>&amp;method=prev_month&amp;callback_func=<?=$callback_func?>" class="left"><img src="./images/buttonLeft2.gif" alt="prev" width="11" height="11" /></a><span><?=$month?></span><a href="./calendar.php?fo_id=<?=$fo_id?>&amp;year=<?=$year?>&amp;month=<?=$month?>&amp;method=next_month&amp;callback_func=<?=$callback_func?>" class="right"><img src="./images/buttonRight2.gif" alt="next" width="11" height="11" /></a> <a href="./calendar.php?fo_id=<?php echo $fo_id?>&amp;year=<?php echo $year?>&amp;month=<?php echo $month?>&amp;method=prev_month&amp;callback_func=<?php echo $callback_func?>" class="left"><img src="./images/buttonLeft2.gif" alt="prev" width="11" height="11" /></a><span><?php echo $month?></span><a href="./calendar.php?fo_id=<?php echo $fo_id?>&amp;year=<?php echo $year?>&amp;month=<?php echo $month?>&amp;method=next_month&amp;callback_func=<?php echo $callback_func?>" class="right"><img src="./images/buttonRight2.gif" alt="next" width="11" height="11" /></a>
</div> </div>
<div class="go"> <div class="go">
<input type="text" name="year" class="inputTypeY" value="<?=$year?>" /> <select name="year" class="selectTypeY" onchange="submit()">
<input type="text" name="month" class="inputTypeM" value="<?=$month?>" /> <? for($i = $max_year; $i >= $min_year; $i--):?>
<input type="image" src="./images/buttonGo.gif" alt="Go" /> <option value="<?php echo $i?>" <?php echo $year == $i? "selected":""?> class="<?php echo $i%10?($i%2?"select_color1":"select_color2"):"select_color10"?>"><?php echo $i?></option>
<?endfor?>
</select>
<select name="month" class="selectTypeM" onchange="submit()">
<? for($i = 1; $i <= 12; $i++):?>
<option value="<?php echo $i?>" <?php echo $month == $i? "selected":""?> class="<?php echo $i%2?"select_color1":"select_color2"?>"><?php echo sprintf("%02d",$i)?></option>
<?endfor?>
</select>
</div> </div>
<br /><br />
<center><a href="./calendar.php" class="button"><span>Go Today</span></a></center>
</div> </div>
<table cellspacing="0" class="dd"> <table cellspacing="0" class="dd">
<tr>
<?for($y = 0; $y < 7; $y++) {?>
<td class="<?php echo $y==0?"sun":($y==6?"sat":"")?>"><?php echo $dayName[$y]?></td>
<?}?>
</tr>
<?php <?php
for($i=0;$i<6;$i++) { //1주~6주
for($i = 0; $i < 6; $i++) {
?> ?>
<tr class="<?if($i==0){?>first<?}elseif($i==5){?>last<?}?>"> <tr class="<?if($i == 0){?>first<?}elseif($i == 5){?>last<?}?>">
<?php <?php
for($j=0;$j<7;$j++) { //요일
for($j = 0; $j < 7; $j++) {
$m = $month; $m = $month;
$y = $year; $y = $year;
$cell_no = $i*7 + $j; $cell_no = $i * 7 + $j;
if($cell_no < $start_week) { if($cell_no < $start_week) {
$day = $before_month_month_day + $cell_no - $start_week + 1; $day = $before_month_month_day + $cell_no - $start_week + 1;
$m = $month - 1; $m = $month - 1;
if($m<1) { if($m < 1) {
$m = 12; $m = 12;
$y = $year - 1; $y = $year - 1;
} }
} else { } else {
$day = $cell_no - $start_week +1; $day = $cell_no - $start_week + 1;
$m = $month; $m = $month;
if($day > $month_day) { if($day > $month_day) {
$day = $day - $month_day; $day = $day - $month_day;
$m = $month + 1; $m = $month + 1;
if($m>12) { if($m >12 ) {
$m = 1; $m = 1;
$y = $year-1; $y = $year - 1;
} }
} }
} }
if($j==0) $class_name = "sun"; if($j == 0) $class_name = "sun";
elseif($j == 6) $class_name = "sat";
else $class_name= ""; else $class_name= "";
$date = date("Y. m. d", mktime(0,0,0,$m, $day, $y)); $date = $y.". ".sprintf("%02d", $m).". ".sprintf("%02d", $day);
$date_str = date("Ymd", mktime(0,0,0,$m, $day, $y)); $date_str = $y.sprintf("%02d", $m).sprintf("%02d", $day);
?> ?>
<td class="<?=$class_name?>"> <td class="<?php echo $class_name?>" <?if($day){?> onclick="selectDate('<?php echo $date?>','<?php echo $date_str?>','<?php echo $callback_func?>')"<?}?>>
<?if($m==$month){?> <?if($m == $month){?><?if(date("Ymd")==$date_str){?><strong><?}?>
<?if(date("Ymd")==$date_str){?><strong><?}?> <?if($day){?><?php echo $day?><?}else{?>&nbsp;<?}?>
<?if($day){?><a href="#" onclick="selectDate('<?=$date?>','<?=$date_str?>','<?=$callback_func?>');return false;"><?=$day?></a><?}else{?>&nbsp;<?}?>
<?if(date("Ymd")==$date_str){?></strong><?}?> <?if(date("Ymd")==$date_str){?></strong><?}?>
<?}else{?> <?}else{?>
<span class="disable"><?if($day){?><a href="#" onclick="selectDate('<?=$date?>','<?=$date_str?>','<?=$callback_func?>');return false;"><?=$day?></a><?}else{?>&nbsp;<?}?></span> <span class="disable"><?if($day){?><?php echo $day?><?}else{?>&nbsp;<?}?></span>
<?}?> <?}?>
</td> </td>
<? <?php
} }
?> ?>
</tr> </tr>
<? <?php
} }
?> ?>
</table> </table>
</div> </div>
</div> </div>
</form> </form>
<div id="popFooter" class="tCenter"> <div id="popFooter" class="tCenter">
<a href="#" onclick="window.close();" class="button"><span>close</span></a> <a href="#" onclick="window.close();" class="button"><span>close</span></a>

View file

@ -9,16 +9,16 @@
<!--@end--><!--@if($layout->author)--><meta name="layout_maker" content="{$layout_info->author->name} ({$layout_info->author->homepage})" /> <!--@end--><!--@if($layout->author)--><meta name="layout_maker" content="{$layout_info->author->name} ({$layout_info->author->homepage})" />
<!--@end--><meta http-equiv="imagetoolbar" content="no" /> <!--@end--><meta http-equiv="imagetoolbar" content="no" />
<title>{Context::getBrowserTitle()}</title> <title>{Context::getBrowserTitle()}</title>
<script type="text/javascript" src="./common/js/x.js"></script> <script type="text/javascript" src="./common/js/x.js?rnd={time()}"></script>
<script type="text/javascript" src="./common/js/common.js"></script> <script type="text/javascript" src="./common/js/common.js?rnd={time()}"></script>
<script type="text/javascript" src="./common/js/xml_handler.js"></script> <script type="text/javascript" src="./common/js/xml_handler.js?rnd={time()}"></script>
<script type="text/javascript" src="./common/js/xml_js_filter.js"></script> <script type="text/javascript" src="./common/js/xml_js_filter.js?rnd={time()}"></script>
<!--@foreach(Context::getJsFile() as $key => $js_file)--><script type="text/javascript" src="{$js_file}"></script> <!--@foreach(Context::getJsFile() as $key => $js_file)--><script type="text/javascript" src="{$js_file}?rnd={time()}"></script>
<!--@end--><!--@if($rss_url)--><link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="{$rss_url}" /> <!--@end--><!--@if($rss_url)--><link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="{$rss_url}" />
<!--@end--><link rel="stylesheet" href="./common/css/default.css" type="text/css" /> <!--@end--><link rel="stylesheet" href="./common/css/default.css?rnd={time()}" type="text/css" />
<link rel="stylesheet" href="./common/css/button.css" type="text/css" /> <link rel="stylesheet" href="./common/css/button.css?rnd={time()}" type="text/css" />
<!--@foreach(Context::getCssFile() as $key => $css_file)--><link rel="stylesheet" href="{$css_file}" type="text/css" /> <!--@foreach(Context::getCssFile() as $key => $css_file)--><link rel="stylesheet" href="{$css_file}?rnd={time()}" type="text/css" />
<!--@end--><!--@if($module=='admin' || strpos($act,'Admin')>0)--><link rel="stylesheet" href="./modules/admin/tpl/css/admin.css" type="text/css" /> <!--@end--><!--@if($module=='admin' || strpos($act,'Admin')>0)--><link rel="stylesheet" href="./modules/admin/tpl/css/admin.css?rnd={time()}" type="text/css" />
<!--@end--><script type="text/javascript">//<![CDATA[ <!--@end--><script type="text/javascript">//<![CDATA[
var current_url = "{$current_url}"; var current_url = "{$current_url}";
var request_uri = "{$request_uri}"; var request_uri = "{$request_uri}";

View file

@ -2,32 +2,37 @@
body { margin:0; padding:0; } body { margin:0; padding:0; }
#popup_content { width:370px; overflow:hidden;} #popup_content { width:500px; overflow:hidden;}
#popHeadder { width:370px; } #popHeadder { width:500px; }
#popBody { width:350px; } #popBody { width:480px; }
#popFooter { width:370px; } #popFooter { width:500px; }
#popBody .calendar { width:350px; border:1px solid #c1c0bd; border-left:none; border-right:none; background:#f5f5f5; overflow:hidden; position:relative;} #popBody .calendar { width:480px; border:1px solid #c1c0bd; border-left:none; border-right:none; background:#f5f5f5; overflow:hidden; position:relative;}
#popBody .calendar .yymm { width:143px; float:left;} #popBody .calendar .yymm { width:143px; float:left;}
#popBody .calendar .yymm .yy { padding:9px 0 6px 0; text-align:center; border-bottom:1px solid #ededed; margin:0 15px; font:bold 1.2em Tahoma; color:#444444;} #popBody .calendar .yymm .yy { padding:9px 0 6px 0; text-align:center; border-bottom:1px solid #ededed; margin:0 15px; font:bold 1.5em Tahoma; color:#444444;}
#popBody .calendar .yymm .mm { margin:0 15px; border-top:1px solid #ffffff; border-bottom:1px solid #ededed; padding:10px 0 7px 0; text-align:center;} #popBody .calendar .yymm .mm { margin:0 15px; border-top:1px solid #ffffff; border-bottom:1px solid #ededed; padding:10px 0 7px 0; text-align:center;}
#popBody .calendar .yymm .mm p { color:#969696; font:1.6em "Times New Roman";} #popBody .calendar .yymm .mm p { color:#969696; font:1.6em "Times New Roman";}
#popBody .calendar .yymm .mm span { font:4em "Times New Roman"; color:#158692; vertical-align:middle;} #popBody .calendar .yymm .mm span { font:4em "Times New Roman"; color:#158692; vertical-align:middle;}
#popBody .calendar .yymm .go { padding:7px 0 0 0; margin:0 15px; text-align:center; border-top:1px solid #ffffff;} #popBody .calendar .yymm .go { padding:7px 0 0 0; margin:0px 15px; text-align:center; border-top:1px solid #ffffff; display:inline;}
#popBody .calendar .yymm .go * { vertical-align:middle;} #popBody .calendar .yymm .go * { vertical-align:middle;}
#popBody .calendar .yymm .go .selectTypeY { width:60px;}
#popBody .calendar .yymm .go .selectTypeM { width:45px;}
#popBody .calendar .yymm .go .inputTypeY { border:1px solid #c9c9c9; text-align:center; font:.9em Tahoma; color:#282828; width:31px; height:16px;} #popBody .calendar .yymm .go .inputTypeY { border:1px solid #c9c9c9; text-align:center; font:.9em Tahoma; color:#282828; width:31px; height:16px;}
#popBody .calendar .yymm .go .inputTypeM { border:1px solid #c9c9c9; text-align:center; font:.9em Tahoma; color:#282828; width:20px; height:16px;} #popBody .calendar .yymm .go .inputTypeM { border:1px solid #c9c9c9; text-align:center; font:.9em Tahoma; color:#282828; width:20px; height:16px;}
#popBody .calendar .yymm .left { vertical-align:middle; margin-right:14px;} #popBody .calendar .yymm .left { vertical-align:middle; margin-right:14px;}
#popBody .calendar .yymm .right { vertical-align:middle; margin-left:14px;} #popBody .calendar .yymm .right { vertical-align:middle; margin-left:14px;}
#popBody .calendar .yymm .left img, #popBody .calendar .yymm .left img,
#popBody .calendar .yymm .right img { vertical-align:middle; position:relative; top:2px;} #popBody .calendar .yymm .right img { vertical-align:middle; position:relative; top:2px;}
#popBody .calendar .dd { float:left; width:207px; background:#ffffff; border-left:10px solid #ffffff;} #popBody .calendar .dd { float:left; width:337px; background:#ffffff; border-left:10px solid #ffffff;}
#popBody .calendar .dd td { border-bottom:1px solid #ededed; height:32px; text-align:center; color:#636363; font:.9em Tahoma;} #popBody .calendar .dd td { border-bottom:1px solid #ededed; height:40px; text-align:center; color:#636363; font:1em Tahoma; cursor:pointer; width:14%;}
#popBody .calendar .dd td a { color:#636363; font:.9em Tahoma;} #popBody .calendar .dd td:hover { background:#eeeeee;}
#popBody .calendar .dd td strong { text-decoration:underline;} #popBody .calendar .dd td strong { text-decoration:underline;}
#popBody .calendar .dd td strong a { text-decoration:underline;}
#popBody .calendar .dd td.sun { color:#c95b53;} #popBody .calendar .dd td.sun { color:#c95b53;}
#popBody .calendar .dd td.sun a { color:#c95b53;} #popBody .calendar .dd td.sat { color:#5378C9;}
#popBody .calendar .dd .first { height:35px;} #popBody .calendar .dd .first { height:35px;}
#popBody .calendar .dd .last td { height:35px; border-bottom:none;} #popBody .calendar .dd .last td { height:35px; border-bottom:none;}
#popBody .calendar .dd td .disable a { color:#CCCCCC; } #popBody .calendar .dd td .disable { color:#CCCCCC; }
#popBody .calendar .select_color1 {background:#ffffff;color:#000000;}
#popBody .calendar .select_color2 {background:#eeeeee;color:#000000;}
#popBody .calendar .select_color10 {background:#ffff00;color:#000000;}

View file

@ -1,4 +1,6 @@
<?php <?php
@error_reporting(E_ALL ^ E_NOTICE);
/** /**
* @file config/config.inc.php * @file config/config.inc.php
* @author zero (zero@nzeo.com) * @author zero (zero@nzeo.com)
@ -12,7 +14,7 @@
* 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며 * 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며
* config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 * config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/ **/
define('__ZBXE_VERSION__', '0.1.4'); define('__ZBXE_VERSION__', '0.1.5');
/** /**
* @brief 디버깅 메세지 출력 * @brief 디버깅 메세지 출력
@ -83,8 +85,16 @@
/** /**
* @brief 세션 설정 * @brief 세션 설정
* 세션의 파기 시간을 5시간으로 하고 세션 저장 경로를 files/session 으로 변경
**/ **/
@session_cache_limiter('no-cache, must-revalidate'); if(!ini_get('session.auto_start')) {
@ini_set("session.gc_maxlifetime", "18000"); session_cache_limiter('no-cache, must-revalidate');
@session_start(); ini_set("session.gc_maxlifetime", "18000");
if(!is_dir("./files/sessions")) {
FileHandler::makeDir("./files/sessions");
@chmod("./files/sessions", 0777);
}
if(is_dir("./files/sessions")) session_save_path(realpath('.')."/files/sessions/");
session_start();
}
?> ?>

View file

@ -17,6 +17,7 @@
$oAdminController->insertShortCut('blog'); $oAdminController->insertShortCut('blog');
$oAdminController->insertShortCut('board'); $oAdminController->insertShortCut('board');
$oAdminController->insertShortCut('page'); $oAdminController->insertShortCut('page');
$oAdminController->insertShortCut('opage');
$oAdminController->insertShortCut('menu'); $oAdminController->insertShortCut('menu');
$oAdminController->insertShortCut('layout'); $oAdminController->insertShortCut('layout');
$oAdminController->insertShortCut('addon'); $oAdminController->insertShortCut('addon');

View file

@ -32,6 +32,41 @@
<title xml:lang="jp">管理</title> <title xml:lang="jp">管理</title>
</grant> </grant>
</grants> </grants>
<permissions>
<permission action="dispBlogContent" target="manager" />
<permission action="dispBlogWrite" target="manager" />
<permission action="dispBlogDelete" target="manager" />
<permission action="dispBlogReplyComment" target="manager" />
<permission action="dispBlogModifyComment" target="manager" />
<permission action="dispBlogDeleteComment" target="manager" />
<permission action="dispBlogDeleteTrackback" target="manager" />
<permission action="dispBlogMessage" target="manager" />
<permission action="procBlogInsertDocument" target="manager" />
<permission action="procBlogDeleteDocument" target="manager" />
<permission action="procBlogInsertComment" target="manager" />
<permission action="procBlogDeleteComment" target="manager" />
<permission action="procBlogDeleteTrackback" target="manager" />
<permission action="procBlogVerificationPassword" target="manager" />
<permission action="procBlogDeleteFile" target="manager" />
<permission action="procBlogUploadFile" target="manager" />
<permission action="procBlogDownloadFile" target="manager" />
<permission action="getBlogAdminCategoryTplInfo" target="manager" />
<permission action="dispBlogAdminContent" target="manager" />
<permission action="dispBlogAdminBlogInfo" target="manager" />
<permission action="dispBlogAdminInsertBlog" target="manager" />
<permission action="dispBlogAdminCategoryInfo" target="manager" />
<permission action="dispBlogAdminSkinInfo" target="manager" />
<permission action="procBlogAdminUpdateSkinInfo" target="manager" />
<permission action="procBlogAdminInsertBlog" target="manager" />
<permission action="procBlogAdminInsertCategory" target="manager" />
<permission action="procBlogAdminDeleteCategory" target="manager" />
<permission action="procBlogAdminMakeXmlFile" target="manager" />
<permission action="procBlogAdminMoveCategory" target="manager" />
</permissions>
<actions> <actions>
<action name="dispBlogContent" type="view" index="true" /> <action name="dispBlogContent" type="view" index="true" />
<action name="dispBlogWrite" type="view" /> <action name="dispBlogWrite" type="view" />

View file

@ -236,7 +236,6 @@ Jeong, Chan Myeong 070601~070630
.blogEditor .userNameAndPw .homePage { width:6em;} .blogEditor .userNameAndPw .homePage { width:6em;}
.blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} .blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;}
.blogEditor .commentForm { width:100%; padding-bottom:.5em;} .blogEditor .commentForm { width:100%; padding-bottom:.5em;}
.blogEditor .commentForm textarea { width:632px; margin:.3em; height:100px;}
/* blogWrite */ /* blogWrite */
.blogWrite { width:100%; position:relative;} .blogWrite { width:100%; position:relative;}

View file

@ -250,8 +250,6 @@ ul.replyZone .replyIndent { background:url(../images/common/iconReplyArrow.gif)
.blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} .blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;}
.blogEditor .buttonReply { position:relative; float:left; left:50%; margin:.5em 0 0 -2em; _padding-bottom:1em;} .blogEditor .buttonReply { position:relative; float:left; left:50%; margin:.5em 0 0 -2em; _padding-bottom:1em;}
.blogEditor .commentForm { width:100%; padding-bottom:.5em;} .blogEditor .commentForm { width:100%; padding-bottom:.5em;}
.blogEditor .commentForm textarea { width:632px; margin:.3em; height:100px;}
/* blogWrite */ /* blogWrite */
.blogWrite { width:100%; position:relative;} .blogWrite { width:100%; position:relative;}

View file

@ -16,6 +16,7 @@
<!-- 카테고리의 위/아래, 삭제와 관련된 form --> <!-- 카테고리의 위/아래, 삭제와 관련된 form -->
<form id="fo_move_category" action="./" method="get"> <form id="fo_move_category" action="./" method="get">
<input type="hidden" name="module_srl" />
<input type="hidden" name="source_category_srl" /> <input type="hidden" name="source_category_srl" />
<input type="hidden" name="target_category_srl" /> <input type="hidden" name="target_category_srl" />
</form> </form>

View file

@ -9,6 +9,17 @@
<!-- 목록 --> <!-- 목록 -->
<table cellspacing="0" class="tableType1"> <table cellspacing="0" class="tableType1">
<col width="40" />
<col width="130" />
<col />
<col />
<col width="40" />
<col width="80" />
<col width="100" />
<col width="80" />
<col width="40" />
<col width="40" />
<col width="40" />
<thead> <thead>
<tr> <tr>
<th scope="col">{$lang->no}</th> <th scope="col">{$lang->no}</th>
@ -16,7 +27,7 @@
<form action="./" method="get" onsubmit="return doChangeCategory(this);"> <form action="./" method="get" onsubmit="return doChangeCategory(this);">
<input type="hidden" name="module" value="{$module}" /> <input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" /> <input type="hidden" name="act" value="{$act}" />
<select name="module_category_srl"> <select name="module_category_srl" class="w80">
<option value="">{$lang->module_category}</option> <option value="">{$lang->module_category}</option>
<!--@foreach($module_category as $key => $val)--> <!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option> <option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
@ -34,6 +45,7 @@
<th scope="col">{$lang->admin_id}</th> <th scope="col">{$lang->admin_id}</th>
<th scope="col">{$lang->regdate}</th> <th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->cmd_view}</th> <th scope="col">{$lang->cmd_view}</th>
<th scope="col">{$lang->cmd_copy}</th>
<th scope="col">{$lang->cmd_delete}</th> <th scope="col">{$lang->cmd_delete}</th>
</tr> </tr>
</thead> </thead>
@ -50,14 +62,15 @@
{$module_category[$val->module_category_srl]->title} {$module_category[$val->module_category_srl]->title}
<!--@end--> <!--@end-->
</td> </td>
<td><a href="{getUrl('act','dispBlogAdminBlogInfo','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></td> <td><div class="tLeft">&nbsp; <a href="{getUrl('act','dispBlogAdminBlogInfo','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></div></td>
<td>{htmlspecialchars($val->browser_title)}</td> <td><div class="tLeft nowrap">{htmlspecialchars($val->browser_title)}</div></td>
<td class="tahoma">{$val->is_default}</td> <td class="tahoma">{$val->is_default}</td>
<td class="tahoma">{$val->skin}</td> <td class="tahoma">{$val->skin}</td>
<td class="tahoma">{$val->admin_id}</td> <td class="tahoma">{$val->admin_id}&nbsp;</td>
<td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td> <td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
<td class="blue"><a href="./?mid={$val->mid}" target="_blank">{$lang->cmd_view}</a></td> <td class="blue"><a href="{getUrl('','mid',$val->mid)}" onclick="window.open(this.href);return false;">{$lang->cmd_view}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispBlogAdminDeleteBlog','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td> <td class="blue"><a href="./?module=module&act=dispModuleAdminCopyModule&module_srl={$val->module_srl}" onclick="popopen(this.href);return false;">{$lang->cmd_copy}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispBlogAdminDeleteBlog','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@else-->&nbsp;<!--@end--></td>
</tr> </tr>
<!--@end--> <!--@end-->
</tbody> </tbody>

View file

@ -132,6 +132,7 @@ function doInsertCategory(parent_srl) {
function doGetCategoryInfo(category_id, obj) { function doGetCategoryInfo(category_id, obj) {
// category, category_id, node_srl을 추출 // category, category_id, node_srl을 추출
var fo_obj = xGetElementById("fo_category"); var fo_obj = xGetElementById("fo_category");
var module_srl = fo_obj.module_srl.value;
var node_srl = 0; var node_srl = 0;
var parent_srl = 0; var parent_srl = 0;
@ -147,6 +148,7 @@ function doGetCategoryInfo(category_id, obj) {
var params = new Array(); var params = new Array();
params["category_srl"] = node_srl; params["category_srl"] = node_srl;
params["parent_srl"] = parent_srl; params["parent_srl"] = parent_srl;
params["module_srl"] = module_srl;
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
var response_tags = new Array('error','message','tpl'); var response_tags = new Array('error','message','tpl');
@ -217,9 +219,12 @@ function completeInsertCategory(ret_obj) {
function doMoveTree(category_id, source_category_srl, target_category_srl) { function doMoveTree(category_id, source_category_srl, target_category_srl) {
source_category_srl = source_category_srl.replace(/menu_category_/,''); source_category_srl = source_category_srl.replace(/menu_category_/,'');
target_category_srl = target_category_srl.replace(/menu_category_/,''); target_category_srl = target_category_srl.replace(/menu_category_/,'');
var p_fo_obj = xGetElementById("fo_category");
var fo_obj = xGetElementById("fo_move_category"); var fo_obj = xGetElementById("fo_move_category");
fo_obj.source_category_srl.value = source_category_srl; fo_obj.source_category_srl.value = source_category_srl;
fo_obj.target_category_srl.value = target_category_srl; fo_obj.target_category_srl.value = target_category_srl;
fo_obj.module_srl.value = p_fo_obj.module_srl.value;
// 이동 취소를 선택하였을 경우 다시 그림;; // 이동 취소를 선택하였을 경우 다시 그림;;
if(!procFilter(fo_obj, move_category)) { if(!procFilter(fo_obj, move_category)) {

View file

@ -49,6 +49,7 @@
// board 라는 이름의 모듈이 있는지 확인 // board 라는 이름의 모듈이 있는지 확인
$module_info = $oModuleModel->getModuleInfoByMid($args->board_name); $module_info = $oModuleModel->getModuleInfoByMid($args->board_name);
if($module_info->module_srl) $args->module_srl = $module_info->module_srl; if($module_info->module_srl) $args->module_srl = $module_info->module_srl;
else $args->module_srl = 0;
// 게시판 controller 생성 // 게시판 controller 생성
$oBoardController = &getAdminController('board'); $oBoardController = &getAdminController('board');

View file

@ -44,6 +44,37 @@
<title xml:lang="en">manager</title> <title xml:lang="en">manager</title>
</grant> </grant>
</grants> </grants>
<permissions>
<permission action="dispBoardContent" target="manager" />
<permission action="dispBoardWrite" target="manager" />
<permission action="dispBoardDelete" target="manager" />
<permission action="dispBoardReplyComment" target="manager" />
<permission action="dispBoardModifyComment" target="manager" />
<permission action="dispBoardDeleteComment" target="manager" />
<permission action="dispBoardDeleteTrackback" target="manager" />
<permission action="dispBoardMessage" target="manager" />
<permission action="procBoardInsertDocument" target="manager" />
<permission action="procBoardDeleteDocument" target="manager" />
<permission action="procBoardInsertComment" target="manager" />
<permission action="procBoardDeleteComment" target="manager" />
<permission action="procBoardDeleteTrackback" target="manager" />
<permission action="procBoardDeleteFile" target="manager" />
<permission action="procBoardUploadFile" target="manager" />
<permission action="procBoardDownloadFile" target="manager" />
<permission action="dispBoardAdminInsertBoard" target="manager" />
<permission action="dispBoardAdminBoardInfo" target="manager" />
<permission action="dispBoardAdminSkinInfo" target="manager" />
<permission action="dispBoardAdminCategoryInfo" target="manager" />
<permission action="dispBoardAdminManageDocument" target="manager" />
<permission action="procBoardAdminInsertBoard" target="manager" />
<permission action="procBoardAdminUpdateSkinInfo" target="manager" />
<permission action="procBoardAdminInsertCategory" target="manager" />
<permission action="procBoardAdminUpdateCategory" target="manager" />
<permission action="procBoardAdminManageCheckedDocument" target="manager" />
</permissions>
<actions> <actions>
<action name="dispBoardContent" type="view" index="true" /> <action name="dispBoardContent" type="view" index="true" />
<action name="dispBoardWrite" type="view" /> <action name="dispBoardWrite" type="view" />

View file

@ -79,9 +79,9 @@ Jeong, Chan Myeong 070601~070630
.boardList.thumbnail { margin-top:-1px; border-bottom:none;} .boardList.thumbnail { margin-top:-1px; border-bottom:none;}
.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;} .boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;}
.boardList.thumbnail div.cell { float:left; width:167px; overflow:hidden; margin:0 1.5em 0 0; padding-bottom:1.5em;} .boardList.thumbnail div.cell { float:left; width:167px; height:220px; overflow:hidden; margin:0 1.5em 0 0; padding-bottom:1.5em;}
.boardList.thumbnail div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em;} .boardList.thumbnail div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em;}
.boardList.thumbnail div.title { color:#444444; margin-bottom:.2em; padding-left:3px;} .boardList.thumbnail div.title { color:#444444; margin-bottom:.2em; padding-left:3px; overflow:hidden; white-space:nowrap;}
.boardList.thumbnail div.title a { color:#444444; text-decoration:none;} .boardList.thumbnail div.title a { color:#444444; text-decoration:none;}
.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;} .boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;}
.boardList.thumbnail div.nameAndDate a { color:#999999;} .boardList.thumbnail div.nameAndDate a { color:#999999;}

View file

@ -9,6 +9,17 @@
<!-- 목록 --> <!-- 목록 -->
<table cellspacing="0" class="tableType1"> <table cellspacing="0" class="tableType1">
<col width="40" />
<col width="130" />
<col />
<col />
<col width="40" />
<col width="80" />
<col width="100" />
<col width="80" />
<col width="40" />
<col width="40" />
<col width="40" />
<thead> <thead>
<tr> <tr>
<th scope="col">{$lang->no}</th> <th scope="col">{$lang->no}</th>
@ -16,7 +27,7 @@
<form action="./" method="get" onsubmit="return doChangeCategory(this);"> <form action="./" method="get" onsubmit="return doChangeCategory(this);">
<input type="hidden" name="module" value="{$module}" /> <input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" /> <input type="hidden" name="act" value="{$act}" />
<select name="module_category_srl"> <select name="module_category_srl" class="w80">
<option value="">{$lang->module_category}</option> <option value="">{$lang->module_category}</option>
<!--@foreach($module_category as $key => $val)--> <!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option> <option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
@ -34,6 +45,7 @@
<th scope="col">{$lang->admin_id}</th> <th scope="col">{$lang->admin_id}</th>
<th scope="col">{$lang->regdate}</th> <th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->cmd_view}</th> <th scope="col">{$lang->cmd_view}</th>
<th scope="col">{$lang->cmd_copy}</th>
<th scope="col">{$lang->cmd_delete}</th> <th scope="col">{$lang->cmd_delete}</th>
</tr> </tr>
</thead> </thead>
@ -48,13 +60,14 @@
{$module_category[$val->module_category_srl]->title} {$module_category[$val->module_category_srl]->title}
<!--@end--> <!--@end-->
</td> </td>
<td><div class="tLeft"><a href="{getUrl('act','dispBoardAdminBoardInfo','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></div></td> <td><div class="tLeft nowrap">&nbsp; <a href="{getUrl('act','dispBoardAdminBoardInfo','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></div></td>
<td><div class="tLeft">{htmlspecialchars($val->browser_title)}</div></td> <td><div class="tLeft">{htmlspecialchars($val->browser_title)}</div></td>
<td class="tahoma">{$val->is_default}</td> <td class="tahoma">{$val->is_default}</td>
<td class="tahoma">{$val->skin}</td> <td class="tahoma">{$val->skin}</td>
<td class="tahoma">{$val->admin_id}</td> <td class="tahoma">{$val->admin_id}&nbsp;</td>
<td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td> <td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
<td class="blue"><a href="{getUrl('','mid',$val->mid)}" onclick="window.open(this.href); return false;">{$lang->cmd_view}</a></td> <td class="blue"><a href="{getUrl('','mid',$val->mid)}" onclick="window.open(this.href); return false;">{$lang->cmd_view}</a></td>
<td class="blue"><a href="./?module=module&act=dispModuleAdminCopyModule&module_srl={$val->module_srl}" onclick="popopen(this.href);return false;">{$lang->cmd_copy}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispBoardAdminDeleteBoard','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td> <td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispBoardAdminDeleteBoard','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td>
</tr> </tr>
<!--@end--> <!--@end-->

View file

@ -40,6 +40,8 @@
* @brief 특정 게시물들의 소속 모듈 변경 (게시글 이동시에 사용) * @brief 특정 게시물들의 소속 모듈 변경 (게시글 이동시에 사용)
**/ **/
function moveDocumentModule($document_srl_list, $module_srl, $source_module_srl) { function moveDocumentModule($document_srl_list, $module_srl, $source_module_srl) {
if(!count($document_srl_list)) return;
$args->document_srls = implode(',',$document_srl_list); $args->document_srls = implode(',',$document_srl_list);
$args->module_srl = $module_srl; $args->module_srl = $module_srl;

View file

@ -299,17 +299,18 @@
FileHandler::writeFile($thumbnail_file, '', 'w'); FileHandler::writeFile($thumbnail_file, '', 'w');
// 첨부파일이 있는지 확인하고 있으면 썸네일 만듬 // 첨부파일이 있는지 확인하고 있으면 썸네일 만듬
$file_list = FileHandler::readDir($document_path); $oFile = &getModel('file');
$file_list = $oFile->getFiles($this->document_srl);
if(count($file_list)) { if(count($file_list)) {
foreach($file_list as $key => $val) { foreach($file_list as $file) {
if(eregi("^thumbnail_([0-9]+)\.(jpg|gif)$",$val)) continue; if($file->direct_download!='Y') continue;
if(!eregi("\.(jpg|gif|png|jpeg)$", $val)) continue; if(!eregi("(jpg|png|jpeg|gif)$",$file->source_filename)) continue;
$filename = sprintf("%s%s",$document_path,$val); $filename = $file->uploaded_filename;
if(file_exists($filename)) { if(!file_exists($filename)) continue;
FileHandler::createImageFile($filename, $thumbnail_file, $width, $width, 'jpg');
if(file_exists($thumbnail_file)) return Context::getRequestUri().$thumbnail_file; FileHandler::createImageFile($filename, $thumbnail_file, $width, $width, 'jpg');
} if(file_exists($thumbnail_file)) return Context::getRequestUri().$thumbnail_file;
} }
} }

View file

@ -5,8 +5,8 @@
* @brief 文章(document)模块语言包 * @brief 文章(document)模块语言包
**/ **/
$lang->cmd_toggle_checked_document = '선택항목 반전'; $lang->cmd_toggle_checked_document = '反选';
$lang->cmd_delete_checked_document = '删除所选项目'; $lang->cmd_delete_checked_document = '删除所选';
$lang->msg_cart_is_null = '请选择要删除的文章。'; $lang->msg_cart_is_null = '请选择要删除的文章。';
$lang->msg_category_not_moved = '不能移动!'; $lang->msg_category_not_moved = '不能移动!';

View file

@ -61,13 +61,10 @@
/** /**
* 자동백업 기능 체크 ( 수정일 경우는 사용하지 않음) * 자동백업 기능 체크 ( 수정일 경우는 사용하지 않음)
**/ **/
if(!$upload_target_srl && $enable_autosave) { if($enable_autosave) {
// 자동 저장된 데이터를 추출 // 자동 저장된 데이터를 추출
$saved_doc = $this->getSavedDoc(); $saved_doc = $this->getSavedDoc();
// 자동저장된 데이터에 실제하는 문서 번호가 있다면 해당 문서 번호를 세팅
if($saved_doc->document_srl) $upload_target_srl = $saved_doc->upload_target_srl;
// 자동 저장 데이터를 context setting // 자동 저장 데이터를 context setting
Context::set('saved_doc', $saved_doc); Context::set('saved_doc', $saved_doc);
} }

View file

@ -135,7 +135,7 @@
<!-- 에디터 출력 --> <!-- 에디터 출력 -->
<div class="editor_iframe_box"><iframe id="editor_iframe_{$editor_sequence}" frameborder="0" width="100%" height="{$editor_height}" style="background-color:transparent;"></iframe></div> <div class="editor_iframe_box"><iframe id="editor_iframe_{$editor_sequence}" frameborder="0" width="100%" height="{$editor_height}" style="background-color:transparent;"></iframe></div>
<textarea id="editor_textarea_{$editor_sequence}" class="editor_iframe_textarea" style="display:none; height:{$editor_height}"></textarea> <textarea id="editor_textarea_{$editor_sequence}" class="editor_iframe_textarea" style="display:none; height:{$editor_height}" rows="10" cols="10"></textarea>
<!-- 에디터 크기 조절 bar --> <!-- 에디터 크기 조절 bar -->
<div class="textAreaDragIndicator"><div class="textAreaDragIndicatorBar" id="editor_drag_bar_{$editor_sequence}"></div></div> <div class="textAreaDragIndicator"><div class="textAreaDragIndicatorBar" id="editor_drag_bar_{$editor_sequence}"></div></div>

View file

@ -572,11 +572,14 @@ function editorEventCheck(evt) {
case 'Outdent' : case 'Outdent' :
case 'InsertOrderedList' : case 'InsertOrderedList' :
case 'InsertUnorderedList' : case 'InsertUnorderedList' :
case 'SaveAs' : case 'SaveAs' :
case 'Copy' : case 'Print' :
case 'Cut' : case 'Copy' :
case 'Paste' : case 'Cut' :
case 'Paste' :
case 'RemoveFormat' : case 'RemoveFormat' :
case 'Subscript' :
case 'Superscript' :
editorDo(component_name, '', editor_sequence); editorDo(component_name, '', editor_sequence);
break; break;

View file

@ -240,7 +240,7 @@
if(!$source_comment) return $this->dispGuestbookMessage('msg_invalid_request'); if(!$source_comment) return $this->dispGuestbookMessage('msg_invalid_request');
// 필요한 정보들 세팅 // 필요한 정보들 세팅
Context::set('document_srl',$document_srl); Context::set('document_srl',$source_comment->document_srl);
Context::set('parent_srl',$parent_srl); Context::set('parent_srl',$parent_srl);
Context::set('comment_srl',NULL); Context::set('comment_srl',NULL);
Context::set('source_comment',$source_comment); Context::set('source_comment',$source_comment);

View file

@ -10,6 +10,7 @@
<parameter> <parameter>
<param name="mid" target="mid" /> <param name="mid" target="mid" />
<param name="document_srl" target="document_srl" /> <param name="document_srl" target="document_srl" />
<param name="comment_srl" target="comment_srl" />
<param name="parent_srl" target="parent_srl" /> <param name="parent_srl" target="parent_srl" />
<param name="nick_name" target="nick_name" /> <param name="nick_name" target="nick_name" />
<param name="password" target="password" /> <param name="password" target="password" />

View file

@ -9,11 +9,10 @@ function completeDocumentInserted(ret_obj) {
var error = ret_obj['error']; var error = ret_obj['error'];
var message = ret_obj['message']; var message = ret_obj['message'];
var mid = ret_obj['mid']; var mid = ret_obj['mid'];
var document_srl = ret_obj['document_srl'];
alert(message); alert(message);
var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('page','').setQuery('comment_srl','');
location.href = url; location.href = url;
} }
@ -24,9 +23,7 @@ function completeDeleteDocument(ret_obj) {
var mid = ret_obj['mid']; var mid = ret_obj['mid'];
var page = ret_obj['page']; var page = ret_obj['page'];
var url = "./?mid="+mid; var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('comment_srl','');
if(page) url += "&page="+page;
alert(message); alert(message);
location.href = url; location.href = url;
@ -48,9 +45,7 @@ function completeInsertComment(ret_obj) {
var document_srl = ret_obj['document_srl']; var document_srl = ret_obj['document_srl'];
var comment_srl = ret_obj['comment_srl']; var comment_srl = ret_obj['comment_srl'];
var url = "./?mid="+mid+"&document_srl="+document_srl; var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('comment_srl','');
//if(comment_srl) url += "#comment_"+comment_srl;
alert(message); alert(message);
location.href = url; location.href = url;
@ -64,9 +59,7 @@ function completeDeleteComment(ret_obj) {
var document_srl = ret_obj['document_srl']; var document_srl = ret_obj['document_srl'];
var page = ret_obj['page']; var page = ret_obj['page'];
var url = "./?mid="+mid+'&document_srl='+document_srl; var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('comment_srl','');
if(page) url += "&page="+page;
alert(message); alert(message);
location.href = url; location.href = url;

View file

@ -7,6 +7,8 @@
<action name="dispMemberModifyPassword" type="view" standalone="true" /> <action name="dispMemberModifyPassword" type="view" standalone="true" />
<action name="dispMemberLoginForm" type="view" standalone="true" /> <action name="dispMemberLoginForm" type="view" standalone="true" />
<action name="dispMemberLogout" type="view" standalone="true" /> <action name="dispMemberLogout" type="view" standalone="true" />
<action name="dispMemberLeave" type="view" standalone="true" />
<action name="dispMemberOpenIDLeave" type="view" standalone="true" />
<action name="dispMemberOwnDocument" type="view" standalone="true" /> <action name="dispMemberOwnDocument" type="view" standalone="true" />
<action name="dispMemberScrappedDocument" type="view" standalone="true" /> <action name="dispMemberScrappedDocument" type="view" standalone="true" />
@ -40,6 +42,7 @@
<action name="procMemberModifyInfo" type="controller" standalone="true" /> <action name="procMemberModifyInfo" type="controller" standalone="true" />
<action name="procMemberModifyPassword" type="controller" standalone="true" /> <action name="procMemberModifyPassword" type="controller" standalone="true" />
<action name="procMemberLeave" type="controller" standalone="true" /> <action name="procMemberLeave" type="controller" standalone="true" />
<action name="procMemberOpenIDLeave" type="controller" standalone="true" />
<action name="procMemberInsertImageName" type="controller" standalone="true" /> <action name="procMemberInsertImageName" type="controller" standalone="true" />
<action name="procMemberInsertImageMark" type="controller" standalone="true" /> <action name="procMemberInsertImageMark" type="controller" standalone="true" />
<action name="procMemberDeleteImageName" type="controller" standalone="true" /> <action name="procMemberDeleteImageName" type="controller" standalone="true" />

View file

@ -168,6 +168,7 @@
$lang->about_member_default = 'It will be set as default group on join'; $lang->about_member_default = 'It will be set as default group on join';
$lang->about_openid = 'When you join as OpenID, basic info like ID or email address will be saved on this site, but password and certification management will be done on current OpenID offering service'; $lang->about_openid = 'When you join as OpenID, basic info like ID or email address will be saved on this site, but password and certification management will be done on current OpenID offering service';
$lang->about_openid_leave = '오픈아이디의 탈퇴는 현 사이트에서의 회원 정보를 삭제하는 것입니다.<br />탈퇴 후 로그인하시면 새로 가입하시는 것으로 되어 작성한 글에 대한 권한을 가질 수 없게 됩니다';
$lang->about_member = "This is a module for creating/modifing/deleting members and managing group or join form.\nYou can manage members by creating new groups, and get additional information by managing join form"; $lang->about_member = "This is a module for creating/modifing/deleting members and managing group or join form.\nYou can manage members by creating new groups, and get additional information by managing join form";
?> ?>

View file

@ -168,6 +168,7 @@
$lang->about_member_default = 'Al registrar se configura como grupo predefinido'; $lang->about_member_default = 'Al registrar se configura como grupo predefinido';
$lang->about_openid = 'Cuando tu registra como OpenID, la información básica como ID o la dirección del email sera guardado en este sitio, pero la contraseña y la resolución de la certificación se hará en el servicio ofrecido por openID'; $lang->about_openid = 'Cuando tu registra como OpenID, la información básica como ID o la dirección del email sera guardado en este sitio, pero la contraseña y la resolución de la certificación se hará en el servicio ofrecido por openID';
$lang->about_openid_leave = '오픈아이디의 탈퇴는 현 사이트에서의 회원 정보를 삭제하는 것입니다.<br />탈퇴 후 로그인하시면 새로 가입하시는 것으로 되어 작성한 글에 대한 권한을 가질 수 없게 됩니다';
$lang->about_member = "Esto es un módulo para crear/modificar/eliminar usuarios y manejar grupos o el formato del registro.\n Usted puede manejar usuarios creando nuevos grupos, y obtener información adicional manejando el formato del registro"; $lang->about_member = "Esto es un módulo para crear/modificar/eliminar usuarios y manejar grupos o el formato del registro.\n Usted puede manejar usuarios creando nuevos grupos, y obtener información adicional manejando el formato del registro";
?> ?>

View file

@ -168,6 +168,7 @@
$lang->about_member_default = '会員加入時に基本グループとして設定されます。'; $lang->about_member_default = '会員加入時に基本グループとして設定されます。';
$lang->about_openid = 'OpenIDで加入する際、とメールなどの基本情報は、このサイトに保存されますが、パスワードと認証のための処理用の情報は該当するOpenID提供サービス側で行われます。'; $lang->about_openid = 'OpenIDで加入する際、とメールなどの基本情報は、このサイトに保存されますが、パスワードと認証のための処理用の情報は該当するOpenID提供サービス側で行われます。';
$lang->about_openid_leave = '오픈아이디의 탈퇴는 현 사이트에서의 회원 정보를 삭제하는 것입니다.<br />탈퇴 후 로그인하시면 새로 가입하시는 것으로 되어 작성한 글에 대한 권한을 가질 수 없게 됩니다';
$lang->about_member = "会員の作成・修正・削除することができ、グループの管理、加入フォームの管理などが行える会員管理モジュールです。デフォルトで作成されたグループにグループを追加作成して会員管理ができるようにし、加入フォーム管理では基本情報の他、フォームの入力情報を追加することができます。"; $lang->about_member = "会員の作成・修正・削除することができ、グループの管理、加入フォームの管理などが行える会員管理モジュールです。デフォルトで作成されたグループにグループを追加作成して会員管理ができるようにし、加入フォーム管理では基本情報の他、フォームの入力情報を追加することができます。";
?> ?>

View file

@ -168,6 +168,7 @@
$lang->about_member_default = '회원가입시 기본 그룹으로 설정됩니다'; $lang->about_member_default = '회원가입시 기본 그룹으로 설정됩니다';
$lang->about_openid = '오픈아이디로 가입시 아이디와 메일등의 기본 정보는 이 사이트에 저장이 되지만 비밀번호와 인증을 위한 처리는 해당 오픈아이디 제공서비스에서 이루어집니다.'; $lang->about_openid = '오픈아이디로 가입시 아이디와 메일등의 기본 정보는 이 사이트에 저장이 되지만 비밀번호와 인증을 위한 처리는 해당 오픈아이디 제공서비스에서 이루어집니다.';
$lang->about_openid_leave = '오픈아이디의 탈퇴는 현 사이트에서의 회원 정보를 삭제하는 것입니다.<br />탈퇴 후 로그인하시면 새로 가입하시는 것으로 되어 작성한 글에 대한 권한을 가질 수 없게 됩니다';
$lang->about_member = "회원을 생성/수정/삭제 할 수 있고 그룹관리나 가입폼 관리등을 할 수 있는 회원 관리 모듈입니다.\n기본으로 생성된 그룹외의 그룹을 생성하여 회원 관리가 가능하고 가입폼관리를 통한 기본 정보외의 추가 정보를 요구받을 수도 있습니다."; $lang->about_member = "회원을 생성/수정/삭제 할 수 있고 그룹관리나 가입폼 관리등을 할 수 있는 회원 관리 모듈입니다.\n기본으로 생성된 그룹외의 그룹을 생성하여 회원 관리가 가능하고 가입폼관리를 통한 기본 정보외의 추가 정보를 요구받을 수도 있습니다.";
?> ?>

View file

@ -168,6 +168,7 @@
$lang->about_member_default = '将成为注册会员时的默认用户组。'; $lang->about_member_default = '将成为注册会员时的默认用户组。';
$lang->about_openid = '用OpenID注册时该网站只保存用户名和 邮件等基本信息密码和认证处理是在提供OpenID服务的站点中得到解决。'; $lang->about_openid = '用OpenID注册时该网站只保存用户名和 邮件等基本信息密码和认证处理是在提供OpenID服务的站点中得到解决。';
$lang->about_openid_leave = '오픈아이디의 탈퇴는 현 사이트에서의 회원 정보를 삭제하는 것입니다.<br />탈퇴 후 로그인하시면 새로 가입하시는 것으로 되어 작성한 글에 대한 권한을 가질 수 없게 됩니다';
$lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。"; $lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。";
?> ?>

View file

@ -18,6 +18,7 @@
$oModuleController->insertActionForward('member', 'view', 'dispMemberModifyInfo'); $oModuleController->insertActionForward('member', 'view', 'dispMemberModifyInfo');
$oModuleController->insertActionForward('member', 'view', 'dispMemberModifyPassword'); $oModuleController->insertActionForward('member', 'view', 'dispMemberModifyPassword');
$oModuleController->insertActionForward('member', 'view', 'dispMemberLeave'); $oModuleController->insertActionForward('member', 'view', 'dispMemberLeave');
$oModuleController->insertActionForward('member', 'view', 'dispMemberOpenIDLeave');
$oModuleController->insertActionForward('member', 'view', 'dispMemberLoginForm'); $oModuleController->insertActionForward('member', 'view', 'dispMemberLoginForm');
$oModuleController->insertActionForward('member', 'view', 'dispMemberLogout'); $oModuleController->insertActionForward('member', 'view', 'dispMemberLogout');
$oModuleController->insertActionForward('member', 'view', 'dispMemberOwnDocument'); $oModuleController->insertActionForward('member', 'view', 'dispMemberOwnDocument');
@ -125,6 +126,10 @@
$act = $oModuleModel->getActionForward('dispMemberScrappedDocument'); $act = $oModuleModel->getActionForward('dispMemberScrappedDocument');
if(!$act) return true; if(!$act) return true;
// dispMemberOpenIDLeave act의 여부 체크 (2007. 9. 19 추가)
$act = $oModuleModel->getActionForward('dispMemberOpenIDLeave');
if(!$act) return true;
// member 디렉토리 체크 (2007. 8. 11 추가) // member 디렉토리 체크 (2007. 8. 11 추가)
if(!is_dir("./files/member_extra_info")) return true; if(!is_dir("./files/member_extra_info")) return true;
@ -139,6 +144,7 @@
$oModuleController = &getController('module'); $oModuleController = &getController('module');
$oModuleController->insertActionForward('member', 'view', 'dispMemberOwnDocument'); $oModuleController->insertActionForward('member', 'view', 'dispMemberOwnDocument');
$oModuleController->insertActionForward('member', 'view', 'dispMemberScrappedDocument'); $oModuleController->insertActionForward('member', 'view', 'dispMemberScrappedDocument');
$oModuleController->insertActionForward('member', 'view', 'dispMemberOpenIDLeave');
// member 디렉토리 체크 // member 디렉토리 체크
FileHandler::makeDir('./files/member_extra_info/image_name'); FileHandler::makeDir('./files/member_extra_info/image_name');

View file

@ -121,12 +121,7 @@
* @brief 로그아웃 * @brief 로그아웃
**/ **/
function procMemberLogout() { function procMemberLogout() {
$_SESSION['is_logged'] = false; $this->destroySessionInfo();
$_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['logged_info'] = NULL;
$_SESSION['member_srl'] = NULL;
$_SESSION['group_srls'] = array();
$_SESSION['is_admin'] = NULL;
return new Object(); return new Object();
} }
@ -726,12 +721,38 @@
$output = $this->deleteMember($member_srl); $output = $this->deleteMember($member_srl);
if(!$output->toBool()) return $output; if(!$output->toBool()) return $output;
$_SESSION['is_logged'] = false; // 모든 세션 정보 파기
$_SESSION['logged_info'] = null; $this->destroySessionInfo();
// 성공 메세지 리턴
$this->setMessage('success_leaved'); $this->setMessage('success_leaved');
} }
/**
* @brief 오픈아이디 탈퇴
**/
function procMemberOpenIDLeave() {
// 비로그인 상태이면 에러
if(!Context::get('is_logged')) return $this->stop('msg_not_logged');
// 현재 ip와 세션 아이피 비교
if($_SESSION['ipaddress']!=$_SERVER['REMOTE_ADDR']) return $this->stop('msg_not_permitted');
// 로그인한 유저의 정보를 가져옴
$logged_info = Context::get('logged_info');
$member_srl = $logged_info->member_srl;
$output = $this->deleteMember($member_srl);
if(!$output->toBool()) return $output;
// 모든 세션 정보 파기
$this->destroySessionInfo();
// 성공 메세지 리턴
$this->setMessage('success_leaved');
}
/** /**
* @brief 이미지 이름을 추가 * @brief 이미지 이름을 추가
**/ **/
@ -960,6 +981,10 @@
function setSessionInfo($member_info) { function setSessionInfo($member_info) {
if(!$member_info->member_srl) return; if(!$member_info->member_srl) return;
// 오픈아이디인지 체크
if(eregi("^([0-9a-z]+)$", $member_info->user_id)) $member_info->is_openid = false;
else $member_info->is_openid = true;
// 로그인 처리 // 로그인 처리
$_SESSION['is_logged'] = true; $_SESSION['is_logged'] = true;
$_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR'];
@ -1312,5 +1337,15 @@
return sprintf("%08lx%08lx", $nr, $nr2); return sprintf("%08lx%08lx", $nr, $nr2);
} }
/**
* @brief 모든 세션 정보 파기
**/
function destroySessionInfo() {
if(!$_SESSION || !is_array($_SESSION)) return;
foreach($_SESSION as $key => $val) {
$_SESSION[$key] = '';
}
}
} }
?> ?>

View file

@ -231,6 +231,27 @@
$this->setTemplateFile('leave_form'); $this->setTemplateFile('leave_form');
} }
/**
* @brief 오픈 아이디 탈퇴 화면
**/
function dispMemberOpenIDLeave() {
$oMemberModel = &getModel('member');
// 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력
if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged');
$logged_info = Context::get('logged_info');
$member_srl = $logged_info->member_srl;
$member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
Context::set('member_info',$member_info);
if($member_info->member_srl == $logged_info->member_srl) Context::set('my_menu', $this->my_menu);
// 템플릿 파일 지정
$this->setTemplateFile('openid_leave_form');
}
/** /**
* @brief 로그아웃 출력 * @brief 로그아웃 출력
**/ **/

View file

@ -99,8 +99,12 @@
<div class="tCenter"> <div class="tCenter">
<!--@if($member_info->member_srl == $logged_info->member_srl)--> <!--@if($member_info->member_srl == $logged_info->member_srl)-->
<a href="{getUrl('act','dispMemberModifyInfo','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_info}</span></a> <a href="{getUrl('act','dispMemberModifyInfo','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_info}</span></a>
<a href="{getUrl('act','dispMemberModifyPassword','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_password}</span></a> <!--@if($logged_info->is_openid)-->
<a href="{getUrl('act','dispMemberLeave','member_srl','')}" class="button"><span>{$lang->cmd_leave}</span></a> <a href="{getUrl('act','dispMemberOpenIDLeave','member_srl','')}" class="button"><span>{$lang->cmd_leave}</span></a>
<!--@else-->
<a href="{getUrl('act','dispMemberModifyPassword','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_password}</span></a>
<a href="{getUrl('act','dispMemberLeave','member_srl','')}" class="button"><span>{$lang->cmd_leave}</span></a>
<!--@end-->
<!--@end--> <!--@end-->
<a href="{getUrl('act','','member_srl','')}" class="button"><span>{$lang->cmd_back}</span></a> <a href="{getUrl('act','','member_srl','')}" class="button"><span>{$lang->cmd_back}</span></a>
</div> </div>

View file

@ -0,0 +1,8 @@
<filter name="openid_leave_member" module="member" act="procMemberOpenIDLeave" confirm_msg_code="confirm_leave">
<form />
<parameter />
<response callback_func="completeLeave">
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -99,8 +99,12 @@
<div class="tCenter"> <div class="tCenter">
<!--@if($member_info->member_srl == $logged_info->member_srl)--> <!--@if($member_info->member_srl == $logged_info->member_srl)-->
<a href="{getUrl('act','dispMemberModifyInfo','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_info}</span></a> <a href="{getUrl('act','dispMemberModifyInfo','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_info}</span></a>
<a href="{getUrl('act','dispMemberModifyPassword','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_password}</span></a> <!--@if($logged_info->is_openid)-->
<a href="{getUrl('act','dispMemberLeave','member_srl','')}" class="button"><span>{$lang->cmd_leave}</span></a> <a href="{getUrl('act','dispMemberOpenIDLeave','member_srl','')}" class="button"><span>{$lang->cmd_leave}</span></a>
<!--@else-->
<a href="{getUrl('act','dispMemberModifyPassword','member_srl','')}" class="button"><span>{$lang->cmd_modify_member_password}</span></a>
<a href="{getUrl('act','dispMemberLeave','member_srl','')}" class="button"><span>{$lang->cmd_leave}</span></a>
<!--@end-->
<!--@end--> <!--@end-->
<a href="{getUrl('act','','member_srl','')}" class="button"><span>{$lang->cmd_back}</span></a> <a href="{getUrl('act','','member_srl','')}" class="button"><span>{$lang->cmd_back}</span></a>
</div> </div>

View file

@ -0,0 +1,28 @@
{@ $member_title = $lang->msg_leave_member}
<!--#include("./common_header.html")-->
<!--%import("filter/openid_leave_member.xml")-->
<form id="fo_insert_member" action="./" method="get" onsubmit="return procFilter(this, openid_leave_member)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="page" value="{$page}" />
<table cellspacing="0" class="memberInfoTable gap1" title="$lang->msg_leave_member}">
<col width="140" />
<col />
<tr class="first-child">
<th scope="row">{$lang->user_id}</th>
<td>
{$member_info->user_id}
<p>{$lang->about_openid_leave}</p>
</td>
</tr>
</table>
<div class="help tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_leave}" accesskey="s" /></span>
<a href="{getUrl('act','dispMemberInfo','member_srl','')}" class="button"><span>{$lang->cmd_back}</span></a>
</div>
</form>
<!--#include("./common_footer.html")-->

View file

@ -8,7 +8,9 @@
<action name="dispModuleSkinInfo" type="view" standalone="true" /> <action name="dispModuleSkinInfo" type="view" standalone="true" />
<action name="dispModuleAdminCopyModule" type="view" standalone="true" />
<action name="procModuleAdminInsertCategory" type="controller" standalone="true" /> <action name="procModuleAdminInsertCategory" type="controller" standalone="true" />
<action name="procModuleAdminUpdateCategory" type="controller" standalone="true" /> <action name="procModuleAdminUpdateCategory" type="controller" standalone="true" />
<action name="procModuleAdminCopyModule" type="controller" standalone="true" />
</actions> </actions>
</module> </module>

View file

@ -28,6 +28,7 @@
'H' => 'Open summary', 'H' => 'Open summary',
'N' => 'Not open', 'N' => 'Not open',
); );
$lang->module_copy = "Copy module";
$lang->cmd_add_shortcut = "Add Shortcut"; $lang->cmd_add_shortcut = "Add Shortcut";
$lang->cmd_install = "Install"; $lang->cmd_install = "Install";

View file

@ -28,6 +28,7 @@
'H' => 'Abrir el sumario', 'H' => 'Abrir el sumario',
'N' => 'No abrir', 'N' => 'No abrir',
); );
$lang->module_copy = "Copy Module";
$lang->cmd_add_shortcut = "añadir acceso directo"; $lang->cmd_add_shortcut = "añadir acceso directo";
$lang->cmd_install = "Instalar"; $lang->cmd_install = "Instalar";

View file

@ -28,6 +28,7 @@
'H' => '要約配信', 'H' => '要約配信',
'N' => '配信しない', 'N' => '配信しない',
); );
$lang->module_copy = "Copy module";
$lang->cmd_add_shortcut = "ショットカット追加"; $lang->cmd_add_shortcut = "ショットカット追加";
$lang->cmd_install = "インストール"; $lang->cmd_install = "インストール";

View file

@ -28,6 +28,7 @@
'H' => '요약 공개', 'H' => '요약 공개',
'N' => '공개하지 않음', 'N' => '공개하지 않음',
); );
$lang->module_copy = "모듈 복사";
$lang->cmd_add_shortcut = "바로가기 추가"; $lang->cmd_add_shortcut = "바로가기 추가";
$lang->cmd_install = "설치"; $lang->cmd_install = "설치";

View file

@ -28,6 +28,7 @@
'H' => '公开摘要', 'H' => '公开摘要',
'N' => '不公开', 'N' => '不公开',
); );
$lang->module_copy = "Copy Module";
$lang->cmd_add_shortcut = "添加到快捷菜单"; $lang->cmd_add_shortcut = "添加到快捷菜单";
$lang->cmd_install = "安装"; $lang->cmd_install = "安装";

View file

@ -62,5 +62,50 @@
return executeQuery('module.deleteModuleCategory', $args); return executeQuery('module.deleteModuleCategory', $args);
} }
/**
* @brief 모듈 복사
**/
function procModuleAdminCopyModule() {
// 복사하려는 대상 모듈의 정보를 구함
$module_srl = Context::get('module_srl');
if(!$module_srl) return;
// 새로 생성하려는 모듈들의 이름/브라우저 제목을 구함
$clones = array();
$args = Context::getAll();
for($i=1;$i<=10;$i++) {
$mid = $args->{"mid_".$i};
$browser_title = $args->{"browser_title_".$i};
if(!$mid) continue;
if($mid && !$browser_title) $browser_title = $mid;
$clones[$mid] = $browser_title;
}
if(!count($clones)) return;
// 원 모듈의 정보를 직접 구해옴
$obj->module_srl = $module_srl;
$output = executeQuery("module.getMidInfo", $obj);
$module_info = $output->data;
unset($module_info->module_srl);
unset($module_info->regdate);
$oDB = &DB::getInstance();
$oDB->begin();
// 모듈 복사
foreach($clones as $mid => $browser_title) {
$clone_args = null;
$clone_args = clone($module_info);
$clone_args->module_srl = getNextSequence();
$clone_args->mid = $mid;
$clone_args->browser_title = $browser_title;
$clone_args->is_default = 'N';
$output = executeQuery('module.insertModule', $clone_args);
}
$oDB->commit();
$this->setMessage('success_registed');
}
} }
?> ?>

View file

@ -78,5 +78,24 @@
} }
} }
/**
* @brief 모듈 복사 기능
**/
function dispModuleAdminCopyModule() {
// 복사하려는 대상 모듈을 구함
$module_srl = Context::get('module_srl');
// 해당 모듈의 정보를 구함
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
Context::set('module_info', $module_info);
// 레이아웃을 팝업으로 지정
$this->setLayoutFile('popup_layout');
// 템플릿 파일 지정
$this->setTemplateFile('copy_module');
}
} }
?> ?>

View file

@ -37,8 +37,6 @@
* @brief 모듈 입력 * @brief 모듈 입력
**/ **/
function insertModule($args) { function insertModule($args) {
if(!$args->module_srl) $args->module_srl = 0;
// begin transaction // begin transaction
$oDB = &DB::getInstance(); $oDB = &DB::getInstance();
$oDB->begin(); $oDB->begin();

View file

@ -301,6 +301,7 @@
if(!count($xml_obj->module)) return; ///< xml 내용중에 module 태그가 없다면 오류;; if(!count($xml_obj->module)) return; ///< xml 내용중에 module 태그가 없다면 오류;;
$grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음) $grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음)
$permissions = $xml_obj->module->permissions->permission; ///< 권한 대행 (없는 경우도 있음)
$actions = $xml_obj->module->actions->action; ///< action list (필수) $actions = $xml_obj->module->actions->action; ///< action list (필수)
$default_index = $admin_index = ''; $default_index = $admin_index = '';
@ -323,6 +324,21 @@
} }
} }
// 권한 허용 정리
if($permissions) {
if(is_array($permissions)) $permission_list = $permissions;
else $permission_list[] = $permissions;
foreach($permission_list as $permission) {
$action = $permission->attrs->action;
$target = $permission->attrs->target;
$info->permission->{$action} = $target;
$buff .= sprintf('$info->permission->%s = \'%s\';', $action, $target);
}
}
// actions 정리 // actions 정리
if($actions) { if($actions) {
if(is_array($actions)) $action_list = $actions; if(is_array($actions)) $action_list = $actions;

View file

@ -11,6 +11,7 @@
<column name="layout_srl" var="layout_srl" /> <column name="layout_srl" var="layout_srl" />
<column name="description" var="description" /> <column name="description" var="description" />
<column name="content" var="content" /> <column name="content" var="content" />
<column name="grants" var="grants" />
<column name="module" var="module" notnull="notnull" maxlength="80"/> <column name="module" var="module" notnull="notnull" maxlength="80"/>
<column name="is_default" var="is_default" default="N" notnull="notnull" /> <column name="is_default" var="is_default" default="N" notnull="notnull" />
<column name="menu_srl" var="menu_srl" filter="number" /> <column name="menu_srl" var="menu_srl" filter="number" />

View file

@ -0,0 +1,87 @@
<!--%import("js/module_admin.js")-->
<!--%import("filter/copy_module.xml")-->
<div id="popHeadder">
<h1>{$lang->module_copy}</h1>
</div>
<form action="./" method="post" onsubmit="return procFilter(this, copy_module)" >
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
<div id="popBody">
<table cellspacing="0" class="tableType5">
<col width="140" />
<col />
<tr>
<th scope="row">{$lang->module}</th>
<td>{$module_info->module}</td>
</tr>
<tr>
<th scope="row">{$lang->mid}</th>
<td>{$module_info->mid}</td>
</tr>
<tr>
<th scope="row">{$lang->browser_title}</th>
<td>{$module_info->browser_title}</td>
</tr>
</table>
<table cellspacing="0" class="tableType3 gap1">
<col width="50%" />
<col width="50%" />
<tr>
<th scope="col">{$lang->mid}</th>
<th scope="col">{$lang->browser_title}</th>
</tr>
<tr>
<td><input type="text" name="mid_1" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_1" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_2" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_2" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_3" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_3" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_4" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_4" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_5" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_5" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_6" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_6" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_7" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_7" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_8" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_8" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_9" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_9" class="inputTypeText w200" /></td>
</tr>
<tr>
<td><input type="text" name="mid_10" class="inputTypeText w200" /></td>
<td><input type="text" name="browser_title_10" class="inputTypeText w200" /></td>
</tr>
</table>
</div>
<div id="popFooter" class="tCenter gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" /></span>
<span class="button"><input type="button" value="{$lang->cmd_close}" onclick="window.close(); return false;"/></span>
</div>
</form>

View file

@ -0,0 +1,9 @@
<filter name="copy_module" module="module" act="procModuleAdminCopyModule">
<form>
<node target="module_srl" required="true" />
</form>
<response callback_func="completeCopyModule">
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -50,3 +50,9 @@ function doUpdateModule(module) {
params['module_name'] = module; params['module_name'] = module;
exec_xml('install','procInstallAdminUpdate',params, completeInstallModule); exec_xml('install','procInstallAdminUpdate',params, completeInstallModule);
} }
/* 모듈 복사후 */
function completeCopyModule() {
if(typeof(opener)!='undefined') opener.location.href = opener.location.href;
window.close();
}

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<module version="0.1">
<title xml:lang="ko">외부 페이지</title>
<title xml:lang="zh-CN">外页面</title>
<title xml:lang="jp">外でページ</title>
<title xml:lang="en">Outside Page</title>
<title xml:lang="es">Afuera Página</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 9. 17">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<description xml:lang="ko">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="zh-CN">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="jp">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="en">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="es">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
</author>
</module>

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants>
<grant name="view" default="guest">
<title xml:lang="ko">열람</title>
<title xml:lang="zh-CN">浏览</title>
<title xml:lang="jp">閲覧</title>
<title xml:lang="en">view</title>
</grant>
</grants>
<actions>
<action name="dispOpageIndex" type="view" index="true" />
<action name="dispOpageAdminContent" type="view" admin_index="true" standalone="true" />
<action name="dispOpageAdminModuleConfig" type="view" standalone="true" />
<action name="dispOpageAdminInfo" type="view" standalone="true" />
<action name="dispOpageAdminInsert" type="view" standalone="true" />
<action name="dispOpageAdminDelete" type="view" standalone="true" />
<action name="dispOpageAdminContentModify" type="view" standalone="true" />
<action name="procOpageAdminRemoveWidgetCache" type="controller" standalone="true" />
<action name="procOpageAdminInsert" type="controller" standalone="true" />
<action name="procOpageAdminDelete" type="controller" standalone="true" />
<action name="procOpageAdminInsertConfig" type="controller" standalone="true" />
</actions>
</module>

View file

@ -0,0 +1,15 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com)
* @brief 외부 페이지(opage) 모듈의 기본 언어팩
**/
$lang->opage = "외부 페이지";
$lang->opage_path = "외부 문서 위치";
$lang->opage_caching_interval = "캐싱 시간 설정";
$lang->about_opage = "제로보드XE가 아닌 외부 html 또는 php파일을 제로보드XE에서 사용할 수 있도록 하는 모듈입니다.<br />절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다";
$lang->about_opage_path= "외부문서의 위치를 입력해주세요.<br />/path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.<br />http://url/sample.php 와 같이 사용하면 결과를 받아다가 출력을 하게 됩니다.<br />현재 제로보드XE가 설치된 절대경로는 다음과 같습니다.<br />";
$lang->about_opage_caching_interval = "단위는 분이며 정해진 시간동안은 임시 저장한 데이터를 출력하도록 합니다.<br />다른 서버의 정보를 출력하거나 데이터 출력시 많은 자원이 필요하면 원하시는 분 단위로 캐싱하시는 것을 추천해드립니다.<br />0 으로 하시면 캐싱을 하지 않습니다";
?>

View file

@ -0,0 +1,108 @@
<?php
/**
* @class opageAdminController
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 admin controller class
**/
class opageAdminController extends opage {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 외부페이지 추가
**/
function procOpageAdminInsert() {
// module 모듈의 controller 객체 생성
$oModuleController = &getController('module');
// 기본 모듈 정보로 등록된 변수 구함
$module_args = Context::gets('module_srl','module_category_srl','browser_title','is_default','layout_srl');
$module_args->module = 'opage';
$module_args->mid = Context::get('opage_name');
if($module_args->is_default!='Y') $module_args->is_default = 'N';
// 외부 문서 위치, 캐싱 시간은 extra_vars에 저장
$config_args = Context::gets('path','caching_interval');
$module_args->extra_vars = serialize($config_args);
// module_srl이 넘어오면 원 모듈이 있는지 확인
if($module_args->module_srl) {
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_args->module_srl);
}
// is_default=='Y' 이면 기본 모듈을 제거
if($module_args->is_default=='Y') $oModuleController->clearDefaultModule();
// module_srl의 값에 따라 insert/update
if($module_info->module_srl != $module_args->module_srl) {
$output = $oModuleController->insertModule($module_args);
$msg_code = 'success_registed';
$module_info->module_srl = $output->get('module_srl');
} else {
$output = $oModuleController->updateModule($module_args);
$msg_code = 'success_updated';
}
// 등록 실패시 에러 반환
if(!$output->toBool()) return $output;
/**
* 권한 저장
**/
// 현 모듈의 권한 목록을 가져옴
$grant_list = $this->xml_info->grant;
if(count($grant_list)) {
foreach($grant_list as $key => $val) {
$group_srls = Context::get($key);
if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls);
}
$grants = serialize($arr_grant);
}
$oModuleController = &getController('module');
$oModuleController->updateModuleGrant($module_info->module_srl, $grants);
// 캐시 파일 삭제
$cache_file = sprintf("./files/cache/opage/%d.cache", $module_info->module_srl);
if(file_exists($cache_file)) @unlink($cache_file);
// 등록 성공후 return될 메세지 정리
$this->add("module_srl", $module_args->module_srl);
$this->add("opage", Context::get('opage'));
$this->setMessage($msg_code);
}
/**
* @brief 외부페이지 삭제
**/
function procOpageAdminDelete() {
$module_srl = Context::get('module_srl');
// 원본을 구해온다
$oModuleController = &getController('module');
$output = $oModuleController->deleteModule($module_srl);
if(!$output->toBool()) return $output;
$this->add('module','opage');
$this->add('opage',Context::get('opage'));
$this->setMessage('success_deleted');
}
/**
* @brief 외부페이지 기본 정보의 추가
**/
function procOpageAdminInsertConfig() {
// 기본 정보를 받음
$args = Context::gets('test');
}
}
?>

View file

@ -0,0 +1,153 @@
<?php
/**
* @class opageAdminView
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 admin view 클래스
**/
class opageAdminView extends opage {
var $module_srl = 0;
var $list_count = 20;
var $page_count = 10;
/**
* @brief 초기화
**/
function init() {
// module_srl이 있으면 미리 체크하여 존재하는 모듈이면 module_info 세팅
$module_srl = Context::get('module_srl');
// module model 객체 생성
$oModuleModel = &getModel('module');
// 모듈 카테고리 목록을 구함
$module_category = $oModuleModel->getModuleCategories();
Context::set('module_category', $module_category);
// 템플릿 경로 구함 (opage의 경우 tpl에 관리자용 템플릿 모아놓음)
$this->setTemplatePath($this->module_path.'tpl');
}
/**
* @brief 외부페이지 관리 목록 보여줌
**/
function dispOpageAdminContent() {
$args->sort_index = "module_srl";
$args->page = Context::get('page');
$args->list_count = 40;
$args->page_count = 10;
$args->s_module_category_srl = Context::get('module_category_srl');
$output = executeQuery('opage.getOpageList', $args);
// 템플릿에 쓰기 위해서 context::set
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('opage_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 템플릿 파일 지정
$this->setTemplateFile('index');
}
/**
* @brief 선택된 외부페이지의 정보 출력
**/
function dispOpageAdminInfo() {
// GET parameter에서 module_srl을 가져옴
$module_srl = Context::get('module_srl');
// module model 객체 생성
if($module_srl) {
$oOpageModel = &getModel('opage');
$module_info = $oOpageModel->getOpage($module_srl);
if(!$module_info) {
unset($module_info);
unset($module_srl);
} else {
Context::set('module_info',$module_info);
}
// module_srl 값이 없다면 그냥 index 외부페이지를 보여줌
} else {
return $this->dispOpageAdminContent();
}
// 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout)
if($module_info->layout_srl) {
$oLayoutModel = &getModel('layout');
$layout_info = $oLayoutModel->getLayout($module_info->layout_srl);
$module_info->layout = $layout_info->layout;
$module_info->layout_title = $layout_info->layout_title;
}
// 레이아웃 목록을 구해옴
$oLayoutMode = &getModel('layout');
$layout_list = $oLayoutMode->getLayoutList();
Context::set('layout_list', $layout_list);
// 템플릿 파일 지정
$this->setTemplateFile('opage_info');
}
/**
* @brief 외부페이지 추가 출력
**/
function dispOpageAdminInsert() {
// 권한 그룹의 목록을 가져온다
$oMemberModel = &getModel('member');
$group_list = $oMemberModel->getGroups();
Context::set('group_list', $group_list);
// module.xml에서 권한 관련 목록을 구해옴
$grant_list = $this->xml_info->grant;
Context::set('grant_list', $grant_list);
// GET parameter에서 module_srl을 가져옴
$module_srl = Context::get('module_srl');
// module_srl이 있으면 해당 모듈의 정보를 구해서 세팅
if($module_srl) {
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info);
else {
unset($module_info);
unset($module_srl);
}
}
// module_srl이 없으면 sequence값으로 미리 구해 놓음
if(!$module_srl) $module_srl = getNextSequence();
Context::set('module_srl',$module_srl);
// 레이아웃 목록을 구해옴
$oLayoutMode = &getModel('layout');
$layout_list = $oLayoutMode->getLayoutList();
Context::set('layout_list', $layout_list);
// 템플릿 파일 지정
$this->setTemplateFile('opage_insert');
}
/**
* @brief 외부페이지 삭제 화면 출력
**/
function dispOpageAdminDelete() {
$module_srl = Context::get('module_srl');
if(!$module_srl) return $this->dispContent();
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
Context::set('module_info',$module_info);
// 템플릿 파일 지정
$this->setTemplateFile('opage_delete');
}
}
?>

View file

@ -0,0 +1,70 @@
<?php
/**
* @class opage
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 high class
**/
class opage extends ModuleObject {
/**
* @brief 설치시 추가 작업이 필요할시 구현
**/
function moduleInstall() {
// action forward에 등록 (관리자 모드에서 사용하기 위함)
$oModuleController = &getController('module');
$oModuleController->insertActionForward('opage', 'view', 'dispOpageIndex');
$oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminContent');
$oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminInsert');
$oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminDelete');
// opage 에서 사용할 cache디렉토리 생성
FileHandler::makeDir('./files/cache/opage');
return new Object();
}
/**
* @brief 설치가 이상이 없는지 체크하는 method
**/
function checkUpdate() {
$oModuleModel = &getModel('module');
// 외부페이지 모듈을 업그레이드로 설치하였을 경우 필요한 action 값의 여부 체크 (2007. 09. 17)
if(!$oModuleModel->getActionForward('dispOpageIndex')) return true;
if(!$oModuleModel->getActionForward('dispOpageAdminContent')) return true;
if(!$oModuleModel->getActionForward('dispOpageAdminInsert')) return true;
if(!$oModuleModel->getActionForward('dispOpageAdminDelete')) return true;
// cache 디렉토리가 없으면 바로 디렉토리 생성
if(!is_dir('./files/cache/opage')) FileHandler::makeDir('./files/cache/opage');
return false;
}
/**
* @brief 업데이트 실행
**/
function moduleUpdate() {
$oModuleModel = &getModel('module');
$oModuleController = &getController('module');
// 외부페이지 모듈을 업그레이드로 설치하였을 경우 필요한 action 값 등록
if(!$oModuleModel->getActionForward('dispOpageIndex'))
$oModuleController->insertActionForward('opage', 'view', 'dispOpageIndex');
if(!$oModuleModel->getActionForward('dispOpageAdminContent'))
$oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminContent');
if(!$oModuleModel->getActionForward('dispOpageAdminInsert'))
$oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminInsert');
if(!$oModuleModel->getActionForward('dispOpageAdminDelete'))
$oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminDelete');
return new Object(0, 'success_updated');
}
}
?>

View file

@ -0,0 +1,119 @@
<?php
/**
* @class documentController
* @author zero (zero@nzeo.com)
* @brief document 모듈의 controller 클래스
**/
class opageController extends opage {
var $target_path = '';
/**
* @brief 초기화
**/
function init() { }
/**
* @brief 타이틀 추출
**/
function getTitle($content) {
preg_match('!<title([^>]*)>(.*?)<\/title>!is', $content, $buff);
return trim($buff[2]);
}
/**
* @brief header script 추출
**/
function getHeadScript($content) {
// title 태그 제거
$content = preg_replace('!<title([^>]*)>(.*?)<\/title>!is','', $content);
// meta 태그 제거
$content = preg_replace('!<(\/){0,1}meta([^>]*)>!is','', $content);
// <link, <style, <script 등의 정보를 추출
preg_match_all('!<link([^>]*)>!is', $content, $link_buff);
for($i=0;$i<count($link_buff[0]);$i++) {
$tmp_str = trim($link_buff[0][$i]);
if(!$tmp_str) continue;
$header_script .= $tmp_str."\n";
}
preg_match_all('!<(style|script)(.*?)<\/(style|script)>!is', $content, $script_buff);
for($i=0;$i<count($script_buff[0]);$i++) {
$tmp_str = trim($script_buff[0][$i]);
if(!$tmp_str) continue;
$header_script .= $tmp_str."\n";
}
return $header_script;
}
/**
* @brief body의 내용을 추출
**/
function getBodyScript($content) {
// 내용 추출
preg_match('!<body([^>]*)>(.*?)<\/body>!is', $content, $body_buff);
$body_script = $body_buff[2];
// link, style, script등 제거
$body_script = preg_replace('!<link([^>]*)>!is', '', $body_script);
$body_script = preg_replace('!<(style|script)(.*?)<\/(style|script)>!is', '', $body_script);
return $body_script;
}
/**
* @brief 내용에 포함된 src, href의 값을 변경
**/
function replaceSrc($content, $path) {
if(substr($path,-1)!='/') $path.='/';
$this->target_path = $path;
// element의 속성중 value에 " 로 안 묶여 있는 것을 검사하여 묶어줌
$content = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', array($this, '_fixQuotation'), $content);
// img, input, a, link등의 href, src값 변경
$content = preg_replace_callback('!(script|link|a|img|input)([^>]*)(href|src)=[\'"](.*?)[\'"]!is', array($this, '_replaceSrc'), $content);
// background:url의 값 변경
$content = preg_replace_callback('!url\((.*?)\)!is', array($this, '_replaceBackgroundUrl'), $content);
return $content;
}
function _replaceSrc($matches) {
$href = $matches[4];
if(eregi("^http", $href) || $href == '#' || eregi("javascript:",$href)) return $matches[0];
if(substr($href,0,1)=='/') $href = substr($href,1);
$href = $this->target_path.$href;
$buff = sprintf('%s%s%s="%s"', $matches[1], $matches[2], $matches[3], $href);
return $buff;
}
function _replaceBackgroundUrl($matches) {
$href = $matches[1];
if(eregi("^http",$href) || $href == '#' || eregi("javascript:",$href)) return $matches[0];
if(substr($href,0,1)=='/') $href = substr($href,1);
$href = $this->target_path.$href;
$buff = sprintf('url(%s)', $href);
return $buff;
}
/**
* @brief 태그의 속성에 " 를 추가
**/
function _fixQuotation($matches) {
$key = $matches[1];
$val = $matches[2];
if(substr($val,0,1)!='"') $val = '"'.$val.'"';
return sprintf('%s=%s', $key, $val);
}
}
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @class opageModel
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 model 클래스
**/
class opageModel extends opage {
/**
* @brief 초기화
**/
function init() { }
/**
* @brief 특정 외부 페이지의 정보를 return
* 외부 페이지의 경우 기본 모듈의 정보와 설정정보를 함께 다루기 때문에 별도의 model method를 이용하게 한다
**/
function getOpage($module_srl) {
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if($module_info->module_srl != $module_srl) return;
$extra_vars = unserialize($module_info->extra_vars);
if($extra_vars) {
foreach($extra_vars as $key => $val) $module_info->{$key} = $val;
unset($module_info->extra_vars);
}
return $module_info;
}
}
?>

View file

@ -0,0 +1,92 @@
<?php
/**
* @class opageView
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 view 클래스
**/
class opageView extends opage {
/**
* @brief 초기화
**/
function init() {
// 템플릿 경로 구함 (opage의 경우 tpl에 관리자용 템플릿 모아놓음)
$this->setTemplatePath($this->module_path.'tpl');
}
/**
* @brief 일반 요청시 출력
**/
function dispOpageIndex() {
// 권한 체크
if(!$this->grant->view) return $this->stop('msg_not_permitted');
// opage controller 생성
$oOpageController = &getController('opage');
// 외부 페이지 모듈의 정보를 구함
$oOpageModel = &getModel('opage');
$module_info = $oOpageModel->getOpage($this->module_srl);
Context::set('module_info', $module_info);
// 외부 페이지에서 명시된 외부 페이지 경로/ 캐싱 간격을 를 구함
$path = $module_info->path;
$caching_interval = $module_info->caching_interval;
// 캐시 파일 지정
$cache_file = sprintf("./files/cache/opage/%d.cache", $module_info->module_srl);
// 캐시 검사
if($caching_interval > 0 && file_exists($cache_file) && filemtime($cache_file) + $caching_interval*60 > time()) {
$content = FileHandler::readFile($cache_file);
} else {
// 경로에 http://가 있는 경우와 없는 경우를 비교
if(eregi("^http:\/\/",$path)) {
FileHandler::getRemoteFile($path, $cache_file);
$content = FileHandler::readFile($cache_file);
// 서버 내부에 있는 경우
} elseif(file_exists($path)) {
ob_start();
@include($path);
$content = ob_get_contents();
ob_end_clean();
FileHandler::writeFile($cache_file, $content);
}
}
// 외부 서버의 페이지 일 경우 이미지, css, javascript등의 url을 변경
if(eregi("^http:\/\/",$path)) {
$content = $oOpageController->replaceSrc($content, $path);
}
// 해당 문서를 utf-8로 변경
$buff->content = $content;
$buff = Context::convertEncoding($buff);
$content = $buff->content;
// title 추출
$title = $oOpageController->getTitle($content);
if($title) Context::setBrowserTitle($title);
// header script 추출
$head_script = $oOpageController->getHeadScript($content);
if($head_script) Context::addHtmlHeader($head_script);
// body 내용 추출
$body_script = $oOpageController->getBodyScript($content);
if(!$body_script) $body_script = $content;
Context::set('opage_content', $body_script);
// 결과 출력 템플릿 지정
$this->setTemplateFile('content');
}
}
?>

View file

@ -0,0 +1,24 @@
<query id="getOpageList" action="select">
<tables>
<table name="modules" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module" default="opage" />
<group pipe="and">
<condition operation="like" column="mid" var="s_mid" pipe="or" />
<condition operation="like" column="title" var="s_title" pipe="or" />
<condition operation="like" column="comment" var="s_comment" pipe="or" />
<condition operation="equal" column="module" var="s_module" pipe="or" />
<condition operation="equal" column="module_category_srl" var="s_module_category_srl" pipe="or" />
</group>
</conditions>
<navigation>
<index var="sort_index" default="module_srl" order="desc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>

View file

@ -0,0 +1,8 @@
{$opage_content}
<!--@if($grant->is_admin)-->
<!--%import("./js/opage_admin.js")-->
<div class="tRight gap1 clear">
<a href="{getUrl('act','dispOpageAdminInsert','module_srl',$module_info->module_srl)}" class="button"><span>{$lang->cmd_setup}</span></a>
</div>
<!--@end-->

View file

@ -0,0 +1,10 @@
<filter name="delete_opage" module="opage" act="procOpageAdminDelete">
<form>
<node target="module_srl" required="true" />
</form>
<response callback_func="completeDeleteOpage">
<tag name="error" />
<tag name="message" />
<tag name="opage" />
</response>
</filter>

View file

@ -0,0 +1,24 @@
<filter name="insert_opage" module="opage" act="procOpageAdminInsert" confirm_msg_code="confirm_submit">
<form>
<node target="mid" required="true" filter="alpha_number" />
<node target="browser_title" required="true" maxlength="250" />
<node target="opage_path" required="true" maxlength="250" />
</form>
<parameter>
<param name="opage_name" target="mid" />
<param name="module_srl" target="module_srl" />
<param name="module_category_srl" target="module_category_srl" />
<param name="layout_srl" target="layout_srl" />
<param name="browser_title" target="browser_title" />
<param name="is_default" target="is_default" />
<param name="caching_interval" target="opage_caching_interval" />
<param name="path" target="opage_path" />
<param name="view" target="view" />
</parameter>
<response callback_func="completeInsertOpage">
<tag name="error" />
<tag name="message" />
<tag name="module_srl" />
<tag name="opage" />
</response>
</filter>

View file

@ -0,0 +1,3 @@
<!--%import("js/blog_admin.js")-->
<!--%import("js/opage_admin.js")-->
<h3>{$lang->opage} <span class="gray">{$lang->cmd_management}</span></h3>

View file

@ -0,0 +1,90 @@
<!--%import("js/opage_admin.js")-->
<!--#include("header.html")-->
<div class="infoText">{nl2br($lang->about_opage)}</div>
<!-- 정보 -->
<div class="tableSummaryType1">
Total <strong>{number_format($total_count)}</strong>, Opage <strong>{number_format($opage)}</strong>/{number_format($total_opage)}
</div>
<!-- 목록 -->
<table cellspacing="0" class="tableType1">
<col width="40" />
<col width="140" />
<col />
<col />
<col width="40" />
<col width="80" />
<col width="40" />
<col width="40" />
<col width="40" />
<thead>
<tr>
<th scope="col">{$lang->no}</th>
<th scope="col">
<form action="./" method="get" onsubmit="return doChangeCategory(this);">
<input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" />
<select name="module_category_srl" class="w100">
<option value="">{$lang->module_category}</option>
<!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
<option value="">---------</option>
<option value="-1">{$lang->cmd_management}</option>
</select>
<span class="button"><input type="submit" name="go_button" id="go_button" value="GO" /></span>
</form>
</th>
<th scope="col">{$lang->mid}</th>
<th scope="col">{$lang->browser_title}</th>
<th scope="col">{$lang->is_default}</th>
<th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->cmd_view}</th>
<th scope="col">{$lang->cmd_copy}</th>
<th scope="col">{$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
<!--@foreach($opage_list as $no => $val)-->
<tr>
<td class="tahoma">{$no}</td>
<td>
<!--@if(!$val->module_category_srl)-->
{$lang->not_exists}
<!--@else-->
{$module_category[$val->module_category_srl]->title}
<!--@end-->
</td>
<td><a href="{getUrl('act','dispOpageAdminInsert','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></td>
<td>{$val->browser_title}</td>
<td class="tahoma">{$val->is_default}</td>
<td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
<td class="blue"><a href="{getUrl('','mid',$val->mid)}" onclick="window.open(this.href); return false;">{$lang->cmd_view}</a></td>
<td class="blue"><a href="./?module=module&act=dispModuleAdminCopyModule&module_srl={$val->module_srl}" onclick="popopen(this.href);return false;">{$lang->cmd_copy}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispOpageAdminDelete','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td>
</tr>
<!--@end-->
</tbody>
</table>
<!-- 버튼 -->
<div class="fr gap1">
<a href="{getUrl('act','dispOpageAdminInsert','module_srl','')}" class="button"><span>{$lang->cmd_make}</span></a>
</div>
<!-- 페이지 네비게이션 -->
<div class="pageNavigation">
<a href="{getUrl('page','','module_srl','')}" class="goToFirst"><img src="../../admin/tpl/images/bottomGotoFirst.gif" alt="{$lang->first_page}" width="7" height="5" /></a>
<!--@while($page_no = $page_navigation->getNextPage())-->
<!--@if($page == $page_no)-->
<span class="current">{$page_no}</span>
<!--@else-->
<a href="{getUrl('page',$page_no,'module_srl','')}">{$page_no}</a>
<!--@end-->
<!--@end-->
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="goToLast"><img src="../../admin/tpl/images/bottomGotoLast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
</div>

View file

@ -0,0 +1,75 @@
/**
* @file modules/opage/js/opage_admin.js
* @author zero (zero@nzeo.com)
* @brief opage모듈의 관리자용 javascript
**/
/* 모듈 생성 후 */
function completeInsertOpage(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var opage = ret_obj['opage'];
var module_srl = ret_obj['module_srl'];
alert(message);
var url = '';
if(location.href.getQuery('module')=='admin') {
url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispOpageAdminInsert');
if(opage) url = url.setQuery('opage',opage);
} else {
url = current_url.setQuery('act','').setQuery('module_srl','');
}
location.href = url;
}
/* 모듈 삭제 후 */
function completeDeleteOpage(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var opage = ret_obj['opage'];
alert(message);
var url = current_url.setQuery('act','dispOpageAdminContent');
if(opage) url = url.setQuery('opage',opage);
location.href = url;
}
/* 카테고리 이동 */
function doChangeCategory(fo_obj) {
var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value;
if(module_category_srl==-1) {
location.href = current_url.setQuery('act','dispModuleAdminCategory');
return false;
}
return true;
}
/* 권한 관련 */
function doSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked=true;
}
}
function doUnSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked = false;
}
}

View file

@ -0,0 +1,31 @@
<!--%import("filter/delete_opage.xml")-->
<!--%import("js/opage_admin.js")-->
<!--#include("header.html")-->
<form action="./" method="get" onsubmit="return procFilter(this, delete_opage)">
<input type="hidden" name="opage" value="{$opage}" />
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
<table cellspacing="0" class="tableType4">
<col width="150" />
<col />
<tr>
<th scope="row" colspan="2">{$lang->confirm_delete}</th>
</tr>
<tr>
<th scope="row">{$lang->module_name}</th>
<td>{$module_info->mid}</td>
</tr>
<tr>
<th scope="row">{$lang->module}</th>
<td>{$module_info->module}</td>
</tr>
</table>
<div class="tRight gap1">
<a href="{getUrl('act','dispOpageAdminContent')}" class="button"><span>{$lang->cmd_back}</span></a>
<span class="button"><input type="submit" value="{$lang->cmd_delete}" /></span>
</div>
</form>

View file

@ -0,0 +1,116 @@
<!--%import("filter/insert_opage.xml")-->
<!--#include("header.html")-->
<form action="./" method="post" onsubmit="return procFilter(this, insert_opage)" enctype="multipart/form-data">
<input type="hidden" name="opage" value="{$opage}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<!--@if($module_info->is_default=='Y')-->
<input type="hidden" name="is_default" value="Y" />
<!--@end-->
<table cellspacing="0" class="tableType2">
<col width="150" />
<col />
<tr>
<th scope="row">{$lang->mid}</th>
<td>
<input type="text" name="mid" value="{$module_info->mid}" class="inputTypeText" />
<p>{$lang->about_mid}</p>
</td>
</tr>
<!--@if($module_info->is_default!='Y')-->
<tr>
<th scope="row">{$lang->is_default}</th>
<td>
<input type="checkbox" name="is_default" value="Y" <!--@if($module_info->is_default=='Y')-->checked="checked"<!--@end--> id="fld_for_default" class="checkbox" />
<label for="fld_for_default">{$lang->about_default}</label>
</td>
</tr>
<!--@end-->
<tr>
<th scope="row">{$lang->module_category}</th>
<td>
<select name="module_category_srl">
<option value="0">{$lang->notuse}</option>
<!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_info->module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
</select>
<p>{$lang->about_module_category}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->browser_title}</th>
<td>
<input type="text" name="browser_title" value="{htmlspecialchars($module_info->browser_title)}" class="inputTypeText" />
<p>{$lang->about_browser_title}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->layout}</th>
<td>
<select name="layout_srl">
<option value="0">{$lang->notuse}</option>
<!--@foreach($layout_list as $key => $val)-->
<option value="{$val->layout_srl}" <!--@if($module_info->layout_srl==$val->layout_srl)-->selected="selected"<!--@end-->>{$val->title} ({$val->layout})</option>
<!--@end-->
</select>
<p>{$lang->about_layout}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->opage_caching_interval}</th>
<td>
<input type="text" name="opage_caching_interval" value="{(int)$module_info->caching_interval}" class="inputTypeText w40" /> {$lang->unit_min}
<p>{$lang->about_opage_caching_interval}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->opage_path}</th>
<td>
<input type="text" name="opage_path" value="{htmlspecialchars($module_info->path)}" class="inputTypeText w400" />
<p>{$lang->about_opage_path}<b>{realpath("./")}</b></p>
</td>
</tr>
</table>
<!-- 권한 출력 -->
<table cellspacing="0" class="tableType3 gap1">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<thead>
<tr>
<th scope="col">{$lang->grant}</th>
<th scope="col" colspan="3">{$lang->target}</th>
</tr>
</thead>
<tbody>
<!--@foreach($grant_list as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@foreach($group_list as $k => $v)-->
<input type="checkbox" class="checkbox" name="{$key}" value="{$v->group_srl}" id="grant_{$key}_{$v->group_srl}" <!--@if(is_array($module_info->grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"<!--@end-->/>
<label for="grant_{$key}_{$v->group_srl}">{$v->title}</label>
<!--@end-->
</td>
<td><a href="#" onclick="doSelectAll(this, '{$key}')" class="blue">{$lang->cmd_select_all}</a></td>
<td><a href="#" onclick="doUnSelectAll(this, '{$key}')" class="red">{$lang->cmd_unselect_all}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<div class="tRight gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
<!--@if($module == 'admin')-->
<span class="button"><input type="button" value="{$lang->cmd_list}" onclick="location.href='./?module=admin&act=dispOpageAdminContent';return false;" /></span>
<!--@else-->
<span class="button"><input type="button" value="{$lang->cmd_back}" onclick="location.href=current_url.setQuery('module_srl','').setQuery('act','');return false;" /></span>
<!--@end-->
</div>
</form>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<module version="0.1"> <module version="0.1">
<title xml:lang="ko">페이지</title> <title xml:lang="ko">페이지</title>
<title xml:lang="zh-CN">页面</title>> <title xml:lang="zh-CN">页面</title>
<title xml:lang="jp">ページ</title> <title xml:lang="jp">ページ</title>
<title xml:lang="en">Page</title> <title xml:lang="en">Page</title>
<title xml:lang="es">Página</title> <title xml:lang="es">Página</title>

View file

@ -1,6 +1,24 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<module> <module>
<grants /> <grants>
<grant name="view" default="guest">
<title xml:lang="ko">열람</title>
<title xml:lang="zh-CN">浏览</title>
<title xml:lang="jp">閲覧</title>
<title xml:lang="en">view</title>
</grant>
<grant name="manager" default="root">
<title xml:lang="ko">관리</title>
<title xml:lang="zh-CN">管理</title>
<title xml:lang="jp">管理</title>
<title xml:lang="en">manager</title>
</grant>
</grants>
<permissions>
<permission action="procPageAdminRemoveWidgetCache" target="manager" />
<permission action="dispPageAdminContentModify" target="manager" />
<permission action="procPageAdminInsert" target="manager" />
</permissions>
<actions> <actions>
<action name="dispPageIndex" type="view" index="true" /> <action name="dispPageIndex" type="view" index="true" />
<action name="dispPageAdminContent" type="view" admin_index="true" standalone="true" /> <action name="dispPageAdminContent" type="view" admin_index="true" standalone="true" />

View file

@ -42,6 +42,7 @@
if($module_info->module_srl != $args->module_srl) { if($module_info->module_srl != $args->module_srl) {
$output = $oModuleController->insertModule($args); $output = $oModuleController->insertModule($args);
$msg_code = 'success_registed'; $msg_code = 'success_registed';
$module_info->module_srl = $output->get('module_srl');
} else { } else {
$output = $oModuleController->updateModule($args); $output = $oModuleController->updateModule($args);
$msg_code = 'success_updated'; $msg_code = 'success_updated';
@ -49,6 +50,24 @@
if(!$output->toBool()) return $output; if(!$output->toBool()) return $output;
/**
* 권한 저장
**/
// 현 모듈의 권한 목록을 저장
$grant_list = $this->xml_info->grant;
if(count($grant_list)) {
foreach($grant_list as $key => $val) {
$group_srls = Context::get($key);
if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls);
}
$grants = serialize($arr_grant);
}
$oModuleController = &getController('module');
$oModuleController->updateModuleGrant($module_info->module_srl, $grants);
$this->add("module_srl", $args->module_srl); $this->add("module_srl", $args->module_srl);
$this->add("page", Context::get('page')); $this->add("page", Context::get('page'));
$this->setMessage($msg_code); $this->setMessage($msg_code);

View file

@ -27,6 +27,15 @@
// 템플릿 경로 구함 (page의 경우 tpl에 관리자용 템플릿 모아놓음) // 템플릿 경로 구함 (page의 경우 tpl에 관리자용 템플릿 모아놓음)
$this->setTemplatePath($this->module_path.'tpl'); $this->setTemplatePath($this->module_path.'tpl');
// 권한 그룹의 목록을 가져온다
$oMemberModel = &getModel('member');
$group_list = $oMemberModel->getGroups();
Context::set('group_list', $group_list);
// module.xml에서 권한 관련 목록을 구해옴
$grant_list = $this->xml_info->grant;
Context::set('grant_list', $grant_list);
} }
/** /**
@ -182,6 +191,9 @@
$layout_list = $oLayoutMode->getLayoutList(); $layout_list = $oLayoutMode->getLayoutList();
Context::set('layout_list', $layout_list); Context::set('layout_list', $layout_list);
// 내용 수정시에는 레이아웃을 보이지 않도록 세팅
Context::set('layout','none');
// 템플릿 파일 지정 // 템플릿 파일 지정
$this->setTemplateFile('page_content_modify'); $this->setTemplateFile('page_content_modify');
} }

View file

@ -23,6 +23,9 @@
* @brief 일반 요청시 출력 * @brief 일반 요청시 출력
**/ **/
function dispPageIndex() { function dispPageIndex() {
// 권한 체크
if(!$this->grant->view) return $this->stop('msg_not_permitted');
// 템플릿에서 사용할 변수를 Context::set() // 템플릿에서 사용할 변수를 Context::set()
if($this->module_srl) Context::set('module_srl',$this->module_srl); if($this->module_srl) Context::set('module_srl',$this->module_srl);

View file

@ -1,10 +1,12 @@
{$page_content} {$page_content}
<!--@if($grant->is_admin)--> <!--@if($grant->manager)-->
<!--%import("./js/page_admin.js")--> <!--%import("./js/page_admin.js")-->
<div class="tRight gap1 clear"> <div class="tRight gap1 clear">
<a href="#" onclick="doRemoveWidgetCache({$module_info->module_srl}); return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a> <a href="#" onclick="doRemoveWidgetCache({$module_info->module_srl}); return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a>
<!--@if($grant->is_admin)-->
<a href="{getUrl('act','dispPageAdminInfo','module_srl',$module_info->module_srl)}" class="button"><span>{$lang->cmd_setup}</span></a> <a href="{getUrl('act','dispPageAdminInfo','module_srl',$module_info->module_srl)}" class="button"><span>{$lang->cmd_setup}</span></a>
<!--@end-->
<a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a> <a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a>
</div> </div>
<!--@end--> <!--@end-->

View file

@ -10,6 +10,8 @@
<param name="layout_srl" target="layout_srl" /> <param name="layout_srl" target="layout_srl" />
<param name="browser_title" target="browser_title" /> <param name="browser_title" target="browser_title" />
<param name="is_default" target="is_default" /> <param name="is_default" target="is_default" />
<param name="view" target="view" />
<param name="manager" target="manager" />
</parameter> </parameter>
<response callback_func="completeInsertPage"> <response callback_func="completeInsertPage">
<tag name="error" /> <tag name="error" />

View file

@ -12,6 +12,8 @@
<param name="content" target="content" /> <param name="content" target="content" />
<param name="browser_title" target="browser_title" /> <param name="browser_title" target="browser_title" />
<param name="is_default" target="is_default" /> <param name="is_default" target="is_default" />
<param name="view" target="view" />
<param name="manager" target="manager" />
</parameter> </parameter>
<response callback_func="completeInsertPageContent"> <response callback_func="completeInsertPageContent">
<tag name="error" /> <tag name="error" />

View file

@ -10,6 +10,15 @@
<!-- 목록 --> <!-- 목록 -->
<table cellspacing="0" class="tableType1"> <table cellspacing="0" class="tableType1">
<col width="40" />
<col width="140" />
<col />
<col />
<col width="40" />
<col width="80" />
<col width="40" />
<col width="40" />
<col width="40" />
<thead> <thead>
<tr> <tr>
<th scope="col">{$lang->no}</th> <th scope="col">{$lang->no}</th>
@ -17,7 +26,7 @@
<form action="./" method="get" onsubmit="return doChangeCategory(this);"> <form action="./" method="get" onsubmit="return doChangeCategory(this);">
<input type="hidden" name="module" value="{$module}" /> <input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" /> <input type="hidden" name="act" value="{$act}" />
<select name="module_category_srl"> <select name="module_category_srl" class="w100">
<option value="">{$lang->module_category}</option> <option value="">{$lang->module_category}</option>
<!--@foreach($module_category as $key => $val)--> <!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option> <option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
@ -33,6 +42,7 @@
<th scope="col">{$lang->is_default}</th> <th scope="col">{$lang->is_default}</th>
<th scope="col">{$lang->regdate}</th> <th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->cmd_view}</th> <th scope="col">{$lang->cmd_view}</th>
<th scope="col">{$lang->cmd_copy}</th>
<th scope="col">{$lang->cmd_delete}</th> <th scope="col">{$lang->cmd_delete}</th>
</tr> </tr>
</thead> </thead>
@ -48,11 +58,12 @@
{$module_category[$val->module_category_srl]->title} {$module_category[$val->module_category_srl]->title}
<!--@end--> <!--@end-->
</td> </td>
<td><a href="{getUrl('act','dispPageAdminInfo','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></td> <td><div class="tLeft nowrap">&nbsp; <a href="{getUrl('act','dispPageAdminInfo','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></div></td>
<td>{$val->browser_title}</td> <td><div class="tLeft">{$val->browser_title}</div></td>
<td class="tahoma">{$val->is_default}</td> <td class="tahoma">{$val->is_default}</td>
<td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td> <td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
<td class="blue"><a href="./?mid={$val->mid}" target="_blank">{$lang->cmd_view}</a></td> <td class="blue"><a href="{getUrl('','mid',$val->mid)}" onclick="window.open(this.href); return false;">{$lang->cmd_view}</a></td>
<td class="blue"><a href="./?module=module&act=dispModuleAdminCopyModule&module_srl={$val->module_srl}" onclick="popopen(this.href);return false;">{$lang->cmd_copy}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispPageAdminDelete','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td> <td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispPageAdminDelete','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td>
</tr> </tr>
<!--@end--> <!--@end-->

View file

@ -83,3 +83,28 @@ function completeRemoveWidgetCache(ret_obj) {
alert(message); alert(message);
location.reload(); location.reload();
} }
/* 권한 관련 */
function doSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked=true;
}
}
function doUnSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked = false;
}
}

View file

@ -15,6 +15,9 @@
<input type="hidden" name="module_category_srl" value="{$module_info->module_category_srl}" /> <input type="hidden" name="module_category_srl" value="{$module_info->module_category_srl}" />
<input type="hidden" name="browser_title" value="{$module_info->browser_title}" /> <input type="hidden" name="browser_title" value="{$module_info->browser_title}" />
<input type="hidden" name="layout_srl" value="{$module_info->layout_srl}" /> <input type="hidden" name="layout_srl" value="{$module_info->layout_srl}" />
<!--@foreach($grant_list as $key => $val)-->
<input type="hidden" name="{$key}" value="<!--@if(is_array($module_info->grants[$key]))-->{implode('|@|',$module_info->grants[$key])}<!--@end-->" />
<!--@end-->
<div class="widget_list"> <div class="widget_list">
<!--@foreach($widget_list as $widget)--> <!--@foreach($widget_list as $widget)-->

View file

@ -59,17 +59,46 @@
<p>{$lang->about_layout}</p> <p>{$lang->about_layout}</p>
</td> </td>
</tr> </tr>
<tr>
<td colspan="2" class="tRight">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
<a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a>
<!--@if($module=="admin")-->
<a href="{getUrl('act','dispPageAdminContent','module_srl','')}" class="button"><span>{$lang->cmd_list}</span></a>
<!--@else-->
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_back}</span></a>
<!--@end-->
</td>
</tr>
</table> </table>
<!-- 권한 출력 -->
<table cellspacing="0" class="tableType3 gap1">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<thead>
<tr>
<th scope="col">{$lang->grant}</th>
<th scope="col" colspan="3">{$lang->target}</th>
</tr>
</thead>
<tbody>
<!--@foreach($grant_list as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@foreach($group_list as $k => $v)-->
<input type="checkbox" class="checkbox" name="{$key}" value="{$v->group_srl}" id="grant_{$key}_{$v->group_srl}" <!--@if(is_array($module_info->grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"<!--@end-->/>
<label for="grant_{$key}_{$v->group_srl}">{$v->title}</label>
<!--@end-->
</td>
<td><a href="#" onclick="doSelectAll(this, '{$key}')" class="blue">{$lang->cmd_select_all}</a></td>
<td><a href="#" onclick="doUnSelectAll(this, '{$key}')" class="red">{$lang->cmd_unselect_all}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<div class="tRight gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
<a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a>
<!--@if($module=="admin")-->
<a href="{getUrl('act','dispPageAdminContent','module_srl','')}" class="button"><span>{$lang->cmd_list}</span></a>
<!--@else-->
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_back}</span></a>
<!--@end-->
</div>
</form> </form>

View file

@ -60,6 +60,36 @@
</tr> </tr>
</table> </table>
<!-- 권한 출력 -->
<table cellspacing="0" class="tableType3 gap1">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<thead>
<tr>
<th scope="col">{$lang->grant}</th>
<th scope="col" colspan="3">{$lang->target}</th>
</tr>
</thead>
<tbody>
<!--@foreach($grant_list as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@foreach($group_list as $k => $v)-->
<input type="checkbox" class="checkbox" name="{$key}" value="{$v->group_srl}" id="grant_{$key}_{$v->group_srl}" <!--@if(is_array($module_info->grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"<!--@end-->/>
<label for="grant_{$key}_{$v->group_srl}">{$v->title}</label>
<!--@end-->
</td>
<td><a href="#" onclick="doSelectAll(this, '{$key}')" class="blue">{$lang->cmd_select_all}</a></td>
<td><a href="#" onclick="doUnSelectAll(this, '{$key}')" class="red">{$lang->cmd_unselect_all}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<div class="tRight gap1"> <div class="tRight gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span> <span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
</div> </div>

View file

@ -10,10 +10,10 @@
$lang->poll_join_count = "投票者"; $lang->poll_join_count = "投票者";
$lang->poll_checkcount = "必选项目数"; $lang->poll_checkcount = "必选项目数";
$lang->cmd_poll_list = '查看投票调查目录'; $lang->cmd_poll_list = '查看目录';
$lang->cmd_delete_checked_poll = '删除所选项目'; $lang->cmd_delete_checked_poll = '删除所选项目';
$lang->cmd_apply_poll = '参与投票'; $lang->cmd_apply_poll = '参与投票';
$lang->cmd_delete_checked_poll = '删除所选问卷'; $lang->cmd_delete_checked_poll = '删除所选';
$lang->success_poll = '感谢您参与投票。'; $lang->success_poll = '感谢您参与投票。';

View file

@ -17,7 +17,12 @@
* @brief 팝업창에서 설문 작성 완료후 저장을 누를때 설문 등록 * @brief 팝업창에서 설문 작성 완료후 저장을 누를때 설문 등록
**/ **/
function procInsert() { function procInsert() {
$upload_target_srl = Context::get('upload_target_srl'); // 기본적으로 필요한 변수 설정
$editor_sequence = Context::get('editor_sequence');
// upload_target_srl 구함
$upload_target_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl;
if(!$upload_target_srl) $upload_target_srl = getNextSequence();
$stop_year = Context::get('stop_year'); $stop_year = Context::get('stop_year');
$stop_month = Context::get('stop_month'); $stop_month = Context::get('stop_month');

View file

@ -4,13 +4,11 @@
<title xml:lang="zh-CN">TatterTools 数据导入</title> <title xml:lang="zh-CN">TatterTools 数据导入</title>
<title xml:lang="jp">TTデータ移転</title> <title xml:lang="jp">TTデータ移転</title>
<title xml:lang="en">Transfer data from TatterTools</title> <title xml:lang="en">Transfer data from TatterTools</title>
<title xml:lang="es">Transferir datos desde la Herramienta Tatter</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28"> <author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name> <name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">zero</name> <name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">Zero</name> <name xml:lang="jp">Zero</name>
<name xml:lang="en">Zero</name> <name xml:lang="en">Zero</name>
<name xml:lang="es">Zero</name>
<description xml:lang="ko"> <description xml:lang="ko">
태터툴즈의 백업파일을 제로보드XE에 입력을 하는 모듈입니다. 태터툴즈의 백업파일을 제로보드XE에 입력을 하는 모듈입니다.
첨부파일 포함하지 않은 백업파일이 필요합니다. 첨부파일 포함하지 않은 백업파일이 필요합니다.
@ -28,11 +26,6 @@
Module for inputting TattertTools' backup file to ZeroboardXE. Module for inputting TattertTools' backup file to ZeroboardXE.
Backup file without attachment is required. Backup file without attachment is required.
Attachments will be downloaded from the original address. Attachments will be downloaded from the original address.
</description>
<description xml:lang="es">
Módulo para ingresar archivos de respaldo de la Herramienta Tatter de ZeroboardXE.
Se requiere archivo de respaldo sin archivos adjuntos.
Archivos adjuntos serán descargados directamente desde la dirección original.
</description> </description>
</author> </author>
</module> </module>

View file

@ -9,7 +9,7 @@
크기, 배경색등의 조건을 설정하지 않으시면 기본 설정으로 사용됩니다. 크기, 배경색등의 조건을 설정하지 않으시면 기본 설정으로 사용됩니다.
그래프를 그리기 위해서 GD 라이브러리가 설치되어 있어야 합니다. 그래프를 그리기 위해서 GD 라이브러리가 설치되어 있어야 합니다.
</description> </description>
<description xml:lang="s"> <description xml:lang="es">
Este widget contador de image muestra un pequeño gráfico para ser añadidos en el blog o sitios. Este widget contador de image muestra un pequeño gráfico para ser añadidos en el blog o sitios.
Si no configura el tamaño, color de fondo, etc., se utiliza la configuración predefinida. Si no configura el tamaño, color de fondo, etc., se utiliza la configuración predefinida.
Para dibujar el gráfico debe estar instalada la librería GD. Para dibujar el gráfico debe estar instalada la librería GD.
@ -70,7 +70,7 @@
</var> </var>
<var id="check_bg_color"> <var id="check_bg_color">
<name xml:lang="ko">체크 무늬 배경색</name> <name xml:lang="ko">체크 무늬 배경색</name>
<name xml:lang="ko">Textura escocés de fondo</name> <name xml:lang="es">Textura escocés de fondo</name>
<type>text</type> <type>text</type>
<description xml:lang="ko"><![CDATA[지정하신 색상 코드로 체크 무늬 배경을 그립니다. <description xml:lang="ko"><![CDATA[지정하신 색상 코드로 체크 무늬 배경을 그립니다.
기본 : <span style="color:#F9F9F9">#F9F9F9</span> 기본 : <span style="color:#F9F9F9">#F9F9F9</span>
@ -117,7 +117,7 @@
기본 : <span style="color:#ed3027">#ed3027</span> 기본 : <span style="color:#ed3027">#ed3027</span>
#과 6자리의 색상코드 입력해주세요]]></description> #과 6자리의 색상코드 입력해주세요]]></description>
<description xml:lang="es"><![CDATA[Con el código del color asignado mostrará el color del punto en donde la línea del gráfico esté doblado. <description xml:lang="es"><![CDATA[Con el código del color asignado mostrará el color del punto en donde la línea del gráfico esté doblado.
기본 : <span style="color:#ed3027">#ed3027</span> Predefinido : <span style="color:#ed3027">#ed3027</span>
Ingrese # + 6 espacios del código del color]]></description> Ingrese # + 6 espacios del código del color]]></description>
</var> </var>
</extra_vars> </extra_vars>

Some files were not shown because too many files have changed in this diff Show more