beta.0.2.7을 trunk로 copy

git-svn-id: http://xe-core.googlecode.com/svn/trunk@3291 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-12-10 07:51:16 +00:00
commit d7d8c7d6c6
1016 changed files with 33445 additions and 2074 deletions

View file

@ -25,6 +25,9 @@ RewriteRule ^([[:digit:]]+)$ ./index.php?document_srl=$1 [L]
# document + act link
RewriteRule ^([[:digit:]]+)/([a-zA-Z0-9_]+)$ ./index.php?document_srl=$1&act=$2 [L]
# document + key + act link
RewriteRule ^([[:digit:]]+)/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$ ./index.php?document_srl=$1&act=$3&key=$2 [L]
# mid + document link
RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)$ ./index.php?mid=$1&document_srl=$2 [L]
@ -54,6 +57,3 @@ RewriteRule ^([a-zA-Z0-9_]+)/writer/(.*)$ ./index.php?mid=$1&search_target=nick_
# module link
RewriteRule ^([a-zA-Z0-9_]+)(/){0,1}$ ./index.php?mid=$1 [L]
# css/img/js/htc등의 경로 처리
RewriteRule ^(.+)/common/js/iePngFix.htc ./common/js/iePngFix.htc [L]

View file

@ -155,25 +155,41 @@
if(!$oDocument->isExists() || !$oDocument->isGranted()) {
printContent( getXmlRpcFailure(1, 'no permission') );
} else {
// 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅
$category = "";
if($oDocument->get('category_srl')) {
$oDocumentModel = &getModel('document');
$category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl'));
if($category_list[$oDocument->get('category_srl')]) {
$category = $category_list[$oDocument->get('category_srl')]->title;
}
}
$content = sprintf(
'<methodResponse>'.
'<params><param><value><struct>'.
'<member><name>categories</name><value><array><data><value>%s</value></data></array></value></member>'.
'<member><name>dateCreated</name><value><dateTime.iso8601>%s</dateTime.iso8601></value></member>'.
'<member><name>description</name><value>%s</value></value></member>'.
'<member><name>link</name><value>%s</value></member>'.
'<member><name>postid</name><value><string>%s</string></value></member>'.
'<member><name>title</name><value>%s</value></member>'.
'<member><name>publish</name><value><boolean>1</boolean></value></member>'.
'</struct></value></param></params></methodResponse>',
$oDocument->get('category_srl'),
'<params>'.
'<param>'.
'<value>'.
'<struct>'.
'<member><name>categories</name><value><array><data><value><![CDATA[%s]]></value></data></array></value></member>'.
'<member><name>dateCreated</name><value><dateTime.iso8601>%s</dateTime.iso8601></value></member>'.
'<member><name>description</name><value><![CDATA[%s]]></value></member>'.
'<member><name>link</name><value>%s</value></member>'.
'<member><name>postid</name><value><string>%s</string></value></member>'.
'<member><name>title</name><value><![CDATA[%s]]></value></member>'.
'<member><name>publish</name><value><boolean>1</boolean></value></member>'.
'</struct>'.
'</value>'.
'</param>'.
'</params>'.
'</methodResponse>',
$category,
date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()),
'sadfsadf',//$oDocument->getContent(false),
$oDocument->getContent(false),
$oDocument->getPermanentUrl(),
$oDocument->document_srl,
'asfasdfs'//$oDocument->getTitleText()
$oDocument->getTitleText()
);
debugPrint($content);
printContent($content);
}
}

View file

@ -1,16 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">BlogAPI 애드온</title>
<title xml:lang="jp">BlogAPIアドオン</title>
<title xml:lang="jp">BlogAPI </title>
<title xml:lang="zh-CN">BlogAPI</title>
<title xml:lang="en">Addon for BlogAPI</title>
<title xml:lang="es">Addon para BlogAPI</title>
<title xml:lang="ru">Аддон для BlogAPI</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
metaWeblog를 지원하는 blogApi애드온입니다.
사용으로 설정하시면 각 모듈마다 RSD 태그를 노출합니다.
@ -18,7 +20,10 @@
사용으로 하셔야 RSD태그 및 api가 동작을 합니다.
</description>
<description xml:lang="jp">
MetaWeblogをサポートするBlogAPI のアドオンです。「使用」をクリックして設定すると各モジュールごとRSDのアドレスを表示します。API のアドレスは「http://インストールURL/モジュール名/api」です。 「使用する」に設定しておけば RSDのアドレスが表示され、 API が動作します。
MetaWeblogをサポートするBlogAPI アドオンです。
「使用する」をクリックして設定すると各モジュールごとRSDのアドレスを表示します。
API のアドレスは「http://インストールURL/モジュール名/api」です。
「使用する」に設定しておけば RSDのアドレスが表示され、 API が動作します。
</description>
<description xml:lang="zh-CN">
支持metaWeblog的 blogApi插件。
@ -38,5 +43,11 @@
La dirección de api es http://dirección de la instalación/nombre de módulo/api.
Sólo si seleccionas la opción usar, funcionará la etiqueta RSD y api.
</description>
<description xml:lang="ru">
Этот blogApi аддон поддерживает metaWeblog.
Включая это опицией использовать, позволяет RSD тегу быть доступным для каждого модуля.
URL для api - http://setup_path/module_name/api.
Только выбор опции использовать включает поведение RSD тега и api.
</description>
</author>
</addon>

View file

@ -1,22 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">기본 카운터 애드온</title>
<title xml:lang="jp">接続カウンターアドオン</title>
<title xml:lang="jp">接続カウンター</title>
<title xml:lang="zh-CN">网站访问统计</title>
<title xml:lang="en">Addon for basic counter</title>
<title xml:lang="es">Addon contador básico</title>
<title xml:lang="ru">Аддон для базового счетчика</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
제로보드XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다.
이 애드온을 켜셔야 접속 정보 수집이 됩니다.
</description>
<description xml:lang="jp">
セロボードXEの接続カウンターモジュールは、接続情報を記録します。このアドオンを「使用」に設定しておくと接続情報が記録されます。
セロボードXEの接続カウンターモジュールは、接続情報を記録します。
このアドオンを「使用」に設定しておくと接続情報が記録されます。
</description>
<description xml:lang="zh-CN">
利用ZeroboardXE的网站访问统计模块记录网站访问信息。
@ -30,5 +33,9 @@
Este addon contador básico de Zeroboard XE permite llevar la información de acceso a la página web de los visitantes.
Es necesario activar este addon para agregar la información de acceso.
</description>
<description xml:lang="ru">
Этот аддон пишет в лог информацию о доступе к сайту, основанную на базовом модуле счетчика в Zeroboard XE.
Для сбора информации необходимо включить этот аддон.
</description>
</author>
</addon>

View file

@ -1,29 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">Google Analytics</title>
<title xml:lang="jp">Google Analytics アドオン</title>
<title xml:lang="jp">Google Analytics</title>
<title xml:lang="zh-CN">Google Analytics</title>
<title xml:lang="en">Google Analytics</title>
<title xml:lang="ru">Google Analytics</title>
<title xml:lang="jp">Google Analytics</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 9. 19">
<name xml:lang="ko">제로</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="zh-CN">Zero</name>
<name xml:lang="en">Zero</name>
<name xml:lang="ru">Zero</name>
<name xml:lang="jp">Zero</name>
<description xml:lang="ko">
Google Analytics 코드를 사이트에 추가할 수 있습니다.
</description>
<description xml:lang="jp">
Google Analytics コードをサイトに追加することができます。
</description>
<description xml:lang="zh-CN">
可以添加Google Analytics代码。
</description>
</author>
<description xml:lang="en">
Google Analytics
</description>
<description xml:lang="ru">
Google Analytics
</description>
<description xml:lang="jp">
Google Analyticsのコードをサイトに挿入できます。
</description>
</author>
<extra_vars>
<var name="uacct">
<title xml:lang="ko">uacct</title>
<title xml:lang="zh-CN">uacct</title>
<description xml:lang="ko">Google Analytics 코드의 _uacct 값을 입력해주세요.</description>
<description xml:lang="jp">Google Analytics コードの値を入力してください。</description>
<title xml:lang="en">uacct</title>
<title xml:lang="ru">uacct</title>
<title xml:lang="jp">uacct</title>
<description xml:lang="ko">Google Analytics 코드의 _uacct 값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入Google Analytics代码的_uacct值。</description>
</var>
<description xml:lang="en">Google Analytics _uacct</description>
<description xml:lang="ru">Google Analytics _uacct</description>
<description xml:lang="jp">Google Analyticsコードの「_uacct」の値を入力してください。</description>
</var>
</extra_vars>
</addon>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">LemonPen XE 애드온</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 12. 10">
<name xml:lang="ko">zero</name>
<description xml:lang="ko">활성화 하시면 레몬펜을 사이트에 달 수 있습니다.</description>
</author>
<extra_vars>
<var name="sid">
<title xml:lang="ko">sid</title>
<description xml:lang="ko">레몬펜에에서 사이트 등록시 발급받은 sid값을 입력해주세요.</description>
</var>
</extra_vars>
</addon>

View file

@ -0,0 +1,21 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file rainbow.addon.php
* @author zero (zero@nzeo.com)
* @brief Rainbow link addon
*
* 링크가 걸린 텍스트에 마우스 오버를 하면 무지개색으로 변하게 하는 애드온입니다.
* rainbow.js 파일만 추가하는 것으로 끝납니다.
* rainbow.js는 http://www.dynamicdrive.com에서 제작하였으며 저작권을 가지고 있습니다.
* before_display_content 에서만 요청이 됩니다.
**/
if(Context::get('module')=='admin' || $called_position != 'before_module_init') return;
$sid = $addon_info->sid;
// Context::addJsFile()을 이용하면 끝
if($sid) Context::addHtmlFooter(sprintf('<script src="http://script.lemonpen.com/site/lemonpen.js?sid=%s" type="text/javascript" charset="UTF-8"></script>', $sid));
?>

View file

@ -1,16 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">사용자 추가 정보 및 커뮤니케이션 기능 활성화</title>
<title xml:lang="jp">会員情報・コミュニティ活性化機能</title>
<title xml:lang="jp">会員情報・コミュニティ</title>
<title xml:lang="zh-CN">用户扩展信息</title>
<title xml:lang="en">Addon for enabling facilities for providing additional information about users and communicating</title>
<title xml:lang="es">Addon para activar la función de la Información addcional del usuario y de la comunicación.</title>
<title xml:lang="ru">Аддон для предоставления дополнительной информации о пользователях и коммуникации</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
사용자의 정보중 이미지이름, 이미지마크, 서명등을 화면에 출력해주는 애드온입니다.
이런 정보들을 사용하지 않을 경우를 대비하여 별도의 애드온으로 빼어서 실행시간을 줄여줍니다.
@ -22,13 +24,14 @@
5. MemberModel::getMemberMenu 호출시 친구 등록 메뉴를 추가합니다.
</description>
<description xml:lang="jp">
会員情報のイメージ名、イメージマーク、署名などを画面に表示するアドオンです。このような情報を使用しない場合、アドオンを「未使用」に設定すれば、実行時間を少なくします。イメージ名、イメージマーク、署名などを表示させたい時は、このアドオンを「使用」に設定して下さい。
1. 出力の直前 &lt;div class="member_会員番号"&gt;....&lt;/div&gt; に定義された部分を探し、会員番号をチェックしてイメージ名、イメージマークがあるかを確認します。あった場合は内容を変更します
2. 出力の直前 &lt;div class="document_番号"&gt;...&lt;/div&gt;に定義された部分を探し、書込みの内容だと判断して、下段に署名を追加します
3. 新しいメッセージが届いた時、ポップアップで表示します
4. MemberModel::getMemberMenu を呼出す時、相手が会員の場合はメッセージ送信の機能を追加します
5. MemberModel::getMemberMenu を呼出す時、友達登録メニュを追加します
会員情報のイメージ名、イメージマーク、署名などを画面に表示するアドオンです。
このような情報を使用しない場合、アドオンを「使用」に設定すれば、実行時間を少なくします。
イメージ名、イメージマーク、署名などを表示させたい時は、このアドオンを「使用」に設定して下さい。
1. 出力の直前 &lt;div class="member_会員番号"&gt;....&lt;/div&gt; に定義された部分を探し、会員番号をチェックしてイメージ名、イメージマークがあるかを確認します。あった場合は内容を変更します。
2. 出力の直前 &lt;div class="document_番号"&gt;...&lt;/div&gt;に定義された部分を探し、書込みの内容だと判断して、下段に署名を追加します。
3. 新しいメッセージが来た場合ポップアップで表示します。
4. MemberModel::getMemberMenu を呼出す時、相手が会員の場合はメッセージ送信の機能を追加します。
5. MemberModel::getMemberMenu を呼出す時、友達登録メニュを追加します。
</description>
<description xml:lang="zh-CN">
此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。
@ -60,5 +63,15 @@
4. Se activa la función "Enviar Mensajes" si la persona que envió la nota es usuario al comprobar en MemberModel::getMemberMenu.
5. Agrega el menú "Ägregar Amigo" al llamar MemberModel::getMemberMenu.
</description>
<description xml:lang="ru">
Среди другой информации о пользователях, этот аддон показывает имя изображения, марку изображения и подпись.
В случае, если Вы не используете эту информацию, это стоит в стороне от базовой информации, так что время выполнения будет снижено.
Чтобы отображать имя изображения, марку изображения и подпись, пожалуйста, включите этот аддон.
1. Прямо перед отображением информации пользователя, это создаст уникальный ключ члена из определения "&amp;lt;div class="член_{уникальный ключ члена}"&amp;gt;....&amp;lt;/div&amp;gt;" и заменит имя изображения и/или марку изображения, если они существуют.
2. Прямо перед отображением, это должно найти определение "&amp;lt;div class="документ_{уникальный ключ документа}"&amp;gt;...&amp;lt;/div&amp;gt;" и вставить подпись внизу.
3. Когда будет получено новое сообщение, оно всплывет.
4. Это позволяет отправить сообщение, если назначение является членом, когда MemberModel::getMemberMenu вызывается.
5. Это добавляет меню для регистрации как друга, когда MemberModel::getMemberMenu вызывается.
</description>
</author>
</addon>

View file

@ -0,0 +1,9 @@
<?php
/**
* @file ru.lang.php
* @author zero <zero@nzeo.com> | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467;
* @brief Russian basic language pack for Zeroboard XE
**/
$lang->alert_new_message_arrived = 'У Вас есть новые сообщения. Хотите проверить сейчас?';
?>

View file

@ -4,13 +4,15 @@
<title xml:lang="zh-CN">OpenID</title>
<title xml:lang="en">Addon for delegating domain name to OpenID</title>
<title xml:lang="es">Delegación ID para OpenID</title>
<title xml:lang="jp">OpenIDアドオン</title>
<title xml:lang="jp">OpenID</title>
<title xml:lang="ru">Аддон для делигирования доменного имени к OpenID</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="ru">Zero</name>
<description xml:lang="ko">
본인의 도메인을 사용하여 오픈아이디로 활용할 수 있도록 합니다.
꼭 설정을 통해서 openid provider관련 값을 입력후 사용해주세요.
@ -28,7 +30,12 @@
Debe utilizar luego de ingresar los valores relacionado con openid provider a través de la configuracion.
</description>
<description xml:lang="jp">
保有するドメインをオープンとして活用することができます。必ず設定で、OpenIDのプロバイダー関連の情報を入力してから使用してください。
保有するドメインをオープンIDとして活用することができます。
必ず設定で、OpenIDのプロバイダー関連情報を入力してから使用してください。
</description>
<description xml:lang="ru">
Этот аддон позволяет Вам использовать Вашу доменное имя как OpenID.
Прежде, чем использовать, просто убедитесь, что установлены значения, имеющие отношение к провайдеру openid.
</description>
</author>
<extra_vars>
@ -38,11 +45,13 @@
<title xml:lang="en">server</title>
<title xml:lang="es">Servidor</title>
<title xml:lang="jp">server</title>
<title xml:lang="ru">server</title>
<description xml:lang="ko">openid.server 값을 입력해 주세요.</description>
<description xml:lang="zh-CN">请输入 openid.server 值。</description>
<description xml:lang="en">Please input your openid.server value.</description>
<description xml:lang="es">Ingrese el valor del openid.server.</description>
<description xml:lang="jp">openid.server の値を入力してください。</description>
<description xml:lang="ru">Пожалуйста, введите Ваше значение openid сервера.</description>
</var>
<var name="delegate">
<title xml:lang="ko">delegate</title>
@ -50,11 +59,13 @@
<title xml:lang="zh-CN">delegate</title>
<title xml:lang="es">delegado</title>
<title xml:lang="jp">delegate</title>
<title xml:lang="ru">delegate</title>
<description xml:lang="ko">openid.delegate값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入 openid.delegate 值。</description>
<description xml:lang="en">Please input your openid.delegate value.</description>
<description xml:lang="en">Ingresar el valor del openid.delegate</description>
<description xml:lang="es">Ingresar el valor del openid.delegate</description>
<description xml:lang="jp">openid.delegate の値を入力してください。</description>
<description xml:lang="ru">Пожалуйста, введите Ваше значение openid делегата.</description>
</var>
<var name="xrds">
<title xml:lang="ko">xrds</title>
@ -62,11 +73,13 @@
<title xml:lang="en">xrds</title>
<title xml:lang="es">xrds</title>
<title xml:lang="jp">xrds</title>
<title xml:lang="ru">xrds</title>
<description xml:lang="ko">X-XRDS-Location값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入 X-XRDS-Location 值。</description>
<description xml:lang="en">Please input your X-XRDS-Location value.</description>
<description xml:lang="es">Ingresar el valor de X-XRDS-Location</description>
<description xml:lang="jp">X-XRDS-Location の値を入力してください。</description>
<description xml:lang="ru">Пожалуйста, введите Ваше значение X-XRDS-Локации.</description>
</var>
</extra_vars>
</addon>

View file

@ -2,15 +2,17 @@
<addon version="0.1">
<title xml:lang="ko">포인트 활성화 애드온</title>
<title xml:lang="zh-CN">积分插件</title>
<title xml:lang="jp">ポイントシステムアドオン</title>
<title xml:lang="jp">ポイントシステム</title>
<title xml:lang="en">Addon for activating point</title>
<title xml:lang="es">Addon para activar los puntos</title>
<title xml:lang="ru">Аддон для активации поинтов</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 7. 26">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">Zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
포인트시스템 모듈에 설정된 내용을 바탕으로 글작성/삭제/댓글작성/삭제/파일업로드/삭제/다운로드등의 행동에 대해서 포인트를 기록합니다.
</description>
@ -18,7 +20,7 @@
以积分系统模块中设置的内容为基础,对发表/删除新帖,发表/删除评论,上传/下载/删除/文件等动作记录为积分。
</description>
<description xml:lang="jp">
ポイントシステムモジュールで設定された内容を基に、書き込み作成・削除/コメント作成・削除/ファイルアップロード・削除/ダウンロードなどのユーザの活動に対してポイントに換算して記録します。
ポイントシステムモジュールで設定された内容を基に、書き込み作成・削除/コメント作成・削除/ファイルアップロード・削除/ダウンロードなどのユーザの活動に対してポイント記録します。
</description>
<description xml:lang="en">
This addon records point on writing/deleting/adding comments/deleting comments/uploading/downloading following to point system module.
@ -26,5 +28,8 @@
<description xml:lang="es">
Este addon registra los puntos de acuerdo a la acción de escribir/borrar/agregar comentarios/borrar comentarios/subir_archivo/bajar_archivo,etc., siguiendo el módulo de sistema de puntos.
</description>
<description xml:lang="ru">
Этот аддон записыват поинты при написании/удалении/добавлении комментариев/удалении комментариев/закачки/скачки согласно модулю системы поинтов.
</description>
</author>
</addon>

View file

@ -2,15 +2,17 @@
<addon version="0.1">
<title xml:lang="ko">포인트 레벨 아이콘 표시 애드온</title>
<title xml:lang="zh-CN">积分级别图标</title>
<title xml:lang="jp">ポイントレベルアイコン表示アドオン</title>
<title xml:lang="jp">ポイントレベルアイコン</title>
<title xml:lang="en">Addon for displaying level icon</title>
<title xml:lang="es">Addon para mostar el nivel del ícono</title>
<title xml:lang="es">Addon para mostar el nivel del ícono</title>
<title xml:lang="ru">Аддон для отображения иконки уровня</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 7. 26">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">Zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다.
레벨 아이콘은 모듈 &gt; 포인트시스템에서 선택 가능합니다.
@ -20,7 +22,8 @@
级别图标可以在模块 &gt; 积分系统中进行选择。
</description>
<description xml:lang="jp">
ポイントシステムを使用している場合、ユーザ名の前にレベルアイコンを表示させます。レベルアイコンは、「モジュール&gt;ポイントシステム」で選択できます。
ポイントシステムを使用している場合、ユーザ名の前にレベルアイコンを表示させます。
レベルアイコンは、「モジュール&gt;ポイントシステム」で選択できます。
</description>
<description xml:lang="en">
This addon displays level icon in front of user name when point system is using.
@ -30,5 +33,9 @@
Este addon muestra el nivel del ícono delante del nombre del usuario cuando es usado el sistema de puntos.
Tu puedes elegir los icono de cada nivel en el módulo &gt; Sistema de Puntos.
</description>
<description xml:lang="ru">
Этот аддон отображает иконку уровня напротив имени пользователя, когда используется система поинтов.
Вы можете выбрать иконку уровня на Модуле Системы Поинтов.
</description>
</author>
</addon>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">레인보우 링크 애드온</title>
<title xml:lang="zh-CN">Rainbow 链接</title>
<title xml:lang="en">Addon for rainbow links</title>
<title xml:lang="es">Adición Enlace Arco Iris</title>
<title xml:lang="jp">レインボーリンク</title>
<author email_address="webmaster@dynamicdrive.com" link="http://dynamicdrive.com" date="2007. 2. 28">
<name xml:lang="ko">dynamicdrive.com</name>
<name xml:lang="zh-CN">dynamicdrive.com</name>
<name xml:lang="en">dynamicdrive.com</name>
<name xml:lang="es">dynamicdrive.com</name>
<name xml:lang="jp">dynamicdrive.com</name>
<description xml:lang="ko">
rainbow.js를 header에 추가하여 링크가 걸린 글의 색을 무지개색으로 나타냅니다.
이 애드온의 rainbow.js는 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;에 저작권이 있습니다.
</description>
<description xml:lang="zh-CN">
把rainbow.js添加到header区使链接显示为彩虹色。
此插件的rainbow.js文件版权属于 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;
</description>
<description xml:lang="en">
This addon adds a file named &quot;rainbow.js&quot; to headers, then linked text will get chameleon(rainbow) color change effect.
&quot;rainbow.js&quot; Copyrightⓒ2007 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;.
</description>
<description xml:lang="es">
incluye rainbow.js en header para mostrar enlaces en colores de arco iris.
&lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt; tiene derecho de autor sobre rainbow.js
</description>
<description xml:lang="jp">
「rainbow.js」をヘッダーに追加し、リンクされている文字列の色を虹色で表示します。この機能拡張の「 rainbow.js」は「&lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;」に著作権があります。
</description>
</author>
</addon>

View file

@ -0,0 +1,245 @@
/************************************************************************/
/* Rainbow Links Version 1.03 (2003.9.20) */
/* Script updated by Dynamicdrive.com for IE6 */
/* Copyright (C) 1999-2001 TAKANASHI Mizuki */
/* takanasi@hamal.freemail.ne.jp */
/*----------------------------------------------------------------------*/
/* Read it somehow even if my English text is a little wrong! ;-) */
/* */
/* Usage: */
/* Insert '<script src="rainbow.js"></script>' into the BODY section, */
/* right after the BODY tag itself, before anything else. */
/* You don't need to add "onMouseover" and "onMouseout" attributes!! */
/* */
/* If you'd like to add effect to other texts(not link texts), then */
/* add 'onmouseover="doRainbow(this);"' and */
/* 'onmouseout="stopRainbow();"' to the target tags. */
/* */
/* This Script works with IE4,Netscape6,Mozilla browser and above only, */
/* but no error occurs on other browsers. */
/************************************************************************/
////////////////////////////////////////////////////////////////////
// Setting
var rate = 20; // Increase amount(The degree of the transmutation)
////////////////////////////////////////////////////////////////////
// Main routine
/*
if (document.getElementById)
window.onerror=new Function("return true")
*/
var objActive; // The object which event occured in
var act = 0; // Flag during the action
var elmH = 0; // Hue
var elmS = 128; // Saturation
var elmV = 255; // Value
var clrOrg; // A color before the change
var TimerID; // Timer ID
if(xIE4Up) {
xAddEventListener(document, 'mouseover', doRainbowAnchor);
xAddEventListener(document, 'mouseout', stopRainbowAnchor);
} else {
xAddEventListener(document, 'mouseover', Mozilla_doRainbowAnchor);
xAddEventListener(document, 'mouseout', Mozilla_stopRainbowAnchor);
}
/*
if (document.all) {
document.onmouseover = doRainbowAnchor;
document.onmouseout = stopRainbowAnchor;
}
else if (document.getElementById) {
document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
document.onmouseover = Mozilla_doRainbowAnchor;
document.onmouseout = Mozilla_stopRainbowAnchor;
}
*/
//=============================================================================
// doRainbow
// This function begins to change a color.
//=============================================================================
function doRainbow(obj)
{
if (act == 0) {
act = 1;
if (obj)
objActive = obj;
else
objActive = event.srcElement;
clrOrg = objActive.style.color;
TimerID = setInterval("ChangeColor()",100);
}
}
//=============================================================================
// stopRainbow
// This function stops to change a color.
//=============================================================================
function stopRainbow()
{
if (act) {
objActive.style.color = clrOrg;
clearInterval(TimerID);
act = 0;
}
}
//=============================================================================
// doRainbowAnchor
// This function begins to change a color. (of a anchor, automatically)
//=============================================================================
function doRainbowAnchor()
{
try {
if (act == 0) {
var obj = event.srcElement;
while (obj.tagName != 'A' && obj.tagName != 'BODY') {
obj = obj.parentElement;
if (obj.tagName == 'A' || obj.tagName == 'BODY')
break;
}
if (obj.tagName == 'A' && obj.href != '') {
objActive = obj;
act = 1;
clrOrg = objActive.style.color;
TimerID = setInterval("ChangeColor()",100);
}
}
} catch(e) {
}
}
//=============================================================================
// stopRainbowAnchor
// This function stops to change a color. (of a anchor, automatically)
//=============================================================================
function stopRainbowAnchor()
{
if (act) {
if (objActive.tagName == 'A') {
objActive.style.color = clrOrg;
clearInterval(TimerID);
act = 0;
}
}
}
//=============================================================================
// Mozilla_doRainbowAnchor(for Netscape6 and Mozilla browser)
// This function begins to change a color. (of a anchor, automatically)
//=============================================================================
function Mozilla_doRainbowAnchor(evt)
{
var e = new xEvent(evt);
if (act == 0) {
obj = e.target;
while (obj.nodeName != 'A' && obj.nodeName != 'BODY') {
obj = obj.parentNode;
if(typeof(obj)=='undefined'||!obj) return;
if (obj.nodeName == 'A' || obj.nodeName == 'BODY') break;
}
if (obj.nodeName == 'A' && obj.href != '') {
objActive = obj;
act = 1;
clrOrg = obj.style.color;
TimerID = setInterval("ChangeColor()",100);
}
}
}
//=============================================================================
// Mozilla_stopRainbowAnchor(for Netscape6 and Mozilla browser)
// This function stops to change a color. (of a anchor, automatically)
//=============================================================================
function Mozilla_stopRainbowAnchor(e)
{
if (act) {
if (objActive.nodeName == 'A') {
objActive.style.color = clrOrg;
clearInterval(TimerID);
act = 0;
}
}
}
//=============================================================================
// Change Color
// This function changes a color actually.
//=============================================================================
function ChangeColor()
{
objActive.style.color = makeColor();
}
//=============================================================================
// makeColor
// This function makes rainbow colors.
//=============================================================================
function makeColor()
{
// Don't you think Color Gamut to look like Rainbow?
// HSVtoRGB
if (elmS == 0) {
elmR = elmV; elmG = elmV; elmB = elmV;
}
else {
t1 = elmV;
t2 = (255 - elmS) * elmV / 255;
t3 = elmH % 60;
t3 = (t1 - t2) * t3 / 60;
if (elmH < 60) {
elmR = t1; elmB = t2; elmG = t2 + t3;
}
else if (elmH < 120) {
elmG = t1; elmB = t2; elmR = t1 - t3;
}
else if (elmH < 180) {
elmG = t1; elmR = t2; elmB = t2 + t3;
}
else if (elmH < 240) {
elmB = t1; elmR = t2; elmG = t1 - t3;
}
else if (elmH < 300) {
elmB = t1; elmG = t2; elmR = t2 + t3;
}
else if (elmH < 360) {
elmR = t1; elmG = t2; elmB = t1 - t3;
}
else {
elmR = 0; elmG = 0; elmB = 0;
}
}
elmR = Math.floor(elmR).toString(16);
elmG = Math.floor(elmG).toString(16);
elmB = Math.floor(elmB).toString(16);
if (elmR.length == 1) elmR = "0" + elmR;
if (elmG.length == 1) elmG = "0" + elmG;
if (elmB.length == 1) elmB = "0" + elmB;
elmH = elmH + rate;
if (elmH >= 360)
elmH = 0;
return '#' + elmR + elmG + elmB;
}

View file

@ -0,0 +1,19 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file rainbow.addon.php
* @author zero (zero@nzeo.com)
* @brief Rainbow link addon
*
* 링크가 걸린 텍스트에 마우스 오버를 하면 무지개색으로 변하게 하는 애드온입니다.
* rainbow.js 파일만 추가하는 것으로 끝납니다.
* rainbow.js는 http://www.dynamicdrive.com에서 제작하였으며 저작권을 가지고 있습니다.
* before_display_content 에서만 요청이 됩니다.
**/
if(Context::get('module')=='admin' || $called_position != 'before_module_init') return;
// Context::addJsFile()을 이용하면 끝
Context::addJsFile($addon_path.'js/rainbow.js');
?>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">리퍼러 수집기</title>
<title xml:lang="jp">リファラー コレクター</title>
<title xml:lang="zh-CN">反向链接统计</title>
<title xml:lang="en">Referer Collector</title>
<title xml:lang="ru">Сборщик рефералов</title>
<author email_address="haneul0318@gmail.com" link="http://haneul.zetyx.net" date="2007. 11. 26">
<name xml:lang="ko">haneul</name>
<name xml:lang="jp">Haneul</name>
<name xml:lang="zn-CN">haneul</name>
<name xml:lang="en">haneul</name>
<name xml:lang="ru">haneul</name>
<description xml:lang="ko">
Referer log를 수집합니다.
</description>
<description xml:lang="jp">
リファラーログを収集します。
</description>
<description xml:lang="zh-CN">
记录反向链接统计数据。
</description>
<description xml:lang="en">
Collect referer log and statistics.
</description>
<description xml:lang="ru">
Собирает лог рефералов и статистику.
</description>
</author>
</addon>

View file

@ -0,0 +1,15 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file referer.addon.php
* @author haneul (haneul0318@gmail.com)
**/
// called_position가 before_module_init 이고 module이 admin이 아닐 경우
if($called_position == 'before_module_init' && !$GLOBALS['__referer_addon_called__']) {
$oController = &getController('referer');
$oController->procRefererExecute();
$GLOBALS['__referer_addon_called__'] = true;
}
?>

View file

@ -4,13 +4,15 @@
<title xml:lang="zh-CN">垃圾过滤</title>
<title xml:lang="en">Addon for filtering spam</title>
<title xml:lang="es">Addon para filtrar los Spam</title>
<title xml:lang="jp">スパムフィルターアドオン</title>
<title xml:lang="jp">スパムフィルター</title>
<title xml:lang="ru">Аддон для фильтрации спама</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="en">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
SpamFilter 모듈을 이용하여 글/코멘트/트랙백 등록 이전에 스팸 필터링 및 도배 방지를 합니다.
자세한 설정은 &quot; 스팸필터 모듈&quot; 에서 해주세요.
@ -28,7 +30,13 @@
Para la configuración más detallada, debe hacerse en el &quot; Módulo de Filtro de Spam&quot;.
</description>
<description xml:lang="jp">
SpamFilterモジュールを利用して書き込み・コメント・トラックバックが登録される前にフィルタリングを行います。更に連続書き込みやロボットによる自動書き込みなどを防ぐことができます。詳細な設定は &quot; スパムフィルターモジュール &quot; で行ってください。
SpamFilterモジュールを利用して書き込み・コメント・トラックバックが登録される前にフィルタリングを行います。
更に連続書き込みやロボットによる自動書き込みなどを防ぐことができます。
詳細な設定は &quot; スパムフィルターモジュール &quot; で行ってください。
</description>
<description xml:lang="ru">
Этот аддон фильтрует спам и предотвращает беспорядок перед сохранением элементов, комментариев или трекбеков в базу данных посредством установки модуля Фильтра Спама.
Вы можете установить детали на странице &quot;Модуля Спам Фильтра&quot;.
</description>
</author>
</addon>

View file

@ -1,133 +1,6 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file spamfilter.addon.php
* @author zero (zero@nzeo.com)
* @brief 스팸필터링 애드온
*
* 스팸필터 애드온은 SpamFilter 모듈을 이용합니다.
* /코멘트/트랙백 등록 이전에만 실행이 됩니다.
* 2007. 12. 7 스팸필터 모듈에서 trigger 기능으로 /댓글/엮인글 처리하도록 하여 이상 사용하지 않도록 변경
**/
// called_position가 before_module_proc 일때만 실행
if($called_position != 'before_module_proc') return;
// 이 애드온이 동작할 대상 (이 부분은 특별히 정해진 규약이 없다)
$effecived_target_act = array(
'procBoardInsertDocument', 'procBoardInsertComment',
'procBlogInsertComment',
'trackback',
);
// spam filter모듈이 적용될 module+act를 체크
if(!in_array($this->act, $effecived_target_act)) return;
// 각 모듈별 act에 대해서도 피해갈 부분이 있으면 피해감
switch($this->act) {
// 게시물 작성시 신규 등록이 아니면 패스~
case 'procBoardInsertDocument' :
// document module의 model 객체 생성
$oDocumentModel = &getModel('document');
// 이미 존재하는 글인지 체크
$document_srl = Context::get('document_srl');
$oDocument = $oDocumentModel->getDocument($document_srl);
// 이미 존재하는 글이라면 return
if($oDocument->isExists()) return;
break;
// 댓글 작성시 신규 등록이 아니면 패스~
case 'procBoardInsertComment' :
case 'procBlogInsertComment' :
$comment_srl = Context::get('comment_srl');
$oCommentModel = &getModel('comment');
// 이미 존재하는 댓글인지 체크
$comment = $oCommentModel->getComment($comment_srl);
if($comment->comment_srl == $comment_srl) return;
break;
}
// 현재 모듈의 관리자이거나 그에 준하는 manager권한이면 그냥 패스
if($this->grant->is_admin || $this->grant->manager) return;
// 현 접속자의 ip address를 구함
$ipaddress = $_SERVER['REMOTE_ADDR'];
// spamfilter 모듈 객체 생성
$oSpamFilterController = &getController('spamfilter');
$oSpamFilterModel = &getModel('spamfilter');
// 스팸필터 기본 설정 출력
$config = $oSpamFilterModel->getConfig();
// 스팸 간격을 체크하는 변수
$interval = $config->interval?$config->interval:60;
// 스팸 간격내에 limit_count이상 작성을 시도하면 해당 ip를 금지 시킴
$limit_count = $config->limit_count?$config->limit_count:5;
// 트랙백의 경우 한 글에 하나의 ip에서만 트랙백을 허용함
$check_trackback = $config->check_trackback=='Y'?true:false;
// 스팸 IP에 등록되어 있는지 체크하여 등록되어 있으면 return
$is_denied = $oSpamFilterModel->isDeniedIP($ipaddress);
if($is_denied) {
$output = new Object(-1, 'msg_alert_registered_denied_ip');
$this->stop_proc = true;
return;
}
// act==procReceiveTrackback (트랙백)일때 check_trackback==true이면 검사
if($this->act=='trackback' && $check_trackback){
$oTrackbackModel = &getModel('trackback');
$document_srl = Context::get('document_srl');
$count = $oTrackbackModel->getTrackbackCountByIPAddress($document_srl, $ipaddress);
if($count>0) {
$output = Object(-1, 'msg_alert_trackback_denied');
$this->stop_proc = true;
return;
}
}
// 정해진 시간내에 글 작성 시도를 하였는지 체크
$count = $oSpamFilterModel->getLogCount($interval, $ipaddress);
// 정해진 시간내에 정해진 글의 수를 초과시 스팸 IP로 등록시킴
if($count>=$limit_count) {
$oSpamFilterController->insertIP($ipaddress);
$output = new Object(-1, 'msg_alert_registered_denied_ip');
$this->stop_proc = true;
return;
// 제한 글수까지는 아니지만 정해진 시간내에 글 작성을 계속 할때
} elseif($count) {
$message = sprintf(Context::getLang('msg_alert_limited_by_config'), $interval);
$output = new Object(-1, $message);
$this->stop_proc = true;
}
// 금지 단어 체크를 위해서 몇가지 지정된 변수들을 한데 묶음
$check_vars = implode("\n",get_object_vars(Context::getRequestVars()));
// 금지 단어를 이용하여 본문 내용을 체크
$denied_word_list = $oSpamFilterModel->getDeniedWordList();
$denied_word_count = count($denied_word_list);
if($denied_word_count>0) {
for($i=0;$i<$denied_word_count;$i++) {
$word = preg_quote($denied_word_list[$i]->word,'/');
if(preg_match('/'.$word.'/i', $check_vars)) {
$message = sprintf(Context::getLang('msg_alert_denied_word'), $word);
$output = new Object(-1, $message);
$this->stop_proc = true;
return;
}
}
}
// 로그를 남김
$oSpamFilterController->insertLog();
return;
?>

View file

@ -566,7 +566,9 @@
} elseif($var_count == 3) {
asort($var_keys);
$target = implode('.',$var_keys);
if($target=='category.mid.page') {
if($target=='act.document_srl.key') {
return sprintf('%s%s/%s/%s',$this->path,$get_vars['document_srl'],$get_vars['key'],$get_vars['act']);
} elseif($target=='category.mid.page') {
return sprintf('%s%s/category/%s/page/%s',$this->path,$get_vars['mid'],$get_vars['category'],$get_vars['page']);
} elseif($target=='mid.search_keyword.search_target' && $get_vars['search_target']=='tag') {
return sprintf('%s%s/tag/%s',$this->path,$get_vars['mid'],str_replace(' ','-',$get_vars['search_keyword']));
@ -907,6 +909,7 @@
$oXmlParser = new XmlParser();
$xml_doc = $oXmlParser->parse($buff);
if($xml_doc->div) $xml_doc = $xml_doc->div;
else if($xml_doc->img) $xml_doc = $xml_doc->img;
$xml_doc->body = $matches[3];

View file

@ -246,6 +246,7 @@
if( (is_a($output, 'Object')||is_subclass_of($output,'Object'))&&!$output->toBool()) return $output;
// action값에 따라서 쿼리 생성으로 돌입
switch($output->action) {
case 'insert' :
@ -395,5 +396,24 @@
break;
}
}
/**
* @brief condition key를 return
**/
function getConditionList($output) {
$conditions = array();
if(count($output->conditions)) {
foreach($output->conditions as $key => $val) {
if($val['condition']) {
foreach($val['condition'] as $k => $v) {
$conditions[] = $v['column'];
}
}
}
}
return $conditions;
}
}
?>

View file

@ -556,17 +556,45 @@
$condition = $this->getCondition($output);
if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
$query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if($output->order) {
foreach($output->order as $key => $val) {
// list_count를 사용할 경우 적용
if($output->list_count['value']) {
$start_count = 0;
$list_count = $output->list_count['value'];
if ($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
$query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count, $list_count);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
else {
if (count($output->groups))
$query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count, $list_count);
else {
if ($condition)
$query = sprintf('%s and inst_num() between %d and %d', $query, $start_count, $list_count);
else
$query = sprintf('%s where inst_num() between %d and %d', $query, $start_count, $list_count);
}
}
} else {
if($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
}
$result = $this->_query($query);

View file

@ -499,15 +499,18 @@
$condition = $this->getCondition($output);
if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
@ -522,6 +525,9 @@
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
// list_count를 사용할 경우 적용
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
$result = $this->_query($query);
if($this->isError()) return;
$data = $this->_fetch($result);
@ -562,11 +568,14 @@
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}

View file

@ -508,15 +508,18 @@
$condition = $this->getCondition($output);
if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
@ -531,6 +534,9 @@
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
// list_count를 사용할 경우 적용
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
$result = $this->_query($query);
if($this->isError()) return;
$data = $this->_fetch($result);
@ -571,11 +577,14 @@
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
@ -590,7 +599,7 @@
}
$query = sprintf('%s limit %d, %d', $query, $start_count, $list_count);
$result = $this->_query($query);
if($this->isError()) {
$buff = new Object();

View file

@ -0,0 +1,623 @@
<?php
/**
* @class DBPostgreSQL
* @author ioseph (ioseph@postgresql.kr)
* @brief MySQL DBMS를 이용하기 위한 class
* @version 0.1
*
* postgresql handling class
**/
class DBPostgresql extends DB {
/**
* @brief PostgreSQL DB에 접속하기 위한 정보
**/
var $hostname = '127.0.0.1'; ///< hostname
var $userid = NULL; ///< user id
var $password = NULL; ///< password
var $database = NULL; ///< database
var $prefix = 'xe'; ///< 제로보드에서 사용할 테이블들의 prefix (한 DB에서 여러개의 제로보드 설치 가능)
/**
* @brief postgresql에서 사용될 column type
*
* column_type은 schema/query xml에서 공통 선언된 type을 이용하기 때문에
* DBMS에 맞게 replace 해주어야 한다
**/
var $column_type = array(
'bignumber' => 'bigint',
'number' => 'integer',
'varchar' => 'varchar',
'char' => 'char',
'text' => 'text',
'bigtext' => 'text',
'date' => 'varchar(14)',
);
/**
* @brief constructor
**/
function DBPostgresql() {
$this->_setDBInfo();
$this->_connect();
}
/**
* @brief 설치 가능 여부를 return
**/
function isSupported() {
if(!function_exists('pg_connect')) return false;
return true;
}
/**
* @brief DB정보 설정 connect/ close
**/
function _setDBInfo() {
$db_info = Context::getDBInfo();
$this->hostname = $db_info->db_hostname;
$this->userid = $db_info->db_userid;
$this->password = $db_info->db_password;
$this->database = $db_info->db_database;
$this->prefix = $db_info->db_table_prefix;
if(!substr($this->prefix,-1)!='_') $this->prefix .= '_';
}
/**
* @brief DB 접속
**/
function _connect() {
// pg용 connection string
$conn_string = "";
// db 정보가 없으면 무시
if(!$this->hostname || !$this->userid || !$this->database) return;
// connection string 만들기
$conn_string .= ($this->hostname) ? " host=$this->hostname" : "";
$conn_string .= ($this->userid) ? " user=$this->userid" : "";
$conn_string .= ($this->password) ? " password=$this->password" : "";
$conn_string .= ($this->database) ? " dbname=$this->database" : "";
$conn_string .= ($this->port) ? " port=$this->port" : "";
// 접속시도
$this->fd = @pg_connect($conn_string);
if(pg_connection_status($this->fd) != PGSQL_CONNECTION_OK) {
$this->setError(-1, "CONNECTION FAILURE");
return;
}
// 접속체크
$this->is_connected = true;
// utf8임을 지정
//$this ->_query('set client_encoding to uhc');
}
/**
* @brief DB접속 해제
**/
function close() {
if(!$this->isConnected()) return;
@pg_close($this->fd);
}
/**
* @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절
**/
function addQuotes($string) {
if(get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string));
if(!is_numeric($string)) $string = @pg_escape_string($string);
return $string;
}
/**
* @brief 트랜잭션 시작
**/
function begin() {
if(!$this->isConnected() || $this->transaction_started == false) return;
if($this->_query($this->fd, 'BEGIN'))
$this->transaction_started = true;
}
/**
* @brief 롤백
**/
function rollback() {
if(!$this->isConnected() || $this->transaction_started == false) return;
if($this->_query($this->fd, 'ROLLBACK'))
$this->transaction_started = false;
}
/**
* @brief 커밋
**/
function commit() {
if(!$this->isConnected() || $this->transaction_started == false) return;
if($this->_query($this->fd, 'COMMIT'))
$this->transaction_started = false;
}
/**
* @brief : 쿼리문의 실행 결과의 fetch 처리
*
* query : query문 실행하고 result return\n
* fetch : reutrn 값이 없으면 NULL\n
* rows이면 array object\n
* row이면 object\n
* return\n
**/
function _query($query) {
if(!$this->isConnected()) return;
// 쿼리 시작을 알림
$this->actStart($query);
// 쿼리 문 실행
$result = @pg_query($this->fd, $query);
// 오류 체크
if(!$result) $this->setError(1, pg_last_error($this->fd));
// 쿼리 실행 종료를 알림
$this->actFinish();
// 결과 리턴
return $result;
}
/**
* @brief 결과를 fetch
**/
function _fetch($result) {
if(!$this->isConnected() || $this->isError() || !$result) return;
while($tmp = pg_fetch_object($result)) {
$output[] = $tmp;
}
if(count($output)==1) return $output[0];
return $output;
}
/**
* @brief 1 증가되는 sequence값을 return (postgresql의 auto_increment는 sequence테이블에서만 사용)
**/
function getNextSequence() {
$query = sprintf("select nextval('%ssequence') as seq", $this->prefix);
$result = $this->_query($query);
$tmp = $this->_fetch($result);
return $tmp->seq;
}
/**
* @brief 테이블 기생성 여부 return
**/
function isTableExists($target_name) {
if($target_name == "sequence") return true;
$query = sprintf("SELECT tablename FROM pg_tables WHERE tablename = '%s%s' AND schemaname = current_schema()", $this->prefix, $this->addQuotes($target_name));
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if(!$tmp) return false;
return true;
}
/**
* @brief 특정 테이블에 특정 column 추가
**/
function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) {
$type = $this->column_type[$type];
if(strtoupper($type)=='INTEGER' || strtoupper($type)=='BIGINT') $size = '';
$query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name);
if($size) $query .= sprintf(" %s(%s) ", $type, $size);
else $query .= sprintf(" %s ", $type);
if($default) $query .= sprintf(" default '%s' ", $default);
if($notnull) $query .= " not null ";
$this->_query($query);
}
/**
* @brief 특정 테이블의 column의 정보를 return
**/
function isColumnExists($table_name, $column_name) {
$query = sprintf("select column_name from information_schema.columns where table_schema = current_schema() and table_name = '%s%s' and column_name = '%s'", $this->prefix, $this->addQuotes($table_name), strtolower($column_name));
$result = $this->_query($query);
if($this->isError()) return;
$output = $this->_fetch($result);
if($output) return true;
return false;
}
/**
* @brief 특정 테이블에 특정 인덱스 추가
* $target_columns = array(col1, col2)
* $is_unique? unique : none
**/
function addIndex($table_name, $index_name, $target_columns, $is_unique = false) {
if(!is_array($target_columns)) $target_columns = array($target_columns);
if(strpos($table_name,$this->prefix)===false) $table_name = $this->prefix.$table_name;
// index_name의 경우 앞에 table이름을 붙여줘서 중복을 피함
$index_name = $table_name.$index_name;
$query = sprintf("create %s index %s on %s (%s);", $is_unique?'unique':'', $index_name, $table_name, implode(',',$target_columns));
$this->_query($query);
}
/**
* @brief 특정 테이블의 index 정보를 return
**/
function isIndexExists($table_name, $index_name) {
if(strpos($table_name,$this->prefix)===false) $table_name = $this->prefix.$table_name;
// index_name의 경우 앞에 table이름을 붙여줘서 중복을 피함
$index_name = $table_name.$index_name;
//$query = sprintf("show indexes from %s%s where key_name = '%s' ", $this->prefix, $table_name, $index_name);
$query = sprintf("select indexname from pg_indexes where schemaname = current_schema() and tablename = '%s' and indexname = '%s'", $table_name, strtolower($index_name));
$result = $this->_query($query);
if($this->isError()) return;
$output = $this->_fetch($result);
if($output) return true;
return false;
}
/**
* @brief xml 받아서 테이블을 생성
**/
function createTableByXml($xml_doc) {
return $this->_createTable($xml_doc);
}
/**
* @brief xml 받아서 테이블을 생성
**/
function createTableByXmlFile($file_name) {
if(!file_exists($file_name)) return;
// xml 파일을 읽음
$buff = FileHandler::readFile($file_name);
return $this->_createTable($buff);
}
/**
* @brief schema xml을 이용하여 create table query생성
*
* type : number, varchar, text, char, date, \n
* opt : notnull, default, size\n
* index : primary key, index, unique\n
**/
function _createTable($xml_doc) {
// xml parsing
$oXml = new XmlParser();
$xml_obj = $oXml->parse($xml_doc);
// 테이블 생성 schema 작성
$table_name = $xml_obj->table->attrs->name;
if($table_name == 'sequence') {
$query = sprintf('create sequence %s', $this->prefix.$table_name);
return $this->_query($query);
}
if($this->isTableExists($table_name)) return;
$table_name = $this->prefix.$table_name;
if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column;
else $columns = $xml_obj->table->column;
foreach($columns as $column) {
$name = $column->attrs->name;
$type = $column->attrs->type;
$size = $column->attrs->size;
$notnull = $column->attrs->notnull;
$primary_key = $column->attrs->primary_key;
$index = $column->attrs->index;
$unique = $column->attrs->unique;
$default = $column->attrs->default;
$auto_increment = $column->attrs->auto_increment;
if($type == "bignumber" || $type == "number") $size = 0;
$column_schema[] = sprintf('%s %s%s %s %s',
$name,
$this->column_type[$type],
$size?'('.$size.')':'',
$default?"default '".$default."'":'',
$notnull?'not null':''
);
if($primary_key) $primary_list[] = $name;
else if($unique) $unique_list[$unique][] = $name;
else if($index) $index_list[$index][] = $name;
}
if(count($primary_list)) {
$column_schema[] = sprintf("primary key (%s)", implode($primary_list,','));
}
if(count($unique_list)) {
foreach($unique_list as $key => $val) {
$column_schema[] = sprintf("unique (%s)", implode($val,','));
}
}
$schema = sprintf('create table %s (%s%s);', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"));
$output = $this->_query($schema);
if(count($index_list)) {
foreach($index_list as $key => $val) {
if(!$this->isIndexExists($table_name, $key)) $this->addIndex($table_name, $key, $val);
}
}
if(!$output) return false;
}
/**
* @brief 조건문 작성하여 return
**/
function getCondition($output) {
if(!$output->conditions) return;
foreach($output->conditions as $key => $val) {
$sub_condition = '';
foreach($val['condition'] as $k =>$v) {
if(!$v['value']) continue;
$name = $v['column'];
$operation = $v['operation'];
$value = $v['value'];
$type = $this->getColumnType($output->column_type,$name);
$pipe = $v['pipe'];
$value = $this->getConditionValue($name, $value, $operation, $type, $output->column_type);
if(!$value) $value = $v['value'];
$str = $this->getConditionPart($name, $value, $operation);
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
$sub_condition .= $str;
}
if($sub_condition) {
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
$condition .= '('.$sub_condition.')';
}
}
if($condition) $condition = ' where '.$condition;
return $condition;
}
/**
* @brief insertAct 처리
**/
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
}
// 컬럼 정리
foreach($output->columns as $key => $val) {
$name = $val['name'];
$value = $val['value'];
if($output->column_type[$name]!='number') {
$value = "'".$this->addQuotes($value)."'";
if(!$value) $value = 'null';
} elseif(!$value || is_numeric($value)) $value = (int)$value;
$column_list[] = $name;
$value_list[] = $value;
}
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
return $this->_query($query);
}
/**
* @brief updateAct 처리
**/
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key.' as '.$val;
}
// 컬럼 정리
foreach($output->columns as $key => $val) {
if(!isset($val['value'])) continue;
$name = $val['name'];
$value = $val['value'];
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
else {
if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'";
elseif(!$value || is_numeric($value)) $value = (int)$value;
$column_list[] = sprintf("%s = %s", $name, $value);
}
}
// 조건절 정리
$condition = $this->getCondition($output);
$query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition);
return $this->_query($query);
}
/**
* @brief deleteAct 처리
**/
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
}
// 조건절 정리
$condition = $this->getCondition($output);
$query = sprintf("delete from %s %s", implode(',',$table_list), $condition);
return $this->_query($query);
}
/**
* @brief selectAct 처리
*
* select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n
* navigation이라는 method를 제공
**/
function _executeSelectAct($output) {
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key .' as '.$val;
}
if(!$output->columns) {
$columns = '*';
} else {
$column_list = array();
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('%s as %s', $name, $alias);
else $column_list[] = sprintf('%s',$name);
} else {
if($alias) $column_list[] = sprintf('%s as %s', $name, $alias);
else $column_list[] = sprintf('%s',$name);
}
}
$columns = implode(',',$column_list);
}
$condition = $this->getCondition($output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
$query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
$result = $this->_query($query);
if($this->isError()) return;
$data = $this->_fetch($result);
$buff = new Object();
$buff->data = $data;
return $buff;
}
/**
* @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다
*
* 그닥 좋지는 않은 구조이지만 편리하다.. -_-;
**/
function _getNavigationData($table_list, $columns, $condition, $output) {
require_once('./classes/page/PageHandler.class.php');
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition);
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;
$page_count = $output->page_count['value'];
if(!$page_count) $page_count = 10;
$page = $output->page['value'];
if(!$page) $page = 1;
// 전체 페이지를 구함
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
else $total_page = 1;
// 페이지 변수를 체크
if($page > $total_page) $page = $total_page;
$start_count = ($page-1)*$list_count;
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
$query = sprintf("select %s from %s %s", $columns, implode(',',$table_list), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if(count($output->order)) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
$query = sprintf('%s offset %d limit %d', $query, $start_count, $list_count);
$result = $this->_query($query);
if($this->isError()) {
$buff = new Object();
$buff->total_count = 0;
$buff->total_page = 0;
$buff->page = 1;
$buff->data = array();
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
return $buff;
}
$virtual_no = $total_count - ($page-1)*$list_count;
while($tmp = pg_fetch_object($result)) {
$data[$virtual_no--] = $tmp;
}
$buff = new Object();
$buff->total_count = $total_count;
$buff->total_page = $total_page;
$buff->page = $page;
$buff->data = $data;
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
return $buff;
}
}
?>

View file

@ -520,15 +520,18 @@
$condition = $this->getCondition($output);
if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
@ -543,6 +546,9 @@
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
// list_count를 사용할 경우 적용
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
$result = $this->_query($query);
if($this->isError()) return;
$data = $this->_fetch($result);
@ -583,11 +589,14 @@
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}

View file

@ -561,15 +561,18 @@
$condition = $this->getCondition($output);
if($output->list_count) return $this->_getNavigationData($table_list, $columns, $condition, $output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}
@ -584,6 +587,9 @@
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
// list_count를 사용할 경우 적용
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
$this->_prepare($query);
$data = $this->_execute();
if($this->isError()) return;
@ -624,11 +630,14 @@
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
if($output->order) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
$conditions = $this->getConditionList($output);
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
foreach($output->order as $key => $val) {
$col = $val[0];
if(!in_array($col, array('list_order','update_order'))) continue;
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
else $condition = sprintf(' where %s < 2100000000 ', $col);
}
}
}

View file

@ -86,7 +86,7 @@
$args_list = func_get_args();
for($i=0;$i<$num_args;$i++) {
$key = $args_list[$i];
$output->{$key} = $this->gets($key);
$output->{$key} = $this->get($key);
}
return $output;
}

View file

@ -73,7 +73,7 @@
$widget_padding_top = $args->widget_padding_top;
$widget_padding_bottom = $args->widget_padding_bottom;
if($include_info) {
$tpl = sprintf('<div class="widgetOutput" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s"><div class="widgetCopy"></div><div class="widgetSize"></div><div class="widgetRemove"></div><div class="widgetResize"></div><div class="widgetResizeLeft"></div><div class="widgetBorder"><div class="nullWidget" style="padding:%s %s %s %s;">', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
$tpl = sprintf('<div class="widgetOutput" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s"><div class="widgetBoxCopy"></div><div class="widgetBoxSize"></div><div class="widgetBoxRemove"></div><div class="widgetBoxResize"></div><div class="widgetBoxResizeLeft"></div><div class="widgetBoxBorder"><div class="nullWidget" style="padding:%s %s %s %s;">', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
} else {
$tpl = sprintf('<div style="overflow:hidden;%s;"><div style="padding:%s %s %s %s;"><div>%s', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $body);
}

View file

@ -136,6 +136,7 @@ span.button-behavior-hover{
a.button:hover span,
span.button:hover button,
span.button:hover input,
a.button:focus span,
span.button-behavior-hover button,

View file

@ -25,7 +25,8 @@ IE7 & IE6 & Below
/* default.css - Type Selector Definition */
* { margin:0; padding:0; }
html { width:100%; }
body { margin:0; font-size:.75em; font-family:sans-serif;}
body { margin:0; font-size:.75em; _font-size:9pt; font-family:sans-serif;}
*:first-child+html body { font-size:9pt; }
img { border:none; }
label { cursor:pointer; }
form { margin:0; padding:0; }
@ -34,18 +35,38 @@ form { margin:0; padding:0; }
.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); }
/* Input Style Definition */
.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; }
.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; _font-size:9pt; }
*:first-child+html .inputTypeText { font-size:9pt; }
.inputTypeText:hover,
.inputTypeText:focus { background:#f4f4f4; }
.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em;}
.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em; _font-size:9pt;}
*:first-child+html .inputTypeTextArea { font-size:9pt; }
.w40 { width:40px; }
.w60 { width:60px; }
.w70 { width:70px; }
.w80 { width:80px; }
.w90 { width:90px; }
.w100 { width:100px; }
.w110 { width:110px; }
.w120 { width:120px; }
.w130 { width:130px; }
.w140 { width:140px; }
.w150 { width:150px; }
.w160 { width:160px; }
.w170 { width:170px; }
.w180 { width:180px; }
.w190 { width:190px; }
.w200 { width:200px; }
.w210 { width:210px; }
.w220 { width:220px; }
.w230 { width:230px; }
.w240 { width:240px; }
.w250 { width:250px; }
.w260 { width:260px; }
.w270 { width:270px; }
.w280 { width:280px; }
.w290 { width:290px; }
.w300 { width:300px; }
.w400 { width:400px; }

View file

@ -194,7 +194,7 @@ function displayMultimedia(src, width, height, auto_start) {
"<param name=\"allowScriptAccess\" value=\"sameDomain\" />"+
"<param name=\"movie\" value=\""+src+"\" />"+
"<param name=\"quality\" value=\"high\" />"+
"<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\"></embed>"+
"<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\" wmode=\"transparent\"></embed>"+
"<\/object>";
} else if(/\.flv/i.test(src)) {
html = "<embed src=\""+request_uri+"common/tpl/images/flvplayer.swf?autoStart="+auto_start+"&file="+src+"\" width=\""+width+"\" height=\""+height+"\" type=\"application/x-shockwave-flash\"></embed>";
@ -224,38 +224,38 @@ function resizeImageContents() {
// 상위 node의 className이 document_ 또는 comment_ 로 시작하지 않으면 패스
var parent = obj.parentNode;
while(parent) {
if(/(document_|comment_)/ig.test(parent.className)) break;
if(parent.className && parent.className.search(/document_|comment_/i) != -1) break;
parent = parent.parentNode;
}
if(!parent || !/(document_|comment_)/ig.test(parent.className)) continue;
if (!parent || parent.className.search(/document_|comment_/i) < 0) continue;
if(parent.parentNode) xWidth(parent, xWidth(parent.parentNode));
parent.style.width = '100%';
parent.style.overflow = 'hidden';
var parent_width = xWidth(parent);
if(parent.parentNode && xWidth(parent.parentNode)<parent_width) parent_width = xWidth(parent.parentNode);
var obj_width = xWidth(obj);
var obj_height = xHeight(obj);
var orig_img = new Image();
orig_img.src = obj.src;
if(parent_width<1 || obj_width <1 || parent_width >= orig_img.width) continue;
obj.style.cursor = "pointer";
obj.source_width = orig_img.width;
obj.source_height = orig_img.height;
if(obj_width >= parent_width) {
var new_w = parent_width-10;
var new_h = Math.round(xHeight(obj)*new_w/obj_width);
// 만약 선택된 이미지의 가로 크기가 부모의 가로크기보다 크면 리사이즈 (이때 부모의 가로크기 - 2 정도로 지정해줌)
if(obj_width > parent_width - 2) {
obj.style.cursor = "pointer";
var new_w = parent_width - 2;
var new_h = Math.round(obj_height * new_w/obj_width);
xWidth(obj, new_w);
xHeight(obj, new_h);
xAddEventListener(obj,"click", showOriginalImage);
// 선택된 이미지가 부모보다 작을 경우 일단 원본 이미지를 불러와서 비교
} else {
var orig_img = new Image();
orig_img.src = obj.src;
if(orig_img.width > parent_width - 2 || orig_img.width != obj_width) {
obj.style.cursor = "pointer";
xAddEventListener(obj,"click", showOriginalImage);
}
}
xAddEventListener(obj,"click", showOriginalImage);
}
}
xAddEventListener(window, "load", resizeImageContents);

View file

@ -10,6 +10,7 @@ function exec_xml(module, act, params, callback_func, response_tags, callback_fu
var oXml = new xml_handler();
oXml.reset();
for(var key in params) {
if(!params.hasOwnProperty(key)) continue;
var val = params[key];
oXml.addParam(key, val);
}
@ -88,6 +89,7 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
+ "<params>\n"
for (var key in this.params) {
if(!this.params.hasOwnProperty(key)) continue;
var val = this.params[key];
rd += "<"+key+"><![CDATA["+val+"]]></"+key+">\n";
}

View file

@ -23,13 +23,13 @@ function filterAlertMessage(ret_obj) {
var redirect_url = ret_obj["redirect_url"];
var url = location.href;
if(url.substr(url.length-1,1)=="#") url = url.substr(0,url.length-1);
if(typeof(message)!="undefined"&&message&&message!="success") alert(message);
if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act);
else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url;
if(url == location.href) url = url.replace(/#(.+)$/,'');
location.href = url;
}
@ -302,9 +302,8 @@ function XmlJsFilterProc(confirm_msg) {
function procFilter(fo_obj, filter_func) {
// form문 안에 위지윅 에디터가 세팅되어 있을 경우 에디터의 값과 지정된 content field를 sync
var editor_sequence = fo_obj.getAttribute('editor_sequence');
if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined' && typeof(editorGetContent)=='function') {
var content = editorGetContent(editor_sequence);
editorRelKeys[editor_sequence]['content'].value = content;
if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined') {
editorRelKeys[editor_sequence]['content'].value = editorGetContent(editor_sequence);
}
filter_func(fo_obj);

View file

@ -29,6 +29,7 @@
$lang->cmd_vote = 'Recommend';
$lang->cmd_vote_down = 'Criticize';
$lang->cmd_declare = 'Accuse';
$lang->cmd_cancel_declare = 'Cancel Accuse';
$lang->cmd_declared_list = 'Accusations List';
$lang->cmd_copy = 'Copy';
$lang->cmd_move = 'Move';
@ -134,8 +135,8 @@
$lang->last_login = 'Last Login';
$lang->first_page = 'First Page';
$lang->last_page = 'Last Page';
$lang->search_target = 'Searching Target';
$lang->search_keyword = 'Searching Keyword';
$lang->search_target = 'Target for Search';
$lang->search_keyword = 'Keyword';
$lang->is_default = 'Default';
$lang->no_documents = 'No Articles';

View file

@ -29,6 +29,7 @@
$lang->cmd_vote = 'Recomendar';
$lang->cmd_vote_down = '비추천';
$lang->cmd_declare = '신고';
$lang->cmd_cancel_declare = '신고 취소';
$lang->cmd_declared_list = '신고 목록';
$lang->cmd_copy = 'Copia';
$lang->cmd_move = 'Mover';

View file

@ -29,6 +29,7 @@
$lang->cmd_vote = 'Voter';
$lang->cmd_vote_down = '비추천';
$lang->cmd_declare = '신고';
$lang->cmd_cancel_declare = '신고 취소';
$lang->cmd_declared_list = '신고 목록';
$lang->cmd_copy = 'Copie';
$lang->cmd_move = 'Deplacer';

View file

@ -1,7 +1,7 @@
<?php
/**
* @file common/lang/jp.lang.php
* @author zero (zero@nzeo.com) 翻訳RisaPapa
* @author zero (zero@nzeo.com) 翻訳RisaPapa、ミニミ
* @brief 日本語言語パッケージ(基本的な実行関連の用語がまとめられている)
**/
@ -16,7 +16,7 @@
$lang->cmd_list = 'リスト';
$lang->cmd_prev = '前へ';
$lang->cmd_next = '次へ';
$lang->cmd_send_trackback = 'TB送信';
$lang->cmd_send_trackback = 'トラックバック送信';
$lang->cmd_registration = $lang->cmd_submit = '登録';
$lang->cmd_comment_registration = 'コメント登録';
$lang->cmd_insert = '挿入';
@ -24,33 +24,35 @@
$lang->cmd_load = '読み込む';
$lang->cmd_input = '入力';
$lang->cmd_search = '検索';
$lang->cmd_cancel = 'キャンセル';
$lang->cmd_cancel = '取り消し';
$lang->cmd_back = '戻る';
$lang->cmd_vote = '推薦';
$lang->cmd_vote_down = '非推薦';
$lang->cmd_declare = '通報';
$lang->cmd_cancel_declare = '通報取り消し';
$lang->cmd_declared_list = '通報リスト';
$lang->cmd_copy = 'コピー';
$lang->cmd_move = '移動';
$lang->cmd_move_up = '上へ';
$lang->cmd_move_down = '下へ';
$lang->cmd_add_indent = '字下げ';
$lang->cmd_remove_indent = '字下げ解除';
$lang->cmd_add_indent = 'インデント';
$lang->cmd_remove_indent = '逆インデント';
$lang->cmd_management = '管理';
$lang->cmd_make = '作成';
$lang->cmd_select = '選択';
$lang->cmd_select_all = 'すべて選択';
$lang->cmd_unselect_all = 'すべて解除';
$lang->cmd_close_all = 'すべて閉じる';
$lang->cmd_reverse_all = "選択の反転";
$lang->cmd_close_all = 'すべて閉じる';
$lang->cmd_open_all = 'すべて開く';
$lang->cmd_reload = 'リロード';
$lang->cmd_close = '閉じる';
$lang->cmd_open = '開く';
$lang->cmd_setup = '設定';
$lang->cmd_addition_setup = '追加設定';
$lang->cmd_apply = '適用';
$lang->cmd_option = 'オプション';
$lang->cmd_open_calendar = 'カレンダーを開く';
$lang->cmd_apply = '適用';
$lang->cmd_open_calendar = 'カレンダーを開く';
$lang->cmd_send = '送信';
$lang->cmd_print = '印刷';
$lang->cmd_scrap = 'スクラップ';
@ -80,11 +82,11 @@
$lang->email_address = 'メールアドレス';
$lang->homepage = 'ホームページ';
$lang->blog = 'ブログ';
$lang->birthday = '誕生日';
$lang->browser_title = 'ブラウザタイトル';
$lang->birthday = '誕生日';
$lang->browser_title = 'ブラウザタイトル';
$lang->title = 'タイトル';
$lang->title_content = 'タイトル+内容';
$lang->topic = 'トピック';
$lang->topic = 'トピック';
$lang->replies = '返事';
$lang->content = '内容';
$lang->document = '書き込み';
@ -100,11 +102,11 @@
$lang->target = '対象';
$lang->total = 'すべて';
$lang->total_count = 'トータル数';
$lang->ipaddress = 'アドレス';
$lang->ipaddress = 'IPアドレス';
$lang->path = 'パス';
$lang->cart = '選択項目';
$lang->friend = '友達';
$lang->notify = 'お知らせ';
$lang->notify = 'アラット';
$lang->mid = 'モジュール名';
$lang->layout = 'レイアウト';
@ -117,7 +119,7 @@
$lang->document_url = '書き込みURL';
$lang->trackback_url = 'トラックバックURL';
$lang->blog_name = 'ブログ名';
$lang->excerpt = '要約';
$lang->excerpt = '抜粋';
$lang->document_count = '書き込み数';
$lang->page_count = 'ページ数';
@ -125,7 +127,7 @@
$lang->readed_count = '照合数';
$lang->voted_count = '推薦数';
$lang->member_count = '会員数';
$lang->date = '年月日';
$lang->date = '';
$lang->regdate = '登録日';
$lang->last_update = '最近修正日';
$lang->last_post = '最近登録';
@ -137,11 +139,11 @@
$lang->search_keyword = 'キーワード';
$lang->is_default = 'デフォルト';
$lang->no_documents = '書き込みがありません。';
$lang->no_documents = '登録された書き込みがありません。';
$lang->board_manager = '掲示板管理';
$lang->member_manager = '会員管理';
$lang->layout_manager = 'レイアウト';
$lang->layout_manager = 'レイアウト管理';
$lang->use = '使用';
$lang->notuse = '未使用';
@ -156,8 +158,8 @@
$lang->unit_year = '年';
// 説明関連
$lang->about_tag = 'タグを入力する時、「,」を使うと複数登録できます。';
$lang->about_layout = 'レイアウトでモジュールの枠をデザインします。上のレイアウトメニューで管理できます。';
$lang->about_tag = 'タグを入力する時、「,」(半角コンマ)を使うと複数登録できます。';
$lang->about_layout = 'レイアウトでモジュールの枠をデザインします。上のレイアウトメニューで管理できます。';
// メッセージ関連
$lang->msg_call_server = 'サーバへ問合わせ中です。しばらくお待ちください。';
@ -184,7 +186,7 @@
$lang->success_moved = '移動しました。';
$lang->success_sended = '送信しました。';
$lang->success_reset = '初期化しました。';
$lang->success_leaved = '会しました。';
$lang->success_leaved = '退会しました。';
$lang->success_saved = '保存しました。';
$lang->fail_to_delete = '削除に失敗しました。';
@ -200,7 +202,7 @@
$lang->confirm_delete = '削除しますか?';
$lang->confirm_move = '移動しますか?';
$lang->confirm_reset = '初期化しますか?';
$lang->confirm_leave = '会しますか?';
$lang->confirm_leave = '退会しますか?';
$lang->column_type = 'タイプ';
$lang->column_type_list['text'] = '入力フィールド(text)';
@ -211,7 +213,7 @@
$lang->column_type_list['checkbox'] = 'チェックボックス(checkbox)';
$lang->column_type_list['select'] = '選択(select)';
$lang->column_type_list['kr_zip'] = '韓国住所(zip)';
$lang->column_type_list['date'] = '年月日';
$lang->column_type_list['date'] = '日付(年月日)';
//$lang->column_type_list['jp_zip'] = '日本住所(zip)';
$lang->column_name = 'コラム名';
$lang->column_title = 'コラムタイトル';
@ -224,11 +226,11 @@
$lang->filter->outofrange = '%sの文字の長さを合わせてください';
$lang->filter->equalto = '%sが正しくありません';
$lang->filter->invalid_email = '%sのパターンが正しくありません (例: zbxe@zeroboard.com)';
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%sの形式が正しくありません。\\n半角の英数と記号「_」を組み合わせて入力してください。最初の文字は半角英数でなければなりません。";
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%sの形式が正しくありません。\\n半角の英数と記号「_」を組み合わせて入力してください。頭字は半角英文字でなければなりません。";
$lang->filter->invalid_homepage = '%sの形式が正しくありません (例: http://www.zeroboard.com)';
$lang->filter->invalid_korean = '%sの形式が正しくありません。ハングルのみ入力してください。';
$lang->filter->invalid_korean_number = '%sの形式が正しくありません。ハングルと半角数字で入力してください。';
$lang->filter->invalid_alpha = '%sの形式が正しくありません。半角英文字入力してください。';
$lang->filter->invalid_alpha = '%sの形式が正しくありません。半角英文字のみ入力してください。';
$lang->filter->invalid_alpha_number = '%sの形式が正しくありません。半角英数で入力してください。';
$lang->filter->invalid_number = '%sの形式が正しくありません。半角数字で入力してください。';
?>

View file

@ -29,6 +29,7 @@
$lang->cmd_vote = '추천';
$lang->cmd_vote_down = '비추천';
$lang->cmd_declare = '신고';
$lang->cmd_cancel_declare = '신고 취소';
$lang->cmd_declared_list = '신고 목록';
$lang->cmd_copy = '복사';
$lang->cmd_move = '이동';

View file

@ -3,3 +3,4 @@ en,English
zh-CN,中文
jp,日本語
es,Español
ru,Русский

236
common/lang/ru.lang.php Normal file
View file

@ -0,0 +1,236 @@
<?php
/**
* @file ru.lang.php
* @author zero <zero@nzeo.com> | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467;
* @brief Russian basic language pack for Zeroboard XE
**/
// Основные слова для действий
$lang->cmd_write = 'Написать';
$lang->cmd_reply = 'Ответить';
$lang->cmd_delete = 'Удалить';
$lang->cmd_modify = 'Изменить';
$lang->cmd_edit = 'Редактировать';
$lang->cmd_view = 'Просмотреть';
$lang->cmd_view_all = 'Просмотреть все';
$lang->cmd_list = 'Список';
$lang->cmd_prev = 'Пред.';
$lang->cmd_next = 'След.';
$lang->cmd_send_trackback = 'Отправить трекбек';
$lang->cmd_registration = $lang->cmd_submit = 'Принять';
$lang->cmd_comment_registration = 'Добавить комментарий';
$lang->cmd_insert = 'Вставить';
$lang->cmd_save = 'Сохранить';
$lang->cmd_load = 'Загрузить';
$lang->cmd_input = 'Ввести';
$lang->cmd_search = 'Искать';
$lang->cmd_cancel = 'Отменить';
$lang->cmd_back = 'Вернуться';
$lang->cmd_vote = 'Рекомендовать';
$lang->cmd_vote_down = 'Критиковать';
$lang->cmd_declare = 'Обвинить';
$lang->cmd_cancel_declare = 'Отменить Обвинить';
$lang->cmd_declared_list = 'Список обвинений';
$lang->cmd_copy = 'Копировать';
$lang->cmd_move = 'Переместить';
$lang->cmd_move_up = 'Вверх';
$lang->cmd_move_down = 'Вниз';
$lang->cmd_add_indent = 'Отступ вправо';
$lang->cmd_remove_indent = 'Отступ влево';
$lang->cmd_management = 'Управление';
$lang->cmd_make = 'Создать';
$lang->cmd_select = 'Выделить';
$lang->cmd_select_all = 'Выделить все';
$lang->cmd_unselect_all = 'Убрать выделение Всех';
$lang->cmd_reverse_all = 'Перевернуть';
$lang->cmd_close_all = 'Закрыть все';
$lang->cmd_open_all = 'Открыть все';
$lang->cmd_reload = 'Перегрузить';
$lang->cmd_close = 'Закрыть';
$lang->cmd_open = 'Открыть';
$lang->cmd_setup = 'Конфигурация';
$lang->cmd_addition_setup = 'Дополнительная настройка';
$lang->cmd_option = 'Опция';
$lang->cmd_apply = 'Применить';
$lang->cmd_open_calendar = 'Выбрать дату';
$lang->cmd_send = 'Отправить';
$lang->cmd_print = 'Напечатать';
$lang->cmd_scrap = 'В черновики';
$lang->cmd_preview = 'Предпросмотр';
$lang->cmd_reset = 'Сброс';
$lang->cmd_remake_cache = "Пере-создать файл кэша";
$lang->cmd_publish = "Опубликовать";
$lang->enable = 'Включено';
$lang->disable = 'Выключено';
// Существенные слова
$lang->no = 'No.';
$lang->notice = 'Уведомление';
$lang->secret = 'Секрет';
$lang->category = 'Категория';
$lang->document_srl = 'Док. No.';
$lang->user_id = 'Юзер ID';
$lang->author = 'Разработчик';
$lang->password = 'Пароль';
$lang->password1 = 'Пароль';
$lang->password2 = 'Подтверждение пароля';
$lang->admin_id = 'Админ ID';
$lang->writer = 'Автор';
$lang->user_name = 'Имя';
$lang->nick_name = 'Ник';
$lang->email_address = 'Email';
$lang->homepage = 'Домашняя страница';
$lang->blog = 'Блог';
$lang->birthday = 'Дата рождения';
$lang->browser_title = 'Заголовок браузера';
$lang->title = 'Тема';
$lang->title_content = 'Тема+Содержание';
$lang->topic = 'Тема';
$lang->replies = 'Ответы';
$lang->content = 'Содержание';
$lang->document = 'Статьи';
$lang->comment = 'Комментарии';
$lang->description = 'Описание';
$lang->trackback = 'Трекбек';
$lang->tag = 'Тег';
$lang->allow_comment = 'Позволить комментарии';
$lang->lock_comment = 'Заблокировать комментарии';
$lang->allow_trackback = 'Позволить трекбек';
$lang->uploaded_file = 'Вложение';
$lang->grant = 'Права доступа';
$lang->target = 'Назначение';
$lang->total = 'Всего';
$lang->total_count = 'Общее кол-во';
$lang->ipaddress = 'IP Адрес';
$lang->path = 'Путь';
$lang->cart = 'Выбранный объект';
$lang->friend = 'Друзья';
$lang->notify = 'Уведомление';
$lang->mid = 'Имя Модуля';
$lang->layout = 'Лейаут';
$lang->widget = 'Виджет';
$lang->module = 'Модуль';
$lang->skin = 'Тема';
$lang->colorset = 'Цветовой набор';
$lang->extra_vars = 'Доп. перем.';
$lang->document_url = 'Адрес статьи';
$lang->trackback_url = 'Адрес трекбек';
$lang->blog_name = 'Название блога';
$lang->excerpt = 'Цитата';
$lang->document_count = 'Всего статей';
$lang->page_count = 'Кол-во страниц';
$lang->list_count = 'Кол-во списков';
$lang->readed_count = 'Хиты';
$lang->voted_count = 'Голоса';
$lang->member_count = 'Кол-во пользователей';
$lang->date = 'Дата';
$lang->regdate = 'Дата регистрации';
$lang->last_update = 'Последнее обновление';
$lang->last_post = 'Последний комментарий';
$lang->signup_date = 'Дата регистрации';
$lang->last_login = 'Последний вход';
$lang->first_page = 'Первая страница';
$lang->last_page = 'Последняя страница';
$lang->search_target = 'Назначение поиска';
$lang->search_keyword = 'Ключевые слова';
$lang->is_default = 'По умолчанию';
$lang->no_documents = 'Нет статей';
$lang->board_manager = 'Настройки форума';
$lang->member_manager = 'Настройки пользователей';
$lang->layout_manager = 'Настройки лейаута';
$lang->use = 'Использовать';
$lang->notuse = 'Не использовать';
$lang->not_exists = "Не существует";
$lang->unit_sec = 'сек.';
$lang->unit_min = 'мин.';
$lang->unit_hour = 'ч.';
$lang->unit_day = 'д.';
$lang->unit_week = 'нед.';
$lang->unit_month = 'мес.';
$lang->unit_year = 'г.';
// Описания
$lang->about_tag = 'Вы можете применить несколько тегов, разделенных запятыми (,)';
$lang->about_layout = 'Лейауты украшают внешний вид Ваших модулей. Вы можете сконфигирировать их с помощью меню Лейаут сверху';
// Сообщение
$lang->msg_call_server = 'Идет обработка. Пожалуйста, подождите...';
$lang->msg_db_not_setted = 'Даза данных не сконфигурирована';
$lang->msg_invalid_queryid = 'Указанный ID запроса неверен';
$lang->msg_not_permitted = 'У Вас нет прав доступа';
$lang->msg_input_password = 'Пожалуйста, введите пароль';
$lang->msg_invalid_document = 'Неверный номер статьи';
$lang->msg_invalid_request = 'Неверный запрос';
$lang->msg_invalid_password = 'Неверный пароль';
$lang->msg_error_occured = 'Произошла ошибка';
$lang->msg_not_founded = 'Сообщение не найдено';
$lang->msg_no_result = 'Ничего не найдено';
$lang->msg_not_permitted_act = 'У Вас нет прав для исполнения запрошенного действия';
$lang->msg_module_is_not_exists = 'Запрошенный модуль не найден';
$lang->msg_module_is_not_standalone = 'Запрошенный модуль не может быть исполнен независимо';
$lang->success_registed = 'Зарегистрировано успешно';
$lang->success_declared = 'Обвинение успешно';
$lang->success_updated = 'Обновление успешно';
$lang->success_deleted = 'Удалено успешно';
$lang->success_voted = 'Рекомендовано успешно';
$lang->success_moved = 'Перемещено успешно';
$lang->success_sended = 'Отправлено успешно';
$lang->success_reset = 'Сброшено успешно';
$lang->success_leaved = 'Все данные пользователя были полностью удалены.';
$lang->success_saved = 'Сохранено успешно';
$lang->fail_to_delete = 'Не может быть удалено';
$lang->fail_to_move = 'Не может быть перемещено';
$lang->failed_voted = 'Ошибка при рекомендации';
$lang->failed_declared = 'Ошибка при обвинении';
$lang->fail_to_delete_have_children = 'Пожалуйста, попробуйте еще после удаления дочерних объектов';
$lang->confirm_submit = 'Вы подтверждаете применение?';
$lang->confirm_logout = 'Вы подтверждаете выход?';
$lang->confirm_vote = 'Вы подтверждаете рекомендацию?';
$lang->confirm_delete = 'Вы подтверждаете удаление?';
$lang->confirm_move = 'Вы подтверждаете перемещение?';
$lang->confirm_reset = 'Вы подтверждаете сброс?';
$lang->confirm_leave = 'Вы подтверждаете уход?';
$lang->column_type = 'Тип колонки';
$lang->column_type_list['text'] = 'one-line text';
$lang->column_type_list['homepage'] = 'url';
$lang->column_type_list['email_address'] = 'email';
$lang->column_type_list['tel'] = 'phone number';
$lang->column_type_list['textarea'] = 'multi-line textarea';
$lang->column_type_list['checkbox'] = 'checkbox (multiple selection)';
$lang->column_type_list['select'] = 'select box (single selection)';
$lang->column_type_list['kr_zip'] = 'zip code (Korean)';
$lang->column_type_list['date'] = 'date (yyyy/mm/dd)';
//$lang->column_type_list['jp_zip'] = 'zip code (Japanese)';
$lang->column_name = 'Имя колонки';
$lang->column_title = 'Название колонки';
$lang->default_value = 'Стандартное значение';
$lang->is_active = 'Активно';
$lang->is_required = 'Требуемое поле';
// Alert-сообщения для Javascript используя XML filter
$lang->filter->isnull = 'Пожалуйста, введите значение для %s';
$lang->filter->outofrange = 'Пожалуйста, исправьте длину текста %s';
$lang->filter->equalto = "Значение %s неверно";
$lang->filter->invalid_email = "Формат %s неверен. Например: zbxe@zeroboard.com";
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "Формат %s неверен.\\n Все значения должны состоять из алфавита, цифр и символа подчеркивания(_), и первая буква должна принадлежать латинскому алфавиту.";
$lang->filter->invalid_homepage = "Формат %s неверен. Например: http://www.zeroboard.com";
$lang->filter->invalid_korean = "Формат %s неверен. Пожалуйста, вводите по-корейски";
$lang->filter->invalid_korean_number = "Формат %s неверен. Пожалуйста, вводите по-корейски или цифрами";
$lang->filter->invalid_alpha = "Формат %s неверен. Пожалуйста, вводите только алфавитные символы";
$lang->filter->invalid_alpha_number = "Формат %s неверен. Пожалуйста, вводите алфавитные символы или цифры";
$lang->filter->invalid_number = "Формат %s неверен. Пожалуйста, вводите только цифры";
?>

View file

@ -29,6 +29,7 @@
$lang->cmd_vote = '推荐';
$lang->cmd_vote_down = '反对';
$lang->cmd_declare = '举报';
$lang->cmd_cancel_declare = '取消举报';
$lang->cmd_declared_list = '举报目录';
$lang->cmd_copy = '复制';
$lang->cmd_move = '查看';

View file

@ -14,7 +14,7 @@
* 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며
* config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '0.2.6');
define('__ZBXE_VERSION__', '0.2.7');
/**
* @brief 디버깅 메세지 출력

View file

@ -246,6 +246,15 @@
return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap;
}
/**
* @brief 월이름을 return
**/
function getMonthName($month, $short = true) {
$short_month = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
$long_month = array("January","February","March","April","May","June","July","August","September","October","November","December");
return !$short?$long_month[$month]:$short_month[$month];
}
/**
* @brief YYYYMMDDHHIISS 형식의 시간값을 원하는 시간 포맷으로 변형
* @param str YYYYMMDDHHIISS 형식의 시간값
@ -253,8 +262,10 @@
* @return string
**/
function zdate($str, $format = "Y-m-d H:i:s") {
// 대상 시간이 없으면 null return
if(!$str) return;
// 언어권에 따라서 지정된 날짜 포맷을 변경
switch(Context::getLangType()) {
case "en" :
case "es" :
@ -264,6 +275,23 @@
break;
}
// 년도가 1970년 이전이면 별도 처리
if((int)substr($str,0,4)<1970) {
$hour = (int)substr($str,8,2);
$min = (int)substr($str,10,2);
$sec = (int)substr($str,12,2);
$year = (int)substr($str,0,4);
$month = (int)substr($str,4,2);
$day = (int)substr($str,6,2);
return str_replace(
array("Y","m","d","H","h","i","s","a","M", "F"),
array($year,$month,$day,$hour,$hour/12,$min,$sec,$hour<=12?"am":"pm",getMonthName($month), getMonthName($month,false)),
$format
);
}
// 1970년 이후라면 ztime()함수로 unixtime을 구하고 date함수로 처리
return date($format, ztime($str));
}
@ -380,6 +408,9 @@
// script code 제거
$content = preg_replace("!<script(.*?)<\/script>!is","",$content);
// meta 태그 제거
$content = preg_replace("!<meta(.*?)>!is","",$content);
return $content;
}

View file

@ -19,8 +19,8 @@
</description>
<description xml:lang="jp">
ゼロボードXEのオフィシャルサイトのレイアウトです。
デザイン:イソラ
パブリシング:ジョンチャンミョン
デザイン:イ ソラ
パブリシング:ジョン チャンミョン
レイアウト作成Zero
</description>
<description xml:lang="en">
@ -50,7 +50,7 @@
<title xml:lang="en">Colorset</title>
<title xml:lang="es">Set de colores</title>
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するを選択してください。</description>
<description xml:lang="jp">希望するカラーセットを選択してください。</description>
<description xml:lang="zh-CN">请选择颜色。</description>
<description xml:lang="en">Please select a colorset you want.</description>
<description xml:lang="es">Seleccione set de colores que desea.</description>
@ -81,19 +81,19 @@
</var>
<var name="logo_image" type="image">
<title xml:lang="ko">로고이미지</title>
<title xml:lang="jp">ロゴイメージ</title>
<title xml:lang="jp">ロゴイメージ</title>
<title xml:lang="zh-CN">LOGO图片</title>
<title xml:lang="en">Logo image</title>
<title xml:lang="es">Imagen del logotipo</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다)</description>
<description xml:lang="jp">レイアウトの上に表示されるロゴイメージを入力してください。 (縦幅が23pxである透明イメージが最も合います。)</description>
<description xml:lang="jp">レイアウトの上に表示されるロゴイメージを入力してください。 (縦幅が23pxである透明イメージが最も合います。)</description>
<description xml:lang="zh-CN">请输入显示在布局顶部的LOGO图片。(高度为23px的透明图片为适。)</description>
<description xml:lang="en">Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 23px is recommended.)</description>
<description xml:lang="es">Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px.</description>
</var>
<var name="index_url" type="text">
<title xml:lang="ko">홈 페이지 URL</title>
<title xml:lang="jp">ホームページ URL</title>
<title xml:lang="jp">ホームページURL</title>
<title xml:lang="zh-CN">主页地址</title>
<title xml:lang="en">Homepage URL</title>
<title xml:lang="es">URL de la página web</title>
@ -119,7 +119,7 @@
<menus>
<menu name="main_menu" default="true">
<title xml:lang="ko">상단 메뉴</title>
<title xml:lang="jp">メニュー</title>
<title xml:lang="jp">メニュー</title>
<title xml:lang="zh-CN">主菜单</title>
<title xml:lang="en">Top menu</title>
<title xml:lang="es">Menú Principal</title>

View file

@ -27,7 +27,7 @@ body { background:#3d3d3d url(../images/black/bgBody.gif) repeat-x;}
#gnb { position:absolute; top:82px; left:0; height:38px; overflow:hidden; white-space:nowrap; margin-bottom:10px;}
#gnb li { list-style:none; float:left; background:url(../images/black/bgGnbVr.gif) no-repeat left center; padding-left:2px; position:relative; left:-2px; white-space:nowrap;}
#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#a6a6a6; white-space:nowrap; text-decoration:none; font-family:"돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#a6a6a6; white-space:nowrap; text-decoration:none; }
#gnb li a:hover,
#gnb li a:focus { color:#ffffff;}
#gnb li.on a { font-weight:bold; color:#ffffff; background:url(../images/black/bgGnbOn.gif) no-repeat center top;}
@ -42,9 +42,9 @@ body { background:#3d3d3d url(../images/black/bgBody.gif) repeat-x;}
#isSearch ul li label.on { background:#2f4345; }
#isSearch ul li label:hover,
#isSearch ul li label:focus { background:#2f4345;}
#isSearch .inputText { vertical-align:middle; _position:relative; _top:-1px; padding:3px 3px 1px 3px; width:94px; height:15px; color:#ffffff; border:none; background:url(../images/black/bgSearch.gif) no-repeat;}
#isSearch .inputText { vertical-align:middle; position:relative; top:0; _top:-1px; left:1px; padding:3px 3px 1px 3px; width:94px; height:13px; color:#ffffff; border:1px solid #8E8E8D; background-color:#857C79; }
#isSearch .inputText:hover,
#isSearch .inputText:focus { background:url(../images/black/bgSearchOn.gif) no-repeat;}
#isSearch .inputText:focus { border:1px solid #B0B0AF; background-color:#A9A4A3; }
*:first-child+html #isSearch .inputText { position:relative; top:-1px;}
#isSearch .submit { vertical-align:middle; _position:relative; _top:-1px;}
*:first-child+html #isSearch .submit { position:relative; top:-1px;}

View file

@ -27,7 +27,7 @@ body { background:#FFFFFF url(../images/default/bgBody.gif) repeat-x left top; }
#gnb { position:absolute; top:82px; left:0; height:38px; overflow:hidden; white-space:nowrap; margin-bottom:10px;}
#gnb li { float:left; list-style:none; background:url(../images/default/bgGnbVr.gif) no-repeat left center; padding-left:2px; position:relative; left:-2px; white-space:nowrap;}
#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#e8e8e8; white-space:nowrap; text-decoration:none; font-family:"돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#e8e8e8; white-space:nowrap; text-decoration:none; }
#gnb li a:hover,
#gnb li a:focus { color:#ffffff;}
#gnb li.on a { font-weight:bold; color:#ffffff; background:url(../images/default/bgGnbOn.gif) no-repeat center top;}
@ -35,6 +35,7 @@ body { background:#FFFFFF url(../images/default/bgBody.gif) repeat-x left top; }
#isSearch { position:absolute; top:48px; right:15px; width:214px; text-align:right;}
#isSearch .searchOrder { display:none;}
#isSearch .checked { position:absolute; left:0; top:0; text-align:left; display:block; padding:5px 0 0 5px; width:64px; height:14px; background:url(../images/default/bgSearchTerm.gif) no-repeat; font:11px "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color:#ffffff; line-height:normal;}
*:first-child+html #isSearch .checked { top:1px; }
#isSearch ul { display:none; position:absolute; left:0; top:18px; padding:2px 0 3px 0; text-align:left; border:1px solid #919898; background:#536c6d;}
#isSearch ul li { width:67px; height:18px; list-style:none; }
#isSearch ul li input { display:none;}
@ -42,9 +43,9 @@ body { background:#FFFFFF url(../images/default/bgBody.gif) repeat-x left top; }
#isSearch ul li label.on { background:#455a5b; }
#isSearch ul li label:hover,
#isSearch ul li label:focus { background:#455a5b;}
#isSearch .inputText { vertical-align:middle; _position:relative; _top:-1px; padding:3px 3px 1px 3px; width:94px; height:15px; color:#ffffff; border:none; background:url(../images/default/bgSearch.gif) no-repeat;}
#isSearch .inputText { vertical-align:middle; position:relative; top:0; _top:-1px; left:1px; padding:3px 3px 1px 3px; width:94px; height:13px; color:#ffffff; border:1px solid #8E8E8D; background-color:#857C79; }
#isSearch .inputText:hover,
#isSearch .inputText:focus { background:url(../images/default/bgSearchOn.gif) no-repeat;}
#isSearch .inputText:focus { border:1px solid #B0B0AF; background-color:#A9A4A3; }
*:first-child+html body#default #isSearch .inputText { position:relative; top:-1px;}
#isSearch .submit { vertical-align:middle; _position:relative; _top:-1px;}
*:first-child+html body#default #isSearch .submit { position:relative; top:-1px;}

View file

@ -27,7 +27,7 @@ body { background:#ffffff;}
#gnb { position:absolute; top:76px; left:0; height:38px; overflow:hidden; white-space:nowrap; margin-bottom:10px;}
#gnb li { list-style:none; float:left; background:url(../images/white/bgGnbVr.gif) no-repeat left center; padding-left:2px; position:relative; left:-2px; white-space:nowrap;}
#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#727272; white-space:nowrap; text-decoration:none; font-family:"돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
#gnb li a { display:block; float:left; padding:13px 15px 0 15px; height:25px; color:#727272; white-space:nowrap; text-decoration:none; }
#gnb li a:hover,
#gnb li a:focus { color:#000000;}
#gnb li.on a { font-weight:bold; color:#3f3f3f; background:url(../images/white/bgGnbOn.gif) no-repeat center top;}
@ -42,10 +42,10 @@ body { background:#ffffff;}
#isSearch ul li label.on { background:#ededed; }
#isSearch ul li label:hover,
#isSearch ul li label:focus { background:#ededed;}
#isSearch .inputText { vertical-align:middle; _position:relative; _top:-1px; padding:3px 3px 1px 3px; width:94px; height:15px; color:#5c5c5c; border:none; background:url(../images/white/bgSearch.gif) no-repeat;}
#isSearch .inputText { vertical-align:middle; position:relative; top:0; _top:-1px; left:1px; padding:3px 3px 1px 3px; width:94px; height:13px; color:#000000; border:1px solid #B0B0AF; background-color:#FFFFFF; }
#isSearch .inputText:hover,
#isSearch .inputText:focus { background:url(../images/white/bgSearchOn.gif) no-repeat;}
*:first-child+html #isSearch .inputText { position:relative; top:-1px;}
#isSearch .inputText:focus { border:1px solid #8E8E8D; background-color:#FFFFFF; }
*:first-child+html #isSearch .inputText { position:relative; top:-1px;}
#isSearch .submit { vertical-align:middle; _position:relative; _top:-1px;}
*:first-child+html #isSearch .submit { position:relative; top:-1px;}

View file

@ -56,7 +56,7 @@
$oAddonModel = &getAdminModel('addon');
$addon_list = $oAddonModel->getInsertedAddons();
foreach($addon_list as $addon=> $val) {
if($val->is_used != 'Y') continue;
if($val->is_used != 'Y' || !is_dir('./addons/'.$addon) ) continue;
if($val->extra_vars) {
unset($extra_vars);

View file

@ -18,7 +18,7 @@
**/
function getAddonPath($addon_name) {
$class_path = sprintf('./addons/%s/', $addon_name);
if(is_dir($class_path)) return $class_path;
if(is_dir($class_path)) return $class_path;
return "";
}
@ -95,7 +95,7 @@
$addon_info->author->date = $xml_obj->author->attrs->date;
$addon_info->author->description = trim($xml_obj->author->description->body);
// history
// history
if(!is_array($xml_obj->history->author)) $history[] = $xml_obj->history->author;
else $history = $xml_obj->history->author;
@ -123,10 +123,25 @@
foreach($extra_vars as $key => $val) {
unset($obj);
if(!$val->type->body) { $val->type->body = 'text'; }
$obj->name = $val->attrs->name;
$obj->title = $val->title->body;
$obj->type = $val->type->body;
$obj->description = $val->description->body;
$obj->value = $extra_vals->{$obj->name};
if(strpos($obj->value, '|@|') != 0) { $obj->value = explode('|@|', $obj->value); }
// 'select'type에서 option목록을 구한다.
if(is_array($val->options)) {
$option_count = count($val->options);
for($i = 0; $i < $option_count; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->value->body;
}
}
$addon_info->extra_vars[] = $obj;
}
}

View file

@ -39,6 +39,11 @@
$addon_info = $oAddonModel->getAddonInfoXml($selected_addon);
Context::set('addon_info', $addon_info);
// mid 목록을 가져옴
$oModuleModel = &getModel('module');
$mid_list = $oModuleModel->getMidList();
Context::set('mid_list', $mid_list);
// 레이아웃을 팝업으로 지정
$this->setLayoutFile('popup_layout');

View file

@ -6,6 +6,7 @@
<title xml:lang="zh-CN">插件</title>
<title xml:lang="jp">アドオン</title>
<title xml:lang="fr">Additions</title>
<title xml:lang="ru">Аддоны</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="en">zero</name>
@ -13,11 +14,13 @@
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="fr">Zero</name>
<name xml:lang="ru">Zero</name>
<description xml:lang="ko">애드온을 등록하거나 사용/미사용을 설정하는 애드온 관리 모듈입니다.</description>
<description xml:lang="en">This module is for maintaining addons which can toggle use and disuse states.</description>
<description xml:lang="es">Este Módulo es para agregar Addons, como también el manejo de ellos.</description>
<description xml:lang="zh-CN">登录插件或设置启用/禁用插件的管理模块。</description>
<description xml:lang="jp">アドオンの「登録、使用、未使用」などを設定するための管理モジュールです。</description>
<description xml:lang="jp">アドオンの「登録、使用、未使用」などを設定する管理モジュールです。</description>
<description xml:lang="fr">Ce module est pour les Additions de maintien qui peuvent basculer des états d'utilisation et de désuétude. </description>
<description xml:lang="ru">Этот модуль служит для управления аддонами, использование которых Вы можете включать и выключать.</description>
</author>
</module>

View file

@ -0,0 +1,15 @@
<?php
/**
* @file ru.lang.php
* @author zero <zero@nzeo.com> | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467;
* @brief Russian basic language pack for Zeroboard XE
**/
$lang->addon = "Аддон";
$lang->addon_info = 'Информация об аддоне';
$lang->addon_maker = 'Автор аддона';
$lang->addon_history = 'История аддона';
$lang->about_addon = 'Аддон служит больше для контролирования действий, чем для отображения HTML-результатов.<br />Простым включением/выключением любых аддонов, Вы можете использовать очень полезные функции для администрирования Вашего веб-сайта';
?>

View file

@ -1,5 +1,5 @@
<div id="popHeadder">
<h1>{$lang->addon_maker}</h1>
<h3>{$lang->addon_maker}</h3>
</div>
<div id="popBody">

View file

@ -1,7 +1,7 @@
<!--%import("filter/setup_addon.xml")-->
<div id="popHeadder">
<h1>{$lang->cmd_setup}</h1>
<h3>{$lang->cmd_setup}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, setup_addon);">
@ -24,12 +24,37 @@
<td><a href="{$addon_info->author->homepage}" onclick="window.open(this.href);return false;">{$addon_info->author->homepage}</a></td>
</tr>
<!--@foreach($addon_info->extra_vars as $key => $val)-->
<!--@foreach($addon_info->extra_vars as $id => $var)-->
<tr>
<th scope="row">{$val->title}</th>
<th scope="row">
{$var->title}
<!--@if($var->type == 'mid_list')-->
<input type="checkbox" onclick="checkboxSelectAll(this.form, '{$var->name}'); return false;" />
<!--@end-->
</th>
<td>
<input type="text" name="{$val->name}" value="{$val->value}" class="inputTypeText w100" />
<!--@if($val->description)--><p>{$val->description}</p><!--@end-->
<!--@if($var->type == 'text')-->
<input type="text" name="{$var->name}" value="{$var->value}" class="inputTypeText w400" />
<!--@elseif($var->type == 'textarea')-->
<textarea name="{$var->name}" class="inputTypeTextArea">{$var->value}</textarea>
<!--@elseif($var->type == 'select')-->
<select name="{$var->name}">
<!--@foreach($var->options as $val)-->
<option value="{$val->value}"<!--@if($var->value == $val->value)--> selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
</select>
<!--@elseif($var->type == 'mid_list')-->
<!--@foreach($mid_list as $key => $val)-->
<div class="addon_mid_list">
<input type="checkbox" value="{$key}" name="{$var->name}" id="chk_mid_list_{$key}" <!--@if(in_array($key, $var->value))-->checked="checkde" <!--@end-->/>
<label for="chk_mid_list_{$key}">{$key} ({$val->browser_title})</label>
</div>
<!--@end-->
<!--@end-->
<p class="clear">{nl2br($var->description)}</p>
</td>
</tr>
<!--@end-->

View file

@ -5,16 +5,19 @@
<title xml:lang="es">Módulo del administrador</title>
<title xml:lang="zh-CN">管理员模块</title>
<title xml:lang="jp">管理者用モジュール</title>
<title xml:lang="ru">Модуль администратора</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다.</description>
<description xml:lang="en">This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator.</description>
<description xml:lang="es">Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador.</description>
<description xml:lang="zh-CN">列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。</description>
<description xml:lang="jp">各モジュールの機能を羅列し、管理者用のレイアウトを適用させ、管理機能が使用できるようにするモジュールです。</description>
<description xml:lang="ru">Этот модуль показывает список возможностей каждого модуля, и позволяет Вам использовать несколько менеджеров, применяя лейаут для администратора.</description>
</author>
</module>

View file

@ -1,7 +1,7 @@
<?php
/**
* @file jp.lang.php
* @author zero (zero@nzeo.com) 翻訳RisaPapa
* @author zero (zero@nzeo.com) 翻訳RisaPapa、ミニミ
* @brief 日本語言語パッケージ(基本的な内容のみ)
**/
@ -24,7 +24,7 @@
$lang->current_version = "インストールバージョン";
$lang->current_path = "インストールパス";
$lang->released_version = "最新バージョン";
$lang->about_download_link = "インストールされたバージョンより新しいバージョンが配布されました。ダウンロードリンクをクリックするとダウンロードできます。";
$lang->about_download_link = "インストールされたバージョンより新しいバージョンが配布されています。ダウンロードリンクをクリックするとダウンロードできます。";
$lang->item_module = "モジュールリスト";
$lang->item_addon = "アドオンリスト";
@ -40,12 +40,12 @@
$lang->cmd_shortcut_management = "メニュー編集";
$lang->msg_is_not_administrator = '管理者のみ接続できます';
$lang->msg_is_not_administrator = '管理者のみアクセスできます';
$lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除できません。';
$lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することができません。';
$lang->welcome_to_zeroboard_xe = 'ゼロボードXEの管理者ページです。';
$lang->about_admin_page = "管理者ページはまだ未完成です。クローズベタバージョンの期間に、多くの方々からご意見をいただきながら、必ず必要なコンテンツを埋めていきたいと思います。";
$lang->about_admin_page = "管理者ページはまだ未完成です。\nクローズベタバージョンの期間に、多くの方々からご意見をいただきながら、必ず必要なコンテンツを埋めていきたいと思います。";
$lang->about_lang_env = "上で設定された言語を、初めてサイトに訪問したユーザに同じく適用させるためには、希望する言語に変更してから「保存」ボタンをクリックしてください。";
$lang->zeroboard_xe_user_links = 'ユーザのためのリンク';
@ -63,8 +63,8 @@
);
$lang->xe_developer_links = array(
'デベロッパーフォーラム' => 'http://spring.zeroboard.com',
//'マニュアル' => 'http://www.zeroboard.com/wiki/manual',
'マニュアル' => 'http://www.zeroboard.com/wiki/manual',
//'デベロッパーフォーラム' => 'http://spring.zeroboard.com',
'イッシュートラッキング' => 'http://trac.zeroboard.com',
'SVN Repository' => 'http://svn.zeroboard.com',
'Doxygen Document' => 'http://doc.zeroboard.com',

View file

@ -0,0 +1,88 @@
<?php
/**
* @file ru.lang.php
* @author zero <zero@nzeo.com> | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467;
* @brief Russian basic language pack for Zeroboard XE
**/
$lang->admin_info = 'Информация администратора';
$lang->admin_index = 'Индексная страница администратора';
$lang->module_category_title = array(
'service' => 'Служебные модули',
'manager' => 'Управляющие модули',
'utility' => 'Утилиратные модули',
'accessory' => 'Дополнительные модули',
'base' => 'Базовые модули',
);
$lang->newest_news = "Последние новости";
$lang->env_setup = "Настройка";
$lang->env_information = "Информация окружения";
$lang->current_version = "Текущая версия";
$lang->current_path = "Текущий путь";
$lang->released_version = "Последняя версия";
$lang->about_download_link = "Новая версия XE доступна. Чтобы скачать последнюю версию, нажмите ссылку закачки.";
$lang->item_module = "Список модулей";
$lang->item_addon = "Список аддонов";
$lang->item_widget = "Список виджетов";
$lang->item_layout = "Список лейаутов";
$lang->module_name = "Имя модуля";
$lang->addon_name = "Имя аддона";
$lang->version = "Версия";
$lang->author = "Разработчик";
$lang->table_count = "Номер таблицы";
$lang->installed_path = "Путь установки";
$lang->cmd_shortcut_management = "Редактировать меню";
$lang->msg_is_not_administrator = 'Только для администраторов!';
$lang->msg_manage_module_cannot_delete = 'Ярлыки модулей, аддонов, лейаутов, виджетов не могут быть удалены';
$lang->msg_default_act_is_null = 'Ярлык не может быть зарегистрирован, поскольку стандартное административное действие не установлено';
$lang->welcome_to_zeroboard_xe = 'Добро пожаловать на страницу администратора Zeroboard XE';
$lang->about_admin_page = "Страница администратора все еще в разработке,\nМы добавим важные доработки, принимая много хороших предложений на этапе Closebeta.";
$lang->about_lang_env = "Чтобы применить выбранный язык для пользователей как страндартный, нажмите кнопку Сохранить [Save] после изменения.";
$lang->zeroboard_xe_user_links = 'Ссылки для пользователей';
$lang->zeroboard_xe_developer_links = 'Ссылки для разработчиков';
$lang->xe_user_links = array(
'Официальный веб-сайт' => 'http://www.zeroboard.com',
//'Close Beta website' => 'http://spring.zeroboard.com',
//'Module morgue' => 'http://www.zeroboard.com',
//'Addon morgue' => 'http://www.zeroboard.com',
//'Widget morgue' => 'http://www.zeroboard.com',
//'Module Skin morgue' => 'http://www.zeroboard.com',
//'Widget Skin morgue' => 'http://www.zeroboard.com',
//'Layout Skin morgue' => 'http://www.zeroboard.com',
);
$lang->xe_developer_links = array(
//'Manual' => 'http://www.zeroboard.com/wiki/manual',
"Форум разработчиков" => 'http://spring.zeroboard.com',
'Обсуждение вопсросов' => 'http://trac.zeroboard.com',
'SVN репозиторий' => 'http://svn.zeroboard.com',
'Документация' => 'http://doc.zeroboard.com',
'PDF документация' => 'http://doc.zeroboard.com/zeroboard_xe.pdf',
);
$lang->zeroboard_xe_usefulness_module = 'Полезные модули';
$lang->xe_usefulness_modules = array(
'dispEditorAdminIndex' => 'Менеждер редактора',
'dispDocumentAdminList' => 'Менеждер статей',
'dispCommentAdminList' => 'Менеждер комментариев',
'dispFileAdminList' => 'Менеждер вложений',
'dispPollAdminList' => 'Менеждер голосований',
'dispSpamfilterAdminConfig' => 'Менеждер спам-фильтра',
'dispCounterAdminIndex' => 'Лог счетчика',
);
$lang->xe_license = 'Zeroboard XE подчиняется Стандартной Общественной Лицензии GPL';
$lang->about_shortcut = 'Вы можете удалить ярлыки модулей, зарегистрированных в списке часто используемых модулей';
?>

View file

@ -18,9 +18,9 @@
$lang->newest_news = "最新消息";
$lang->env_setup = "环境设置";
$lang->env_setup = "系统设置";
$lang->env_information = "环境信息";
$lang->env_information = "系统信息";
$lang->current_version = "安装版本";
$lang->current_path = "安装路径";
$lang->released_version = "最新版本";

View file

@ -20,7 +20,7 @@ h3 .gray { color:#9d9d9d;}
.adminTable { width:100%; border-left:1px solid #E3E3E2; border-top:1px solid #E3E3E2; margin-bottom:10px; table-layout:fixed;}
.adminTable caption { background:url("../images/s_application.gif") no-repeat 3px 5px; padding:6px 5px 4px 22px; text-align:left; border:1px solid #E3E3E2; border-bottom:none; font-weight:bold; background-color:#F9F8F5; color:#5E6266; }
.adminTable th { background-color:#FAF8F4; padding:5px; font-weight:normal; text-align:left; padding-left:10px; color:#606060; border-right:1px solid #E3E3E2; border-bottom:1px solid #E3E3E2; white-space:nowrap; }
.adminTable th { overflow:hidden; background-color:#FAF8F4; padding:5px; font-weight:normal; text-align:left; padding-left:10px; color:#606060; border-right:1px solid #E3E3E2; border-bottom:1px solid #E3E3E2; }
.adminTable th.button { text-align:right; }
.adminTable th.centerButton { text-align:center; }
@ -44,7 +44,7 @@ h3 .gray { color:#9d9d9d;}
.adminTable th a.green { color:#218E08; }
.adminTable th select { height:20px; }
.adminTable td { background-color:#FFFFFF; padding:5px; font-weight:normal; text-align:left; padding-left:10px; color:#5A5A5A; border-right:1px solid #E3E3E2; border-bottom:1px solid #E3E3E2;}
.adminTable td { overflow:hidden; background-color:#FFFFFF; padding:5px; font-weight:normal; text-align:left; padding-left:10px; color:#5A5A5A; border-right:1px solid #E3E3E2; border-bottom:1px solid #E3E3E2;}
.adminTable td.tahoma { font-family:tahoma; font-size:7pt; }
.adminTable td.tahoma a { font-family:tahoma; font-size:7pt; }
@ -77,7 +77,7 @@ h3 .gray { color:#9d9d9d;}
.adminTable td .graph .num { position:relative; background:#ffffff; color:#636363; font:.9em Tahoma; padding-left:10px; white-space:nowrap;}
.admin_news { width:540px; float:left; margin-right:10px; }
.admin_link { width:250px; float:right; }
.admin_link { width:300px; float:right; }
select.time_zone { width:70%; position:relative; top:4px; }
.gap1 { margin-top:.8em; }

View file

@ -2,31 +2,31 @@
body { background:url("../images/admin_background.gif") repeat-x left top; background-color:#DBD8D3; }
#adminLayout { background:url("../images/admin_logo.gif") no-repeat left top; background-color:#F8F6F2; overflow:hidden; width:1000px; border-right:1px solid #B2B2B2; margin:5px 0 0 5px; }
#adminLayout { background:url("../images/admin_logo.gif") no-repeat left top; background-color:#F8F6F2; overflow:hidden; width:1050px; border-right:1px solid #B2B2B2; margin:5px 0 0 5px; }
#adminContentBody { width:800px; float:left; background-color:#FFFFFF; padding:25px 10px 20px 10px; vertical-align:top; background:url(../images/admin_top_bg.gif) repeat-x left top; background-color:#FFFFFF; }
#adminContentBody { width:850px; float:left; background-color:#FFFFFF; padding:25px 10px 20px 10px; vertical-align:top; background:url(../images/admin_top_bg.gif) repeat-x left top; background-color:#FFFFFF; }
#adminLayoutBottom { background:url("../images/admin_bottom_bg.gif") repeat-x left top; height:3px; clear:both; overflow:hidden; width:1001px; margin:0 0 0 5px; }
#adminLayoutBottom { background:url("../images/admin_bottom_bg.gif") repeat-x left top; height:3px; clear:both; overflow:hidden; width:1051px; margin:0 0 0 5px; }
#adminMenuContent { width:179px; float:left; margin-top:70px; padding-bottom:20px; vertical-align:top; background:none; overflow:hidden; border-right:1px solid #B2B2B2; }
#adminMenuContent .adminInfoBox { border:1px solid #E3E3E2; padding:3px; margin:0 0 0 8px; width:130px; background-color:#FFFFFF; overflow:hidden; width:154px; margin-bottom:10px;}
#adminMenuContent .adminInfoBox .adminInfo { border:1px solid #E3E3E2; padding:5px 3px 3px 23px; background:url("../images/icon_key.gif") no-repeat 3px 3px; color:#555555; font-weight:bold; overflow:hidden; background-color:#F8F6F2; }
#adminMenuContent .adminInfoBox .adminInfo div.expandButton { float:right; height:16px; overflow:hidden; }
#adminMenuContent .adminInfoBox { border:1px solid #E3E3E2; padding:3px; margin:0 0 0 8px; width:130px; background-color:#FFFFFF; width:154px; margin-bottom:10px;}
#adminMenuContent .adminInfoBox .adminInfo { border:1px solid #E3E3E2; padding:5px 3px 3px 23px; background:url("../images/icon_key.gif") no-repeat 3px 5px; color:#555555; font-weight:bold; background-color:#F8F6F2; }
#adminMenuContent .adminInfoBox .adminInfo div.expandButton { float:right; height:16px; }
#adminMenuContent .adminInfoBox div.logoutButton { margin-top:5px; text-align:center; clear:both; }
#adminMemberInfo { padding:10px 5px 10px 24px; background:url("../images/icon_user.gif") no-repeat 5px 8px; color:#336699; font-weight:bold; letter-spacing:-1px;}
#adminMenuContent h3 { border:1px solid #E3E3E2; border-top:none; color:#555555; font-size:1em; text-indent:none; padding:6px 5px 3px 25px; white-space:nowrap; margin:0 0 0 8px; width:130px; overflow:hidden;}
#adminMenuContent h3 { border:1px solid #E3E3E2; border-top:none; color:#555555; font-size:1em; text-indent:none; padding:6px 0 3px 25px; margin:0 0 0 8px; width:135px;}
#adminMenuContent h3 a { color:#555555; text-decoration:none; }
#adminMenuContent h3 span.expandButton { float:right; height:16px; overflow:hidden; }
#adminMenuContent h3.summary { background:url("../images/icon_summary.gif") no-repeat 3px 3px; background-color:#FFFFFF; margin-top:0px; border-top:1px solid #E3E3E2; }
#adminMenuContent h3 span.expandButton { float:right; padding:none; margin:none; height:16px; white-space:nowrap; overflow:hidden;}
#adminMenuContent h3.summary { background:url("../images/icon_summary.gif") no-repeat 3px 5px; background-color:#FFFFFF; margin-top:0px; border-top:1px solid #E3E3E2; }
#adminMenuContent h3.service { background:url("../images/icon_service_module.gif") no-repeat 3px 5px; background-color:#FFFFFF; }
#adminMenuContent h3.manager { background:url("../images/icon_manager_module.gif") no-repeat 3px 5px; background-color:#FFFFFF;}
#adminMenuContent h3.utility { background:url("../images/icon_utility_module.gif") no-repeat 3px 5px; background-color:#FFFFFF;}
#adminMenuContent h3.accessory { background:url("../images/icon_accessory_module.gif") no-repeat 3px 5px; background-color:#FFFFFF;}
#adminMenuContent h3.base { background:url("../images/icon_base_module.gif") no-repeat 3px 5px; background-color:#FFFFFF;}
#adminMenuContent ul { width:170px; overflow:hidden; }
#adminMenuContent ul { width:170px; }
#adminMenuContent ul li { background-color:#F8F6F3; list-style:none; padding:5px 10px 3px 10px; margin-left:8px; white-space:nowrap; overflow:hidden; color:#888785; border-bottom:1px solid #E3E3E2; cursor:pointer; }
#adminMenuContent ul li:hover { background-color:#EFE6D3; border-left:1px solid #E3E3E2; border-right:1px solid #E3E3E2;}
#adminMenuContent li.on { background-color:#EFE6D3; border-left:1px solid #E3E3E2; border-right:1px solid #E3E3E2;}

View file

@ -9,6 +9,7 @@
<div class="adminInfo">
<div class="fl">{$lang->admin_info}</div>
<div class="expandButton"><a href="#" onclick="toggleDisplay('adminMemberInfo','block'); return false;"><img src="./images/expand.gif" alt="toggle" /></a></div>
<div class="clear"></div>
</div>
<div id="adminMemberInfo" style="display:none;">
{$logged_info->nick_name} ({$logged_info->user_id})
@ -19,13 +20,12 @@
</div>
<h3 class="summary">
<span class="fl"><a href="{getUrl('','module','admin')}">{$lang->admin_index}</a></span>
<span><a href="{getUrl('','module','admin')}">{$lang->admin_index}</a></span>
</h3>
<!--@foreach($lang->module_category_title as $key => $val)-->
<h3 class="{$key}">
<span class="fl"><a href="#" onclick="toggleAdminMenu('amm_{$key}'); return false;">{$val}</a></span>
<span class="expandButton"><a href="#" onclick="toggleAdminMenu('amm_{$key}'); return false;"><img src="./images/expand.gif" alt="toggle" /></a></span>
<span><a href="#" onclick="toggleAdminMenu('amm_{$key}'); return false;">{$val}</a></span>
</h3>
<ul id="amm_{$key}" style="display:{$_COOKIE['amm_'.$key]}">

View file

@ -88,7 +88,7 @@
$oDocument = $oDocumentModel->getDocument(0, $this->grant->manager);
// document_srl이 있다면 해당 글을 구해오자
// document_srl이 있다면 해당 글만 출력
if($this->grant->list && $document_srl) {
// 글을 구함
@ -109,74 +109,71 @@
// 조회수 증가
$oDocument->updateReadedCount();
// 목록수를 1개로 수정 (글이 선택되었을 때만)
$this->list_count = 1;
// 카테고리 설정
Context::set('category', $oDocument->get('category_srl'));
// 페이지 변수를 제거하여 직접 구하도록 변경
unset($page);
// comment editor 생성/ 세팅
$comment_editor[$oDocument->document_srl] = $this->getCommentEditor($oDocument->document_srl, 0, 100);
Context::set('comment_editor', $comment_editor);
}
}
Context::set('oDocument', $oDocument);
// 만약 document_srl은 있는데 page가 없다면 글만 호출된 경우 page를 구해서 세팅해주자..
if($document_srl && !$page) {
$page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count);
Context::set('page', $page);
}
// document_srl이 없다면 정해진데로 목록을 구함
if(!$oDocument->isExists()) {
// 목록을 구하기 위한 옵션
$args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl
$args->page = $page; ///< 페이지
$args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수
$args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수
// 목록을 구하기 위한 옵션
$args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl
$args->page = $page; ///< 페이지
$args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수
$args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수
// 검색 옵션
$args->search_target = trim(Context::get('search_target')); ///< 검색대상
$args->search_keyword = trim(Context::get('search_keyword')); ///< 검색어
// 검색 옵션
$args->search_target = trim(Context::get('search_target')); ///< 검색대상
$args->search_keyword = trim(Context::get('search_keyword')); ///< 검색어
// 키워드 검색이 아닌 검색일 경우 목록의 수를 40개로 고정
if($args->search_target && $args->search_keyword) $args->list_count = 40;
// 키워드 검색이 아닌 검색일 경우 목록의 수를 40개로 고정
if($args->search_target && $args->search_keyword) $args->list_count = 40;
// 키워드 검색의 경우 제목,내용으로 검색 대상 고정
if($args->search_keyword && !$args->search_target) $args->search_target = "title_content";
// 키워드 검색의 경우 제목,내용으로 검색 대상 고정
if($args->search_keyword && !$args->search_target) $args->search_target = "title_content";
// 블로그 카테고리
$args->category_srl = (int)Context::get('category');
// 블로그 카테고리
$args->category_srl = (int)Context::get('category');
$args->sort_index = 'list_order'; ///< 소팅 값
$args->sort_index = 'list_order'; ///< 소팅 값
// 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조
$output = $oDocumentModel->getDocumentList($args, true);
// 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조
$output = $oDocumentModel->getDocumentList($args, true);
// 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('document_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('document_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 문서 갯수만큼 comment editor 생성
if(count($output->data)) {
foreach($output->data as $obj) {
$comment_editor[$obj->document_srl] = $this->getCommentEditor($obj->document_srl, 0, 100);
// 문서 갯수만큼 comment editor 생성
if(count($output->data)) {
foreach($output->data as $obj) {
$comment_editor[$obj->document_srl] = $this->getCommentEditor($obj->document_srl, 0, 100);
}
}
}
// 에디터 세팅
Context::set('comment_editor', $comment_editor);
// 에디터 세팅
Context::set('comment_editor', $comment_editor);
// 템플릿에서 사용할 검색옵션 세팅
$count_search_option = count($this->search_option);
for($i=0;$i<$count_search_option;$i++) {
$search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]);
// 템플릿에서 사용할 검색옵션 세팅
$count_search_option = count($this->search_option);
for($i=0;$i<$count_search_option;$i++) {
$search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]);
}
Context::set('search_option', $search_option);
}
Context::set('search_option', $search_option);
// 블로그의 코멘트는 ajax로 호출되기에 미리 css, js파일을 import
Context::addJsFile('./modules/editor/tpl/js/editor.js');
Context::addCSSFile('./modules/editor/tpl/css/editor.css');
//Context::addJsFile('./modules/editor/tpl/js/editor.js');
//Context::addCSSFile('./modules/editor/tpl/css/editor.css');
$this->setTemplateFile('list');
}
@ -269,7 +266,7 @@
$oSourceComment = $oCommentModel->getComment($parent_srl, $this->grant->manager);
// 댓글이 없다면 오류
if(!$oSourceComment->isExists()) return $this->dispBoardMessage('msg_invalid_request');
if(!$oSourceComment->isExists()) return $this->dispBlogMessage('msg_invalid_request');
// 대상 댓글을 생성
$oComment = $oCommentModel->getComment();
@ -305,7 +302,7 @@
$oComment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
// 댓글이 없다면 오류
if(!$oComment->isExists()) return $this->dispBoardMessage('msg_invalid_request');
if(!$oComment->isExists()) return $this->dispBlogMessage('msg_invalid_request');
// 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로
if(!$oComment->isGranted()) return $this->setTemplateFile('input_password_form');

View file

@ -5,19 +5,23 @@
<title xml:lang="en">Blog</title>
<title xml:lang="es">Blog</title>
<title xml:lang="zh-CN">博客</title>
<title xml:lang="ru">Блог</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
블로그의 기능을 담당하는 모듈.
게시판과 비슷하지만 보여지는 view가 다르고 블로그에 적합한 method가 추가되었음.
레이아웃과 기본 메뉴를 직접 담당
</description>
<description xml:lang="jp">
ブログの機能を担当するモジュールです。掲示板と似ているが、内容の表示が異なり、ブログに適切なメソッドが追加されています。 レイアウトと基本メニューを直接担当します。
ブログの機能を担当するモジュール
掲示板と似ているが、内容の表示が異なり、ブログに適切なメソッドが追加されている。
レイアウトと基本メニューを直接担当します。
</description>
<description xml:lang="en">
This module contains the blog functions.
@ -34,5 +38,10 @@
虽然类似版面但其显示模式不同且还添加了适合博客的method。
内置布局和基本的菜单。
</description>
<description xml:lang="ru">
Этот модуль содержит функции блога.
Он похож на модуль BBS, но имеет другой вид и более подходящие методы для блога.
Этот модуль управляет лейвутом и базовым меню самостоятельно.
</description>
</author>
</module>

View file

@ -1,7 +1,7 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com) 翻訳keinicht
* @author zero (zero@nzeo.com) 翻訳keinicht、ミニミ
* @brief ブログ(blog) モジュルの基本言語パッケージ
**/
@ -24,10 +24,10 @@
$lang->search_result = '検索結果';
// その他
$lang->about_category_title = 'カテゴリ名を入力して下さい';
$lang->about_expand = 'チェックすると常に開いた状態にします';
$lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになりますXMLファイルを直接閲覧すると表示されます';
$lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正できます。ウィジェットコードを入力、又は管理して下さい';
$lang->about_blog_category = 'ブログのカテゴリが作成できます。<br />ブログのカテゴリが誤作動する場合キャッシュファイルの再生性を手動で行うと解決される事があります。';
$lang->about_blog = "ブログを作成し管理できるブログモジュールです。ブログモジュールはブログスキンに含まれているレイアウトを利用するので生成後必ずカテゴリ、又はスキン管理を用いてブログを編集して下さい。ブログ内に他の掲示板を連動させたい時はメニュモジュールでメニューを作成した後、スキン管理で行ってください。";
$lang->about_category_title = 'カテゴリ名を入力して下さい';
$lang->about_expand = 'チェックすると常に展開された状態になります。';
$lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになりますXMLファイルを直接閲覧すると表示されます';
$lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。';
$lang->about_blog_category = 'ブログのカテゴリを作成します。<br />ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。';
$lang->about_blog = "ブログの作成、および管理できるブログモジュールです。\nブログモジュールはブログスキンに含まれているレイアウトを利用するので生成後必ずカテゴリ、およびスキン管理を用いてブログを編集して下さい。\nブログ内に他の掲示板を連動させたい場合は「メニュモジュール」でメニューを作成した後、「スキン管理」で行ってください。";
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @file ru.lang.php
* @author zero <zero@nzeo.com> | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467;
* @brief Russian basic language pack for Zeroboard XE
**/
// Слова, использованные в кнопке
$lang->cmd_blog_list = 'Список блогов';
$lang->cmd_module_config = 'Общие настройки блога';
$lang->cmd_view_info = 'Иформация блога';
$lang->cmd_manage_menu = 'Управление меню';
$lang->cmd_make_child = 'Добавить дочернюю категорию';
$lang->cmd_enable_move_category = "Изменить позицию категории (Перетащите верхнее меню после выделения)";
$lang->cmd_remake_cache = 'Перепостроить файл кеша';
$lang->cmd_layout_setup = 'Конфигурировать лейаут';
$lang->cmd_layout_edit = 'Редактировать лейаут';
// Объект
$lang->parent_category_title = 'Родительская категория';
$lang->category_title = 'Категория';
$lang->expand = 'Расширить';
$lang->category_group_srls = 'Доступные группы';
$lang->search_result = 'Результат поиска';
// blah blah.. или чушь всякая... ;)
$lang->about_category_title = 'Пожалуйста, введите название категории';
$lang->about_expand = 'Если эта опция выбрана, расширение будут применено всегда';
$lang->about_category_group_srls = 'Только выбранная группа будет способна видеть ткущие категории. (Вручную откройте xml файл, чтобы сделать видимыми)';
$lang->about_layout_setup = 'Вы можете вручную изменять лейаут код блога. Вставляйте или управляйте кодом виджетов везде, где хотите';
$lang->about_blog_category = 'Вы можете сделать категории блога.<br />Когда категория блога испорчена, попробуйте перепостроить файл кеша вручную.';
$lang->about_blog = "Это модуть блогов, который может создавать и управлять блогом.\nПосле создания блога, пожалуйста, украсьте Ваш блог посредством менеджера категорий и скинов, поскольку этот модуль блогов использует лейаут включенный в скин блога.\nЕсли Вы хотите подключить другие форумы внутри блога, используйте модуль меню для создания меню и, затем, подключите его к менеджеру скинов";
?>

View file

@ -285,3 +285,9 @@ Jeong, Chan Myeong 070601~070630
/* 게시물의 팝업 메뉴 */
.comment_popup_menu, .document_popup_menu { text-align:right; margin-top:3em; clear:both; display:block; background:url(../images/common/document_menu.gif) no-repeat right top; padding-right:16px; height:18px; }
.comment_popup_menu span, .document_popup_menu span { cursor:pointer; display:inline; background:none; padding:0 0 0 0; margin:0 0 0 0; }
/* widget common css */
.blog_widget_ h2 { border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; }
.blog_widget_ .items { padding:10px; overflow:hidden;}
.blog_widget_ .items li { font-size:.9em; display:block; color:#a4a4a4; margin-right:.1em; line-height:150%; overflow:hidden; white-space:nowrap; list-style:none; width:100%; padding:3px 0 3px 0;}
.blog_widget_ .items li a { color:#a4a4a4; margin-right:1em; }

View file

@ -35,3 +35,6 @@ blogRead .readFooter .fileAttached li a { background:url(../images/cyan/iconFile
.replyAndTrackback { background:url(../images/cyan/bgBlogListTh.gif) repeat-x left 0px; }
.replyAndTrackback a strong { color:#2895c0;}
.replyBox .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/cyan/iconFile.gif) no-repeat left;}
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -36,3 +36,6 @@
.replyAndTrackback { background:url(../images/green/bgBlogListTh.gif) repeat-x left 0px; }
.replyAndTrackback a strong { color:#38b549;}
.replyBox .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/green/iconFile.gif) no-repeat left;}
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -73,6 +73,8 @@ div#blog_category { background-color:#FFFFFF; }
div#searchBox { margin-bottom:.7em; overflow:hidden; width:100%;}
div#searchBox fieldset { border:none;}
div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;}
div#searchBox .imgBtn {vertical-align:middle; _position:relative; top:-4px; }
*:first-child+html div#searchBox .imgBtn { position:relative; top:-4px; }
/* powered by zbxe */
#poweredbyzbxe { text-align:center; margin-top:2em; }

View file

@ -35,3 +35,6 @@
.replyAndTrackback { background:url(../images/purple/bgBlogListTh.gif) repeat-x left 0px; }
.replyAndTrackback a strong { color:#b1ae00;}
.replyBox .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/purple/iconFile.gif) no-repeat left;}
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -35,3 +35,6 @@
.replyAndTrackback { background:url(../images/red/bgBlogListTh.gif) repeat-x left 0px; }
.replyAndTrackback a strong { color:#ff6600;}
.replyBox .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/red/iconFile.gif) no-repeat left;}
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -35,3 +35,6 @@
.replyAndTrackback { background:url(../images/white/bgBlogListTh.gif) repeat-x left 0px; }
.replyAndTrackback a strong { color:#ff6600;}
.replyBox .fileAttached li { border:0px; display:inline; margin-right:.75em; line-height:1.5em; padding:.1em 0 .1em 1.5em; background:url(../images/white/iconFile.gif) no-repeat left;}
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -28,11 +28,11 @@
<!-- 전화번호 -->
<!--@elseif($val->type == 'tel')-->
{(int)htmlspecialchars($val->value[0])}
{htmlspecialchars($val->value[0])}
<!--@if($val->value[1])-->-<!--@end-->
{(int)htmlspecialchars($val->value[1])}
{htmlspecialchars($val->value[1])}
<!--@if($val->value[2])-->-<!--@end-->
{(int)htmlspecialchars($val->value[2])}
{htmlspecialchars($val->value[2])}
&nbsp;
<!-- textarea -->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 196 B

Before After
Before After

View file

@ -13,7 +13,6 @@
<!-- CSS 파일 로드 (컬러셋에 따라서) -->
<!--%import("css/common.css")-->
<!--@if($layout_info->colorset == "cyan")--> <!--%import("css/cyan.css")-->
<!--@elseif($layout_info->colorset == "red")--> <!--%import("css/red.css")-->
<!--@elseif($layout_info->colorset == "green")--> <!--%import("css/green.css")-->
@ -119,8 +118,8 @@
<div id="searchBox">
<form action="{getUrl()}" method="post">
<input type="hidden" name="mid" value="{$layout_info->mid}" />
<input name="search_keyword" type="text" class="inputTypeText w140" value="<!--@if(!$search_target)-->{htmlspecialchars($search_keyword)}<!--@end-->" />
<input type="image" alt="search" src="./images/common/find_button.gif" width="21" height="21" align="absmiddle" />
<input name="search_keyword" type="text" class="inputTypeText w140" size="4" value="<!--@if(!$search_target)-->{htmlspecialchars($search_keyword)}<!--@end-->" />
<input type="image" alt="search" src="./images/common/find_button.gif" class="imgBtn" />
</form>
</div>
@ -130,22 +129,22 @@
<!-- 왼쪽 위젯 출력 위치 -->
<!-- 최근문서 출력 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_document" skin="blog_newest_document" colorset="{$layout_info->colorset}" title="Recent Articles" order_target="list_order" order_type="desc" list_count="10" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_document" skin="blog_newest_document" title="Recent Articles" order_target="list_order" order_type="desc" list_count="10" mid_list="{$layout_info->mid}" />
<!-- 최근댓글 출력 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_comment" skin="blog_newest_comment" colorset="{$layout_info->colorset}" title="Recent Comments" list_count="10" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_comment" skin="blog_newest_comment" title="Recent Comments" list_count="10" mid_list="{$layout_info->mid}" />
<!-- 엮인글들 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_trackback" skin="blog_newest_trackback" colorset="{$layout_info->colorset}" title="Recent Trackbacks" list_count="5" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_trackback" skin="blog_newest_trackback" title="Recent Trackbacks" list_count="5" mid_list="{$layout_info->mid}" />
<!-- 꼬리표들 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="tag_list" skin="blog_tag_list" colorset="{$layout_info->colorset}" title="Site Tags" list_count="60" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="tag_list" skin="blog_tag_list" title="Site Tags" list_count="60" mid_list="{$layout_info->mid}" />
<!-- 월별 현황들 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="archive_list" skin="blog_archive_list" colorset="{$layout_info->colorset}" title="Archives" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="archive_list" skin="blog_archive_list" title="Archives" mid_list="{$layout_info->mid}" />
<!-- 달력 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="calendar" skin="blog_calendar_list" colorset="{$layout_info->colorset}" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="calendar" skin="blog_calendar_list" mid_list="{$layout_info->mid}" />
<!-- 카운터 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="image_counter" widget_margin_left="5px" widget_margin_bottom="10px" graph_width="170" graph_height="100" day_range="5" />

View file

@ -1,6 +1,11 @@
<!-- 검색된 글 목록이 있고 권한이 있을 경우 출력 -->
<!--@if($document_list && $grant->list)-->
<!--@if($grant->list)-->
<!--@if($oDocument->isExists())-->
<!--#include("./view_document.html")-->
<!--@end-->
<!--@if($document_list)-->
<!--@if($search_keyword)-->
<!-- 검색어가 사용되었을 경우 목록형태로 출력 -->
<!--#include("./style.list.html")-->
@ -11,10 +16,8 @@
<!--#include("./view_document.html")-->
<!--@end-->
<!--@end-->
<!--@end-->
<!-- 페이지 네비게이션 -->
<!-- 페이지 네비게이션 -->
<div class="pageNavigation">
<a href="{getUrl('page','','document_srl','')}" class="goToFirst"><img src="./images/common/bottomGotoFirst.gif" alt="{$lang->first_page}" width="7" height="5" /></a>
<!--@while($page_no = $page_navigation->getNextPage())-->
@ -26,3 +29,5 @@
<!--@end-->
<a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="goToLast"><img src="./images/common/bottomGotoLast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
</div>
<!--@end-->
<!--@end-->

View file

@ -2,7 +2,7 @@
<!--#include("header.html")-->
<div class="blogWrite">
<form action="./" method="post" onsubmit="return procFilter(this, insert)" <!--@if($grant->fileupload)-->enctype="multipart/form-data"<!--@end--> class="blogEditor" id="fo_write">
<form action="./" method="post" onsubmit="return procFilter(this, window.insert)" <!--@if($grant->fileupload)-->enctype="multipart/form-data"<!--@end--> class="blogEditor" id="fo_write">
<fieldset>
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="content" value="{$oDocument->getContentText()}" />

View file

@ -6,6 +6,6 @@ body { margin:10px; }
.menuListZone td { vertical-align:top; }
.menuListZone td.category_zone { padding-right:10px; }
#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; width:250px; overflow:hidden; float:left; }
#category_info { margin-left:10px; width:560px; _width:540px; float:left; }
#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; width:250px; overflow:hidden; float:left; position:absolute; left:10px;}
#category_info { margin-left:10px; width:560px; _width:540px; float:left; position:absolute; right:10px;}
*:first-child+html #category_info { width:550px; }

View file

@ -8,12 +8,12 @@
<!-- 목록 -->
<table cellspacing="0" class="adminTable">
<col width="50" />
<col width="120" />
<col width="130" />
<col />
<col width="80" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="60" />
<col width="60" />
<col width="60" />
<thead>
<tr>
<th scope="col">{$lang->no}</th>

View file

@ -172,7 +172,12 @@ function hideCategoryInfo() {
function completeGetCategoryTplInfo(ret_obj, response_tags) {
var obj = xGetElementById('category_info');
obj.style.marginTop = xScrollTop()+'px';
if(xScrollTop()>200) {
obj.style.marginTop = ( xScrollTop() - 210 )+'px';
} else {
obj.style.marginTop = '0px';
}
var tpl = ret_obj['tpl'];
xInnerHtml(obj, tpl);
obj.style.display = 'block';
@ -180,6 +185,7 @@ function completeGetCategoryTplInfo(ret_obj, response_tags) {
var fo_obj = xGetElementById("fo_category");
fo_obj.category_title.focus();
/*
var x = _xPos + 50;
var y = _yPos - xHeight(obj)/2+ xScrollTop();
xLeft(obj, x);
@ -191,6 +197,7 @@ function completeGetCategoryTplInfo(ret_obj, response_tags) {
}
if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter();
*/
}
/* 카테고리 아이템 입력후 */

View file

@ -22,6 +22,7 @@
// action forward에 등록 (관리자 모드에서 사용하기 위함)
$oModuleController = &getController('module');
$oModuleController->insertActionForward('board', 'view', 'dispBoardAdminContent');
$oModuleController->insertActionForward('board', 'view', 'dispBoardTagList');
$oModuleController->insertActionForward('board', 'view', 'dispBoardAdminBoardInfo');
$oModuleController->insertActionForward('board', 'view', 'dispBoardAdminInsertBoard');
$oModuleController->insertActionForward('board', 'view', 'dispBoardAdminDeleteBoard');
@ -76,6 +77,11 @@
**/
if(!$oModuleModel->getActionForward('dispBoardAdminBoardAdditionSetup')) return true;
/**
* 2007. 11. 27 : 태그 목록 보기 액션 설정
**/
if(!$oModuleModel->getActionForward('dispBoardTagList')) return true;
return false;
}
@ -96,6 +102,12 @@
if(!$oModuleModel->getActionForward('dispBoardAdminBoardAdditionSetup'))
$oModuleController->insertActionForward('board', 'view', 'dispBoardAdminBoardAdditionSetup');
/**
* 2007. 11. 27 : 태그 목록 보기 액션 설정
**/
if(!$oModuleModel->getActionForward('dispBoardTagList'))
$oModuleController->insertActionForward('board', 'view', 'dispBoardTagList');
return new Object(0, 'success_updated');
}

View file

@ -124,11 +124,11 @@
$args->order_type = Context::get('order_type');
// 스킨에서 설정한 기본 정렬 대상을 구함
if(!$args->sort_index) $args->sort_index = $this->module_info->order_target?$this->module_info->order_target:'newest';
if(!$args->sort_index) $args->sort_index = $this->module_info->order_target?$this->module_info->order_target:'list_order';
if(!$args->order_type) $args->order_type = $this->module_info->order_type?$this->module_info->order_type:'asc';
// 만약 document_srl은 있는데 page가 없다면 글만 호출된 경우 page를 구해서 세팅해주자..
if($document_srl && ($oDocument->isExists()&&!$oDocument->isNotice()) && !$args->category_srl && !$args->search_keyword && $args->sort_index == 'newest' && $args->order_type == 'asc') {
if($document_srl && ($oDocument->isExists()&&!$oDocument->isNotice()) && !$args->category_srl && !$args->search_keyword && $args->sort_index == 'list_order' && $args->order_type == 'asc') {
$page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count);
Context::set('page', $page);
$args->page = $page;
@ -150,6 +150,37 @@
$this->setTemplateFile('list');
}
/**
* @brief 태그 목록 모두 보기
**/
function dispBoardTagList() {
// 권한 체크
if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted');
// 태그 모델 객체에서 태그 목록을 구해옴
$oTagModel = &getModel('tag');
$obj->mid = $this->module_info->mid;
$obj->list_count = 10000;
$output = $oTagModel->getTagList($obj);
// 내용을 랜던으로 정렬
if(count($output->data)) {
$numbers = array_keys($output->data);
shuffle($numbers);
if(count($output->data)) {
foreach($numbers as $k => $v) {
$tag_list[] = $output->data[$v];
}
}
}
Context::set('tag_list', $tag_list);
$this->setTemplateFile('tag_list');
}
/**
* @brief 작성 화면 출력

View file

@ -5,16 +5,19 @@
<title xml:lang="en">Board</title>
<title xml:lang="es">Tablero</title>
<title xml:lang="jp">掲示板</title>
<title xml:lang="ru">Форум</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">게시판의 기능을 담당하는 모듈. 게시판의 생성/추가 관리등의 관리자 기능도 포함합니다.</description>
<description xml:lang="zh-CN">给用户提供相应版面功能,将包含版面的生成/添加及版面管理等管理员功能。</description>
<description xml:lang="en">Module of the board''s function. Also includes administrator functions such as creating/managing boards.</description>
<description xml:lang="es">Módulo para la función del tablero. Incluye funciones de administración como crear/ agregar o el manejo de los tableros.</description>
<description xml:lang="jp">掲示板の機能を担うモジュールです。掲示板の生成・追加・管理などの管理者機能も含まれています。</description>
<description xml:lang="ru">Модуль для функционирования форума. Также включает в себя функции администратора такие как создание/управление форумами.</description>
</author>
</module>

View file

@ -46,6 +46,7 @@
</grants>
<permissions>
<permission action="dispBoardContent" target="manager" />
<permission action="dispBoardTagList" target="manager" />
<permission action="dispBoardWrite" target="manager" />
<permission action="dispBoardDelete" target="manager" />
<permission action="dispBoardReplyComment" target="manager" />
@ -76,6 +77,7 @@
</permissions>
<actions>
<action name="dispBoardContent" type="view" index="true" />
<action name="dispBoardTagList" type="view" />
<action name="dispBoardWrite" type="view" />
<action name="dispBoardDelete" type="view" />
<action name="dispBoardReplyComment" type="view" />

View file

@ -1,7 +1,7 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com) 翻訳RisaPapa
* @author zero (zero@nzeo.com) 翻訳RisaPapa、ミニミ
* @brief 掲示板(board)モジュールの基本言語パッケージ
**/
@ -12,5 +12,5 @@
$lang->cmd_module_config = '掲示板共通設定';
$lang->cmd_view_info = '掲示板情報';
$lang->about_board = "掲示板を生成、管理できる掲示板モジュールです。生成後、リストからモジュール名を選択すると詳細な設定ができます。掲示板のモジュール名はURLになりますので注意してください。 (ex : http://ドメイン/zb/?mid=モジュール名)";
$lang->about_board = "掲示板の生成、および管理する掲示板モジュールです。\n生成後、リストからモジュール名を選択すると詳細な設定ができます。\n掲示板のモジュール名はURLになりますので注意してください。 (ex : http://ドメイン/zb/?mid=モジュール名)";
?>

View file

@ -9,7 +9,7 @@
// 버튼에 사용되는 언어
$lang->cmd_board_list = '게시판 목록';
$lang->cmd_module_config = '게시판 공통 설정';
$lang->cmd_module_config = '게시판 공통 설정';
$lang->cmd_view_info = '게시판 정보';
$lang->about_board = "게시판을 생성하고 관리할 수 있는 게시판 모듈입니다.\n생성하신 후 목록에서 모듈이름을 선택하시면 자세한 설정이 가능합니다.\n게시판의 모듈이름은 접속 url이 되므로 신중하게 입력해주세요. (ex : http://도메인/zb/?mid=모듈이름)";

View file

@ -0,0 +1,16 @@
<?php
/**
* @file ru.lang.php
* @author zero <zero@nzeo.com> | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467;
* @brief Russian basic language pack for Zeroboard XE
**/
$lang->board = "Форум";
// слова, использованные в кнопке
$lang->cmd_board_list = 'Список форумов';
$lang->cmd_module_config = 'Общие настройки форума';
$lang->cmd_view_info = 'Информация форума';
$lang->about_board = "Этот модуль служит для создания и управления форумами.\nВы можете выбрать имя модуля из списка после создания для дополнительного конифигурирования.\nПожалуйста, будте осторожны с именем модуля форума, поскольку оно будет URL. (например : http://domain/zb/?mid=имя_модуля)";
?>

View file

@ -0,0 +1,86 @@
<!--@if($oDocument->getCommentCount())-->
<div id="reply" class="comment">
{@ $_comment_list = $oDocument->getComments() }
{@ $idx = 0 }
<!--@foreach($_comment_list as $key => $comment)-->
<a name="comment_{$key}"></a>
<div class="contentBox <!--@if($comment->get('depth')>0)-->indent_box<!--@end--> <!--@if($idx>0)-->top_border<!--@end-->">
<!--@if($comment->depth>0)-->
<div style="margin-left:{($comment->get('depth')*1.5)}em;">
<div class="indent">
<!--@end-->
<table cellspacing="0" width="100%">
<tr>
<td class="author">
<!--@if(!$comment->member_srl)-->
<!--@if($comment->get('homepage'))-->
<a href="{$comment->get('homepage')}" onclick="window.open(this.href);return false;">{$comment->getNickName()}</a>
<!--@else-->
{$comment->getNickName()}
<!--@end-->
<!--@else-->
<div class="member_{$comment->member_srl}">{$comment->getNickName()}</div>
<!--@end-->
</td>
<td align="right">
<span class="date">
<strong>{$comment->getRegdate('Y.m.d')}</strong> {$comment->getRegdate('H:i:s')}
<!--@if($grant->is_admin)-->
({$comment->get('ipaddress')})
<!--@end-->
<!--@if($comment->is_granted || !$comment->member_srl || $grant->is_admin)-->
<a href="{getUrl('act','dispBoardDeleteComment','comment_srl',$comment->comment_srl)}"><img src="./images/common/buttonDeleteX.gif" alt="{$lang->cmd_delete}" /></a>
<a href="{getUrl('act','dispBoardModifyComment','comment_srl',$comment->comment_srl)}"><img src="./images/common/buttonModifyE.gif" alt="{$lang->cmd_modify}" /></a>
<!--@end-->
<a href="{getUrl('act','dispBoardReplyComment','comment_srl',$comment->comment_srl)}"><img src="./images/common/buttonReply.gif" alt="{$lang->cmd_reply}" /></a>
</span>
</td>
</tr>
<tr>
<td colspan="2">
<!--@if(!$comment->isAccessible())-->
<!--%import("filter/input_password.xml")-->
<strong>{$lang->msg_is_secret}</strong>
<form action="./" method="get" onsubmit="return procFilter(this, input_password)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$comment->get('document_srl')}" />
<input type="hidden" name="comment_srl" value="{$comment->get('comment_srl')}" />
<div class="inputPassword">
<input type="password" name="password" class="inputTypeText" /><span class="button"><input type="submit" value="{$lang->cmd_input}" accesskey="s" /></span>
</div>
</form>
<!--@else-->
{$comment->getContent(true)}
<!--@end-->
</td>
</tr>
<!--@if($comment->hasUploadedFIles())-->
<tr>
<td colspan="2">
<div class="fileAttached">
<ul>
{@ $_uploaded_files = $comment->getUploadedFiles() }
<!--@foreach($_uploaded_files as $key => $file)-->
<li><img src="./images/common/iconFile.gif" alt="attached file" /><a href="{getUrl('')}{$file->download_url}">{$file->source_filename} ({FileHandler::filesize($file->file_size)})({number_format($file->download_count)})</a></li>
<!--@end-->
</ul>
</div>
<div class="clear"></div>
</td>
</tr>
<!--@end-->
</table>
<!--@if($comment->get('depth')>0)-->
</div>
</div>
<!--@end-->
</div>
{@ $idx++}
<!--@end-->
</div>
<!--@end-->

View file

@ -0,0 +1,67 @@
<!--#include("header.html")-->
<!-- 만약 댓글의 답을 다는 것이라면 원문 보여줌 -->
<!--@if($oSourceComment->isExists())-->
<div class="boardRead">
<div id="reply" class="comment topBorder">
<div class="contentBox">
<div class="content">
{$oSourceComment->getContent(false)}
</div>
<div class="member_{$oSourceComment->getMemberSrl()}">{$oSourceComment->getNickName()}</div>
<span class="date">
{$oSourceComment->getRegdate("Y.m.d H:i")}
<!--@if($grant->is_admin)-->
({$oSourceComment->get('ipaddress')})
<!--@end-->
</span>
</div>
</div>
</div>
<!--@end-->
<!-- 글쓰기 폼 -->
<!--%import("filter/insert_comment.xml")-->
<div class="boardWrite">
<form action="./" method="post" onsubmit="return procFilter(this, insert_comment)" <!--@if($grant->fileupload)-->enctype="multipart/form-data"<!--@end--> class="boardEditor" id="fo_comment_write" >
<fieldset>
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$oComment->get('document_srl')}" />
<input type="hidden" name="comment_srl" value="{$oComment->get('comment_srl')}" />
<input type="hidden" name="content" value="{htmlspecialchars($oComment->get('content'))}" />
<input type="hidden" name="parent_srl" value="{$oComment->get('parent_srl')}" />
<div class="userNameAndPw">
<!--@if(!$is_logged)-->
<label for="userName">{$lang->writer}</label>
<input type="text" name="nick_name" value="{$oComment->get('nick_name')}" class="userName inputTypeText" id="userName"/>
<label for="userPw">{$lang->password}</label>
<input type="password" name="password" value="" id="userPw" class="userPw inputTypeText" />
<label for="emailAddress">{$lang->email_address}</label>
<input type="text" name="email_address" value="{htmlspecialchars($oComment->get('email_address'))}" id="emailAddress" class="emailAddress inputTypeText"/>
<label for="homePage">{$lang->homepage}</label>
<input type="text" name="homepage" value="{htmlspecialchars($oComment->get('homepage'))}" id="homePage" class="homePage inputTypeText"/>
<!--@else-->
<input type="checkbox" name="notify_message" value="Y" <!--@if($oComment->useNotify())-->checked="checked"<!--@end--> id="notify_message" />
<label for="notify_message">{$lang->notify}</label>
<!--@end-->
<input type="checkbox" name="is_secret" value="Y" <!--@if($oComment->isSecret())-->checked="checked"<!--@end--> id="is_secret" />
<label for="is_secret">{$lang->secret}</label>
</div>
<div>{$comment_editor}</div>
<div class="tCenter"><input type="image" src="./images/common/btn_reply2.gif" accesskey="s" /></div>
</fieldset>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,19 @@
@charset "utf-8";
/* boardHeader */
.boardHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.boardList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; }
.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.boardList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;}
.boardList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;}
.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;}
.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;}
.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;}
.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;}
.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,19 @@
@charset "utf-8";
/* boardHeader */
.boardHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.boardList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; }
.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.boardList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;}
.boardList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;}
.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;}
.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;}
.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;}
.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;}
.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,585 @@
@charset "utf-8";
/*
NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/)
Jeong, Chan Myeong 070601~070630
*/
/* ----- List+Read+Write+Modify | Start ----- */
.boardHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;}
/* boardInformation */
.boardInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;}
.articleNum { float:left; padding:.5em 0 .5em 2.3em !important; font:.8em Tahoma; background:none !important;}
.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;}
.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;}
.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;}
.accountNavigation li a {}
/* boardList */
.boardList tr:first-child td, .boardList tr.first-child td {}
.boardList tr.notice {}
.boardList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;}
.boardList th a { color:#3e3f3e;}
.boardList th span.on { font-weight:bold;}
.boardList th.num { background-position:-3px bottom; padding:0;}
.boardList th select { height:20px; }
.boardList th.category { white-space:nowrap; }
.boardList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;}
.boardList th:first-child { background-position:-2px bottom;}
.boardList th.first-child { background-position:-2px bottom;}
.boardList th.author {}
.boardList th.title {}
.boardList th.reading { white-space:nowrap;}
.boardList th.recommend { white-space:nowrap;}
.boardList th.reply { white-space:nowrap;}
.boardList th.date {}
.boardList th.check { padding:0;}
.boardList th.user {}
.boardList th.registDate {}
.boardList th.checkDate {}
.boardList th.friendGroup {}
.boardList th.userId {}
.boardList th.userName {}
.boardList th.userNick {}
.boardList th.sendMessage {}
.boardList th.last-child { border-right:1px solid #ffffff;}
.boardList th .sort { padding:0 .2em; vertical-align:middle;}
.boardList th select,
.boardList th input { vertical-align:middle;}
.boardList td { padding:.3em; border-bottom:1px solid #e4e4e2;}
.boardList td.noline { border-bottom:none;}
.boardList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em; text-align:center;}
.boardList td.category {}
.boardList td.checkbox {text-align:center;}
.boardList td.thumb { padding:.5em 0 .5em .5em; table-layout:fixed; white-space:nowrap;}
.boardList td.thumb * { vertical-align:middle;}
.boardList td.title.bold { font-size:1em; font-weight:bold;}
.boardList td.title.bold a { position:relative; top:.3em;}
.boardList td.title * { vertical-align:middle;}
.boardList td.title,
.boardList td.title a { color:#444444; text-decoration:none; }
.boardList td.title a:visited { color:#777777;}
.boardList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;}
.boardList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
.boardList td.author a { font-size:1em; color:#333333;}
.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;}
.boardList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;}
.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center;}
.boardList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;}
.boardList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;}
.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;}
.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;}
.boardList td.summary a:visited { color:#999999;}
.boardList td.check { text-align:center;}
.boardList td.user { color:#333333; font-size:.9em;}
.boardList td.user a { color:#333333;}
.boardList td.userId { font:.9em Tahoma;}
.boardList td.userName {}
.boardList td.userNick { font-size:.9em; color:#999999;}
.boardList td.friendGroup {}
.boardList td.sendMessage { text-align:center; padding:0;}
.boardList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;}
*:first-child+html .boardList td.sendMessage .buttonFixedLeft { left:0;}
.boardList td input { _margin:-3px;}
.boardList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;}
.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;}
.boardList td .thumbnailSmall { margin:0 .3em 0 .3em;}
.boardList td .thumbnailSmall img {}
.boardList td .thumbnailMedium { margin:0 .3em 0 .3em;}
.boardList td .thumbnailMedium img {}
.boardList.thumbnail {}
.boardList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;}
.boardList.thumbnail div.cell { float:left; width:131px; margin:0 1.6em 0 0; padding-bottom:1.5em;}
.boardList.thumbnail div.cell .fix_img { width:131px; height:106px; overflow:hidden;}
.boardList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;}
.boardList.thumbnail div.title a { color:#444444;}
.boardList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;}
.boardList.thumbnail div.nameAndDate a { color:#999999;}
.boardList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;}
.boardList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;}
.boardList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;}
.boardList.thumbnail div.readAndRecommend .vr { color:#dddddd;}
.boardList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;}
/* boardSearch */
.boardSearch { margin-left:auto; margin-right:auto; clear:both; text-align:center;}
.boardSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; }
.boardSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.boardSearch * { vertical-align:middle;}
.boardSearch select { float:left;}
.boardSearch input { float:left; margin:0 .3em; background:#fbfbfb;}
.searchButton ul { overflow:hidden;}
.searchButton li { float:left; margin-right:.3em; list-style:none;}
.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;}
/* pageNavigation */
.pageNavigation { float:left; display:block; margin:2.2em 0 2em 1.1em; font:bold .8em Tahoma; }
.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.pageNavigation a:hover { text-decoration:none; }
.pageNavigation a.goToFirst,
.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;}
.pageNavigation a.goToFirst img,
.pageNavigation a.goToLast img { vertical-align:middle;}
.buttonBox { float:right; margin:1.2em 0 0 0; }
/* boardRead */
#blog .boardRead { position:relative; margin:0; _overflow:hidden;}
.boardRead .originalContent { padding:2em 0 2em 0;}
.boardRead .titleAndCategory { float:left;}
.boardRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;}
.boardRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;}
.boardRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;}
.boardRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;}
.boardRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;}
.boardRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;}
.boardRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;}
.boardRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;}
.boardRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;}
.boardRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;}
.boardRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;}
.boardRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;}
.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;}
.boardRead .readBody p { margin:1em 0; line-height:1.5em;}
.boardRead .contentBody { width:100%; overflow:hidden; }
.boardRead .userInfo { float:left; white-space:nowrap;}
.boardRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;}
.boardRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; }
/* extraVars list */
.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;}
.extraVarsList tr.notice { background:#f8f8f8;}
.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;}
.extraVarsList tr.bg1 { background:#ffffff}
.extraVarsList tr.bg2 { background:#fbfbfb;}
.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;}
.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;}
.boardRead .readFooter { border-top:1px solid #dfe0db; }
.boardRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; }
.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;}
.boardRead .readFooter .tag ul,
.boardRead .readFooter .tag li { display:inline;}
.boardRead .readFooter .tag a { color:#444444; text-decoration:none;}
.boardRead .readFooter .tag .tagIcon { vertical-align:middle;}
.boardRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;}
.boardRead .readFooter .fileAttached h5 {}
.boardRead .readFooter .fileAttached ul { margin-left:1.8em;}
.boardRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;}
.boardRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; }
.boardRead .readFooter .fileAttached li a:visited { color:#777777;}
.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; }
.boardRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;}
.boardRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;}
.boardRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; }
.boardRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;}
.boardRead .replyAndTrackback li.selected a { color:#666666;}
.boardRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;}
/*.boardRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;}*/
/*.boardRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;}*/
.boardRead #reply,
.boardRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;}
.boardRead #reply { }
.boardRead #trackback { display:none;}
.boardRead .topBorder { border-top:1px solid #EAEAEA; }
.boardRead #reply .contentBox,
.boardRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;}
.boardRead #reply .top_border,
.boardRead #trackback .top_border { border-top:1px dashed #d8d8d8; }
.boardRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; }
.boardRead .contentBox .author { overflow:hidden; color:#3173a3;}
.boardRead .contentBox .author a { overflow:hidden; color:#3173a3; text-decoration:none;}
.boardRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; }
.boardRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; }
.boardRead .contentBox .replyOption img { vertical-align:middle;}
.boardRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; }
.boardRead .contentBox .fileAttached h5 {}
.boardRead .contentBox .fileAttached ul { margin-bottom:.5em;}
.boardRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;}
.boardRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; }
.boardRead .contentBox .fileAttached li a:visited { color:#777777;}
.boardRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;}
.boardRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; }
.boardRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; }
.boardRead .indent_box { background-color:#FBFBFB; }
.boardRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;}
/* boardEditor */
.boardEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;}
.boardEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;}
.boardEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;}
.boardEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;}
.boardEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;}
.boardEditor .userNameAndPw * { vertical-align:middle;}
.boardEditor .userNameAndPw label { margin-right:.2em; color:#666760;}
.boardEditor .userNameAndPw input { color:#aaaaaa;}
.boardEditor .userNameAndPw .userName { width:6em; margin-right:.8em;}
.boardEditor .userNameAndPw .userPw { width:5em;}
.boardEditor .userNameAndPw .emailAddress { width:6em;}
.boardEditor .userNameAndPw .homePage { width:6em;}
.boardEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;}
/* boardWrite */
.boardWrite { width:100%; position:relative;}
.boardWrite .userNameAndPw { margin-bottom:-1px;}
.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;}
.boardWrite div.title input#title { width:60%;}
.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;}
.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;}
.boardWrite .option dd * { vertical-align:middle;}
.boardWrite .inputTypeText { background:#fbfbfb;}
.boardWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;}
.boardWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;}
.boardWrite .trackbackURI .inputTypeText { width:50%;}
.boardWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;}
.boardWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;}
.boardWrite .tag .inputTypeText { width:50%;}
.boardWrite .tag .help { vertical-align:middle;}
.boardWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;}
.boardWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;}
.boardWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;}
.boardWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;}
.boardWrite .extra_vars ul li { float:left; margin-right:1em; }
/* ----- List+Read+Write+Modify | End ----- */
/* ----- Blog | Start ----- */
#blog #bodyWrap #login_menu { padding:0 1.2em;}
#blog #bodyWrap #login_menu .member { float:right}
#blog #bodyWrap #login_menu .member li {display:inline; margin:0 0 0 -.1em; padding:0 .6em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;}
#blog #bodyWrap #login_menu .login {float:right}
/* Blog header Child*/
#blog #header h1 { font:bold 1.3em ; margin:2em 0 .4em 30px; letter-spacing:-.05em; }
#blog #header h1 a { color:#FFFFFF;}
#blog #header #tagLine { padding:0 0 0 30px; color:#f6c8c8;}
#blog #header #globalNavigation { width:100%; margin:2.4em 0 0 0; padding:.8em 0 .8em 53.5em; background:#e4e4e4; overflow:hidden;}
#blog #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/bar_1x10_c0c0c0.gif) no-repeat left bottom;}
#blog #header #globalNavigation li.no_bg { background:none;}
#blog #header #globalNavigation li a { display:block; float:left; padding:0 1.2em; font:bold .8em Tahoma; color:#54564b; white-space:nowrap;}
#blog #header #globalNavigation li.on a { color:#ee2126;}
/* Column Left & Right Common Child */
.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;}
.boxTypeB { position:relative; margin-bottom:.7em;}
.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;}
*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;}
.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;}
.boxTypeB .showHide { position:relative;}
.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;}
.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;}
.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;}
.boxTypeB .optionList li.on a { color:#000000;}
.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;}
.boxTypeB .showAll.no_bg { background:none;}
/* Profile */
#blog div#profile { padding:6px; overflow:hidden;}
#blog div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;}
#blog div#profile dl#hello {}
#blog div#profile dl#hello dt { color:#333333; margin-bottom:.5em;}
#blog div#profile dl#hello dt a { color:#333333;}
#blog div#profile dl#hello dd { color:#777777; margin-bottom:1em;}
#blog div#profile ul#admin { overflow:hidden; height:1.2em;}
#blog div#profile ul#admin li { float:left; padding:0 .4em; font:.8em tahoma;}
#blog div#profile ul#admin li a { display:block;}
#blog div#profile ul#admin li.write a {}
#blog div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;}
#blog div#profile ul#admin li.setup a {}
#blog div#profile ul#admin li a { color:#666666;}
/* Category */
#blog div#category {}
#blog div#category #categoryList { padding:1em .8em .5em .8em;}
#blog div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;}
#blog div#category #categoryList li li {}
#blog div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;}
#blog div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;}
/* Search Box */
#blog div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden;}
#blog div#searchBox fieldset { border:none;}
#blog div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
/* Tags */
#blog div#tag { padding-bottom:1em;}
#blog div#tag .tagList { padding:1.2em; overflow:hidden;}
#blog div#tag .tagList li { display:inline; color:#a4a4a4; margin-right:.1em; line-height:1.5em;}
#blog div#tag .tagList li a { color:#a4a4a4;}
#blog div#tag .tagList li.typeA a { color:#717171; font-weight:bold;}
#blog div#tag .tagList li.typeB a { color:#3d3d3d;}
#blog div#tag .tagList li.typeC a { font-weight:bold;}
#blog div#tag .tag_sort { width:100%; border-top:1px dashed #ababab; border-bottom:1px dashed #ababab; text-align:center; overflow:hidden;}
/* Neighbor */
#blog div#neighbor {}
#blog div#neighbor #neighborList { padding:1.2em 1.2em 0 1.2em;}
#blog div#neighbor #neighborList li { padding:0 0 .7em 1.2em; background:url(../images/common/iconPlus2.gif) no-repeat left top;}
#blog div#neighbor #neighborList li img { padding-left:.3em; top:.1em;}
#blog div#neighbor #neighborList li a { display:inline-block; color:#6b6b6b; font-weight:bold;}
#blog div#neighbor #neighborList li ul { display:none; padding:.7em 0 0 0;}
#blog div#neighbor #neighborList li ul li { padding:0 0 .6em .6em; margin-left:-.6em; background:url(../images/common/iconLineBD.gif) no-repeat left 5px;}
#blog div#neighbor #neighborList li ul li a{ font-weight:normal;}
/* Calendar */
#blog div#calendar {}
#blog div#calendar table { width:100%; background:url(../images/common/bg_line_dot_x.gif) repeat-x left top;}
#blog div#calendar table caption { font:bold 1em ; color:#ec1a25; padding:1em;}
#blog div#calendar table caption .mm { font:bold 1em ; color:#555650;}
#blog div#calendar table caption a { padding:.2em;}
#blog div#calendar table caption a img { vertical-align:middle;}
#blog div#calendar table th { padding:.6em 0;}
#blog div#calendar table td { padding:.25em 0;}
#blog div#calendar table th { font:bold .7em tahoma; color:#717171;}
#blog div#calendar table th.sun { color:#000000;}
#blog div#calendar table td { text-align:center;}
#blog div#calendar table td a { font:.7em Tahoma; color:#9a9a9a;}
#blog div#calendar table td.sun { color:#000000;}
#blog div#calendar table td.sun a { color:#000000;}
#blog div#calendar table td.today a { font-weight:bold; color:#54564b;}
#blog div#calendar table td.posted a { text-decoration:underline;}
#blog .boardWrite div.title { border-top:2px solid #ed1b24;}
#blog .write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em ;}
/* ----- Blog | End ----- */
/* ----- Member | Start ----- */
.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;}
.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;}
.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;}
.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;}
.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;}
.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;}
.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;}
.memberInformation .instantMessage li { float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;}
.memberInformation .instantMessage li a {white-space:nowrap; color:#666666;}
.memberInformation .instantMessage li.on a { background-position:left -14px; font-weight:bold;}
.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;}
/* 친구목록 */
.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse;}
.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.memberList th.check { padding:0;}
.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;}
.memberList th select,
.memberList th input { vertical-align:middle;}
.memberList th.repeat_bg { background:#ffffff url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom;}
.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;}
.memberList td.noline { border-bottom:none;}
.memberList td.check { text-align:center;}
.memberList td.friendGroup { }
.memberList td.userId { text-align:center; font:.9em Tahoma;}
.memberList td.userName { text-align:center;}
.memberList td.userNick { text-align:center; color:#999999;}
.memberList td.registDate { text-align:center; font:.8em Tahoma;}
.memberList td.sendMessage { text-align:center;}
.smallBox { margin:5em auto 1em auto;}
.smallBox.w268 { width:268px;}
.smallBox.w298 { width:298px;}
.smallBox.w498 { width:498px;}
.smallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;}
.smallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em;}
.smallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;}
.smallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.smallBox .login dl { overflow:hidden; width:162px; float:left;}
.smallBox .login dl dt { float:left; width:55px; color:#54564b; height:22px; padding-top:5px;}
.smallBox .login dl dd { float:left; width:105px; height:27px;}
.smallBox .login dl dd input { width:90px;}
.smallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;}
*:first-child+html .smallBox .login .loginButton { margin-top:28px;}
.smallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:55px; _left:52px;}
*:first-child+html .smallBox .login .keep { left:52px;}
.smallBox .login .keep input { vertical-align:middle;}
.smallBox .login .keep label { font-size:11px; color:#999999;}
.smallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; height:1em;}
.smallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;}
.smallBox .help li:first-child { background:none;}
.smallBox .help li.first-child { _background:none;}
.smallBox .help li a { font-size:11px; color:#54564b;}
.smallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;}
.smallBox .text p { margin-bottom:.5em;}
.smallBox .button img { vertical-align:top;}
.smallBox.w268 .button ul { position:absolute; left:79px; }
.smallBox.w298 .button ul { position:absolute; left:110px; }
.smallBox.w498 .button ul { position:absolute; left:220px; }
.smallBox .button ul li { float:left; margin-right:.3em;}
.smallBox .complex { padding:1.5em 2em 2em 2em;}
.smallBox .friend { width:100%;}
.smallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;}
.smallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;}
.smallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;}
.smallBox .leftHeaderType th,
.smallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;}
.smallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;}
.smallBox .leftHeaderType td { color:#444444;}
.smallBox .inputTypeText { background:#fbfbfb;}
.smallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;}
.smallBox .group select { float:left; width:180px; margin-top:1px;}
.smallBox .pwModify { border:none;}
.smallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.smallBox .pwModify input { width:9em;}
.smallBox .pwModify br { display:block; margin-bottom:.2em}
.smallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;}
/* messageList */
.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse;}
.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;}
.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.messageList th:first-child,
.messageList th.first-child { background-position:-3px bottom;}
.messageList th.author { background:url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;}
.messageList th.check { padding:0;}
.messageList th select,
.messageList th input { vertical-align:middle;}
.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;}
.messageList td.noline { border-bottom:none;}
.messageList td.category {}
.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;}
.messageList tr.notice td img { margin:-.1em .3em 0 0;}
.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;}
.messageList td.thumb * { vertical-align:middle;}
.messageList td.title {}
.messageList td.title.bold { font-size:1em; font-weight:bold;}
.messageList td.title.bold a { position:relative; top:.3em;}
.messageList td.title * { vertical-align:middle;}
.messageList td.title,
.messageList td.title a { color:#444444;}
.messageList td.title a:visited { color:#777777;}
.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
.messageList td.author a { font-size:1em; color:#333333;}
.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;}
.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;}
.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;}
.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;}
.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;}
.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;}
.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;}
.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;}
.messageList td.summary a:visited { color:#999999;}
.messageList td.check { text-align:center;}
.messageList td.user { color:#333333; font-size:.9em;}
.messageList td.user a { color:#333333;}
.messageList td.userId { font:.9em Tahoma;}
.messageList td.userNick { font-size:.9em; color:#999999;}
.messageList td.sendMessage { text-align:center; padding:0;}
.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;}
.readMessage { margin-bottom:2em;}
.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;}
.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;}
.readMessage .messageHeader address { float:right; white-space:nowrap;}
.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;}
.readMessage .messageHeader address em a { color:#333333;}
.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;}
.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;}
.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;}
.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;}
.readMessage .button { position:relative; background:#f7f7f7; border-top:1px solid #ee2b33; border-bottom:2px solid #ee2b33; overflow:hidden; padding:.7em; text-align:center;}
.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;}
.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;}
.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;}
.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;}
.joinTable { width:100%;}
.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;}
.joinTable th,
.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;}
.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;}
.joinTable th { width:10em;}
.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;}
.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;}
.joinTable td input.radio,
.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;}
.joinTable td input.w4em { width:4em;}
.joinTable td input.w2em { width:2em;}
.joinTable td select { float:left; margin-right:.5em;}
.joinTable td .fl { margin-right:.5em;}
.joinTable td br { clear:both;}
.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;}
.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;}
.joinTable td a { color:#333333;}
.joinTable .no_line { border:none;}
.join_button { margin:1em 0 0 0; text-align:center;}
.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;}
.buttonTypeWrite.join { margin-top:1.2em;}
/* ----- Member | End ----- */
/* gallery sub menu */
.boardSubMenu { margin:0 0 .5em 0; padding:1em 0 .5em .5em; border-bottom:1px solid #e0e1db;}
.boardSubMenu a { text-decoration:none; color:#666666; vertical-align:bottom; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 5px; padding-left:10px; padding-right:10px; _padding-top:5px; position:relative; top:5px; }
.boardSubMenu img.sort { vertical-align:middle; }
.thumbnailBox { margin-top:1em; clear:both; overflow:hidden; border-bottom:1px solid #e0e1db; }
.thumbnailBox div.cell { display:block; float:left; overflow:hidden; margin-bottom:1em; margin-right:1em;}
.thumbnailBox div.cell img.thumb { padding:2px; border:1px solid #e0e1db; display:block; margin-bottom:1em; margin-left:auto;margin-right:auto;}
.thumbnailBox div.title { color:#3B96C0; margin-bottom:.2em; overflow:hidden; white-space:nowrap; text-align:center;}
.thumbnailBox div.title a { color:#3B96C0; text-decoration:none;}
.thumbnailBox div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; text-align:center;}
.thumbnailBox div.nameAndDate a { color:#999999;}
.thumbnailBox div.nameAndDate .author { margin-left:auto; margin-right:right; }
.thumbnailBox div.nameAndDate .author div { display:inline; vertical-align:middle;}
.thumbnailBox div.nameAndDate .date { font:.8em Tahoma; color:#999999;}
.thumbnailBox div.readAndRecommend { font-size:.9em; color:#666666; text-align:center;}
.thumbnailBox div.readAndRecommend .num { font:.8em Tahoma;}
.thumbnailBox div.readAndRecommend .vr { color:#dddddd;}
.thumbnailBox div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#ff6600;}
.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;}
.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;}
.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
/* list button */
.leftButtonBox { float: left; margin-top:1em;}
.rightButtonBox { float: right; margin-top:1em;}
/* 게시물의 팝업 메뉴 */
.comment_popup_menu, .document_popup_menu { text-align:right; margin-top:3em; clear:both; display:block; background:url(../images/common/document_menu.gif) no-repeat right top; padding-right:16px; height:18px; }
.comment_popup_menu span, .document_popup_menu span { cursor:pointer; display:inline; background:none; padding:0 0 0 0; margin:0 0 0 0; }
/* tag list */
.tagsBox { border:1px solid #EEEEEE; padding:10px; overflow:hidden;}
.tags { width:100%; }
.tags div { float:left; padding:2px; margin-right:10px; overflow:hidden; white-space:nowrap; height:15px;}
.tags div a { text-decoration:none; color:#555555; line-height:150%;}
.tags div a:hover { background-color:#888888; color:#FFFFFF;}
.tags .tagTypeA a { color:#fe3614; font-weight:bold; font-size:12pt; background-color:#EFEFEF; margin:0;}
.tags .tagTypeB a { color:#fe3614; font-size:11pt; margin:0;}
.tags .tagTypeC a { font-weight:bold; font-size:11pt; margin:0; background-color:#EFEFEF;}
.tags .tagTypeD a { font-weight:bold; margin:0; background-color:#EFEFEF;}
.tags .tagTypeE a { font-weight:normal; margin:0;}
.searchNextButton { border:1px solid #979797; border-left:1px solid #B1B1B1; border-top:1px solid #B1B1B1; color:#4F4F4F; height:21px; font-size:8pt; padding-left:5px; padding-right:5px; _padding-top:3px;}
*:first-child+html .searchNextButton { padding-top:3px; }

View file

@ -0,0 +1,20 @@
@charset "utf-8";
/* boardHeader */
.boardHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.boardList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; }
.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.boardList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;}
.boardList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;}
.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;}
.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;}
.boardWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;}
.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;}
.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,19 @@
@charset "utf-8";
/* boardHeader */
.boardHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.boardList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; }
.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.boardList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;}
.boardList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;}
.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;}
.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;}
.boardWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;}
.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;}
.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,19 @@
@charset "utf-8";
/* boardHeader */
.boardHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.boardList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; }
.boardList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.boardList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;}
.boardList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.boardRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;}
.boardRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;}
.boardRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;}
.boardWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;}
.boardWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;}
.boardWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,24 @@
<!--%import("filter/delete_comment.xml")-->
<!--#include("header.html")-->
<div class="smallBox w268">
<div class="header">
<h3>{$lang->confirm_delete}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, delete_comment)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="comment_srl" value="{$comment_srl}" />
<div class="inputPassword tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></span>
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_cancel}</span></a>
</div>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,23 @@
<!--%import("filter/delete_document.xml")-->
<!--#include("header.html")-->
<div class="smallBox w268">
<div class="header">
<h3>{$lang->confirm_delete}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, delete_document)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<div class="inputPassword tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></span>
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_cancel}</span></a>
</div>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,25 @@
<!--%import("filter/delete_trackback.xml")-->
<!--#include("header.html")-->
<div class="smallBox w268">
<div class="header">
<h3>{$lang->confirm_delete}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, delete_trackback)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="trackback_srl" value="{$trackback_srl}" />
<div class="inputPassword tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></span>
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_cancel}</span></a>
</div>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,65 @@
<!-- 이 파일은 extra_vars의 form을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
<!-- type=select,checkbox이고 기본값이 , 로 연결되어 있으면 , 를 기준으로 explode하여 배열로 만든다 -->
<!--@if(in_array($val->type,array('select','checkbox'))&&strpos($val->default,",")!==false)-->
{@ $val->default = explode(',',$val->default) }
<!--@end-->
<!-- 확장변수의 이름을 지정 -->
{@ $val->column_name = "extra_vars".$key}
<!-- 확장변수의 값을 documentItem::getExtraValue로 가져옴 -->
{@ $val->value = $oDocument->getExtraValue($key)}
<!-- 일반 text -->
<!--@if($val->type == 'text')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w400" />
<!-- 홈페이지 주소 -->
<!--@elseif($val->type == 'homepage')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w400" />
<!-- Email 주소 -->
<!--@elseif($val->type == 'email_address')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w400" />
<!-- 전화번호 -->
<!--@elseif($val->type == 'tel')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[0])}" size="4" class="inputTypeText" />
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[1])}" size="4" class="inputTypeText" />
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[2])}" size="4" class="inputTypeText" />
<!-- textarea -->
<!--@elseif($val->type == 'textarea')-->
<textarea name="{$val->column_name}" class="inputTypeTextArea w400">{htmlspecialchars($val->value)}</textarea>
<!-- 다중 선택 -->
<!--@elseif($val->type == 'checkbox')-->
<!--@if($val->default)-->
<ul style="list-style:none;">
<!--@foreach($val->default as $v)-->
<li><input type="checkbox" name="{$val->column_name}" value="{$v}" <!--@if(is_array($val->value)&&in_array($v, $val->value))-->checked="checked"<!--@end-->/> {$v}</li>
<!--@end-->
</ul>
<!--@end-->
<!-- 단일 선택 -->
<!--@elseif($val->type == 'select')-->
<select name="{$val->column_name}">
<!--@if($val->default)-->
<!--@foreach($val->default as $v)-->
<option value="{$v}" <!--@if($v == $val->value)-->selected="selected"<!--@end-->>{$v}</option>
<!--@end-->
<!--@end-->
</select>
<!-- 날짜 입력 -->
<!--@elseif($val->type == 'date')-->
<input type="hidden" name="{$val->column_name}" id="date_{$val->column_name}" value="{$val->value}" />
<div class="fl inputTypeText w80" id="str_{$val->column_name}">{zdate($val->value,"Y-m-d")}</div>
<a href="#" onclick="open_calendar('{$val->column_name}','{$val->value}');return false;" class="button"><span>{$lang->cmd_open_calendar}</span></a>
<!--@end-->
<!--@if($val->desc)-->
<p class="info">{$val->desc}</p>
<!--@end-->

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