mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-24 05:39:58 +09:00
개발버전인 sandbox를 beta 0.1.7 배포를 위해 trunk로 copy
git-svn-id: http://xe-core.googlecode.com/svn/trunk@2675 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
commit
130c933522
99 changed files with 1472 additions and 812 deletions
807
LICENSE
807
LICENSE
|
|
@ -1,281 +1,526 @@
|
|||
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
|
||||
|
||||
이 문서는 자유 소프트웨어 재단(Free Software Foundation)의 GNU General Public License를
|
||||
한국어로 번역한 것입니다. 이 문서는 GNU General Public License가 내포하고 있는 호혜적인
|
||||
자유와 공유의 정신을 보다 많은 사람들에게 알리기 위한 희망에서 작성되었지만, 자유 소프트
|
||||
웨어 재단의 공식 문서로 취급될 수는 없습니다. 이는 원래의 문서가 의도하고 있는 내용이 왜
|
||||
곡되지 않고 법률적으로 유효하기 위해서 선행되어야 할 양국의 현행 법률과 언어의 적합성 여
|
||||
부에 대한 전문가들의 검토 작업에 많은 비용이 필요하기 때문입니다. 또한 공식 번역문으로 인
|
||||
정된 문서라 하더라도 다른 언어로의 번역에 따른 위험 부담은 여전히 남아 있게 됩니다. 따라서
|
||||
자유 소프트웨어 재단은 오역이나 해석상의 난점으로 인해서 발생될 지도 모를 혼란과 분쟁의
|
||||
가능성을 미연에 방지하고, 문서가 담고 있는 내용과 취지를 보다 많은 사람들에게 알리려는 상
|
||||
반된 목적을, 한국어 번역문을 공식적으로 승인하지 않는 방법으로 양립시키고 있습니다.
|
||||
|
||||
자유 소프트웨어 재단은 어떠한 언어에 대한 번역문도 공식적으로 인정하지 않고 있으며,
|
||||
그러한 계획 또한 갖고 있지 않습니다. 자유 소프트웨어 재단은 GNU General Public License를
|
||||
실무에 적용할 경우, 오직 영문판에 의해서만 그 법률적 효력이 올바르게 발생될 수 있음을 권고하고
|
||||
있습니다. 이 번역문은 법률적 검토와 문서간의 동일성 여부에 대한 검증을 거치지 않은 것이며,
|
||||
이로 인해서 야기될 수 있을 지도 모를 법률적인 문제에 대해서 어떠한 형태의 보증도 제공하지
|
||||
않습니다. GNU General Public License를 상업적인 목적으로 사용하려고 할 경우에는 변호사나
|
||||
변리사에게 직접 자문을 구하기 바랍니다. 그러나 대부분의 일반 사용자들에게는 이 번역문이 전달하려고
|
||||
하는 내용과 취지를 이해하는 것만으로도 충분할 것입니다.
|
||||
|
||||
본 문서는 한글 번역된 GPL과 원본 영문 GPL을 전부 포함하고 있습니다.
|
||||
--------------------------------------------------------------------------------------------------------------------------
|
||||
GNU 일반 공중 사용 허가서
|
||||
(GNU GENERAL PUBLIC LICENSE)
|
||||
제 2판, 1991년 6월
|
||||
(Version 2, June 1991)
|
||||
|
||||
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
누구든지 본 사용 허가서를 있는 그대로 복제하고 배포할 수 있습니다.
|
||||
그러나 본문에 대한 수정은 허용되지 않습니다.
|
||||
|
||||
|
||||
전 문
|
||||
소프트웨어에 적용되는 대부분의 사용 허가서(license)들은 소프트웨어에 대한 수정과 공유의 자유를 제한
|
||||
하려는 것을 그 목적으로 합니다. 그러나 GNU 일반 공중 사용 허가서(이하, ``GPL''이라고 칭합니다.)는 자
|
||||
유 소프트웨어에 대한 수정과 공유의 자유를 모든 사용자들에게 보장하기 위해서 성립된 것입니다. 자유 소
|
||||
프트웨어 재단이 제공하는 대부분의 소프트웨어들은 GPL에 의해서 관리되고 있으며, 몇몇 소프트웨어에는
|
||||
별도의 사용 허가서인 GNU 라이브러리 일반 공중 사용 허가서(GNU Library General Public License)를 대신
|
||||
적용하기도 합니다. 자유 소프트웨어란, 이를 사용하려고 하는 모든 사람에 대해서 동일한 자유와 권리가
|
||||
함께 양도되는 소프트웨어를 말하며 프로그램 저작자의 의지에 따라 어떠한 종류의 프로그램에도 GPL을 적
|
||||
용할 수 있습니다. 따라서 여러분이 만든 프로그램에도 GPL을 적용할 수 있습니다.
|
||||
|
||||
자유 소프트웨어를 언급할 때 사용되는 ``자유''라는 단어는 무료(無料)를 의미하는 금전적인 측면의 자유
|
||||
가 아니라 구속되지 않는다는 관점에서의 자유를 의미하며, GPL은 자유 소프트웨어를 이용한 복제와 개작,
|
||||
배포와 수익 사업 등의 가능한 모든 형태의 자유를 실질적으로 보장하고 있습니다. 여기에는 원시 코드
|
||||
(source code)의 전부 또는 일부를 원용해서 개선된 프로그램을 만들거나 새로운 프로그램을 창작할 수 있
|
||||
는 자유가 포함되며, 자신에게 양도된 이러한 자유와 권리를 보다 명확하게 인식할 수 있도록 하기 위한 규
|
||||
정도 포함되어 있습니다.
|
||||
|
||||
GPL은 GPL 안에 소프트웨어를 양도받을 사용자의 권리를 제한하는 조항과 단서를 별항으로 추가시키지 못하
|
||||
게 함으로써 사용자들의 자유와 권리를 실제적으로 보장하고 있습니다. 자유 소프트웨어의 개작과 배포에
|
||||
관계하고 있는 사람들은 이러한 무조건적인 권리 양도 규정을 준수해야만 합니다.
|
||||
|
||||
예를 들어 GPL 프로그램을 배포할 경우에는 프로그램의 유료 판매나 무료 배포에 관계없이 자신이 해당 프
|
||||
로그램에 대해서 가질 수 있었던 모든 권리를, 프로그램을 받게될 사람에게 그대로 양도해 주어야 합니다.
|
||||
이 경우, 프로그램의 원시 코드를 함께 제공하거나 원시 코드를 구할 수 있는 방법을 확실히 알려주어야 하
|
||||
고 이러한 모든 사항들을 사용자들이 분명히 알 수 있도록 명시해야 합니다.
|
||||
|
||||
자유 소프트웨어 재단은 다음과 같은 두 가지 단계를 통해서 사용자들을 권리를 보호합니다. (1) 소프트웨
|
||||
어에 저작권을 설정합니다. (2) 저작권의 양도에 관한 실정법에 의해서 유효한 법률적 효력을 갖는 GPL을
|
||||
통해 소프트웨어를 복제하거나 개작 및 배포할 수 있는 권리를 사용자들에게 부여합니다.
|
||||
|
||||
자유 소프트웨어를 사용하는 사람들은 반복적인 재배포 과정을 통해 소프트웨어 자체에 수정과 변형이 일어
|
||||
날 수도 있으며, 이는 최초의 저작자가 만든 소프트웨어가 갖고 있는 문제가 아닐 수 있다는 개연성을 인식
|
||||
하고 있어야 합니다. 우리는 개작과 재배포 과정에서 다른 사람에 의해 발생된 문제로 인해 프로그램 원저
|
||||
작자들의 신망이 훼손되는 것을 원하지 않습니다. GPL에 자유 소프트웨어에 대한 어떠한 형태의 보증도 규
|
||||
정하지 않는 이유는 이러한 점들이 고려되었기 때문이며, 이는 프로그램 원저작자와 자유 소프트웨어 재단
|
||||
의 자유로운 활동을 보장하는 현실적인 수단이기도 합니다.
|
||||
|
||||
특허 제도는 자유 소프트웨어의 발전을 위협하는 요소일 수밖에 없습니다. 자유 프로그램을 재배포하는 사
|
||||
람들이 개별적으로 특허를 취득하게 되면, 결과적으로 그 프로그램이 독점 소프트웨어가 될 가능성이 있습
|
||||
니다. 자유 소프트웨어 재단은 이러한 문제에 대처하기 위해서 어떠한 특허에 대해서도 그 사용 권리를 모
|
||||
든 사람들(이하, ``공중(公衆)''이라고 칭합니다.)에게 자유롭게 허용하는 경우에 한해서만 자유 소프트웨
|
||||
어와 함께 사용할 수 있다는 것을 명확히 밝히고 있습니다.
|
||||
|
||||
복제(copying)와 개작(modification) 및 배포(distribution)에 관련된 구체적인 조건과 규정은 다음과 같습
|
||||
니다.
|
||||
|
||||
|
||||
복제와 개작 및 배포에 관한 조건과 규정
|
||||
제 0 조. 본 허가서는 GNU 일반 공중 사용 허가서의 규정에 따라 배포될 수 있다는 사항이 저작권자에 의해
|
||||
서 명시된 모든 컴퓨터 프로그램 저작물에 대해서 동일하게 적용됩니다. 컴퓨터 프로그램 저작물(이하, ``
|
||||
프로그램''이라고 칭합니다.)이란 특정한 결과를 얻기 위해서 컴퓨터 등의 정보 처리 능력을 가진 장치(이
|
||||
하, ``컴퓨터''라고 칭합니다.) 내에서 직접 또는 간접으로 사용되는 일련의 지시 및 명령으로 표현된 창작
|
||||
물을 의미하고, ``2차적 프로그램''이란 전술한 프로그램 자신 또는 저작권법의 규정에 따라 프로그램의 전
|
||||
부 또는 상당 부분을 원용하거나 다른 언어로의 번역을 포함할 수 있는 개작 과정을 통해서 창작된 새로운
|
||||
프로그램과 이와 관련된 저작물을 의미합니다. (이후로 다른 언어로의 번역은 별다른 제한없이 개작의 범위
|
||||
에 포함되는 것으로 간주합니다.) ``피양도자''란 GPL의 규정에 따라 프로그램을 양도받은 사람을 의미하
|
||||
고, ``원(原)프로그램''이란 프로그램을 개작하거나 2차적 프로그램을 만들기 위해서 사용된 최초의 프로그
|
||||
램을 의미합니다.
|
||||
|
||||
본 허가서는 프로그램에 대한 복제와 개작 그리고 배포 행위에 대해서만 적용됩니다. 따라서 프로그램을 실
|
||||
행시키는 행위에 대한 제한은 없습니다. 프로그램의 결과물(output)에는, 그것이 프로그램을 실행시켜서 생
|
||||
성된 것인지 아닌지의 여부에 상관없이 결과물의 내용이 원프로그램으로부터 파생된 2차적 프로그램을 구성
|
||||
했을 때에 한해서 본 허가서의 규정들이 적용됩니다. 2차적 프로그램의 구성 여부는 2차적 프로그램 안에서
|
||||
의 원프로그램의 역할을 토대로 판단합니다.
|
||||
|
||||
제 1 조. 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실을 각각의 복제물에 명시하
|
||||
는 한, 피양도자는 프로그램의 원시 코드를 자신이 양도받은 상태 그대로 어떠한 매체를 통해서도 복제하고
|
||||
배포할 수 있습니다. 복제와 배포가 이루어 질 때는 본 허가서와 프로그램에 대한 보증이 제공되지 않는다
|
||||
는 사실에 대해서 언급되었던 모든 내용을 그대로 유지시켜야 하며, 영문판 GPL을 함께 제공해야 합니다.
|
||||
|
||||
배포자는 복제물을 물리적으로 인도하는데 소요된 비용을 청구할 수 있으며, 선택 사항으로 독자적인 유료
|
||||
보증을 설정할 수 있습니다.
|
||||
|
||||
제 2 조. 피양도자는 자신이 양도받은 프로그램의 전부나 일부를 개작할 수 있으며, 이를 통해서 2차적 프
|
||||
로그램을 창작할 수 있습니다. 개작된 프로그램이나 창작된 2차적 프로그램은 다음의 사항들을 모두 만족시
|
||||
키는 조건에 한해서, 제1조의 규정에 따라 또다시 복제되고 배포될 수 있습니다.
|
||||
|
||||
제 1 항. 파일을 개작할 때는 파일을 개작한 사실과 그 날짜를 파일 안에 명시해야 합니다.
|
||||
제 2 항. 배포하거나 공표하려는 저작물의 전부 또는 일부가 양도받은 프로그램으로부터 파생된 것이라면,
|
||||
저작물 전체에 대한 사용 권리를 본 허가서의 규정에 따라 공중에게 무상으로 허용해야 합니다.
|
||||
|
||||
제 3 항. 개작된 프로그램의 일반적인 실행 형태가 대화형 구조로 명령어를 읽어 들이는 방식을 취하고 있
|
||||
을 경우에는, 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실, (별도의 보증을 설정
|
||||
한 경우라면 해당 내용) 그리고 양도받은 프로그램을 본 규정에 따라 재배포할 수 있다는 사실과 GPL 사본
|
||||
을 참고할 수 있는 방법이 함께 포함된 문구가 프로그램이 대화형 구조로 평이하게 실행된 직후에 화면 또
|
||||
는 지면으로 출력되도록 작성되어야 합니다. (예외 규정: 양도받은 프로그램이 대화형 구조를 갖추고 있다
|
||||
하더라도 통상적인 실행 환경에서 전술한 사항들이 출력되지 않는 형태였을 경우에는 이를 개작한 프로그램
|
||||
또한 관련 사항들을 출력시키지 않아도 무방합니다.)
|
||||
|
||||
위의 조항들은 개작된 프로그램 전체에 적용됩니다. 만약, 개작된 프로그램에 포함된 특정 부분이 원프로그
|
||||
램으로부터 파생된 것이 아닌 별도의 독립 저작물로 인정될 만한 상당한 이유가 있을 경우에는 해당 저작물
|
||||
의 개별적인 배포에는 본 허가서의 규정들이 적용되지 않습니다. 그러나 이러한 저작물이 2차적 프로그램의
|
||||
일부로서 함께 배포된다면 개별적인 저작권과 배포 기준에 상관없이 저작물 모두에 본 허가서가 적용되어야
|
||||
하며, 전체 저작물에 대한 사용 권리는 공중에게 무상으로 양도됩니다.
|
||||
|
||||
이러한 규정은 개별적인 저작물에 대한 저작자의 권리를 침해하거나 인정하지 않으려는 것이 아니라, 원프
|
||||
로그램으로부터 파생된 2차적 프로그램이나 수집 저작물의 배포를 일관적으로 규제할 수 있는 권리를 행사
|
||||
하기 위한 것입니다.
|
||||
|
||||
원프로그램이나 원프로그램으로부터 파생된 2차적 프로그램을 이들로부터 파생되지 않은 다른 저작물과 함
|
||||
께 단순히 저장하거나 배포할 목적으로 동일한 매체에 모아 놓은 집합물의 경우에는, 원프로그램으로부터
|
||||
파생되지 않은 다른 저작물에는 본 허가서의 규정들이 적용되지 않습니다.
|
||||
|
||||
제 3 조. 피양도자는 다음 중 하나의 항목을 만족시키는 조건에 한해서 제1조와 제2조의 규정에 따라 프로
|
||||
그램(또는 제2조에서 언급된 2차적 프로그램)을 목적 코드(object code)나 실행물(executable form)의 형태
|
||||
로 복제하고 배포할 수 있습니다.
|
||||
|
||||
제 1 항. 목적 코드나 실행물에 상응하는 컴퓨터가 인식할 수 있는 완전한 원시 코드를 함께 제공해야 합니
|
||||
다. 원시 코드는 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 교환을 위해서 일반적
|
||||
으로 사용되는 매체를 통해 제공되어야 합니다.
|
||||
제 2 항. 배포에 필요한 최소한의 비용만을 받고 목적 코드나 실행물에 상응하는 완전한 원시 코드를 배포
|
||||
하겠다는, 최소한 3년간 유효한 약정서를 함께 제공해야 합니다. 이 약정서는 약정서를 갖고 있는 어떠한
|
||||
사람에 대해서도 유효해야 합니다. 원시 코드는 컴퓨터가 인식할 수 있는 형태여야 하고 제1조와 제2조의
|
||||
규정에 따라 배포될 수 있어야 하며, 소프트웨어의 교환을 위해서 일반적으로 사용되는 매체를 통해 제공되
|
||||
어야 합니다.
|
||||
|
||||
제 3 항. 목적 코드나 실행물에 상응하는 원시 코드를 배포하겠다는 약정에 대해서 자신이 양도받은 정보를
|
||||
함께 제공해야 합니다. (제3항은 위의 제2항에 따라 원시 코드를 배포하겠다는 약정을 프로그램의 목적 코
|
||||
드나 실행물과 함께 제공 받았고, 동시에 비상업적인 배포를 하고자 할 경우에 한해서만 허용됩니다.)
|
||||
|
||||
저작물에 대한 원시 코드란 해당 저작물을 개작하기에 적절한 형식을 의미합니다. 실행물에 대한 완전한 원
|
||||
시 코드란 실행물에 포함된 모든 모듈들의 원시 코드와 이와 관련된 인터페이스 정의 파일 모두, 그리고 실
|
||||
행물의 컴파일과 설치를 제어하는데 사용된 스크립트 전부를 의미합니다. 그러나 특별한 예외의 하나로서,
|
||||
실행물이 실행될 운영체제의 주요 부분(컴파일러나 커널 등)과 함께 (원시 코드나 바이너리의 형태로) 일반
|
||||
적으로 배포되는 구성 요소들은 이러한 구성 요소 자체가 실행물에 수반되지 않는 한 원시 코드의 배포 대
|
||||
상에서 제외되어도 무방합니다.
|
||||
|
||||
목적 코드나 실행물을 지정한 장소로부터 복제해 갈 수 있게 하는 방식으로 배포할 경우, 동일한 장소로부
|
||||
터 원시 코드를 복제할 수 있는 동등한 접근 방법을 제공한다면 이는 원시 코드를 목적 코드와 함께 복제되
|
||||
도록 설정하지 않았다고 하더라도 원시 코드를 배포하는 것으로 간주됩니다.
|
||||
|
||||
제 4 조. 본 허가서에 의해 명시적으로 이루어 지지 않는 한 프로그램에 대한 복제와 개작 및 하위 허가권
|
||||
설정과 배포가 성립될 수 없습니다. 이와 관련된 어떠한 행위도 무효이며 본 허가서가 보장한 권리는 자동
|
||||
으로 소멸됩니다. 그러나 본 허가서의 규정에 따라 프로그램의 복제물이나 권리를 양도받았던 제3자는 본
|
||||
허가서의 규정들을 준수하는 한, 배포자의 권리 소멸에 관계없이 사용상의 권리를 계속해서 유지할 수 있습
|
||||
니다.
|
||||
|
||||
제 5 조. 본 허가서는 서명이나 날인이 수반되는 형식을 갖고 있지 않기 때문에 피양도자가 본 허가서의 내
|
||||
용을 반드시 받아들여야 할 필요는 없습니다. 그러나 프로그램이나 프로그램에 기반한 2차적 프로그램에 대
|
||||
한 개작 및 배포를 허용하는 것은 본 허가서에 의해서만 가능합니다. 만약 본 허가서에 동의하지 않을 경우
|
||||
에는 이러한 행위들이 법률적으로 금지됩니다. 따라서 프로그램(또는 프로그램에 기반한 2차적 프로그램)을
|
||||
개작하거나 배포하는 행위는 이에 따른 본 허가서의 내용에 동의한다는 것을 의미하며, 복제와 개작 및 배
|
||||
포에 관한 본 허가서의 조건과 규정들을 모두 받아들이겠다는 의미로 간주됩니다.
|
||||
|
||||
제 6 조. 피양도자에 의해서 프로그램(또는 프로그램에 기반한 2차적 프로그램)이 반복적으로 재배포될 경
|
||||
우, 각 단계에서의 피양도자는 본 허가서의 규정에 따른 프로그램의 복제와 개작 및 배포에 대한 권리를 최
|
||||
초의 양도자로부터 양도받은 것으로 자동적으로 간주됩니다. 프로그램(또는 프로그램에 기반한 2차적 프로
|
||||
그램)을 배포할 때는 피양도자의 권리의 행사를 제한할 수 있는 어떠한 사항도 추가할 수 없습니다. 그러나
|
||||
피양도자에게, 재배포가 일어날 시점에서의 제3의 피양도자에게 본 허가서를 준수하도록 강제할 책임은 부
|
||||
과되지 않습니다.
|
||||
|
||||
제 7 조. 법원의 판결이나 특허권 침해에 대한 주장 또는 특허 문제에 국한되지 않은 그밖의 이유들로 인해
|
||||
서 본 허가서의 규정에 배치되는 사항이 발생한다 하더라도 그러한 사항이 선행하거나 본 허가서의 조건과
|
||||
규정들이 면제되는 것은 아닙니다. 따라서 법원의 명령이나 합의 등에 의해서 본 허가서에 위배되는 사항들
|
||||
이 발생한 상황이라도 양측 모두를 만족시킬 수 없다면 프로그램은 배포될 수 없습니다. 예를 들면, 특정한
|
||||
특허 관련 허가가 프로그램의 복제물을 직접 또는 간접적인 방법으로 양도받은 임의의 제3자에게 해당 프로
|
||||
그램을 무상으로 재배포할 수 있게 허용하지 않는다면, 그러한 허가와 본 사용 허가를 동시에 만족시키면서
|
||||
프로그램을 배포할 수 있는 방법은 없습니다.
|
||||
|
||||
본 조항은 특정한 상황에서 본 조항의 일부가 유효하지 않거나 적용될 수 없을 경우에도 본 조항의 나머지
|
||||
부분들을 적용하기 위한 의도로 만들어 졌습니다. 따라서 그 이외의 상황에서는 본 조항을 전체적으로 적용
|
||||
하면 됩니다.
|
||||
|
||||
본 조항의 목적은 특허나 저작권 침해 등의 행위를 조장하거나 해당 권리를 인정하지 않으려는 것이 아니
|
||||
라, GPL을 통해서 구현되어 있는 자유 소프트웨어의 배포 체계를 통합적으로 보호하기 위한 것입니다. 많은
|
||||
사람들이 배포 체계에 대한 신뢰있는 지원을 계속해 줌으로써 소프트웨어의 다양한 분야에 많은 공헌을 해
|
||||
주었습니다. 소프트웨어를 어떠한 배포 체계로 배포할 것인가를 결정하는 것은 전적으로 저작자와 기증자들
|
||||
의 의지에 달려있는 것이지, 일반 사용자들이 강요할 수 있는 문제는 아닙니다.
|
||||
|
||||
본 조항은 본 허가서의 다른 조항들에서 무엇이 중요하게 고려되어야 하는 지를 명확하게 설명하기 위한 목
|
||||
적으로 만들어진 것입니다.
|
||||
|
||||
제 8 조. 특허나 저작권이 설정된 인터페이스로 인해서 특정 국가에서 프로그램의 배포와 사용이 함께 또는
|
||||
개별적으로 제한되어 있는 경우, 본 사용 허가서를 프로그램에 적용한 최초의 저작권자는 문제가 발생하지
|
||||
않는 국가에 한해서 프로그램을 배포한다는 배포상의 지역적 제한 조건을 명시적으로 설정할 수 있으며, 이
|
||||
러한 사항은 본 허가서의 일부로 간주됩니다.
|
||||
|
||||
제 9 조. 자유 소프트웨어 재단은 때때로 본 사용 허가서의 개정판이나 신판을 공표할 수 있습니다. 새롭게
|
||||
공표될 판은 당면한 문제나 현안을 처리하기 위해서 세부적인 내용에 차이가 발생할 수 있지만, 그 근본 정
|
||||
신에는 변함이 없을 것입니다.
|
||||
|
||||
각각의 판들은 판번호를 사용해서 구별됩니다. 특정한 판번호와 그 이후 판을 따른다는 사항이 명시된 프로
|
||||
그램에는 해당 판이나 그 이후에 발행된 어떠한 판을 선택해서 적용해도 무방하고, 판번호를 명시하고 있지
|
||||
않은 경우에는 자유 소프트웨어 재단이 공표한 어떠한 판번호의 판을 적용해도 무방합니다.
|
||||
|
||||
제 10 조. 프로그램의 일부를 본 허가서와 배포 기준이 다른 자유 프로그램과 함께 결합하고자 할 경우에는
|
||||
해당 프로그램의 저작자로부터 서면 승인을 받아야 합니다. 자유 소프트웨어 재단이 저작권을 갖고 있는 소
|
||||
프트웨어의 경우에는 자유 소프트웨어 재단의 승인을 얻어야 합니다. 우리는 이러한 요청을 수락하기 위해
|
||||
서 때때로 예외 기준을 만들기도 합니다. 자유 소프트웨어 재단은 일반적으로 자유 소프트웨어의 2차적 저
|
||||
작물들을 모두 자유로운 상태로 유지시키려는 목적과 소프트웨어의 공유와 재활용을 증진시키려는 두가지
|
||||
목적을 기준으로 승인 여부를 결정할 것입니다.
|
||||
|
||||
|
||||
보증의 결여 (제11조, 제12조)
|
||||
제 11 조. 본 허가서를 따르는 프로그램은 무상으로 양도되기 때문에 관련 법률이 허용하는 한도 내에서 어
|
||||
떠한 형태의 보증도 제공되지 않습니다. 프로그램의 저작권자와 배포자가 공동 또는 개별적으로 별도의 보
|
||||
증을 서면으로 제공할 때를 제외하면, 특정한 목적에 대한 프로그램의 적합성이나 상업성 여부에 대한 보증
|
||||
을 포함한 어떠한 형태의 보증도 명시적이나 묵시적으로 설정되지 않은 ``있는 그대로의'' 상태로 이 프로
|
||||
그램을 배포합니다. 프로그램과 프로그램의 실행에 따라 발생할 수 있는 모든 위험은 피양도자에게 인수되
|
||||
며 이에 따른 보수 및 복구를 위한 제반 경비 또한 피양도자가 모두 부담해야 합니다.
|
||||
|
||||
제 12 조. 저작권자나 배포자가 프로그램의 손상 가능성을 사전에 알고 있었다 하더라도 발생된 손실이 관
|
||||
련 법규에 의해 보호되고 있거나 이에 대한 별도의 서면 보증이 설정된 경우가 아니라면, 저작권자나 프로
|
||||
그램을 원래의 상태 또는 개작한 상태로 제공한 배포자는 프로그램의 사용이나 비작동으로 인해 발생된 손
|
||||
실이나 프로그램 자체의 손실에 대해 책임지지 않습니다. 이러한 면책 조건은 사용자나 제3자가 프로그램을
|
||||
조작함으로써 발생된 손실이나 다른 소프트웨어와 프로그램을 함께 동작시키는 것으로 인해서 발생된 데이
|
||||
터의 상실 및 부정확한 산출 결과에만 국한되는 것이 아닙니다. 발생된 손실의 일반성이나 특수성 뿐 아니
|
||||
라 원인의 우발성 및 필연성도 전혀 고려되지 않습니다.
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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.
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['insert_document'];
|
||||
if(!$point) $point = $config->insert_document;
|
||||
if($point == null) $point = $config->insert_document;
|
||||
|
||||
// 포인트 증감
|
||||
$cur_point += $point;
|
||||
|
|
@ -67,7 +67,7 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['insert_document'];
|
||||
if(!$point) $point = $config->insert_document;
|
||||
if($point == null) $point = $config->insert_document;
|
||||
|
||||
// 포인트 차감
|
||||
$cur_point = $oPointModel->getPoint($target_member_srl, true);
|
||||
|
|
@ -90,7 +90,7 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['insert_comment'];
|
||||
if(!$point) $point = $config->insert_comment;
|
||||
if($point == null) $point = $config->insert_comment;
|
||||
|
||||
// 포인트 증감
|
||||
$cur_point += $point;
|
||||
|
|
@ -109,7 +109,7 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['insert_comment'];
|
||||
if(!$point) $point = $config->insert_comment;
|
||||
if($point == null) $point = $config->insert_comment;
|
||||
|
||||
// 포인트 증감
|
||||
$cur_point = $oPointModel->getPoint($target_member_srl, true);
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['upload_file'];
|
||||
if(!$point) $point = $config->upload_file;
|
||||
if($point == null) $point = $config->upload_file;
|
||||
|
||||
// 포인트 증감
|
||||
$cur_point += $point;
|
||||
|
|
@ -152,7 +152,7 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['upload_file'];
|
||||
if(!$point) $point = $config->upload_file;
|
||||
if($point == null) $point = $config->upload_file;
|
||||
|
||||
// 포인트 차감
|
||||
$cur_point = $oPointModel->getPoint($target_member_srl, true);
|
||||
|
|
@ -178,18 +178,18 @@
|
|||
|
||||
// 포인트를 구해옴
|
||||
$point = $config->module_point[$module_srl]['download_file'];
|
||||
if(!$point) $point = $config->download_file;
|
||||
if($point == null) $point = $config->download_file;
|
||||
|
||||
// 포인트가 0보다 작고 포인트가 없으면 파일 다운로드가 안되도록 했다면 오류
|
||||
if($cur_point + $point < 0 && $config->disable_download == 'Y') {
|
||||
$this->stop('msg_cannot_download');
|
||||
} else {
|
||||
// 포인트 차감
|
||||
$cur_point += $point;
|
||||
$oPointController = &getController('point');
|
||||
$oPointController->setPoint($member_srl,$cur_point);
|
||||
}
|
||||
|
||||
// 포인트 차감
|
||||
$cur_point += $point;
|
||||
$oPointController = &getController('point');
|
||||
$oPointController->setPoint($member_srl,$cur_point);
|
||||
|
||||
// 글 삭제일 경우 대상 글의 사용자 번호 저장
|
||||
} elseif(strpos($config->delete_document_act,$this->act)!==false) {
|
||||
$document_srl = Context::get('document_srl');
|
||||
|
|
|
|||
|
|
@ -121,6 +121,15 @@
|
|||
// 상대 경로 설정
|
||||
$this->path = $this->getRequestUri();
|
||||
|
||||
// 기본 JS/CSS 등록
|
||||
$this->addJsFile("./common/js/x.js");
|
||||
$this->addJsFile("./common/js/common.js");
|
||||
$this->addJsFile("./common/js/xml_handler.js");
|
||||
$this->addJsFile("./common/js/xml_js_filter.js");
|
||||
$this->addCSSFile("./common/css/default.css");
|
||||
$this->addCSSFile("./common/css/button.css");
|
||||
if(Context::get('module')=='admin' || strpos(Context::get('act'),'Admin')>0) $this->addCssFile("./modules/admin/tpl/css/admin.css");
|
||||
|
||||
// rewrite module때문에 javascript에서 location.href 문제 해결을 위해 직접 실제 경로 설정
|
||||
if($_SERVER['REQUEST_METHOD'] == 'GET') {
|
||||
if($this->get_vars) {
|
||||
|
|
@ -676,6 +685,8 @@
|
|||
**/
|
||||
function _addJsFile($file) {
|
||||
if(in_array($file, $this->js_files)) return;
|
||||
|
||||
if(!eregi("^http:\/\/",$file)) $file = str_replace(realpath("."), ".", realpath($file));
|
||||
$this->js_files[] = $file;
|
||||
}
|
||||
|
||||
|
|
@ -691,7 +702,9 @@
|
|||
* @brief js file 목록을 return
|
||||
**/
|
||||
function _getJsFile() {
|
||||
return $this->js_files;
|
||||
require_once("./classes/optimizer/Optimizer.class.php");
|
||||
$oOptimizer = new Optimizer();
|
||||
return $oOptimizer->getOptimizedFiles($this->js_files, "js");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -707,6 +720,8 @@
|
|||
**/
|
||||
function _addCSSFile($file) {
|
||||
if(in_array($file, $this->css_files)) return;
|
||||
|
||||
if(!eregi("^http:\/\/",$file)) $file = str_replace(realpath("."), ".", realpath($file));
|
||||
$this->css_files[] = $file;
|
||||
}
|
||||
|
||||
|
|
@ -722,7 +737,9 @@
|
|||
* @brief CSS file 목록 return
|
||||
**/
|
||||
function _getCSSFile() {
|
||||
return $this->css_files;
|
||||
require_once("./classes/optimizer/Optimizer.class.php");
|
||||
$oOptimizer = new Optimizer();
|
||||
return $oOptimizer->getOptimizedFiles($this->css_files, "css");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -923,5 +940,18 @@
|
|||
return WidgetHandler::execute($widget, $vars);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief gzip encoding 여부 체크
|
||||
**/
|
||||
function isGzEnabled() {
|
||||
if(
|
||||
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
|
||||
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
|
||||
function_exists('ob_gzhandler') &&
|
||||
extension_loaded('zlib')
|
||||
) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -289,6 +289,9 @@
|
|||
case 'number' :
|
||||
if(!eregi('^[0-9]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key));
|
||||
break;
|
||||
case 'numbers' :
|
||||
if(!eregi('^[0-9,]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key));
|
||||
break;
|
||||
case 'alpha' :
|
||||
if(!eregi('^[a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key}?$lang->{$key}:$key));
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -22,12 +22,7 @@
|
|||
function printContent(&$oModule) {
|
||||
|
||||
// gzip encoding 지원 여부 체크
|
||||
if(
|
||||
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
|
||||
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
|
||||
function_exists('ob_gzhandler') &&
|
||||
extension_loaded('zlib')
|
||||
) $this->gz_enabled = true;
|
||||
$this->gz_enabled = Context::isGzEnabled();
|
||||
|
||||
// header 출력
|
||||
$this->_printHeader();
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
if(@!$fp = fopen($file_name,$mode)) return false;
|
||||
fwrite($fp, $buff);
|
||||
fclose($fp);
|
||||
@chmod($file_name, 0644);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -116,6 +117,14 @@
|
|||
@rmdir($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* @biref 지정된 디렉토리를 제외한 모든 파일을 삭제
|
||||
**/
|
||||
function removeFilesInDir($path) {
|
||||
FileHandler::removedir($path);
|
||||
FileHandler::makeDir($path);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief byte단위의 파일크기를 적절하게 변환해서 return
|
||||
**/
|
||||
|
|
@ -150,7 +159,7 @@
|
|||
$url_info['path'] = $path;
|
||||
}
|
||||
|
||||
$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());
|
||||
$header = sprintf("GET %s?%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['query'], $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri());
|
||||
|
||||
@fwrite($fp, $header);
|
||||
|
||||
|
|
@ -214,6 +223,7 @@
|
|||
if($resize_height>0 && $height >= $resize_height) $height_per = $resize_height / $height;
|
||||
if($width_per < $height_per) $per = $height_per;
|
||||
else $per = $width_per;
|
||||
if(!$per) $per = 1;
|
||||
|
||||
// 원본 이미지의 타입으로 임시 이미지 생성
|
||||
switch($type) {
|
||||
|
|
@ -246,14 +256,12 @@
|
|||
$new_width = (int)($width * $per);
|
||||
$new_height = (int)($height * $per);
|
||||
|
||||
$x = ($resize_width/2 - $new_width/2);
|
||||
$y = ($resize_height/2 - $new_height/2);
|
||||
$x = (int)($resize_width/2 - $new_width/2);
|
||||
$y = (int)($resize_height/2 - $new_height/2);
|
||||
|
||||
if($source) {
|
||||
if($new_width != $width || $new_height != $height) {
|
||||
if(function_exists('imagecopyresampled')) @imagecopyresampled($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
|
||||
else @imagecopyresized($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
|
||||
} else $thumb = $source;
|
||||
if(function_exists('imagecopyresampled')) @imagecopyresampled($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
|
||||
else @imagecopyresized($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
|
||||
}
|
||||
|
||||
// 파일을 쓰고 끝냄
|
||||
|
|
|
|||
148
classes/optimizer/Optimizer.class.php
Normal file
148
classes/optimizer/Optimizer.class.php
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
<?php
|
||||
/**
|
||||
* @class Optimizer
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief JS/CSS파일등을 특정한 규칙에 맞게 하나의 파일로 만들어서 client에서 가져갈 수 있도록 성능향상을 지원하는 클래스
|
||||
*
|
||||
* 일단 내부적인 코드가 아무리 튜닝이 되어도 모듈/애드온/위젯/에디터컴포넌트등 각 요소들의 JS/CSs파일들을 잘라서 호출하는 구조이기에
|
||||
* 사용자의 브라우저에서는 최소 10이상의 파일을 별도로 서버에 요청을 하게 된다.
|
||||
* 이를 방지하기 위해서 서버내의 로컬 파일일 경우 하나로 묶어서 클라이언트에서 가져갈 수 있도록 하여 그 효과를 증대시킴.
|
||||
**/
|
||||
|
||||
class Optimizer {
|
||||
|
||||
var $cache_path = "./files/cache/optimized/";
|
||||
|
||||
/**
|
||||
* @brief optimizer에서 캐싱파일을 저장할 곳을 찾아서 없으면 만듬
|
||||
**/
|
||||
function Optimizer() {
|
||||
if(!is_dir($this->cache_path)) {
|
||||
FileHandler::makeDir($this->cache_path);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief optimize 대상 파일을 받아서 처리 후 optimize 된 파일이름을 return
|
||||
**/
|
||||
function getOptimizedFiles($source_files, $type = "js") {
|
||||
if(!is_dir($this->cache_path)) return $source_files;
|
||||
|
||||
$file_count = count($source_files);
|
||||
for($i=0;$i<$file_count;$i++) {
|
||||
$file = trim($source_files[$i]);
|
||||
if(!$file) continue;
|
||||
$file = str_replace("\\","/",$file);
|
||||
if(eregi("^http:\/\/",$file) || $file == './common/css/button.css') $files[] = $file;
|
||||
else $targets[] = $file;
|
||||
}
|
||||
|
||||
if(!count($targets)) return $files;
|
||||
|
||||
$hashed_filename = $this->getHashFilename($targets);
|
||||
|
||||
$filename = sprintf("%s%s.%s.php", $this->cache_path, $hashed_filename, $type);
|
||||
|
||||
$this->doOptimizedFile($filename, $targets, $type);
|
||||
|
||||
$files[] = $filename;
|
||||
|
||||
return $files;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief optimize는 대상 파일을 \n로 연결후 md5 hashing하여 파일이름의 중복을 피함
|
||||
**/
|
||||
function getHashFilename($files) {
|
||||
$buff = implode("\n", $files);
|
||||
return md5($buff);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 이미 저장된 캐시 파일과의 시간등을 검사하여 새로 캐싱해야 할지를 체크
|
||||
**/
|
||||
function doOptimizedFile($filename, $targets, $type) {
|
||||
if(!file_exists($filename)) return $this->makeOptimizedFile($filename, $targets, $type);
|
||||
|
||||
$file_count = count($targets);
|
||||
|
||||
$mtime = filemtime($filename);
|
||||
for($i=0;$i<$file_count;$i++) {
|
||||
if($mtime < filemtime($targets[$i])) return $this->makeOptimizedFile($filename, $targets, $type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief css나 js파일을 묶어서 하나의 파일로 만들고 gzip 압축이나 헤더등을 통제하기 위해서 php파일을 별도로 만들어서 진행함
|
||||
**/
|
||||
function makeOptimizedFile($filename, $targets, $type) {
|
||||
/**
|
||||
* 실제 css나 js의 내용을 합친 것을 구함
|
||||
**/
|
||||
// 대상 파일의 내용을 구해오고 css 파일일 경우 url()내의 경로를 변경
|
||||
$file_count = count($targets);
|
||||
for($i=0;$i<$file_count;$i++) {
|
||||
$file = $targets[$i];
|
||||
$str = FileHandler::readFile($file);
|
||||
|
||||
// css 일경우 background:url() 변경
|
||||
if($type == "css") $str = $this->replaceCssPath($file, $str);
|
||||
|
||||
$content_buff .= $str."\r\n";
|
||||
}
|
||||
if(Context::isGzEnabled()) $content_buff = ob_gzhandler($content_buff, 5);
|
||||
|
||||
$content_file = eregi_replace("\.php$","",$filename);
|
||||
$content_filename = str_replace($this->cache_path, '', $content_file);
|
||||
|
||||
FileHandler::writeFile($content_file, $content_buff);
|
||||
|
||||
/**
|
||||
* 압축을 지원하고 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함
|
||||
**/
|
||||
// php의 헤더파일 생성
|
||||
$modified_time = gmdate("D, d M Y H:i:s");
|
||||
|
||||
// gzip 압축 체크
|
||||
if(Context::isGzEnabled()) $gzip_header = 'header("Content-Encoding: gzip");';
|
||||
|
||||
// 확장자별 content-type 체크
|
||||
if($type == 'css') $content_type = 'text/css';
|
||||
elseif($type == 'js') $content_type = 'text/javascript';
|
||||
|
||||
$header_buff = <<<EndOfBuff
|
||||
<?php
|
||||
header("Content-Type: {$content_type}; charset=UTF-8");
|
||||
header("Last-Modified: {$modified_time} GMT");
|
||||
{$gzip_header}
|
||||
if(@file_exists("{$content_filename}")) {
|
||||
@fpassthru(fopen("{$content_filename}", "rb"));
|
||||
}
|
||||
exit();
|
||||
?>
|
||||
EndOfBuff;
|
||||
|
||||
FileHandler::writeFile($filename, $header_buff);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief css의 경우 import/ background 등의 속성에서 사용되는 url내의 경로를 변경시켜줌
|
||||
**/
|
||||
function replaceCssPath($file, $str) {
|
||||
$this->tmp_css_path = Context::getRequestUri().ereg_replace("^\.\/","",dirname($file))."/";
|
||||
$str = preg_replace_callback('!url\(("|\'){0,1}([^\)]+)("|\'){0,1}\)!is', array($this, '_replaceCssPath'), $str);
|
||||
|
||||
$str = preg_replace('!\/([^\/]*)\/\.\.\/!is','/', $str);
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
function _replaceCssPath($matches) {
|
||||
if(eregi("^http",$matches[2])) return $matches[0];
|
||||
if(eregi("^\.\/common\/",$matches[2])) return $matches[0];
|
||||
return sprintf('url(%s)', $this->tmp_css_path.$matches[2]);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
{@ $js_files = Context::getJsFile() }{@ $css_files = Context::getCssFile() }<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html lang="{Context::getLangType()}" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
|
|
@ -9,16 +9,9 @@
|
|||
<!--@end--><!--@if($layout->author)--><meta name="layout_maker" content="{$layout_info->author->name} ({$layout_info->author->homepage})" />
|
||||
<!--@end--><meta http-equiv="imagetoolbar" content="no" />
|
||||
<title>{Context::getBrowserTitle()}</title>
|
||||
<script type="text/javascript" src="./common/js/x.js?rnd={time()}"></script>
|
||||
<script type="text/javascript" src="./common/js/common.js?rnd={time()}"></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?rnd={time()}"></script>
|
||||
<!--@foreach(Context::getJsFile() as $key => $js_file)--><script type="text/javascript" src="{$js_file}?rnd={time()}"></script>
|
||||
<!--@foreach($js_files as $key => $js_file)--><script type="text/javascript" src="{$js_file}"></script>
|
||||
<!--@end--><!--@foreach($css_files as $key => $css_file)--><link rel="stylesheet" href="{$css_file}" type="text/css" />
|
||||
<!--@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?rnd={time()}" 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}?rnd={time()}" 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[
|
||||
var current_url = "{$current_url}";
|
||||
var request_uri = "{$request_uri}";
|
||||
|
|
@ -32,8 +25,6 @@
|
|||
<body>
|
||||
{$zbxe_final_content}
|
||||
|
||||
{Context::getHtmlFooter()}
|
||||
|
||||
<div id="waitingforserverresponse" style="visibility:hidden"></div>
|
||||
<div id="fororiginalimagearea" style="visibility:hidden">
|
||||
<div id="fororiginalimageareabg">
|
||||
|
|
@ -43,5 +34,7 @@
|
|||
</div>
|
||||
<div id="membermenuarea"></div>
|
||||
|
||||
{Context::getHtmlFooter()}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<!--%import("css/popup.css")-->
|
||||
<!--%import("../../modules/admin/tpl/css/admin.css")-->
|
||||
<div id="popup_content">{$content}</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
* 이 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며
|
||||
* config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 함
|
||||
**/
|
||||
define('__ZBXE_VERSION__', '0.1.6');
|
||||
define('__ZBXE_VERSION__', '0.1.7');
|
||||
|
||||
/**
|
||||
* @brief 디버깅 메세지 출력
|
||||
|
|
|
|||
|
|
@ -220,21 +220,27 @@
|
|||
$year = (int)substr($str,0,4);
|
||||
$month = (int)substr($str,4,2);
|
||||
$day = (int)substr($str,6,2);
|
||||
if(strlen($str) <= 8)
|
||||
{
|
||||
$gap = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
$time_zone = $GLOBALS['_time_zone'];
|
||||
if($time_zone<0) $to = -1; else $to = 1;
|
||||
$t_hour = substr($time_zone,1,2)*$to;
|
||||
$t_min = substr($time_zone,3,2)*$to;
|
||||
|
||||
$time_zone = $GLOBALS['_time_zone'];
|
||||
if($time_zone<0) $to = -1; else $to = 1;
|
||||
$t_hour = substr($time_zone,1,2)*$to;
|
||||
$t_min = substr($time_zone,3,2)*$to;
|
||||
$server_time_zone = date("O");
|
||||
if($server_time_zone<0) $so = -1; else $so = 1;
|
||||
$c_hour = substr($server_time_zone,1,2)*$so;
|
||||
$c_min = substr($server_time_zone,3,2)*$so;
|
||||
|
||||
$server_time_zone = date("O");
|
||||
if($server_time_zone<0) $so = -1; else $so = 1;
|
||||
$c_hour = substr($server_time_zone,1,2)*$so;
|
||||
$c_min = substr($server_time_zone,3,2)*$so;
|
||||
$g_min = $t_min - $c_min;
|
||||
$g_hour = $t_hour - $c_hour;
|
||||
|
||||
$g_min = $t_min - $c_min;
|
||||
$g_hour = $t_hour - $c_hour;
|
||||
|
||||
$gap = $g_min*60 + $g_hour*60*60;
|
||||
$gap = $g_min*60 + $g_hour*60*60;
|
||||
}
|
||||
|
||||
return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap;
|
||||
}
|
||||
|
|
|
|||
16
index.php
16
index.php
|
|
@ -19,7 +19,21 @@
|
|||
* - SVN Repository : http://svn.zeroboard.com/zeroboard_xe/trunk
|
||||
* - document : http://doc.zeroboard.com
|
||||
* - pdf 문서 : http://doc.zeroboard.com/zeroboard_xe.pdf
|
||||
*
|
||||
* \n
|
||||
* \n
|
||||
* Copyright (C) 2007년 고영수(skklove@gmail.com) \n
|
||||
* \n
|
||||
* "Zeroboard™ XE"는 자유 소프트웨어입니다. \n
|
||||
* 소프트웨어의 피양도자는 자유 소프트웨어 재단이 공표한 GNU 일반 공중 사용 허가서 2판 또는 \n
|
||||
* 그 이후 판을 임의로 선택해서, 그 규정에 따라 프로그램을 개작하거나 재배포할 수 있습니다. \n
|
||||
* \n
|
||||
* 이 프로그램은 유용하게 사용될 수 있으리라는 희망에서 배포되고 있지만, 특정한 목적에 맞는 적합성 \n
|
||||
* 여부나 판매용으로 사용할 수 있으리라는 묵시적인 보증을 포함한 어떠한 형태의 보증도 제공하지 않습니다. \n
|
||||
* 보다 자세한 사항에 대해서는 GNU 일반 공중 사용 허가서를 참고하시기 바랍니다. \n
|
||||
* \n
|
||||
* GNU 일반 공중 사용 허가서는 이 프로그램과 함께 제공됩니다. 만약, 이 문서가 누락되어 있다면 자유 소프트웨어\n
|
||||
* 재단으로 문의하시기 바랍니다. \n
|
||||
* (자유 소프트웨어 재단: Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA)
|
||||
**/
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -50,5 +50,13 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
$oAddonController = &getAdminController('addon');
|
||||
$oAddonController->makeCacheFile();
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -55,5 +55,19 @@
|
|||
$output = executeQuery('admin.insertShortCut', $args);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 모든 캐시 파일 재생성
|
||||
**/
|
||||
function procAdminRecompileCacheFile() {
|
||||
$oModuleModel = &getModel('module');
|
||||
$module_list = $oModuleModel->getModuleList();
|
||||
|
||||
foreach($module_list as $module) {
|
||||
$oModule = null;
|
||||
$oModule = &getClass($module->module);
|
||||
if(method_exists($oModule, 'recompileCache')) $oModule->recompileCache();
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -42,5 +42,29 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
|
||||
// 템플릿 컴파일 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/template_compiled");
|
||||
|
||||
// optimized 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/optimized");
|
||||
|
||||
// js_filter_compiled 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/js_filter_compiled");
|
||||
|
||||
// queries 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/queries");
|
||||
|
||||
// ./files/cache/news* 파일 삭제
|
||||
$directory = dir("./files/cache/");
|
||||
while($entry = $directory->read()) {
|
||||
if(substr($entry,0,11)=='newest_news') @unlink("./files/cache/".$entry);
|
||||
}
|
||||
$directory->close();
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -6,5 +6,6 @@
|
|||
|
||||
<action name="procAdminInsertShortCut" type="controller" standalone="true" />
|
||||
<action name="procAdminDeleteShortCut" type="controller" standalone="true" />
|
||||
<action name="procAdminRecompileCacheFile" type="controller" standalone="true" />
|
||||
</actions>
|
||||
</module>
|
||||
|
|
|
|||
|
|
@ -67,12 +67,15 @@
|
|||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="tRight gap1">
|
||||
<div class="fl tLeft gap1">
|
||||
<span class="button"><input type="button" value="{$lang->cmd_remake_cache}" onclick="doRecompileCacheFile(); return false;"/></span>
|
||||
</div>
|
||||
<div class="fr tRight gap1">
|
||||
<span class="button"><input type="submit" value="{$lang->cmd_save}" /></span>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="admin_news">
|
||||
<div class="admin_news clear">
|
||||
<!--@if($news)-->
|
||||
<table cellspacing="0" class="tableType1">
|
||||
<caption>{$lang->newest_news}</caption>
|
||||
|
|
|
|||
|
|
@ -29,3 +29,8 @@ function fixAdminNaviHeight() {
|
|||
else xHeight('content',naviHeight);
|
||||
setTimeout(fixAdminNaviHeight, 500);
|
||||
}
|
||||
|
||||
// 캐시파일 모두 재 생성
|
||||
function doRecompileCacheFile() {
|
||||
exec_xml("admin","procAdminRecompileCacheFile");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,5 +49,28 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// 블로그 모듈의 캐시 파일 모두 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/blog_category");
|
||||
|
||||
$oModuleModel = &getModel('module');
|
||||
$oBlogAdminController = &getAdminController('blog');
|
||||
|
||||
// 블로그 모듈 목록을 모두 구함
|
||||
$args->module = 'blog';
|
||||
$output = executeQueryArray("module.getMidList", $args);
|
||||
$list = $output->data;
|
||||
if(!count($list)) return;
|
||||
|
||||
// 블로그 모듈에서 사용되는 모든 메뉴 목록을 재 생성
|
||||
foreach($list as $blog_item) {
|
||||
$module_srl = $blog_item->module_srl;
|
||||
$oBlogAdminController->makeXmlFile($module_srl);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -73,5 +73,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -117,7 +117,12 @@
|
|||
$oCommentController = &getController('comment');
|
||||
|
||||
// comment_srl이 존재하는지 체크
|
||||
$comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager);
|
||||
// 만일 comment_srl이 n/a라면 getNextSequence()로 값을 얻어온다.
|
||||
if(!$obj->comment_srl) {
|
||||
$obj->comment_srl = getNextSequence();
|
||||
} else {
|
||||
$comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager);
|
||||
}
|
||||
|
||||
// comment_srl이 없을 경우 신규 입력
|
||||
if($comment->comment_srl != $obj->comment_srl) {
|
||||
|
|
@ -146,7 +151,7 @@
|
|||
$this->setMessage('success_registed');
|
||||
$this->add('mid', Context::get('mid'));
|
||||
$this->add('document_srl', $obj->document_srl);
|
||||
$this->add('comment_srl', $comment_srl);
|
||||
$this->add('comment_srl', $obj->comment_srl);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@
|
|||
} else {
|
||||
|
||||
// 글 보기 권한을 체크해서 권한이 없으면 오류 메세지 출력하도록 처리
|
||||
if(!$this->grant->view) {
|
||||
if(!$this->grant->view && !$oDocument->isGranted()) {
|
||||
|
||||
$oDocument = null;
|
||||
$oDocument = $oDocumentModel->getDocument(0, $this->grant->manager);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<!-- 선택된 게시물이 있고 권한이 있으면 내용 출력 -->
|
||||
<!--@if($oDocument->isExists() && $grant->view)-->
|
||||
<!--@if($oDocument->isExists())-->
|
||||
<!--#include("./view_document.html")-->
|
||||
<!--@end-->
|
||||
|
||||
|
|
@ -61,11 +61,7 @@
|
|||
<input type="checkbox" value="{$document->document_srl}" onclick="doAddCart('{$mid}',this)" <!--@if($check_list[$document->document_srl])-->checked="checked"<!--@end--> />
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[R<strong>{$document->getCommentCount()}</strong>]</span>
|
||||
|
|
@ -106,11 +102,8 @@
|
|||
<!--@if($grant->is_admin)-->
|
||||
<input type="checkbox" value="{$document->document_srl}" onclick="doAddCart('{$mid}',this)" <!--@if($check_list[$document->document_srl])-->checked="checked"<!--@end--> />
|
||||
<!--@end-->
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText(8,'')}
|
||||
<!--@end-->
|
||||
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies">(<strong>{$document->getCommentCount()}</strong>)</span>
|
||||
|
|
@ -137,52 +130,52 @@
|
|||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
|
||||
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/icon_gofirst.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,'document_srl','')}">{$page_no}</a>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/icon_golast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="buttonBox">
|
||||
<a href="{getUrl('','mid',$mid,'page',$page,'document_srl','')}"><img src="./images/common/btn_list.gif" alt="{$lang->cmd_list}" /></a>
|
||||
<!--@if($grant->write_document)-->
|
||||
<a href="{getUrl('act','dispBoardWrite','document_srl','')}"><img src="./images/common/btn_write.gif" alt="{$lang->cmd_write}" /></a>
|
||||
<!--@end-->
|
||||
<!--@if($grant->is_admin)-->
|
||||
<a href="{getUrl('act','dispBoardAdminManageDocument')}" onclick="popopen(this.href,'manageDocument'); return false;"><img src="./images/common/btn_manage.gif" alt="{$lang->cmd_manage_document}" /></a>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<!-- 검색 -->
|
||||
<!--@if($grant->view)-->
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search" class="boardSearch">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/icon_gofirst.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,'document_srl','')}">{$page_no}</a>
|
||||
<fieldset>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/icon_golast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="buttonBox">
|
||||
<a href="{getUrl('','mid',$mid,'page',$page,'document_srl','')}"><img src="./images/common/btn_list.gif" alt="{$lang->cmd_list}" /></a>
|
||||
<!--@if($grant->write_document)-->
|
||||
<a href="{getUrl('act','dispBoardWrite','document_srl','')}"><img src="./images/common/btn_write.gif" alt="{$lang->cmd_write}" /></a>
|
||||
<!--@end-->
|
||||
<!--@if($grant->is_admin)-->
|
||||
<a href="{getUrl('act','dispBoardAdminManageDocument')}" onclick="popopen(this.href,'manageDocument'); return false;"><img src="./images/common/btn_manage.gif" alt="{$lang->cmd_manage_document}" /></a>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<!-- 검색 -->
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search" class="boardSearch">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<fieldset>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<ul class="searchButton">
|
||||
<li><input type="image" src="./images/common/btn_search.gif" alt="{$lang->cmd_search}" /></li>
|
||||
<li><a href="{getUrl('','mid',$mid)}"><img src="./images/common/btn_cancel.gif" alt="{$lang->cmd_cancel}" /></a></li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
</form>
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<ul class="searchButton">
|
||||
<li><input type="image" src="./images/common/btn_search.gif" alt="{$lang->cmd_search}" /></li>
|
||||
<li><a href="{getUrl('','mid',$mid)}"><img src="./images/common/btn_cancel.gif" alt="{$lang->cmd_cancel}" /></a></li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
</form>
|
||||
<!--@end-->
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<!-- 선택된 게시물이 있고 권한이 있으면 내용 출력 -->
|
||||
<!--@if($oDocument->isExists() && $grant->view)-->
|
||||
<!--@if($oDocument->isExists())-->
|
||||
<!--#include("./view_document.html")-->
|
||||
<!--@end-->
|
||||
|
||||
|
|
@ -18,6 +18,13 @@
|
|||
<!--@end-->
|
||||
|
||||
<table cellspacing="0" summary="board list" class="boardList">
|
||||
<!--@if($module_info->display_number!='N')--><col width="80" /><!--@end-->
|
||||
<col />
|
||||
<!--@if($module_info->display_author!='N')--><col width="120" /><!--@end-->
|
||||
<!--@if($module_info->display_readed_count!='N')--><col width="70" /><!--@end-->
|
||||
<!--@if($module_info->display_voted_count!='N')--><col width="70" /><!--@end-->
|
||||
<!--@if($module_info->display_regdate != 'N')--><col width="90" /><!--@end-->
|
||||
<!--@if($module_info->display_last_update == 'Y')--><col width="90" /><!--@end-->
|
||||
<thead>
|
||||
<tr>
|
||||
<!--@if($module_info->display_number!='N')-->
|
||||
|
|
@ -79,11 +86,7 @@
|
|||
<input type="checkbox" value="{$document->document_srl}" onclick="doAddCart('{$mid}',this)" <!--@if($check_list[$document->document_srl])-->checked="checked"<!--@end--> />
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[R<strong>{$document->getCommentCount()}</strong>]</span>
|
||||
|
|
@ -92,6 +95,8 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[T<strong>{$document->getTrackbackCount()}</strong>]</span>
|
||||
<!--@end-->
|
||||
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</div>
|
||||
</td>
|
||||
<!--@if($module_info->display_author!='N')--><td class="author"><div class="member_{$document->get('member_srl')}">{$document->getNickName()}</div></td><!--@end-->
|
||||
|
|
@ -103,52 +108,52 @@
|
|||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
|
||||
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/icon_gofirst.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,'document_srl','')}">{$page_no}</a>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/icon_golast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="buttonBox">
|
||||
<a href="{getUrl('','mid',$mid,'page',$page,'document_srl','')}"><img src="./images/common/btn_list.gif" alt="{$lang->cmd_list}" /></a>
|
||||
<!--@if($grant->write_document)-->
|
||||
<a href="{getUrl('act','dispBoardWrite','document_srl','')}"><img src="./images/common/btn_write.gif" alt="{$lang->cmd_write}" /></a>
|
||||
<!--@end-->
|
||||
<!--@if($grant->is_admin)-->
|
||||
<a href="{getUrl('act','dispBoardAdminManageDocument')}" onclick="popopen(this.href,'manageDocument'); return false;"><img src="./images/common/btn_manage.gif" alt="{$lang->cmd_manage_document}" /></a>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<!-- 검색 -->
|
||||
<!--@if($grant->view)-->
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search" class="boardSearch">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/icon_gofirst.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,'document_srl','')}">{$page_no}</a>
|
||||
<fieldset>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/icon_golast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="buttonBox">
|
||||
<a href="{getUrl('','mid',$mid,'page',$page,'document_srl','')}"><img src="./images/common/btn_list.gif" alt="{$lang->cmd_list}" /></a>
|
||||
<!--@if($grant->write_document)-->
|
||||
<a href="{getUrl('act','dispBoardWrite','document_srl','')}"><img src="./images/common/btn_write.gif" alt="{$lang->cmd_write}" /></a>
|
||||
<!--@end-->
|
||||
<!--@if($grant->is_admin)-->
|
||||
<a href="{getUrl('act','dispBoardAdminManageDocument')}" onclick="popopen(this.href,'manageDocument'); return false;"><img src="./images/common/btn_manage.gif" alt="{$lang->cmd_manage_document}" /></a>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<!-- 검색 -->
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search" class="boardSearch">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<fieldset>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<ul class="searchButton">
|
||||
<li><input type="image" src="./images/common/btn_search.gif" alt="{$lang->cmd_search}" /></li>
|
||||
<li><a href="{getUrl('','mid',$mid)}"><img src="./images/common/btn_cancel.gif" alt="{$lang->cmd_cancel}" /></a></li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
</form>
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<ul class="searchButton">
|
||||
<li><input type="image" src="./images/common/btn_search.gif" alt="{$lang->cmd_search}" /></li>
|
||||
<li><a href="{getUrl('','mid',$mid)}"><img src="./images/common/btn_cancel.gif" alt="{$lang->cmd_cancel}" /></a></li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
</form>
|
||||
<!--@end-->
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<!-- 선택된 게시물이 있고 권한이 있으면 내용 출력 -->
|
||||
<!--@if($oDocument->isExists() && $grant->view)-->
|
||||
<!--@if($oDocument->isExists())-->
|
||||
<!--#include("./view_document.html")-->
|
||||
<!--@end-->
|
||||
|
||||
|
|
@ -61,11 +61,7 @@
|
|||
<input type="checkbox" value="{$document->document_srl}" onclick="doAddCart('{$mid}',this)" <!--@if($check_list[$document->document_srl])-->checked="checked"<!--@end--> />
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[R<strong>{$document->getCommentCount()}</strong>]</span>
|
||||
|
|
@ -74,6 +70,8 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[T<strong>{$document->getTrackbackCount()}</strong>]</span>
|
||||
<!--@end-->
|
||||
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</div>
|
||||
</td>
|
||||
<td class="author"><div class="member_{$document->get('member_srl')}">{$document->getNickName()}</div></td>
|
||||
|
|
@ -102,11 +100,7 @@
|
|||
<input type="checkbox" value="{$document->document_srl}" onclick="doAddCart('{$mid}',this)" <!--@if($check_list[$document->document_srl])-->checked="checked"<!--@end--> />
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[R<strong>{$document->getCommentCount()}</strong>]</span>
|
||||
|
|
@ -115,6 +109,8 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Replies & Trackbacks">[T<strong>{$document->getTrackbackCount()}</strong>]</span>
|
||||
<!--@end-->
|
||||
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</div>
|
||||
</td>
|
||||
<td class="author noline"><div class="member_{$document->get('member_srl')}">{$document->getNickName()}</div></td>
|
||||
|
|
@ -130,52 +126,52 @@
|
|||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
|
||||
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/icon_gofirst.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,'document_srl','')}">{$page_no}</a>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/icon_golast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="buttonBox">
|
||||
<a href="{getUrl('','mid',$mid,'page',$page,'document_srl','')}"><img src="./images/common/btn_list.gif" alt="{$lang->cmd_list}" /></a>
|
||||
<!--@if($grant->write_document)-->
|
||||
<a href="{getUrl('act','dispBoardWrite','document_srl','')}"><img src="./images/common/btn_write.gif" alt="{$lang->cmd_write}" /></a>
|
||||
<!--@end-->
|
||||
<!--@if($grant->is_admin)-->
|
||||
<a href="{getUrl('act','dispBoardAdminManageDocument')}" onclick="popopen(this.href,'manageDocument'); return false;"><img src="./images/common/btn_manage.gif" alt="{$lang->cmd_manage_document}" /></a>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<!-- 검색 -->
|
||||
<!--@if($grant->view)-->
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search" class="boardSearch">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/icon_gofirst.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,'document_srl','')}">{$page_no}</a>
|
||||
<fieldset>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/icon_golast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="buttonBox">
|
||||
<a href="{getUrl('','mid',$mid,'page',$page,'document_srl','')}"><img src="./images/common/btn_list.gif" alt="{$lang->cmd_list}" /></a>
|
||||
<!--@if($grant->write_document)-->
|
||||
<a href="{getUrl('act','dispBoardWrite','document_srl','')}"><img src="./images/common/btn_write.gif" alt="{$lang->cmd_write}" /></a>
|
||||
<!--@end-->
|
||||
<!--@if($grant->is_admin)-->
|
||||
<a href="{getUrl('act','dispBoardAdminManageDocument')}" onclick="popopen(this.href,'manageDocument'); return false;"><img src="./images/common/btn_manage.gif" alt="{$lang->cmd_manage_document}" /></a>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<!-- 검색 -->
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search" class="boardSearch">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<fieldset>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<ul class="searchButton">
|
||||
<li><input type="image" src="./images/common/btn_search.gif" alt="{$lang->cmd_search}" /></li>
|
||||
<li><a href="{getUrl('','mid',$mid)}"><img src="./images/common/btn_cancel.gif" alt="{$lang->cmd_cancel}" /></a></li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
</form>
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<ul class="searchButton">
|
||||
<li><input type="image" src="./images/common/btn_search.gif" alt="{$lang->cmd_search}" /></li>
|
||||
<li><a href="{getUrl('','mid',$mid)}"><img src="./images/common/btn_cancel.gif" alt="{$lang->cmd_cancel}" /></a></li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
</form>
|
||||
<!--@end-->
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<!-- 선택된 게시물이 있고 권한이 있으면 내용 출력 -->
|
||||
<!--@if($oDocument->isExists() && $grant->view)-->
|
||||
<!--@if($oDocument->isExists())-->
|
||||
<!--#include("./view_document.html")-->
|
||||
<!--@end-->
|
||||
|
||||
|
|
@ -60,11 +60,8 @@
|
|||
<!--@if($grant->is_admin)-->
|
||||
<input type="checkbox" value="{$document->document_srl}" onclick="doAddCart('{$mid}',this)" <!--@if($check_list[$document->document_srl])-->checked="checked"<!--@end--> />
|
||||
<!--@end-->
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies"><img src="./images/common/iconReply.gif" alt="" width="12" height="12" class="icon" /> <strong>{$document->getCommentCount()}</strong></span>
|
||||
|
|
@ -73,6 +70,8 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Trackbacks"><img src="./images/common/iconTrackback.gif" alt="" width="12" height="13" class="trackback icon" /> <strong>{$document->getTrackbackCount()}</strong></span>
|
||||
<!--@end-->
|
||||
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</td>
|
||||
<td class="reading">{$document->get('readed_count')}</td>
|
||||
<td class="recommend">{$document->get('voted_count')}</td>
|
||||
|
|
@ -136,7 +135,6 @@
|
|||
</table>
|
||||
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<div class="clear">
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="gap1 fr">
|
||||
|
|
@ -170,25 +168,26 @@
|
|||
|
||||
|
||||
<!-- 검색 -->
|
||||
<!--@if($grant->view)-->
|
||||
<div class="boardSearch">
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<a href="#" onclick="xGetElementById('fo_search').submit();return false;" class="button"><span>{$lang->cmd_search}</span></a>
|
||||
<a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<a href="#" onclick="xGetElementById('fo_search').submit();return false;" class="button"><span>{$lang->cmd_search}</span></a>
|
||||
<a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<!--@end-->
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<!-- 선택된 게시물이 있고 권한이 있으면 내용 출력 -->
|
||||
<!--@if($oDocument->isExists() && $grant->view)-->
|
||||
<!--@if($oDocument->isExists())-->
|
||||
<!--#include("./view_document.html")-->
|
||||
<!--@end-->
|
||||
|
||||
|
|
@ -94,11 +94,7 @@
|
|||
<a href="{getUrl('','document_srl',$document->document_srl)}" class="thumbnailMedium"><img src="{$document->getThumbnail(100)}" border="0" alt="" /></a>
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies"><img src="./images/common/iconReply.gif" alt="" width="12" height="12" class="icon" /> <strong>{$document->getCommentCount()}</strong></span>
|
||||
|
|
@ -107,6 +103,8 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Trackbacks"><img src="./images/common/iconTrackback.gif" alt="" width="12" height="13" class="trackback icon" /> <strong>{$document->getTrackbackCount()}</strong></span>
|
||||
<!--@end-->
|
||||
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</td>
|
||||
<!--@if($module_info->display_author!='N')--><td class="author"><div class="member_{$document->get('member_srl')}">{$document->getNickName()}</div></td><!--@end-->
|
||||
<!--@if($module_info->display_readed_count!='N')--><td class="reading">{$document->get('readed_count')>0?$document->get('readed_count'):' '}</td><!--@end-->
|
||||
|
|
@ -118,7 +116,6 @@
|
|||
</tbody>
|
||||
</table>
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<div class="clear">
|
||||
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
|
|
@ -153,23 +150,24 @@
|
|||
|
||||
|
||||
<!-- 검색 -->
|
||||
<!--@if($grant->view)-->
|
||||
<div class="boardSearch">
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/><a href="#" onclick="xGetElementById('fo_search').submit();return false;" class="button"><span>{$lang->cmd_search}</span></a><a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/><a href="#" onclick="xGetElementById('fo_search').submit();return false;" class="button"><span>{$lang->cmd_search}</span></a><a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<!--@end-->
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<!--#include("header.html")-->
|
||||
|
||||
<!-- 선택된 게시물이 있고 권한이 있으면 내용 출력 -->
|
||||
<!--@if($oDocument->isExists() && $grant->view)-->
|
||||
<!--@if($oDocument->isExists())-->
|
||||
<!--#include("./view_document.html")-->
|
||||
<!--@end-->
|
||||
|
||||
|
|
@ -77,11 +77,8 @@
|
|||
<!--@if($module_info->use_category == "Y" && $document->get('category_srl'))-->
|
||||
<strong class="category">{$category_list[$document->get('category_srl')]->title}</strong>
|
||||
<!--@end-->
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies"><img src="./images/common/iconReply.gif" alt="" width="12" height="12" class="icon" /> <strong>{$document->getCommentCount()}</strong></span>
|
||||
|
|
@ -90,6 +87,8 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Trackbacks"><img src="./images/common/iconTrackback.gif" alt="" width="12" height="13" class="trackback icon" /> <strong>{$document->getTrackbackCount()}</strong></span>
|
||||
<!--@end-->
|
||||
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</td>
|
||||
<td class="author"><div class="member_{$document->get('member_srl')}">{$document->getNickName()}</div></td>
|
||||
<td class="reading">{$document->get('readed_count')}</td>
|
||||
|
|
@ -115,11 +114,8 @@
|
|||
<!--@if($module_info->use_category == "Y" && $document->get('category_srl'))-->
|
||||
<strong>{$category_list[$document->get('category_srl')]->title}</strong>
|
||||
<!--@end-->
|
||||
<!--@if($grant->view)-->
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
<!--@else-->
|
||||
{$document->getTitleText($module_info->subject_cut_size)}
|
||||
<!--@end-->
|
||||
|
||||
<a href="{getUrl('document_srl',$document->document_srl)}">{$document->getTitleText($module_info->subject_cut_size)}</a>
|
||||
|
||||
<!--@if($document->getCommentCount())-->
|
||||
<span class="replyAndTrackback" title="Replies"><img src="./images/common/iconReply.gif" alt="" width="12" height="12" class="icon" /> <strong>{$document->getCommentCount()}</strong></span>
|
||||
|
|
@ -128,6 +124,7 @@
|
|||
<!--@if($document->getTrackbackCount())-->
|
||||
<span class="replyAndTrackback" title="Trackbacks"><img src="./images/common/iconTrackback.gif" alt="" width="12" height="13" class="trackback icon" /> <strong>{$document->getTrackbackCount()}</strong></span>
|
||||
<!--@end-->
|
||||
{$document->printExtraImages(60*60*2)}
|
||||
</td>
|
||||
<td class="author"><div class="member_{$document->get('member_srl')}">{$document->getNickName()}</div></td>
|
||||
<td class="reading">{$document->get('readed_count')}</td>
|
||||
|
|
@ -148,7 +145,6 @@
|
|||
</table>
|
||||
|
||||
|
||||
<!--@if($grant->view)-->
|
||||
<div class="clear">
|
||||
<!-- 글쓰기, 목록 버튼 -->
|
||||
<div class="gap1 fr">
|
||||
|
|
@ -182,25 +178,26 @@
|
|||
|
||||
|
||||
<!-- 검색 -->
|
||||
<!--@if($grant->view)-->
|
||||
<div class="boardSearch">
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
<form action="{getUrl()}" method="get" onsubmit="return procFilter(this, search)" id="fo_search">
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="category" value="{$category}" />
|
||||
|
||||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<a href="#" onclick="xGetElementById('fo_search').submit();return false;" class="button"><span>{$lang->cmd_search}</span></a>
|
||||
<a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
<select name="search_target">
|
||||
<!--@foreach($search_option as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText"/>
|
||||
<a href="#" onclick="xGetElementById('fo_search').submit();return false;" class="button"><span>{$lang->cmd_search}</span></a>
|
||||
<a href="{getUrl('','mid',$mid)}" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<!--@end-->
|
||||
</div>
|
||||
<!--@end-->
|
||||
|
||||
<!--#include("footer.html")-->
|
||||
|
|
|
|||
|
|
@ -32,5 +32,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -40,5 +40,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -105,5 +105,10 @@
|
|||
return new Object(0,'success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@
|
|||
return $oTrackbackModel->getTrackbackList($this->document_srl, $is_admin);
|
||||
}
|
||||
|
||||
function thumbnailExists($width, $height) {
|
||||
function thumbnailExists($width = 80, $height = 0) {
|
||||
if(!$this->getThumbnail($width, $height)) return false;
|
||||
return true;
|
||||
}
|
||||
|
|
@ -341,6 +341,62 @@
|
|||
return Context::getRequestUri().$thumbnail_file;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 새글, 최신 업데이트글, 비밀글, 이미지/동영상/첨부파일등의 아이콘 출력용 함수
|
||||
* $time_interval 에 지정된 시간(초)로 새글/최신 업데이트글의 판별
|
||||
**/
|
||||
function getExtraImages($time_interval = 7200) {
|
||||
|
||||
// 아이콘 목록을 담을 변수 미리 설정
|
||||
$buffs = array();
|
||||
|
||||
// 최신 시간 설정
|
||||
$time_check = date("YmdHis", time()-$time_interval);
|
||||
|
||||
// 새글 체크
|
||||
if($this->get('regdate')>$time_check) $buffs[] = "new";
|
||||
else if($this->get('last_update')>$time_check) $buffs[] = "update";
|
||||
|
||||
// 비밀글 체크
|
||||
if($this->isSecret()) $buffs[] = "secret";
|
||||
|
||||
$check_files = false;
|
||||
|
||||
// 사진 이미지 체크
|
||||
if(preg_match('!<img([^>]*?)>!is', $this->get('content'))) {
|
||||
$buffs[] = "image";
|
||||
$check_files = true;
|
||||
}
|
||||
|
||||
// 동영상 체크
|
||||
if(preg_match('!<embed([^>]*?)>!is', $this->get('content'))) {
|
||||
$buffs[] = "movie";
|
||||
$check_files = true;
|
||||
}
|
||||
|
||||
// 첨부파일 체크
|
||||
if(!$check_files && $this->hasUploadedFiles()) $buffs[] = "file";
|
||||
|
||||
return $buffs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief getExtraImages로 구한 값을 이미지 태그를 씌워서 리턴
|
||||
**/
|
||||
function printExtraImages($time_check = 7200) {
|
||||
// 아이콘 디렉토리 구함
|
||||
$path = sprintf('%s%s',getUrl(), 'modules/document/tpl/icons/');
|
||||
|
||||
$buffs = $this->getExtraImages($time_check);
|
||||
if(!count($buffs)) return;
|
||||
|
||||
$buff = null;
|
||||
foreach($buffs as $key => $val) {
|
||||
$buff .= sprintf('<img src="%s%s.gif" alt="%s" title="%s" width="13" height="13" align="absmiddle"/>', $path, $val, $val, $val);
|
||||
}
|
||||
return $buff;
|
||||
}
|
||||
|
||||
function hasUploadedFiles() {
|
||||
if($this->isSecret() && !$this->isGranted()) return false;
|
||||
return $this->get('uploaded_count')? true : false;
|
||||
|
|
|
|||
BIN
modules/document/tpl/icons/file.gif
Normal file
BIN
modules/document/tpl/icons/file.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 545 B |
BIN
modules/document/tpl/icons/image.gif
Normal file
BIN
modules/document/tpl/icons/image.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 522 B |
BIN
modules/document/tpl/icons/movie.gif
Normal file
BIN
modules/document/tpl/icons/movie.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 524 B |
BIN
modules/document/tpl/icons/new.gif
Normal file
BIN
modules/document/tpl/icons/new.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 78 B |
BIN
modules/document/tpl/icons/secret.gif
Normal file
BIN
modules/document/tpl/icons/secret.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 338 B |
BIN
modules/document/tpl/icons/update.gif
Normal file
BIN
modules/document/tpl/icons/update.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 79 B |
|
|
@ -48,5 +48,13 @@
|
|||
function moduleUpdate() {
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// 에디터 컴포넌트 캐시 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/editor");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,162 +0,0 @@
|
|||
<!--%import("js/editor.js")-->
|
||||
<!--%import("css/editor.css")-->
|
||||
<!--%import("./lang")-->
|
||||
<!-- 에디터 활성화 -->
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var editor_height = '{$editor_height}';
|
||||
var editor_path = "{$editor_path}";
|
||||
var auto_saved_msg = "{$lang->msg_auto_saved}";
|
||||
editorInit("{$upload_target_srl}", {$enable_resizable}, {$editor_height});
|
||||
//]]></script>
|
||||
|
||||
<!-- 자동저장용 폼 -->
|
||||
<!--@if($enable_autosave)-->
|
||||
<input type="hidden" name="_saved_doc_title" value="{htmlspecialchars($saved_doc->title)}" />
|
||||
<input type="hidden" name="_saved_doc_content" value="{htmlspecialchars($saved_doc->content)}" />
|
||||
<input type="hidden" name="_saved_doc_message" value="{$lang->msg_load_saved_doc}" />
|
||||
<!--@end-->
|
||||
|
||||
<!-- 에디터 -->
|
||||
<div class="xeEditor">
|
||||
|
||||
<div id="xeEditorOption_{$upload_target_srl}">
|
||||
<!--@if($enable_default_component)-->
|
||||
<div class="optionABC">
|
||||
<div class="optionA">
|
||||
<div class="selectGroup">
|
||||
<select onchange="editorChangeFontName(this,'{$upload_target_srl}')" id="editor_font_{$upload_target_srl}">
|
||||
<option value="">{$lang->edit->fontname}</option>
|
||||
<!--@foreach($lang->edit->fontlist as $key=>$obj)-->
|
||||
<option style="font-family:{$obj}" value="{$obj}">{$obj}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
|
||||
<select onchange="editorChangeFontSize(this,'{$upload_target_srl}')" id="editor_fontsize_{$upload_target_srl}">
|
||||
<option value="" selected="selected">{$lang->edit->fontsize}</option>
|
||||
<option value="1">8pt</option>
|
||||
<option value="2">10pt</option>
|
||||
<option value="3">12pt</option>
|
||||
<option value="4">14pt</option>
|
||||
<option value="5">18pt</option>
|
||||
<option value="6">24pt</option>
|
||||
<option value="7">36pt</option>
|
||||
</select>
|
||||
|
||||
<select onchange="editorChangeHeader(this,'{$upload_target_srl}')" id="editor_header_{$upload_target_srl}">
|
||||
<option value="">{$lang->edit->header}</option>
|
||||
<!--@foreach($lang->edit->header_list as $key=>$obj)-->
|
||||
<option value="{$key}">{$obj}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="buttonGroup">
|
||||
<img src="./images/editor_btn_b.gif" width="23" height="63" title="{$lang->edit->help_bold}" alt="{$lang->edit->help_bold}" id="component_{$upload_target_srl}_Bold" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_i.gif" width="23" height="63" title="{$lang->edit->help_italic}" alt="{$lang->edit->help_italic}" id="component_{$upload_target_srl}_Italic" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_u.gif" width="23" height="63" title="{$lang->edit->help_underline}" alt="{$lang->edit->help_underline}" id="component_{$upload_target_srl}_Underline" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_c.gif" width="23" height="63" title="{$lang->edit->help_fontcolor}" alt="{$lang->edit->help_fontcolor}" id="component_{$upload_target_srl}_colorpicker_text" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_bg.gif" width="23" height="63" title="{$lang->edit->help_fontbgcolor}" alt="{$lang->edit->help_fontbgcolor}" id="component_{$upload_target_srl}_colorpicker_bg" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="optionB">
|
||||
<div class="buttonGroup">
|
||||
<img src="./images/editor_btn_al.gif" width="23" height="63" title="{$lang->edit->help_align_left}" alt="{$lang->edit->help_align_left}" id="component_{$upload_target_srl}_justifyleft" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_ac.gif" width="23" height="63" title="{$lang->edit->help_align_center}" alt="{$lang->edit->help_align_center}" id="component_{$upload_target_srl}_justifycenter" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_ar.gif" width="23" height="63" title="{$lang->edit->help_align_right}" alt="{$lang->edit->help_align_right}" id="component_{$upload_target_srl}_justifyright" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<!--<img src="./images/editor_btn_aj.gif" width="23" height="63" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />-->
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="buttonGroup">
|
||||
<img src="./images/editor_btn_od.gif" title="{$lang->edit->help_remove_indent}" alt="{$lang->edit->help_remove_indent}" id="component_{$upload_target_srl}_outdent" width="23" height="63" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_id.gif" width="23" height="63" title="{$lang->edit->help_add_indent}" alt="{$lang->edit->help_add_indent}" id="component_{$upload_target_srl}_indent" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
</div>
|
||||
|
||||
<div class="buttonGroup">
|
||||
<img src="./images/editor_btn_ol.gif" title="{$lang->edit->help_list_number}" alt="{$lang->edit->help_list_number}" id="component_{$upload_target_srl}_insertorderedlist" width="23" height="63" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<img src="./images/editor_btn_ul.gif" title="{$lang->edit->help_list_bullet}" alt="{$lang->edit->help_list_bullet}" id="component_{$upload_target_srl}_insertunorderedlist" width="23" height="63" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
</div>
|
||||
|
||||
<div class="buttonGroup">
|
||||
<img src="./images/editor_btn_lh.gif" alt="Line hight" width="23" height="63" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="optionC">
|
||||
<div class="buttonGroup">
|
||||
<img src="./images/editor_btn_tag.gif" alt="Tag" width="23" height="63" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
<!--@end-->
|
||||
|
||||
<!--@if($enable_component)-->
|
||||
<div class="optionDE">
|
||||
<div class="optionE">
|
||||
<div class="buttonGroup" id="editor_component_{$upload_target_srl}">
|
||||
<!--@foreach($component_list as $component_name => $component)-->
|
||||
<!--@if(substr($component_name,0,11)!="colorpicker")-->
|
||||
<img src="../components/{$component_name}/icon.gif" alt="{$component->title}" title="{$component->title}" id="component_{$upload_target_srl}_{$component_name}" onmouseover="eOptionOver(this)" onmouseout="eOptionOut(this)" />
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--@end-->
|
||||
</div>
|
||||
|
||||
<!--@if(!$_COOKIE['EditorInfo'])-->
|
||||
<div id="editorInfo" class="editorInfo" >
|
||||
{$lang->about_dblclick_in_editor}
|
||||
<span id="for_ie_help_{$upload_target_srl}" style="display:none">{$lang->edit->help_use_paragrapth}</span>
|
||||
<img src="./images/buttonClose.gif" alt="close" width="13" height="13" class="close" onclick="closeEditorInfo(); return false;" />
|
||||
</div>
|
||||
<!--@end-->
|
||||
|
||||
<div class="editor_info">
|
||||
<div class="editor_option">
|
||||
<input type="checkbox" id="use_html_{$upload_target_srl}" value="Y" onclick="editorChangeMode(this, '{$upload_target_srl}');" /> <label for="use_html_{$upload_target_srl}">HTML</label>
|
||||
</div>
|
||||
<div class="editor_autosaved_message" id="editor_autosaved_message_{$upload_target_srl}"> </div>
|
||||
</div>
|
||||
|
||||
<div class="editor_iframe_box" id="editor_iframe_area_{$upload_target_srl}"></div>
|
||||
|
||||
<div class="textAreaDragIndicator"><div class="textAreaDragIndicatorBar" id="editor_drag_bar_{$upload_target_srl}"></div></div>
|
||||
|
||||
<!--@if($allow_fileupload)-->
|
||||
<!-- 첨부파일 영역 -->
|
||||
<!--%import("./js/uploader.js")-->
|
||||
<script type="text/javascript">
|
||||
var zbxe_session_name = "{session_name()}";
|
||||
var uploader_setting = { "allowed_filesize" : {$file_config->allowed_filesize}, "allowed_filetypes" : "{$file_config->allowed_filetypes}", "allowed_filetypes_description" : "{$file_config->allowed_filetypes}" }
|
||||
editor_upload_init("{$upload_target_srl}");
|
||||
</script>
|
||||
|
||||
<div class="fileAttach">
|
||||
<input type="hidden" name="upload_target_srl" value="{$upload_target_srl}" />
|
||||
|
||||
<div class="preview" id="preview_uploaded_{$upload_target_srl}">
|
||||
<img src="./images/blank.gif" alt="preview" width="100" height="100" />
|
||||
</div>
|
||||
|
||||
<!-- 파일 업로드 영역 -->
|
||||
<div class="fileListArea">
|
||||
<select id="uploaded_file_list_{$upload_target_srl}" size="7" class="fileList" onclick="editor_preview(this, '{$upload_target_srl}');"></select>
|
||||
<span class="file_attach_info" id="uploader_status_{$upload_target_srl}"></span>
|
||||
</div>
|
||||
|
||||
<div class="fileUploadControl"><a href="#" onclick="editor_upload_file('{$upload_target_srl}');return false;" class="button"><span>{$lang->edit->upload_file}</span></a></div>
|
||||
<div class="fileUploadControl"><a href="#" onclick="editor_remove_file('{$upload_target_srl}');return false;" class="button"><span>{$lang->edit->delete_selected}</span></a></div>
|
||||
<div class="fileUploadControl"><a href="#" onclick="editor_insert_file('{$upload_target_srl}');return false;" class="button"><span>{$lang->edit->link_file}</span></a></div>
|
||||
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
<!--@end-->
|
||||
</div>
|
||||
|
||||
|
||||
|
|
@ -7,8 +7,6 @@
|
|||
/**
|
||||
* 에디터에서 사용하는 iframe, textarea의 prefix
|
||||
**/
|
||||
var iframe_id = 'editor_iframe_'; ///< 에디터로 사용하는 iframe의 prefix
|
||||
var textarea_id = 'editor_textarea_'; ///< 에디터의 html편집 모드에서 사용하는 textarea의 prefix
|
||||
var editor_mode = new Array(); ///<< 에디터의 html편집 모드 flag 세팅 변수
|
||||
var _editorSyncList = new Array(); ///< 에디터와 form 동기화를 위한 동기화 대상 목록
|
||||
var _autoSaveObj = {fo_obj:null, editor_sequence:0, title:'', content:'', locked:false} ///< 자동저장을 위한 정보를 가진 object
|
||||
|
|
@ -20,20 +18,19 @@ var editor_rel_keys = new Array(); ///< 에디터와 각 모듈과의 연동을
|
|||
xAddEventListener(window, 'load', _editorSync); ///< 에디터의 동기화를 하는 함수를 window.load시 실행
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 에디터의 상태나 객체를 구하기 위한 함수
|
||||
**/
|
||||
|
||||
// editor_sequence값에 해당하는 iframe의 object를 return
|
||||
function editorGetIFrame(editor_sequence) {
|
||||
var obj_id = iframe_id + editor_sequence;
|
||||
var obj_id = 'editor_iframe_'+ editor_sequence;
|
||||
return xGetElementById(obj_id);
|
||||
}
|
||||
|
||||
// editor_sequence값에 해당하는 textarea object를 return
|
||||
function editorGetTextArea(editor_sequence) {
|
||||
var obj_id = textarea_id + editor_sequence;
|
||||
var obj_id = 'editor_textarea_' + editor_sequence;
|
||||
return xGetElementById(obj_id);
|
||||
}
|
||||
|
||||
|
|
@ -148,9 +145,15 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
|
|||
// iframe내의 document element를 구함
|
||||
var contentDocument = iframe_obj.contentWindow.document;
|
||||
|
||||
/**
|
||||
* 에디터를 위지윅 모드로 만들기 위해 내용 작성 후 designMode 활성화
|
||||
**/
|
||||
// 크기 변경 불가일 경우 드래그바 숨김
|
||||
if(resizable == false) xGetElementById("editor_drag_bar_"+editor_sequence).style.display = "none";
|
||||
else xGetElementById("editor_drag_bar_"+editor_sequence).style.display = "block";
|
||||
|
||||
// IE일 경우 ctrl-Enter 안내 문구를 노출
|
||||
if(xIE4Up && xGetElementById('for_ie_help_'+editor_sequence)) {
|
||||
xGetElementById('for_ie_help_'+editor_sequence).style.display = "block";
|
||||
}
|
||||
|
||||
var contentHtml = ''+
|
||||
'<!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><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/>'+
|
||||
|
|
@ -165,15 +168,31 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
|
|||
content+
|
||||
'</body></html>'+
|
||||
'';
|
||||
contentDocument.open("text/html","replace");
|
||||
contentDocument.write(contentHtml);
|
||||
contentDocument.close();
|
||||
|
||||
// editor_mode를 기본으로 설정
|
||||
editor_mode[editor_sequence] = null;
|
||||
|
||||
// iframe에 focus가 될때 에디터 모드로 전환하도록 이벤트 지정
|
||||
if(xIE4Up) xAddEventListener(iframe_obj, "focus", function() { editorSetDesignMode(iframe_obj, contentDocument, content, fo_obj, editor_sequence, editor_height); } );
|
||||
else xAddEventListener(iframe_obj.contentWindow, "focus", function() { editorSetDesignMode(iframe_obj, contentDocument, content, fo_obj, editor_sequence, editor_height); } );
|
||||
}
|
||||
|
||||
/**
|
||||
* 에디터를 위지윅 모드로 만들기 위해 내용 작성 후 designMode 활성화
|
||||
**/
|
||||
var editor_is_started = new Array();
|
||||
function editorSetDesignMode(iframe_obj, contentDocument, content, fo_obj, editor_sequence, editor_height) {
|
||||
if(editor_is_started[editor_sequence]) return;
|
||||
|
||||
contentDocument.designMode = 'on';
|
||||
try {
|
||||
contentDocument.execCommand("undo", false, null);
|
||||
contentDocument.execCommand("useCSS", false, true);
|
||||
} catch (e) {
|
||||
}
|
||||
contentDocument.open("text/html","replace");
|
||||
contentDocument.write(contentHtml);
|
||||
contentDocument.close();
|
||||
|
||||
/**
|
||||
* 더블클릭이나 키눌림등의 각종 이벤트에 대해 listener 추가
|
||||
|
|
@ -189,11 +208,6 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
|
|||
xAddEventListener(document,'mouseup',editorEventCheck);
|
||||
xAddEventListener(document,'mousedown',editorHideObject);
|
||||
|
||||
// IE일 경우 ctrl-Enter 안내 문구를 노출
|
||||
if(xIE4Up && xGetElementById('for_ie_help_'+editor_sequence)) {
|
||||
xGetElementById('for_ie_help_'+editor_sequence).style.display = "block";
|
||||
}
|
||||
|
||||
/**
|
||||
* 에디터의 내용을 지속적으로 fo_obj.content의 값과 동기화를 시킴.
|
||||
* 차후 다른 에디터를 사용하더라도 fo_obj.content와 동기화만 된다면 어떤 에디터라도 사용 가능하도록 하기 위해
|
||||
|
|
@ -204,12 +218,7 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
|
|||
// 자동저장 필드가 있다면 자동 저장 기능 활성화
|
||||
if(typeof(fo_obj._saved_doc_title)!="undefined" ) editorEnableAutoSave(fo_obj, editor_sequence);
|
||||
|
||||
// 크기 변경 불가일 경우 드래그바 숨김
|
||||
if(resizable == false) xGetElementById("editor_drag_bar_"+editor_sequence).style.display = "none";
|
||||
else xGetElementById("editor_drag_bar_"+editor_sequence).style.display = "block";
|
||||
|
||||
// editor_mode를 기본으로 설정
|
||||
editor_mode[editor_sequence] = null;
|
||||
editor_is_started[editor_sequence] = true;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -819,4 +828,3 @@ function closeEditorInfo(editor_sequence) {
|
|||
expire.setTime(expire.getTime()+ (7000 * 24 * 3600000));
|
||||
xSetCookie('EditorInfo', '1', expire);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,5 +45,11 @@
|
|||
function moduleUpdate() {
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<column name="upload_target_srl" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="in" column="module_srl" var="module_srls" notnull="notnull" filter="number" />
|
||||
<condition operation="in" column="module_srl" var="module_srls" notnull="notnull" filter="numbers" />
|
||||
<condition operation="equal" column="direct_download" var="direct_download" pipe="and" />
|
||||
<condition operation="equal" column="isvalid" var="isvalid" pipe="and" />
|
||||
</conditions>
|
||||
|
|
|
|||
|
|
@ -55,5 +55,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -32,5 +32,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -28,5 +28,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -43,5 +43,10 @@
|
|||
return new Object(0, 'success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -36,5 +36,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -39,5 +39,11 @@
|
|||
function moduleUpdate() {
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
'email_address' => 'Email Address',
|
||||
'regdate' => 'Join Date',
|
||||
'last_login' => 'Latest Login Date',
|
||||
'extra_vars' => 'Extra Vars',
|
||||
);
|
||||
|
||||
$lang->message_box = array(
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
'email_address' => 'Dirección de Email',
|
||||
'regdate' => 'Fecha del registro',
|
||||
'last_login' => 'Fecha de su última conección',
|
||||
'extra_vars' => 'Variables Extra',
|
||||
);
|
||||
|
||||
$lang->message_box = array(
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
'email_address' => 'メールアドレス',
|
||||
'regdate' => '加入日',
|
||||
'last_login' => '最近のログイン',
|
||||
'extra_vars' => '拡張変数',
|
||||
);
|
||||
|
||||
$lang->message_box = array(
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@
|
|||
'email_address' => '메일주소',
|
||||
'regdate' => '가입일시',
|
||||
'last_login' => '최근로그인일시',
|
||||
'last_login' => '최근로그인일시',
|
||||
'extra_vars' => '확장변수',
|
||||
);
|
||||
|
||||
$lang->message_box = array(
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
'email_address' => '邮箱地址',
|
||||
'regdate' => '注册日期',
|
||||
'last_login' => '最近登录',
|
||||
'extra_vars' => '扩展变数',
|
||||
);
|
||||
|
||||
$lang->message_box = array(
|
||||
|
|
@ -171,4 +172,4 @@
|
|||
$lang->about_openid_leave = '删除OpenID就等于永久删除站内用户的信息。<br />被删除后的重新登录就等于新会员注册,因此对以前自己写的主题将失去相应权限。';
|
||||
|
||||
$lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。";
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
**/
|
||||
function procMemberAdminInsert() {
|
||||
// 필수 정보들을 미리 추출
|
||||
$args = Context::gets('member_srl','user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','allow_message','denied','is_admin','description','group_srl_list');
|
||||
$args = Context::gets('member_srl','user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','allow_message','denied','is_admin','description','group_srl_list','limit_date');
|
||||
|
||||
// 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
|
||||
$all_args = Context::getRequestVars();
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@
|
|||
case 'last_login' :
|
||||
$args->s_last_login = $search_keyword;
|
||||
break;
|
||||
case 'extra_vars' :
|
||||
$args->s_extra_vars = $search_keyword;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -154,5 +154,11 @@
|
|||
|
||||
return new Object(0, 'success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
/**
|
||||
* @brief user_id, password를 체크하여 로그인 시킴
|
||||
**/
|
||||
function procMemberLogin() {
|
||||
function procMemberLogin($user_id = null, $password = null, $remember_user_id = null) {
|
||||
// 변수 정리
|
||||
if(!$user_id) $user_id = Context::get('user_id');
|
||||
$user_id = trim($user_id);
|
||||
|
|
@ -24,6 +24,9 @@
|
|||
if(!$password) $password = Context::get('password');
|
||||
$password = trim($password);
|
||||
|
||||
if($remember_user_id) $remember_user_id = Context::get('remember_user_id');
|
||||
if($remember_user_id != 'Y') setcookie('user_id','');
|
||||
|
||||
// 아이디나 비밀번호가 없을때 오류 return
|
||||
if(!$user_id) return new Object(-1,'null_user_id');
|
||||
if(!$password) return new Object(-1,'null_password');
|
||||
|
|
@ -599,6 +602,9 @@
|
|||
unset($all_args->is_admin);
|
||||
unset($all_args->description);
|
||||
unset($all_args->group_srl_list);
|
||||
unset($all_args->body);
|
||||
unset($all_args->accept_agreement);
|
||||
unset($all_args->signature);
|
||||
|
||||
// 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력
|
||||
$extra_vars = delObjectVars($all_args, $args);
|
||||
|
|
@ -636,6 +642,9 @@
|
|||
unset($all_args->is_admin);
|
||||
unset($all_args->description);
|
||||
unset($all_args->group_srl_list);
|
||||
unset($all_args->body);
|
||||
unset($all_args->accept_agreement);
|
||||
unset($all_args->signature);
|
||||
|
||||
// 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력
|
||||
$extra_vars = delObjectVars($all_args, $args);
|
||||
|
|
@ -964,7 +973,7 @@
|
|||
if($member_info->denied == 'Y') return new Object(-1,'msg_user_denied');
|
||||
|
||||
// denied_date가 현 시간보다 적으면 알림
|
||||
if($member_info->limit_date && $member_info->limit_date >= date("YmdHis")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d H:i")));
|
||||
if($member_info->limit_date && $member_info->limit_date >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d")));
|
||||
|
||||
// 사용자 정보의 최근 로그인 시간을 기록
|
||||
$args->member_srl = $member_info->member_srl;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />
|
||||
<condition operation="like" column="nick_name" var="s_nick_name" pipe="or" />
|
||||
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
|
||||
<condition operation="like" column="extra_vars" var="s_extra_vars" pipe="or" />
|
||||
<condition operation="like_prefix" column="regdate" var="s_regdate" pipe="or" />
|
||||
<condition operation="like_prefix" column="last_login" var="s_last_login" pipe="or" />
|
||||
</group>
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
<condition operation="like" column="member.user_name" var="s_user_name" pipe="or" />
|
||||
<condition operation="like" column="member.nick_name" var="s_nick_name" pipe="or" />
|
||||
<condition operation="like" column="member.email_address" var="s_email_address" pipe="or" />
|
||||
<condition operation="like" column="extra_vars" var="s_extra_vars" pipe="or" />
|
||||
<condition operation="like_prefix" column="member.regdate" var="s_regdate" pipe="or" />
|
||||
<condition operation="like_prefix" column="member.last_login" var="s_last_login" pipe="or" />
|
||||
</group>
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
<column name="allow_mailing" var="allow_mailing" default="Y" />
|
||||
<column name="allow_message" var="allow_message" default="Y" />
|
||||
<column name="denied" var="denied" />
|
||||
<column name="limit_date" var="limit_date" />
|
||||
<column name="is_admin" var="is_admin" />
|
||||
<column name="description" var="description" />
|
||||
<column name="extra_vars" var="extra_vars" />
|
||||
|
|
|
|||
|
|
@ -535,3 +535,6 @@ Jeong, Chan Myeong 070601~070630
|
|||
.memberInfoTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;}
|
||||
.memberInfoTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;}
|
||||
.memberInfoTable td .checkbox { border:none; }
|
||||
|
||||
.agreementBox { border:1px solid #AAAAAA; margin:.5em 0 0 0; padding:1em; border-bottom:none; height:200px; overflow-y:scroll;}
|
||||
.agreementButton { background-color:#EEEEEE; padding:1em; border:1px solid #AAAAAA; border-top:none; margin-bottom:1em; }
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<filter name="modify_info" module="member" act="procMemberModifyInfo" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="user_name" required="true" minlength="2" maxlength="20"/>
|
||||
<node target="user_name" required="true" minlength="2" maxlength="80"/>
|
||||
<node target="nick_name" required="true" minlength="2" maxlength="20"/>
|
||||
<node target="email_address" required="true" minlength="1" maxlength="200" filter="email"/>
|
||||
</form>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<filter name="signup" module="member" act="procMemberInsert" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="user_id" required="true" minlength="2" maxlength="20" filter="userid" />
|
||||
<node target="user_id" required="true" minlength="2" maxlength="80" filter="userid" />
|
||||
<node target="password1" required="true" minlength="6" maxlength="20" />
|
||||
<node target="password2" required="true" minlength="6" maxlength="20" equalto="password1" />
|
||||
<node target="user_name" required="true" minlength="2" maxlength="20" />
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@
|
|||
.krZip .address2 { clear:both; margin-top:10px;}
|
||||
.extendDesc { clear:both; margin-top:0; font-size:.9em; color:#999999; }
|
||||
|
||||
.agreementBox { border:1px solid #AAAAAA; margin:.5em 0 0 0; padding:1em; border-bottom:none;}
|
||||
.agreementBox { border:1px solid #AAAAAA; margin:.5em 0 0 0; padding:1em; border-bottom:none; height:200px; overflow-y:scroll;}
|
||||
.agreementButton { background-color:#EEEEEE; padding:1em; border:1px solid #AAAAAA; border-top:none;}
|
||||
|
||||
/* popup common */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<filter name="modify_info" module="member" act="procMemberModifyInfo" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="user_name" required="true" minlength="2" maxlength="20"/>
|
||||
<node target="user_name" required="true" minlength="2" maxlength="80"/>
|
||||
<node target="nick_name" required="true" minlength="2" maxlength="20"/>
|
||||
<node target="email_address" required="true" minlength="1" maxlength="200" filter="email"/>
|
||||
</form>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<filter name="signup" module="member" act="procMemberInsert" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="user_id" required="true" minlength="2" maxlength="20" filter="userid" />
|
||||
<node target="user_id" required="true" minlength="2" maxlength="80" filter="userid" />
|
||||
<node target="password1" required="true" minlength="6" maxlength="20" />
|
||||
<node target="password2" required="true" minlength="6" maxlength="20" equalto="password1" />
|
||||
<node target="user_name" required="true" minlength="2" maxlength="20" />
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<filter name="insert" module="member" act="procMemberAdminInsert" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit" >
|
||||
<form>
|
||||
<node target="user_id" required="true" minlength="2" maxlength="20" />
|
||||
<node target="user_id" required="true" minlength="2" maxlength="80" />
|
||||
<node target="user_name" required="true" minlength="2" maxlength="20" />
|
||||
<node target="nick_name" required="true" minlength="2" maxlength="20" />
|
||||
<node target="email_address" required="true" minlength="1" maxlength="200" filter="email"/>
|
||||
|
|
@ -23,6 +23,7 @@
|
|||
<param name="description" target="description" />
|
||||
<param name="group_srl_list" target="group_srl_list" />
|
||||
<param name="signature" target="signature" />
|
||||
<param name="limit_date" target="limit_date" />
|
||||
</parameter>
|
||||
<response callback_func="completeInsert">
|
||||
<tag name="error" />
|
||||
|
|
|
|||
|
|
@ -36,5 +36,26 @@
|
|||
function moduleUpdate() {
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// 메뉴 모듈의 캐시 파일 모두 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/menu");
|
||||
|
||||
$oMenuAdminController = &getAdminController('menu');
|
||||
|
||||
// 블로그 모듈 목록을 모두 구함
|
||||
$output = executeQueryArray("menu.getMenus");
|
||||
$list = $output->data;
|
||||
if(!count($list)) return;
|
||||
|
||||
// 메뉴 모듈에서 사용되는 모든 메뉴 목록을 재 생성
|
||||
foreach($list as $menu_item) {
|
||||
$menu_srl = $menu_item->menu_srl;
|
||||
$oMenuAdminController->makeXmlFile($menu_srl);
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -33,5 +33,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -38,5 +38,12 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// 모듈 정보 캐시 파일 모두 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/module_info");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@
|
|||
$oModuleController->updateModuleGrant($module_info->module_srl, $grants);
|
||||
|
||||
// 캐시 파일 삭제
|
||||
$cache_file = sprintf("./files/cache/opage/%d.cache", $module_info->module_srl);
|
||||
$cache_file = sprintf("./files/cache/opage/%d.cache.php", $module_info->module_srl);
|
||||
if(file_exists($cache_file)) @unlink($cache_file);
|
||||
|
||||
// 등록 성공후 return될 메세지 정리
|
||||
|
|
|
|||
|
|
@ -66,5 +66,12 @@
|
|||
return new Object(0, 'success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// 외부 페이지 캐시 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/opage");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -91,15 +91,28 @@
|
|||
* @brief 내부 파일일 경우 include하도록 캐시파일을 만들고 처리
|
||||
**/
|
||||
function executeFile($path, $caching_interval, $cache_file) {
|
||||
// 파일이 없으면 취소
|
||||
if(!file_exists($path)) return;
|
||||
|
||||
// 경로와 파일이름을 구함
|
||||
$tmp_path = explode('/',$cache_file);
|
||||
$filename = $tmp_path[count($tmp_path)-1];
|
||||
$filepath = ereg_replace($filename."$","",$cache_file);
|
||||
|
||||
// 캐시 검사
|
||||
if($caching_interval <1 || !file_exists($cache_file) || filemtime($cache_file) + $caching_interval*60 <= time()) {
|
||||
if($caching_interval <1 || !file_exists($cache_file) || filemtime($cache_file) + $caching_interval*60 <= time() || filemtime($cache_file)<filemtime($path) ) {
|
||||
if(file_exists($cache_file)) @unlink($cache_file);
|
||||
|
||||
// 경로와 파일이름을 구함
|
||||
$tmp_path = explode('/',$path);
|
||||
$filename = $tmp_path[count($tmp_path)-1];
|
||||
$filepath = ereg_replace($filename."$","",$path);
|
||||
// 일단 대상 파일을 읽어서 내용을 구함
|
||||
ob_start();
|
||||
@include($path);
|
||||
$content = ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
FileHandler::writeFile($cache_file, $content);
|
||||
|
||||
// include후 결과를 return
|
||||
if(!file_exists($cache_file)) return;
|
||||
|
||||
// 컴파일 시도
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
|
|
@ -108,13 +121,14 @@
|
|||
FileHandler::writeFile($cache_file, $script);
|
||||
}
|
||||
|
||||
// include후 결과를 return
|
||||
if(file_exists($cache_file)) {
|
||||
ob_start();
|
||||
@include($cache_file);
|
||||
$content = ob_get_contents();
|
||||
ob_end_clean();
|
||||
}
|
||||
$__Context = &$GLOBALS['__Context__'];
|
||||
$__Context->tpl_path = $filepath;
|
||||
if($_SESSION['is_logged']) $__Context->logged_info = $_SESSION['logged_info'];
|
||||
|
||||
ob_start();
|
||||
@include($cache_file);
|
||||
$content = ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,5 +40,12 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// 페이지 캐시 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/page");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -61,10 +61,10 @@
|
|||
// 변수 정리
|
||||
$args = Context::getRequestVars();
|
||||
|
||||
$config->insert_document = $args->insert_document;
|
||||
$config->insert_comment = $args->insert_comment;
|
||||
$config->upload_file = $args->upload_file;
|
||||
$config->download_file = $args->download_file;
|
||||
$config->insert_document = (int)$args->insert_document;
|
||||
$config->insert_comment = (int)$args->insert_comment;
|
||||
$config->upload_file = (int)$args->upload_file;
|
||||
$config->download_file = (int)$args->download_file;
|
||||
|
||||
foreach($args as $key => $val) {
|
||||
preg_match("/^(insert_document|insert_comment|upload_file|download_file)_([0-9]+)$/", $key, $matches);
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
$name = $matches[1];
|
||||
$module_srl = $matches[2];
|
||||
if(strlen($val)==0) unset($config->module_point[$module_srl][$name]);
|
||||
else $config->module_point[$module_srl][$name] = $val;
|
||||
else $config->module_point[$module_srl][$name] = (int)$val;
|
||||
}
|
||||
|
||||
// 저장
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
$point = Context::get('point');
|
||||
|
||||
$oPointController = &getController('point');
|
||||
return $oPointController->setPoint($member_srl, $point);
|
||||
return $oPointController->setPoint($member_srl, (int)$point);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -71,6 +71,13 @@
|
|||
Context::set('member_list', $output->data);
|
||||
Context::set('page_navigation', $output->page_navigation);
|
||||
|
||||
// 멤버모델 객체 생성
|
||||
$oMemberModel = &getModel('member');
|
||||
|
||||
// group 목록 가져오기
|
||||
$this->group_list = $oMemberModel->getGroups();
|
||||
Context::set('group_list', $this->group_list);
|
||||
|
||||
// 템플릿 지정
|
||||
$this->setTemplateFile('member_list');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,5 +89,14 @@
|
|||
return new Object(0, 'success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// point action 파일 재정의
|
||||
$oPointAdminController = &getAdminController('point');
|
||||
$oPointAdminController->cacheActList();
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -57,21 +57,21 @@
|
|||
* @brief 포인트 순 회원목록 가져오기
|
||||
**/
|
||||
function getMemberList($args = null) {
|
||||
if(!$args) {
|
||||
$args->list_count = 20;
|
||||
$args->page = 1;
|
||||
}
|
||||
$output = executeQuery("point.getMemberList", $args);
|
||||
// member model 객체 생성후 목록을 구해옴
|
||||
$oMemberModel = &getAdminModel('member');
|
||||
$output = $oMemberModel->getMemberList();
|
||||
|
||||
if($output->total_count) {
|
||||
$oModuleModel = &getModel('module');
|
||||
$config = $oModuleModel->getModuleConfig('point');
|
||||
|
||||
foreach($output->data as $key => $val) {
|
||||
$point = $val->point;
|
||||
$level = $this->getLevel($val->point, $config->level_step);
|
||||
$output->data[$key]->level = $level;
|
||||
$point = $this->getPoint($val->member_srl);
|
||||
$output->data[$key]->point = $point;
|
||||
$output->data[$key]->level = $this->getLevel($point, $config->level_step);
|
||||
}
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,3 +46,35 @@
|
|||
<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>
|
||||
|
||||
<!-- 검색 -->
|
||||
<form action="./" method="get" class="adminSearch">
|
||||
<input type="hidden" name="module" value="{$module}" />
|
||||
<input type="hidden" name="act" value="{$act}" />
|
||||
|
||||
<fieldset>
|
||||
|
||||
<select name="is_admin">
|
||||
<option value="" <!--@if($is_admin!='Y')-->selected="selected"<!--@end-->>{$lang->total}</option>
|
||||
<option value="Y" <!--@if($is_admin=='Y')-->selected="selected"<!--@end-->>{$lang->is_admin}</option>
|
||||
</select>
|
||||
<select name="is_denied">
|
||||
<option value="" <!--@if($is_denied!='Y')-->selected="selected"<!--@end-->>{$lang->total}</option>
|
||||
<option value="Y" <!--@if($is_denied=='Y')-->selected="selected"<!--@end-->>{$lang->denied}</option>
|
||||
</select>
|
||||
<select name="selected_group_srl">
|
||||
<option value="0">{$lang->group}</option>
|
||||
<!--@foreach($group_list as $key => $val)-->
|
||||
<option value="{$val->group_srl}" <!--@if($selected_group_srl==$val->group_srl)-->selected="selected"<!--@end-->>{$val->title}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<select name="search_target">
|
||||
<option value="">{$lang->search_target}</option>
|
||||
<!--@foreach($lang->search_target_list as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($search_target==$key)-->selected="selected"<!--@end-->>{$val}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<input type="text" name="search_keyword" value="{htmlspecialchars($search_keyword)}" class="inputTypeText" />
|
||||
<span class="button"><input type="submit" value="{$lang->cmd_search}" /></span>
|
||||
<a href="#" onclick="location.href='{getUrl('','module',$module,'act',$act)}';return false;" class="button"><span>{$lang->cmd_cancel}</span></a>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
|
@ -39,5 +39,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -32,5 +32,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
<table name="spamfilter_denied_ip" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" filter="number" notnull="notnull" />
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
<table name="spamfilter_denied_word" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="word" var="word" filter="number" notnull="notnull" />
|
||||
<condition operation="equal" column="word" var="word" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" filter="number" notnull="notnull" />
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" notnull="notnull" />
|
||||
<condition operation="more" column="regdate" var="regdate" notnull="notnull" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
|
|||
|
|
@ -6,6 +6,6 @@
|
|||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" filter="number" notnull="notnull" />
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
|
|||
|
|
@ -34,5 +34,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -28,5 +28,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -33,5 +33,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -32,5 +32,10 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -37,5 +37,16 @@
|
|||
function moduleUpdate() {
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 캐시 파일 재생성
|
||||
**/
|
||||
function recompileCache() {
|
||||
// widget 정보를 담은 캐시 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/widget");
|
||||
|
||||
// widget 생성 캐시 파일 삭제
|
||||
FileHandler::removeFilesInDir("./files/cache/widget_cache");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
$regdate = Context::get('search_keyword');
|
||||
if($regdate) $obj->regdate = zdate($regdate, 'Ym');
|
||||
}
|
||||
if(!$obj->regdate) $obj->regdate = date('Ym');
|
||||
if(!$obj->regdate) $obj->regdate = zdate(date('YmdHis'), 'Ym');
|
||||
|
||||
// document 모듈의 model 객체를 받아서 getDailyArchivedList() method를 실행
|
||||
$oDocumentModel = &getModel('document');
|
||||
|
|
|
|||
|
|
@ -3,10 +3,7 @@
|
|||
<node target="user_id" required="true" filter="user_id"/>
|
||||
<node target="password" required="true" />
|
||||
</form>
|
||||
<parameter>
|
||||
<param name="user_id" target="user_id" />
|
||||
<param name="password" target="password" />
|
||||
</parameter>
|
||||
<parameter />
|
||||
<response callback_func="completeLogin">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
|
|
|
|||
|
|
@ -3,10 +3,7 @@
|
|||
<node target="user_id" required="true" filter="user_id"/>
|
||||
<node target="password" required="true" />
|
||||
</form>
|
||||
<parameter>
|
||||
<param name="user_id" target="user_id" />
|
||||
<param name="password" target="password" />
|
||||
</parameter>
|
||||
<parameter />
|
||||
<response callback_func="completeLogin">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
</div>
|
||||
<ul class="documentList">
|
||||
<!--@foreach($widget_info->document_list as $oDocument)-->
|
||||
<li><a href="{$oDocument->getPermanentUrl()}#{$oDocument->getCommentCount()}">{$oDocument->getTitleText($widget_info->subject_cut_size)}</a></li>
|
||||
<li><a href="{$oDocument->getPermanentUrl()}#{$oDocument->getCommentCount()}">{$oDocument->getTitleText($widget_info->subject_cut_size)}</a> {$oDocument->printExtraImages()}</li>
|
||||
<!--@end-->
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
</div>
|
||||
<ul>
|
||||
<!--@foreach($widget_info->document_list as $oDocument)-->
|
||||
<li><a href="{$oDocument->getPermanentUrl()}#{$oDocument->getCommentCount()}">{$oDocument->getTitleText($widget_info->subject_cut_size)}</a></li>
|
||||
<li><a href="{$oDocument->getPermanentUrl()}#{$oDocument->getCommentCount()}">{$oDocument->getTitleText($widget_info->subject_cut_size)}</a> {$oDocument->printExtraImages()}</li>
|
||||
<!--@end-->
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
<span class="writer">
|
||||
- {$oDocument->getNickName()}
|
||||
</span>
|
||||
|
||||
{$oDocument->printExtraImages()}
|
||||
</div>
|
||||
<div class="regdate">{$oDocument->getRegdate("Y-m-d")}</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@
|
|||
<!--@if($oDocument->getCommentCount())-->
|
||||
<span class="comment">[<a href="{$oDocument->getPermanentUrl()}#comment">{$oDocument->getCommentCount()}</a>]</span>
|
||||
<!--@end-->
|
||||
|
||||
{$oDocument->printExtraImages()}
|
||||
</span>
|
||||
<span class="date"><span>{$oDocument->getRegdate("Y-m-d")}</span></span>
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -23,13 +23,13 @@
|
|||
$widget_info->thumbnail_width = (int)$args->thumbnail_width;
|
||||
if(!$widget_info->thumbnail_width) $widget_info->thumbnail_width = 100;
|
||||
|
||||
// 가로 이미지 수
|
||||
$widget_info->rows_list_count = (int)$args->rows_list_count;
|
||||
if(!$widget_info->rows_list_count) $widget_info->rows_list_count = 5;
|
||||
|
||||
// 세로 이미지 수
|
||||
$widget_info->rows_list_count = (int)$args->rows_list_count;
|
||||
if(!$widget_info->rows_list_count) $widget_info->rows_list_count = 1;
|
||||
|
||||
// 가로 이미지 수
|
||||
$widget_info->cols_list_count = (int)$args->cols_list_count;
|
||||
if(!$widget_info->cols_list_count) $widget_info->cols_list_count = 1;
|
||||
if(!$widget_info->cols_list_count) $widget_info->cols_list_count = 5;
|
||||
|
||||
// 노출 여부 체크
|
||||
if($args->display_author!='Y') $widget_info->display_author = 'N';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue