diff --git a/.htaccess b/.htaccess index aad260ec1..e7cb32774 100644 --- a/.htaccess +++ b/.htaccess @@ -1,9 +1,17 @@ RewriteEngine On # image... -RewriteRule ^([a-zA-Z0-9_]+)/files/attach/images/(.*) ./files/attach/images/$2 [L] -RewriteRule ^([a-zA-Z0-9_]+)/modules/(.*) ./modules/$2 [L] -RewriteRule ^([a-zA-Z0-9_]+)/common/(.*) ./common/$2 [L] +RewriteRule ^(.+)/files/attach/images/(.*) ./files/attach/images/$2 [L] +RewriteRule ^(.+)/files/attach/menu_button/(.*) ./files/attach/menu_button/$2 [L] +RewriteRule ^(.+)/files/member_extra_info/(.*) ./files/member_extra_info/$2 [L] +RewriteRule ^(.+)/files/cache/(.*) ./files/cache/$2 [L] +RewriteRule ^(.+)/modules/(.*) ./modules/$2 [L] +RewriteRule ^(.+)/common/css/(.*) ./common/css/$2 [L] +RewriteRule ^(.+)/common/js/(.*) ./common/js/$2 [L] +RewriteRule ^(.+)/common/tpl/(.*) ./common/tpl/$2 [L] +RewriteRule ^(.+)/widgets/(.*) ./widgets/$2 [L] +RewriteRule ^(.+)/layouts/(.*) ./layouts/$2 [L] +RewriteRule ^(.+)/addons/(.*) ./addons/$2 [L] # page RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)page$ ./index.php?mid=$1&page=$2 [L] diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php index 27dbb978f..d5fc3879a 100644 --- a/addons/blogapi/blogapi.addon.php +++ b/addons/blogapi/blogapi.addon.php @@ -119,8 +119,21 @@ // 파일 업로드 case 'metaWeblog.newMediaObject' : // 파일 업로드 권한 체크 - if(!$this->grant->fileupload) { - printContent( getXmlRpcFailure(1, 'no permission') ); + $oFileModel = &getModel('file'); + $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl); + if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) { + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y') { + $is_permitted = false; + for($i=0;$idownload_grant);$i++) { + $group_srl = $file_module_config->download_grant[$i]; + if($logged_info->group_list[$group_srl]) { + $is_permitted = true; + break; + } + } + if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') ); + } } $fileinfo = $params[3]->value->struct->member; diff --git a/addons/blogapi/conf/info.xml b/addons/blogapi/conf/info.xml index 17f8edb91..416de9f5a 100644 --- a/addons/blogapi/conf/info.xml +++ b/addons/blogapi/conf/info.xml @@ -33,9 +33,9 @@ This blogApi addon supports metaWeblog. - Toggling this with use option lets RSD tag be exposed for each module. + By using this option, it lets the RSD tag to be exposed to each module. URL to the api is http://setup_path/module_name/api. - Only selecting use option enables RSD tag and api to behave. + RSD tag and the api will work only if u use this addon. Este blogApi addon soporta el metaWeblog. diff --git a/addons/counter/conf/info.xml b/addons/counter/conf/info.xml index 54ff175d1..e8dc0179c 100644 --- a/addons/counter/conf/info.xml +++ b/addons/counter/conf/info.xml @@ -27,7 +27,7 @@ This addon logs access information based on the basic counter module within Zeroboard XE. - It is necessary for aggregation of access information to turn on this addon. + The access information will be collected only if you turn on this addon. Este addon contador básico de Zeroboard XE permite llevar la información de acceso a la página web de los visitantes. diff --git a/addons/counter/counter.addon.php b/addons/counter/counter.addon.php index fc2bed4ae..6e7f2c75a 100644 --- a/addons/counter/counter.addon.php +++ b/addons/counter/counter.addon.php @@ -13,7 +13,7 @@ **/ // called_position가 before_module_init 이고 module이 admin이 아닐 경우 - if($called_position == 'before_module_init' && !$GLOBALS['__counter_addon_called__']) { + if($called_position == 'before_module_init' && !$GLOBALS['__counter_addon_called__'] && !in_array(Context::get('act'), array('procCounterExecute','procFileDelete'))) { if($this->module != 'admin') Context::addJsFile('./modules/counter/tpl/js/counter.js'); $GLOBALS['__counter_addon_called__'] = true; } diff --git a/addons/google_analytics/conf/info.xml b/addons/google_analytics/conf/info.xml index 3cea23912..be7d19bc6 100644 --- a/addons/google_analytics/conf/info.xml +++ b/addons/google_analytics/conf/info.xml @@ -3,12 +3,14 @@ Google Analytics Google Analytics Google Analytics + Google Analytics Google Analytics Google Analyticsアドオン 제로 Zero Zero + Zero Zero Zero @@ -18,7 +20,10 @@ 可以添加Google Analytics代码。 - Google Analytics + This addon inserts Google Analytics code to site. + + + Este addon inserciones Google Analytics código de sitio. Google Analytics @@ -32,11 +37,13 @@ uacct uacct uacct + Uacct uacct uacct Google Analytics 코드의 _uacct 값을 입력해주세요. 请输入Google Analytics代码的_uacct值。 - Google Analytics _uacct + Please input _uacct from Google Analytics code. + Por favor, de entrada _uacct código de Google Analytics. Google Analytics _uacct Google Analyticsコードの「_uacct」の値を入力してください。 diff --git a/addons/lemonpen/conf/info.xml b/addons/lemonpen/conf/info.xml index a344a091e..a71fc7a33 100644 --- a/addons/lemonpen/conf/info.xml +++ b/addons/lemonpen/conf/info.xml @@ -1,18 +1,33 @@ LemonPen XE 애드온 + LemonPen XE Addon + LemonPen XE addon + LemonPen XE Addon LemonPen XE アドオン zero + zero + zero + zero zero 활성화 하시면 레몬펜을 사이트에 달 수 있습니다. + You can insert LemonPen to the site when you enable this. + Puede insertar LemonPen al sitio cuando este se activa. + Вы можете вставить LemonPen к месту, когда вы позволили это. 機能をオンにすると、レモンペンをサイト上で使うことが出来ます。 (LemonPen:Openmaru社提供) sid + sid + sid + sid sid - 레몬펜에에서 사이트 등록시 발급받은 sid값을 입력해주세요. + 레몬펜에서 사이트 등록시 발급받은 sid값을 입력해주세요. + Please input sid value that you got after registering at the LemonPen website. + Por favor, de entrada sid valor que había que hacer después de registrarse en el sitio web LemonPen. + Введите замороженный ценности, которые вы получили после регистрации на сайте LemonPen. レモンペンのサイトで発行されたsidを入力してください。 (LemonPen:Openmaru社提供) diff --git a/addons/lemonpen/lemonpen.addon.php b/addons/lemonpen/lemonpen.addon.php index 7ae3bfefd..0b5c7239c 100644 --- a/addons/lemonpen/lemonpen.addon.php +++ b/addons/lemonpen/lemonpen.addon.php @@ -12,10 +12,26 @@ * before_display_content 에서만 요청이 됩니다. **/ - if(Context::get('module')=='admin' || $called_position != 'before_module_init') return; + if(Context::getResponseMethod()=="XMLRPC") return; - $sid = $addon_info->sid; + // 모듈의 실행 이후에 script를 추가함 + if(Context::get('module')!='admin' && $called_position == 'after_module_proc' ) { + if($this->getLayoutFile() != 'popup_layout.html') { + $sid = $addon_info->sid; + if($sid) { + Context::addHtmlFooter(sprintf('', $sid)); + $GLOBALS['__lemonpen_is_called__'] = true; + } + } + return; + } - // Context::addJsFile()을 이용하면 끝 - if($sid) Context::addHtmlFooter(sprintf('', $sid)); + // 제로보드XE의 문서와 permant link를 레몬펜의 규약에 맞춰서 출력 + if($GLOBALS['__lemonpen_is_called__'] && $called_position == 'before_display_content') { + // 글 본문을 링크 + $output = preg_replace('/
/is','
'.getUrl('','document_srl',"$1").'', $output); + + // 댓글 본문을 링크 + $output = preg_replace('/
/is','
'.getUrl('','document_srl',"$1").'', $output); + } ?> diff --git a/addons/member_extra_info/conf/info.xml b/addons/member_extra_info/conf/info.xml index 413b804eb..6dc1dbd94 100644 --- a/addons/member_extra_info/conf/info.xml +++ b/addons/member_extra_info/conf/info.xml @@ -3,7 +3,7 @@ 사용자 추가 정보 및 커뮤니케이션 기능 활성화 会員情報・コミュニティアドオン 用户扩展信息 - Addon for enabling facilities for providing additional information about users and communicating + Enabling additional information about users and the communication function. Addon para activar la función de la Información addcional del usuario y de la comunicación. Аддон для предоставления дополнительной информации о пользователях и коммуникации @@ -44,13 +44,13 @@ 5. 呼出MemberModel::getMemberMenu时,添加[加为好友]菜单。 - Among other information about users, this addon displays image name, image mark, and signature. - In case of you not use this information, this stands apart from basic information so runtime should be reduced. - To expose image name, image mark, and signature, please turn on this addon. - 1. Just before displaying user information, this will figure out unique key of member from the definition of "<div class="member_{unique key of member}">....</div>" and replace image name and/or image mark if they exsist. - 2. Just before displaying, this is gonna locate the definition of "<div class="document_{unique key of document}">...</div>" and insert the signature below it. - 3. When arrived a new slip, this will popup it. - 4. This makes available to send a slip if the target is a member when MemberModel::getMemberMenu is called. + Among other information about users, this addon displays image name, image mark, and signature. + This addon is normally turned off to reduce loading time. + To display image name, image mark, and the signature, please turn on this addon. + 1. Right before displaying, this addon will seek for the unique key of the member from <div class="member_{unique key of member}">....</div> and will replace the content with the image name and/or image mark if they exist. + 2. Right before displaying, this addon will search for <div class="document_{unique key of document}">...</div> and will display the signature in the bottom of the article. + 3. When a new msessage is arrived, this will display the message in the popup window. + 4. This makes available to send a message if the target is a member when MemberModel::getMemberMenu is called. 5. This adds a menu for registering as a friend when MemberModel::getMemberMenu is called. diff --git a/addons/member_extra_info/lang/es.lang.php b/addons/member_extra_info/lang/es.lang.php index efd23396a..51933d3f8 100644 --- a/addons/member_extra_info/lang/es.lang.php +++ b/addons/member_extra_info/lang/es.lang.php @@ -1,3 +1,3 @@ alert_new_message_arrived = 'Ha llegado un nuevo mensaje. Desea leer ahora?'; + $lang->alert_new_message_arrived = 'Usted tiene un nuevo mensaje. Quiere comprobar ahora?'; ?> diff --git a/addons/member_extra_info/member_extra_info.addon.php b/addons/member_extra_info/member_extra_info.addon.php index 372476e3e..fecf0162d 100644 --- a/addons/member_extra_info/member_extra_info.addon.php +++ b/addons/member_extra_info/member_extra_info.addon.php @@ -9,9 +9,6 @@ * 1. 출력되기 직전
....
로 정의가 된 부분을 찾아 회원번호를 구해서 * 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다. * - * 2. 출력되기 직전
...
로 정의된 곳을 찾아 글의 내용이라 판단, - * 하단에 서명을 추가합니다. - * * 3. 새로운 쪽지가 왔을 경우 팝업으로 띄움 * * 4. MemberModel::getMemberMenu 호출시 대상이 회원일 경우 쪽지 보내기 기능 추가합니다. @@ -26,14 +23,12 @@ **/ if($called_position == "before_display_content") { - // 기본적인 기능이라 MemberController 에 변경 코드가 있음 - $oMemberController = &getController('member'); + // 회원 이미지이름/ 마크/ 찾아서 대체할 함수를 담고 있는 파일을 include + require_once('./addons/member_extra_info/member_extra_info.lib.php'); // 1. 출력문서중에서
content
를 찾아 MemberController::transImageName() 를 이용하여 이미지이름/마크로 변경 - $output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oMemberController, 'transImageName'), $output); + $output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', 'memberTransImageName', $output); - // 2. 출력문서중에 를 찾아서 member_controller::transSignature()를 이용해서 서명을 추가 - $output = preg_replace_callback('//i', array($oMemberController, 'transSignature'), $output); /** * 3 기능 수행 : 시작할때 새쪽지가 왔는지 검사 @@ -90,9 +85,12 @@ // 대상 회원의 정보를 가져옴 $target_member_info = $this->getMemberInfoByMemberSrl($member_srl); if(!$target_member_info->member_srl) return; + + // 로그인된 사용자 정보를 구함 + $logged_info = Context::get('logged_info'); // 4. 쪽지 발송 메뉴를 만듬 - if( $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $this->isFriend($member_srl))) { + if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $this->isFriend($member_srl))) { $menu_str = Context::getLang('cmd_send_message'); $menu_link = sprintf('%s?module=member&act=dispMemberSendMessage&receiver_srl=%s',Context::getRequestUri(),$member_srl); $menu_list .= sprintf("\n%s,%s,popopen('%s','sendMessage')", Context::getRequestUri().'/modules/member/tpl/images/icon_write_message.gif', $menu_str, $menu_link); diff --git a/addons/member_extra_info/member_extra_info.lib.php b/addons/member_extra_info/member_extra_info.lib.php new file mode 100644 index 000000000..d0bbdc6d3 --- /dev/null +++ b/addons/member_extra_info/member_extra_info.lib.php @@ -0,0 +1,40 @@ +cached) { + $GLOBALS['_transImageNameList'][$member_srl]->cached = true; + $image_name_file = sprintf('./files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl); + $image_mark_file = sprintf('./files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(file_exists($image_name_file)) $GLOBALS['_transImageNameList'][$member_srl]->image_name_file = $image_name_file; + else $image_name_file = ''; + if(file_exists($image_mark_file)) $GLOBALS['_transImageNameList'][$member_srl]->image_mark_file = $image_mark_file; + else $image_mark_file = ''; + } else { + $image_name_file = $GLOBALS['_transImageNameList'][$member_srl]->image_name_file; + $image_mark_file = $GLOBALS['_transImageNameList'][$member_srl]->image_mark_file; + } + + // 이미지이름이나 마크가 없으면 원본 정보를 세팅 + if(!$image_name_file && !$image_mark_file) return $matches[0]; + + $text = $nick_name = htmlspecialchars(strip_tags($nick_name)); + + // 이미지 이름이 있을 경우 + if($image_name_file) $text = sprintf('id: %s', $image_name_file, $nick_name, $nick_name); + + if($image_mark_file) $text = sprintf('id: %s%s', $image_mark_file, $nick_name, $nick_name, $text); + + return sprintf('%s',$member_srl, $text); + } +?> diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml index abe71577c..fe87190b7 100644 --- a/addons/openid_delegation_id/conf/info.xml +++ b/addons/openid_delegation_id/conf/info.xml @@ -22,7 +22,7 @@ 必须在设置中输入openid provider相关值后再使用。
- This addon enables you to use your own domian name as an OpenID. + This addon enables you to use your own domain name as an OpenID. Just be sure to set the values related with openid provider before using. diff --git a/addons/point/conf/info.xml b/addons/point/conf/info.xml deleted file mode 100644 index a5e124361..000000000 --- a/addons/point/conf/info.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 포인트 활성화 애드온 - 积分插件 - ポイントシステム用アドオン - Addon for activating point - Addon para activar los puntos - Аддон для активации поинтов - - 제로 - Zero - Zero - zero - zero - zero - - 포인트시스템 모듈에 설정된 내용을 바탕으로 글작성/삭제/댓글작성/삭제/파일업로드/삭제/다운로드등의 행동에 대해서 포인트를 기록합니다. - - - 以积分系统模块中设置的内容为基础,对发表/删除新帖,发表/删除评论,上传/下载/删除/文件等动作记录为积分。 - - - ポイントシステムモジュールで設定された内容を基に、書き込み作成・削除/コメント作成・削除/ファイルアップロード・削除/ダウンロードなどのユーザの活動に対してそれぞれのポイント付与ができます。 - - - This addon records point on writing/deleting/adding comments/deleting comments/uploading/downloading following to point system module. - - - 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. - - - Этот аддон записыват поинты при написании/удалении/добавлении комментариев/удалении комментариев/закачки/скачки согласно модулю системы поинтов. - - - diff --git a/addons/point/point.addon.php b/addons/point/point.addon.php deleted file mode 100644 index fb42f882e..000000000 --- a/addons/point/point.addon.php +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/addons/point_level_icon/conf/info.xml b/addons/point_level_icon/conf/info.xml index 154c5493e..0120e98ba 100644 --- a/addons/point_level_icon/conf/info.xml +++ b/addons/point_level_icon/conf/info.xml @@ -26,8 +26,8 @@ レベルアイコンは、「モジュール>ポイントシステム」で選択できます。 - This addon displays level icon in front of user name when point system is using. - You can choose level icon on Module > Point System. + This addon displays level icon in front of the user name when you are using the point system. + You can choose the level icon on Module > Point System. Este addon muestra el nivel del ícono delante del nombre del usuario cuando es usado el sistema de puntos. diff --git a/addons/point_level_icon/point_level_icon.addon.php b/addons/point_level_icon/point_level_icon.addon.php index 952e25c1d..5e9f09acf 100644 --- a/addons/point_level_icon/point_level_icon.addon.php +++ b/addons/point_level_icon/point_level_icon.addon.php @@ -12,6 +12,8 @@ // before_display_content 가 아니면 return if($called_position != "before_display_content") return; + require_once('./addons/point_level_icon/point_level_icon.lib.php'); + $oPointController = &getController('point'); - $output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oPointController, 'transLevelIcon'), $output); + $output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', 'pointLevelIconTrans', $output); ?> diff --git a/addons/point_level_icon/point_level_icon.lib.php b/addons/point_level_icon/point_level_icon.lib.php new file mode 100644 index 000000000..e494354be --- /dev/null +++ b/addons/point_level_icon/point_level_icon.lib.php @@ -0,0 +1,46 @@ +getModuleConfig('point'); + } + $config = $GLOBALS['_pointConfig']; + + // 포인트 모델을 구해 놓음 + if(!$GLOBALS['_pointModel']) $GLOBALS['_pointModel'] = getModel('point'); + $oPointModel = &$GLOBALS['_pointModel']; + + // 포인트를 구함 + $point = $oPointModel->getPoint($member_srl); + + // 레벨을 구함 + $level = $oPointModel->getLevel($point, $config->level_step); + $text = $matches[5]; + + // 레벨 아이콘의 위치를 구함 + $level_icon = sprintf("./modules/point/icons/%s/%d.gif", $config->level_icon, $level); + + // 최고 레벨이 아니면 다음 레벨로 가기 위한 per을 구함 + if($level < $config->max_level) { + $next_point = $config->level_step[$level+1]; + if($next_point > 0) $per = (int)($point / $next_point*100); + } + + $title = sprintf("%s:%s%s %s, %s:%s/%s", Context::getLang('point'), $point, $config->point_name, $per?"(".$per."%)":"", Context::getLang('level'), $level, $config->max_level); + + $text = sprintf('%s%s', $member_srl, $level_icon, $title, $title, $text); + + $GLOBALS['_pointLevelIcon'][$member_srl] = $text; + } + + return $GLOBALS['_pointLevelIcon'][$member_srl]; + } +?> diff --git a/addons/rainbow_link/conf/info.xml b/addons/rainbow_link/conf/info.xml index b2fc0b23a..0e010ad3d 100644 --- a/addons/rainbow_link/conf/info.xml +++ b/addons/rainbow_link/conf/info.xml @@ -2,7 +2,7 @@ 레인보우 링크 애드온 Rainbow 链接 - Addon for rainbow links + Rainbow Link Addon Adición Enlace Arco Iris レインボーリンクアドオン Аддон для радужных ссылок @@ -22,7 +22,7 @@ 此插件的rainbow.js文件版权属于 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a> - This addon adds a file named "rainbow.js" to headers, then linked text will get chameleon(rainbow) color change effect. + This addon will insert the "rainbow.js" file to the header, which will make the linked text to get the chameleon(rainbow) color change effect. "rainbow.js" Copyrightⓒ2007 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>. diff --git a/addons/referer/conf/info.xml b/addons/referer/conf/info.xml index 23dd18d7f..4940718b0 100644 --- a/addons/referer/conf/info.xml +++ b/addons/referer/conf/info.xml @@ -4,12 +4,14 @@ リファラー コレクター 反向链接统计 Referer Collector + Referer Collector Сборщик рефералов haneul Haneul haneul haneul + haneul haneul Referer log를 수집합니다. @@ -22,6 +24,9 @@ Collect referer log and statistics. + + + Recoger referer log y estadísticas. Собирает лог рефералов и статистику. diff --git a/addons/spamfilter/conf/info.xml b/addons/spamfilter/conf/info.xml deleted file mode 100644 index 51043b615..000000000 --- a/addons/spamfilter/conf/info.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 스팸필터 애드온 - 垃圾过滤 - Addon for filtering spam - Addon para filtrar los Spam - スパムフィルター(SpamFilter)アドオン - Аддон для фильтрации спама - - 제로 - zero - zero - zero - Zero - zero - - SpamFilter 모듈을 이용하여 글/코멘트/트랙백 등록 이전에 스팸 필터링 및 도배 방지를 합니다. - 자세한 설정은 " 스팸필터 모듈" 에서 해주세요. - - - 利用垃圾过滤模块在发表主题/评论/引用之前进行垃圾过滤。 - 请在" 垃圾过滤模块"中详细设置。 - - - This addon filters spam and prevents users from cluttering before saving entries, comments, or trackbacks to database by setting SpamFilter module. - You can set up more details on "Spam Filter module". - - - Este addon filtra y previene de los documentos/ commentarios/ trackback no deseado antes de ser agregados. - Para la configuración más detallada, debe hacerse en el " Módulo de Filtro de Spam". - - - SpamFilterモジュールを利用して書き込み・コメント・トラックバックが登録される前にフィルタリングを行います。 - 更に悪質な連続書き込みやロボットによる自動書き込みなどを防ぐことができます。 - 詳細な設定は " スパムフィルターモジュール " で行ってください。 - - - Этот аддон фильтрует спам и предотвращает беспорядок перед сохранением элементов, комментариев или трекбеков в базу данных посредством установки модуля Фильтра Спама. - Вы можете установить детали на странице "Модуля Спам Фильтра". - - - diff --git a/addons/spamfilter/spamfilter.addon.php b/addons/spamfilter/spamfilter.addon.php deleted file mode 100644 index 73ab00fb3..000000000 --- a/addons/spamfilter/spamfilter.addon.php +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index a91a673f6..debc38151 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -80,7 +80,7 @@ list($lang_prefix, $lang_text) = explode(',',$val); $lang_text = trim($lang_text); $lang_supported[$lang_prefix] = $lang_text; - if(!$this->lang_type && ereg($lang_prefix, strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))) { + if(!$this->lang_type && preg_match('/'.$lang_prefix.'/i',$_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $this->lang_type = $lang_prefix; setcookie('lang_type', $this->lang_type, time()+60*60*24*365, '/'); } @@ -106,10 +106,20 @@ $this->_setUploadedArgument(); // 인증관련 데이터를 Context에 설정 - $oMember = getModel('member'); - if($oMember->isLogged()) { + $oMemberModel = &getModel('member'); + + // 로그인되어 있지 않고 자동로그인 키값이 있으면 자동 로그인 체크 + if(Context::isInstalled() && !$oMemberModel->isLogged() && $_COOKIE['xeak']) { + $oMemberController = &getController('member'); + $oMemberController->doAutologin(); + } + + // 로그인되어 있으면 로그인 정보 기록 + if($oMemberModel->isLogged()) { $this->_set('is_logged', true); $this->_set('logged_info', $_SESSION['logged_info']); + + // 로그인 되어 있지 않으면 먼저 자동 로그인을 체크 비로그인 상태 기록 } else { $this->_set('is_logged', false); $this->_set('logged_info', NULL); @@ -504,7 +514,7 @@ **/ function _setUploadedArgument() { if($this->_getRequestMethod() != 'POST') return; - if(!eregi("^multipart\/form-data", $_SERVER['CONTENT_TYPE'])) return; + if(!preg_match("/multipart\/form-data/i",$_SERVER['CONTENT_TYPE'])) return; if(!$_FILES) return; foreach($_FILES as $key => $val) { @@ -575,7 +585,7 @@ } elseif($var_count == 2) { asort($var_keys); $target = implode('.',$var_keys); - if($target=='act.mid' && !ereg('([A-Z]+)',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']); + if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']); elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['document_srl']); elseif($target=='act.document_srl') return sprintf('%s%s/%s',$this->path,$get_vars['document_srl'],$get_vars['act']); elseif($target=='mid.page') return sprintf('%s%s/page/%s',$this->path,$get_vars['mid'],$get_vars['page']); @@ -609,11 +619,7 @@ * @brief 요청이 들어온 URL에서 argument를 제거하여 return **/ function getRequestUri() { - $hostname = $_SERVER['HTTP_HOST']; - //$port = $_SERVER['SERVER_PORT']; - //if($port!=80) $hostname .= ":{$port}"; - $path = str_replace('index.php','',$_SERVER['SCRIPT_NAME']); - return sprintf("http://%s%s",$hostname,$path); + return sprintf("http://%s%s",$_SERVER['HTTP_HOST'], getScriptPath()); } /** @@ -717,8 +723,7 @@ **/ function _addJsFile($file) { if(in_array($file, $this->js_files)) return; - - if(!eregi("^http:\/\/",$file)) $file = str_replace(realpath("."), ".", realpath($file)); + //if(!preg_match('/^http:\/\//i',$file)) $file = str_replace(realpath("."), ".", realpath($file)); $this->js_files[] = $file; } @@ -753,7 +758,7 @@ function _addCSSFile($file) { if(in_array($file, $this->css_files)) return; - if(!eregi("^http:\/\/",$file)) $file = str_replace(realpath("."), ".", realpath($file)); + //if(preg_match('/^http:\/\//i',$file)) $file = str_replace(realpath("."), ".", realpath($file)); $this->css_files[] = $file; } @@ -868,17 +873,8 @@ // body 내의 를 header로 이동 $content = preg_replace_callback('!!is', array($this,'moveStyleToHeader'), $content); - //
코드 변환 - $content = preg_replace('/\/]*)(\/>|>)/i','', $content); - - // 몇가지 대문자 태그를 소문자로 변경 - //$content = preg_replace_callback('!<(\/){0,1}([A-Z]+)([^>]*?)>!s',array($this,'transTagToLowerCase'), $content); - - // 코드를 코드로 변환 - $content = preg_replace('//i','', $content); - - // blogapi tool에서 삽입된 코드 삭제 - //$content = str_replace('atomicselection="true"','',$content); + // 코드 변환 + $content = preg_replace('/<(img|br)([^>\/]*)(\/>|>)/i','<$1$2 />', $content); return $content; } @@ -894,8 +890,8 @@ * @brief 를 변경 **/ function transMeta($matches) { - if(eregi('\.css$', $matches[1])) $this->addCSSFile($matches[1]); - elseif(eregi('\.js$', $matches[1])) $this->addJSFile($matches[1]); + if(substr($matches[1],'-4')=='.css') $this->addCSSFile($matches[1]); + elseif(substr($matches[1],'-3')=='.js') $this->addJSFile($matches[1]); } /** diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 7e8c79af1..bfd6b4b71 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -15,6 +15,8 @@ class DB { + var $count_cache_path = './files/cache/db'; + var $cond_operation = array( ///< 조건문에서 조건을 등호로 표시하는 변수 'equal' => '=', 'more' => '>=', @@ -83,7 +85,7 @@ for($i=0;$icache_file, $query_id); + if(file_exists($cache_file)) $cache_time = filemtime($cache_file); + else $cache_time = -1; - // 없으면 원본 쿼리 xml파일을 찾아서 파싱을 한다 - if(!file_exists($cache_file)||filemtime($cache_file)parse($query_id, $xml_file, $cache_file); @@ -250,12 +254,15 @@ // action값에 따라서 쿼리 생성으로 돌입 switch($output->action) { case 'insert' : + $this->resetCountCache($output->tables); $output = $this->_executeInsertAct($output); break; case 'update' : + $this->resetCountCache($output->tables); $output = $this->_executeUpdateAct($output); break; case 'delete' : + $this->resetCountCache($output->tables); $output = $this->_executeDeleteAct($output); break; case 'select' : @@ -278,24 +285,24 @@ switch($filter_type) { case 'email' : case 'email_address' : - if(!eregi('^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key}?$lang->{$key}:$key)); + if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key}?$lang->{$key}:$key)); break; case 'homepage' : - if(!eregi('^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key}?$lang->{$key}:$key)); + if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key}?$lang->{$key}:$key)); break; case 'userid' : case 'user_id' : - if(!eregi('^[a-zA-Z]+([_0-9a-zA-Z]+)*$', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key}?$lang->{$key}:$key)); + if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key}?$lang->{$key}:$key)); break; case 'number' : case 'numbers' : - if(!eregi('^[0-9,]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key)); + if(!preg_match('/^[0-9,]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key)); break; case 'alpha' : - if(!eregi('^[a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key}?$lang->{$key}:$key)); + if(!preg_match('/^[a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key}?$lang->{$key}:$key)); break; case 'alpha_number' : - if(!eregi('^[0-9a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key}?$lang->{$key}:$key)); + if(!preg_match('/^[0-9a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key}?$lang->{$key}:$key)); break; } @@ -413,7 +420,69 @@ } return $conditions; + } + /** + * @brief 카운터 캐시 데이터 얻어오기 + **/ + function getCountCache($tables, $condition) { + if(!$tables) return false; + if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); + + $condition = md5($condition); + + if(!is_array($tables)) $tables_str = $tables; + else $tables_str = implode('.',$tables); + + $cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str); + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + + $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); + if(!file_exists($cache_filename)) return false; + + $cache_mtime = filemtime($cache_filename); + + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $alias => $table) { + $table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table) ; + if(file_exists($table_filename) && filemtime($table_filename) > $cache_mtime) return false; + } + + $count = (int)FileHandler::readFile($cache_filename); + return $count; + } + + /** + * @brief 카운터 캐시 데이터 저장 + **/ + function putCountCache($tables, $condition, $count = 0) { + if(!$tables) return false; + if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); + + $condition = md5($condition); + + if(!is_array($tables)) $tables_str = $tables; + else $tables_str = implode('.',$tables); + + $cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str); + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + + $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); + + FileHandler::writeFile($cache_filename, $count); + } + + /** + * @brief 카운터 캐시 리셋 + **/ + function resetCountCache($tables) { + if(!$tables) return false; + if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); + + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $alias => $table) FileHandler::writeFile( sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table), '' ); + + return true; } } ?> diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 8943d9299..f25f47613 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -415,7 +415,7 @@ function _executeInsertAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$key.'"'; + $table_list[] = '"'.$this->prefix.$val.'"'; } // 컬럼 정리 @@ -423,21 +423,21 @@ $name = $val['name']; $value = $val['value']; if($this->getColumnType($output->column_type,$name)!='number') { - $clen=strlen($value); - if ($clen <= $this->cutlen) - $value = "'".$this->addQuotes($value)."'"; - else { - $wrk=""; - $off=0; - while ($off<$clen) { - $wlen=$clen-$off; - if ($wlen>$this->cutlen) $wlen=$this->cutlen; - if ($off>0) $wrk .= "+\n"; - $wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'"; - $off += $wlen; - } - $value = $wrk; - } + $clen=strlen($value); + if ($clen <= $this->cutlen) + $value = "'".$this->addQuotes($value)."'"; + else { + $wrk=""; + $off=0; + while ($off<$clen) { + $wlen=$clen-$off; + if ($wlen>$this->cutlen) $wlen=$this->cutlen; + if ($off>0) $wrk .= "+\n"; + $wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'"; + $off += $wlen; + } + $value = $wrk; + } if(!$value) $value = 'null'; } elseif(!$value || is_numeric($value)) $value = (int)$value; @@ -456,7 +456,7 @@ function _executeUpdateAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = "\"".$this->prefix.$key."\" as ".$val; + $table_list[] = "\"".$this->prefix.$val."\" as ".$key; } // 컬럼 정리 @@ -467,21 +467,21 @@ if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; else { if($output->column_type[$name]!='number') { - $clen=strlen($value); - if ($clen <= $this->cutlen) - $value = "'".$this->addQuotes($value)."'"; - else { - $wrk=""; - $off=0; - while ($off<$clen) { - $wlen=$clen-$off; - if ($wlen>$this->cutlen) $wlen=$this->cutlen; - if ($off>0) $wrk .= "+\n"; - $wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'"; - $off += $wlen; - } - $value = $wrk; - } + $clen=strlen($value); + if ($clen <= $this->cutlen) + $value = "'".$this->addQuotes($value)."'"; + else { + $wrk=""; + $off=0; + while ($off<$clen) { + $wlen=$clen-$off; + if ($wlen>$this->cutlen) $wlen=$this->cutlen; + if ($off>0) $wrk .= "+\n"; + $wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'"; + $off += $wlen; + } + $value = $wrk; + } } elseif(!$value || is_numeric($value)) $value = (int)$value; @@ -503,7 +503,7 @@ function _executeDeleteAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$key.'"'; + $table_list[] = '"'.$this->prefix.$val.'"'; } // 조건절 정리 @@ -524,7 +524,7 @@ // 테이블 정리 $table_list = array(); foreach($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$key.'" as '.$val; + $table_list[] = '"'.$this->prefix.$val.'" as '.$key; } if(!$output->columns) { @@ -573,16 +573,16 @@ $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); + $query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); } else { if (count($output->groups)) - $query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count, $list_count); + $query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); else { if ($condition) - $query = sprintf('%s and inst_num() between %d and %d', $query, $start_count, $list_count); + $query = sprintf('%s and inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); else - $query = sprintf('%s where inst_num() between %d and %d', $query, $start_count, $list_count); + $query = sprintf('%s where inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); } } @@ -609,53 +609,53 @@ /** * @brief 현재 시점의 Stack trace를 보여줌.결과를 fetch **/ - function backtrace() - { - $output = "
\n"; - $output .= "Backtrace:
\n"; - $backtrace = debug_backtrace(); - - foreach ($backtrace as $bt) { - $args = ''; - foreach ($bt['args'] as $a) { - if (!empty($args)) { - $args .= ', '; - } - switch (gettype($a)) { - case 'integer': - case 'double': - $args .= $a; - break; - case 'string': - $a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? '...' : ''); - $args .= "\"$a\""; - break; - case 'array': - $args .= 'Array('.count($a).')'; - break; - case 'object': - $args .= 'Object('.get_class($a).')'; - break; - case 'resource': - $args .= 'Resource('.strstr($a, '#').')'; - break; - case 'boolean': - $args .= $a ? 'True' : 'False'; - break; - case 'NULL': - $args .= 'Null'; - break; - default: - $args .= 'Unknown'; - } - } - $output .= "
\n"; - $output .= "file: {$bt['line']} - {$bt['file']}
\n"; - $output .= "call: {$bt['class']}{$bt['type']}{$bt['function']}($args)
\n"; - } - $output .= "
\n"; - return $output; - } + function backtrace() + { + $output = "
\n"; + $output .= "Backtrace:
\n"; + $backtrace = debug_backtrace(); + + foreach ($backtrace as $bt) { + $args = ''; + foreach ($bt['args'] as $a) { + if (!empty($args)) { + $args .= ', '; + } + switch (gettype($a)) { + case 'integer': + case 'double': + $args .= $a; + break; + case 'string': + $a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? '...' : ''); + $args .= "\"$a\""; + break; + case 'array': + $args .= 'Array('.count($a).')'; + break; + case 'object': + $args .= 'Object('.get_class($a).')'; + break; + case 'resource': + $args .= 'Resource('.strstr($a, '#').')'; + break; + case 'boolean': + $args .= $a ? 'True' : 'False'; + break; + case 'NULL': + $args .= 'Null'; + break; + default: + $args .= 'Unknown'; + } + } + $output .= "
\n"; + $output .= "file: {$bt['line']} - {$bt['file']}
\n"; + $output .= "call: {$bt['class']}{$bt['type']}{$bt['function']}($args)
\n"; + } + $output .= "
\n"; + return $output; + } /** @@ -668,9 +668,13 @@ // 전체 개수를 구함 $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; + $total_count = $this->getCountCache($output->tables, $condition); + if($total_count === false) { + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $condition, $total_count); + } $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; @@ -696,16 +700,16 @@ $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); + $query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); } else { if (count($output->groups)) - $query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count, $list_count); + $query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); else { if ($condition) - $query = sprintf('%s and inst_num() between %d and %d', $query, $start_count, $list_count); + $query = sprintf('%s and inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); else - $query = sprintf('%s where inst_num() between %d and %d', $query, $start_count, $list_count); + $query = sprintf('%s where inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count); } } diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 15a357ed8..6c6573486 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -57,6 +57,7 @@ function _setDBInfo() { $db_info = Context::getDBInfo(); $this->hostname = $db_info->db_hostname; + $this->port = $db_info->db_port; $this->userid = $db_info->db_userid; $this->password = $db_info->db_password; $this->database = $db_info->db_database; @@ -71,6 +72,8 @@ // db 정보가 없으면 무시 if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; + if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port; + // 접속시도 $this->fd = @mysql_connect($this->hostname, $this->userid, $this->password); if(mysql_error()) { @@ -396,7 +399,7 @@ function _executeInsertAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'`'; + $table_list[] = '`'.$this->prefix.$val.'`'; } // 컬럼 정리 @@ -422,7 +425,7 @@ function _executeUpdateAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; } // 컬럼 정리 @@ -453,7 +456,7 @@ function _executeDeleteAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'`'; + $table_list[] = '`'.$this->prefix.$val.'`'; } // 조건절 정리 @@ -474,7 +477,7 @@ // 테이블 정리 $table_list = array(); foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; } if(!$output->columns) { @@ -547,9 +550,13 @@ // 전체 개수를 구함 $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; + $total_count = $this->getCountCache($output->tables, $condition); + if($total_count === false) { + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $condition, $total_count); + } $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php index a653cc420..a3a982eed 100644 --- a/classes/db/DBMysql_innodb.class.php +++ b/classes/db/DBMysql_innodb.class.php @@ -57,6 +57,7 @@ function _setDBInfo() { $db_info = Context::getDBInfo(); $this->hostname = $db_info->db_hostname; + $this->port = $db_info->db_port; $this->userid = $db_info->db_userid; $this->password = $db_info->db_password; $this->database = $db_info->db_database; @@ -71,6 +72,8 @@ // db 정보가 없으면 무시 if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; + if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port; + // 접속시도 $this->fd = @mysql_connect($this->hostname, $this->userid, $this->password); if(mysql_error()) { @@ -121,6 +124,7 @@ **/ function begin() { if(!$this->isConnected() || $this->transaction_started) return; + $this->transaction_started = true; $this->_query("begin"); } @@ -405,7 +409,7 @@ function _executeInsertAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'`'; + $table_list[] = '`'.$this->prefix.$val.'`'; } // 컬럼 정리 @@ -431,7 +435,7 @@ function _executeUpdateAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; } // 컬럼 정리 @@ -462,7 +466,7 @@ function _executeDeleteAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'`'; + $table_list[] = '`'.$this->prefix.$val.'`'; } // 조건절 정리 @@ -483,7 +487,7 @@ // 테이블 정리 $table_list = array(); foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$key.'` as '.$val; + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; } if(!$output->columns) { @@ -556,9 +560,13 @@ // 전체 개수를 구함 $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; + $total_count = $this->getCountCache($output->tables, $condition); + if($total_count === false) { + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $condition, $total_count); + } $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/db/DBPostgresql.class.php b/classes/db/DBPostgresql.class.php index 7d8231102..6b9f8e062 100644 --- a/classes/db/DBPostgresql.class.php +++ b/classes/db/DBPostgresql.class.php @@ -57,6 +57,7 @@ function _setDBInfo() { $db_info = Context::getDBInfo(); $this->hostname = $db_info->db_hostname; + $this->port = $db_info->db_port; $this->userid = $db_info->db_userid; $this->password = $db_info->db_password; $this->database = $db_info->db_database; @@ -400,7 +401,7 @@ function _executeInsertAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key; + $table_list[] = $this->prefix.$val; } // 컬럼 정리 @@ -426,7 +427,7 @@ function _executeUpdateAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key.' as '.$val; + $table_list[] = $this->prefix.$val.' as '.$key; } // 컬럼 정리 @@ -457,7 +458,7 @@ function _executeDeleteAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key; + $table_list[] = $this->prefix.$val; } // 조건절 정리 @@ -478,7 +479,7 @@ // 테이블 정리 $table_list = array(); foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key .' as '.$val; + $table_list[] = $this->prefix.$val.' as '.$key; } if(!$output->columns) { @@ -548,9 +549,13 @@ // 전체 개수를 구함 $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; + $total_count = $this->getCountCache($output->tables, $condition); + if($total_count === false) { + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $condition, $total_count); + } $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index d10a75672..a54b0b250 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -382,7 +382,7 @@ function _executeInsertAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key; + $table_list[] = $this->prefix.$val; } // 컬럼 정리 @@ -411,7 +411,7 @@ // 대상 테이블이 1개일 경우 if($table_count == 1) { // 테이블 정리 - list($target_table) = array_keys($output->tables); + list($target_table) = array_values($output->tables); $target_table = $this->prefix.$target_table; // 컬럼 정리 @@ -437,7 +437,7 @@ } elseif($table_count == 2) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[$val] = $this->prefix.$val; + $table_list[$val] = $this->prefix.$key; } list($source_table, $target_table) = array_values($table_list); @@ -474,7 +474,7 @@ function _executeDeleteAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key; + $table_list[] = $this->prefix.$val; } // 조건절 정리 @@ -495,7 +495,7 @@ // 테이블 정리 $table_list = array(); foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key.' as '.$val; + $table_list[] = $this->prefix.$val.' as '.$key; } if(!$output->columns) { @@ -568,9 +568,13 @@ // 전체 개수를 구함 $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; + $total_count = $this->getCountCache($output->tables, $condition); + if($total_count === false) { + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $condition, $total_count); + } $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index 9d001bbc4..3256e90e6 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -412,7 +412,7 @@ function _executeInsertAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key; + $table_list[] = $this->prefix.$val; } // 컬럼 정리 @@ -450,7 +450,7 @@ // 대상 테이블이 1개일 경우 if($table_count == 1) { // 테이블 정리 - list($target_table) = array_keys($output->tables); + list($target_table) = array_values($output->tables); $target_table = $this->prefix.$target_table; // 컬럼 정리 @@ -476,7 +476,7 @@ } elseif($table_count == 2) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[$val] = $this->prefix.$val; + $table_list[$val] = $this->prefix.$key; } list($source_table, $target_table) = array_values($table_list); @@ -514,7 +514,7 @@ function _executeDeleteAct($output) { // 테이블 정리 foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key; + $table_list[] = $this->prefix.$val; } // 조건절 정리 @@ -536,7 +536,7 @@ // 테이블 정리 $table_list = array(); foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$key.' as '.$val; + $table_list[] = $this->prefix.$val.' as '.$key; } if(!$output->columns) { @@ -609,9 +609,13 @@ // 전체 개수를 구함 $count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition); - $this->_prepare($count_query); - $count_output = $this->_execute(); - $total_count = (int)$count_output->count; + $total_count = $this->getCountCache($output->tables, $condition); + if($total_count === false) { + $this->_prepare($count_query); + $count_output = $this->_execute(); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $condition, $total_count); + } $list_count = $output->list_count['value']; if(!$list_count) $list_count = 20; diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index 201e6c50c..ff14ce5c7 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -28,7 +28,8 @@ $this->_printHeader(); // request method에 따른 처리 - $content = $this->getContent($oModule); + if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule); + else $content = $this->_toHTMLDoc($oModule); // 요청방식에 따라 출력을 별도로 if(Context::getResponseMethod()!="XMLRPC") { @@ -86,36 +87,13 @@ function display($content) { $content .= $this->_debugOutput(); - $path = str_replace('index.php','',$_SERVER['SCRIPT_NAME']); - - // commons/modules/files/widgets/layouts/addons 로 시작되는 src나 href의 값을 절대경로로 변경 - $content = preg_replace('!(href|src)=("|\'){0,1}(commons|modules|widgets|layouts|addons|files)!is', '\\1=\\2'.$path.'\\3', $content); - $content = preg_replace('!(href|src)=("|\'){0,1}\.\/([a-zA-Z0-9\_^\/]+)\/!is', '\\1=\\2'.$path.'\\3/', $content); - // 출력하기 전에 trigger 호출 (after) ModuleHandler::triggerCall('display', 'after', $content); - if($this->gz_enabled) print ob_gzhandler($content, 5); else print $content; } - /** - * @brief 모듈 객체의 content return - **/ - function getContent(&$oModule) { - return $this->_toDoc($oModule); - } - - /** - * @brief 모듈 객체의 content return - **/ - function _toDoc(&$oModule) { - if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule); - else $content = $this->_toHTMLDoc($oModule); - return $content; - } - /** * @brief RequestMethod가 XML이면 XML 데이터로 컨텐츠 생성 **/ diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index d5aeff6cb..e6fa27e37 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -14,11 +14,11 @@ **/ function readFile($file_name) { if(!file_exists($file_name)) return; - $filesize = filesize($file_name); - if($filesize<1) return; + if(function_exists('file_get_contents')) return file_get_contents($file_name); + $fp = fopen($file_name, "r"); $buff = ''; if($fp) { @@ -263,7 +263,7 @@ } // 디렉토리 생성 - $path = preg_replace('/\/([^\.^\/]*)\.(gif|png|jpeg|bmp|wbmp)$/i','',$target_file); + $path = preg_replace('/\/([^\.^\/]*)\.(gif|png|jpg|jpeg|bmp|wbmp)$/i','',$target_file); FileHandler::makeDir($path); // 원본 이미지의 크기를 조절해서 임시 이미지에 넣음 diff --git a/classes/mail/Mail.class.php b/classes/mail/Mail.class.php index cbd3dcd3b..3fbf9c17e 100644 --- a/classes/mail/Mail.class.php +++ b/classes/mail/Mail.class.php @@ -106,7 +106,7 @@ } function isVaildMailAddress($email_address) { - if( eregi("([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)", $email_address) ) return $email_address; + if( preg_match("/([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)/i", $email_address) ) return $email_address; else return ''; } } diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 1660ce888..3f9fdd06b 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -57,9 +57,9 @@ else $this->module_srl = (int)$module_srl; // 기본 변수들의 검사 (XSS방지를 위한 기초적 검사) - if($this->module && !eregi("^([a-z0-9\_\-]+)$",$this->module)) die(Context::getLang("msg_invalid_request")); - if($this->mid && !eregi("^([a-z0-9\_\-]+)$",$this->mid)) die(Context::getLang("msg_invalid_request")); - if($this->act && !eregi("^([a-z0-9\_\-]+)$",$this->act)) die(Context::getLang("msg_invalid_request")); + if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request")); + if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request")); + if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request")); // 애드온 실행 (모듈 실행 전) $called_position = 'before_module_init'; @@ -73,7 +73,7 @@ // ModuleModel 객체 생성 $oModuleModel = &getModel('module'); - // document_srl이 있으면 document_srl로 모듈과 모듈 정보를 구함 + // document_srl만 있을 경우 document_srl로 모듈과 모듈 정보를 구함 if($this->document_srl && !$this->mid && !$this->module_srl) { $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); if($this->module && $module_info->module != $this->module) unset($module_info); @@ -102,6 +102,10 @@ Context::setBrowserTitle($module_info->browser_title); } + // 모듈정보에 module과 mid를 강제로 지정 + $this->module_info->module = $this->module; + $this->mid = $this->mid; + // 여기까지도 모듈 정보를 찾지 못했다면 깔끔하게 시스템 오류 표시 if(!$this->module) $this->error = 'msg_module_is_not_exists'; @@ -143,14 +147,6 @@ return; } - // 설정된 mid가 없을 경우 요청된 act의 standalone 여부 체크 - /* - if(!$this->mid && !$xml_info->action->{$this->act}->standalone) { - $this->error = 'msg_module_is_not_standalone'; - return; - } - */ - // type, grant 값 구함 $type = $xml_info->action->{$this->act}->type; $grant = $xml_info->action->{$this->act}->grant; @@ -206,6 +202,7 @@ // 해당 모듈에 layout_srl이 있는지 확인 if($oModule->module_info->layout_srl && !$oModule->getLayoutFile()) { + // layout_srl이 있으면 해당 레이아웃 정보를 가져와 layout_path/ layout_file 위치 변경 $oLayoutModel = &getModel('layout'); $layout_info = $oLayoutModel->getLayout($oModule->module_info->layout_srl); diff --git a/classes/module/ModuleObject.class.php b/classes/module/ModuleObject.class.php index 420542272..7e92d39cd 100644 --- a/classes/module/ModuleObject.class.php +++ b/classes/module/ModuleObject.class.php @@ -84,19 +84,31 @@ $logged_info = Context::get('logged_info'); $user_id = $logged_info->user_id; $user_group = $logged_info->group_list; + $grant->is_admin = false; - // 로그인되어 있다면 admin 체크 - if($is_logged && ($logged_info->is_admin == 'Y' || (is_array($this->module_info->admin_id)&&in_array($user_id, $this->module_info->admin_id) )) ) { - $grant->is_admin = true; - } else { - $grant->is_admin = false; - } + // 로그인되어 있다면 관리자 여부를 확인 + if($is_logged) { + /* 로그인 사용자에 대한 관리자 여부는 다양한 방법으로 체크가 됨 */ + // 1. 최고관리자일 경우 + if($logged_info->is_admin == 'Y') { + $grant->is_admin = true; - // module.xml 에 있는 권한 정보를 정리 - if($module_info->grants) { - foreach($module_info->grants as $key => $val) { - if(!$xml_info->grant->{$key}) { - $xml_info->grant->{$key}->title = $key; + // 2. 최고 관리자는 아니지만 모듈 object가 있고 admin_id 컬럼에 로그인 사용자의 아이디가 있을 경우 + } elseif($this->module_info->admin_id) { + if(is_array($this->module_info->admin_id) && in_array($user_id, $this->module_info->admin_id)) $grant->is_admin = true; + + // 4. 1/2번이 아닐 경우 그룹을 체크하고 직접 모듈에 요청을 하여 체크를 함. (모듈.class.php에 정의) + } else { + $manager_group = $this->module_info->grants['manager']; + if(count($user_group) && count($manager_group)) { + foreach($user_group as $group_srl => $group_info) { + if(in_array($group_srl, $manager_group)) $grant->is_admin = true; + } + } + + if(!$grant->is_admin && $module_info->module) { + $oClass = &getClass($module_info->module); + if($oClass && method_exists($oClass, 'isAdmin')) $grant->is_admin = $oClass->isAdmin(); } } } diff --git a/classes/optimizer/Optimizer.class.php b/classes/optimizer/Optimizer.class.php index 5c8ffe41d..6c5c01376 100644 --- a/classes/optimizer/Optimizer.class.php +++ b/classes/optimizer/Optimizer.class.php @@ -42,19 +42,20 @@ foreach($source_files as $file) { if(!$file) continue; $file = str_replace("\\","/",$file); - if(eregi("^http:\/\/",$file) || $file == './common/css/button.css') $files[] = $file; + if(preg_match('/^http:\/\//i', $file) || $file == './common/css/button.css') $files[] = $file; else $targets[] = $file; } if(!count($targets)) return $files; - $hashed_filename = $this->getHashFilename($targets); + $optimized_info = $this->getOptimizedInfo($targets); - $filename = sprintf("%s%s.%s.php", $this->cache_path, $hashed_filename, $type); + $path = sprintf("%s%s", $this->cache_path, $optimized_info[0]); + $filename = sprintf("%s.%s.%s.php", $optimized_info[0], $optimized_info[1], $type); - $this->doOptimizedFile($filename, $targets, $type); + $this->doOptimizedFile($path, $filename, $targets, $type); - $files[] = $filename; + $files[] = $path.'/'.$filename; return $files; @@ -62,28 +63,40 @@ /** * @brief optimize는 대상 파일을 \n로 연결후 md5 hashing하여 파일이름의 중복을 피함 + * 개별 파일과 optimizer 클래스 파일의 변경을 적용하기 위해 각 파일들과 Optimizer.class.php의 filemtime을 비교, 파일이름에 반영 **/ - function getHashFilename($files) { + function getOptimizedInfo($files) { + // 개별 요소들 또는 Optimizer.class.php파일이 갱신되었으면 새로 옵티마이징 + $count = count($files); + $last_modified = 0; + for($i=0;$i<$count;$i++) { + $mtime = filemtime($files[$i]); + if($last_modified < $mtime) $last_modified = $mtime; + } + $buff = implode("\n", $files); - return md5($buff); + + return array(md5($buff), $last_modified); } /** * @brief 이미 저장된 캐시 파일과의 시간등을 검사하여 새로 캐싱해야 할지를 체크 **/ - function doOptimizedFile($filename, $targets, $type) { - if(!file_exists($filename)) return $this->makeOptimizedFile($filename, $targets, $type); + function doOptimizedFile($path, $filename, $targets, $type) { + // 대상 파일이 있으면 그냥 패스~ + if(file_exists($path.'/'.$filename)) return; - $mtime = filemtime($filename); - foreach($targets as $file) { - if($mtime < filemtime($file)) return $this->makeOptimizedFile($filename, $targets, $type); - } + // 대상 파일이 없으면 hashed_filename으로 생성된 파일들을 모두 삭제 + FileHandler::removeFilesInDir($path); + + // 새로 캐시 파일을 생성 + $this->makeOptimizedFile($path, $filename, $targets, $type); } /** * @brief css나 js파일을 묶어서 하나의 파일로 만들고 gzip 압축이나 헤더등을 통제하기 위해서 php파일을 별도로 만들어서 진행함 **/ - function makeOptimizedFile($filename, $targets, $type) { + function makeOptimizedFile($path, $filename, $targets, $type) { /** * 실제 css나 js의 내용을 합친 것을 구함 **/ @@ -100,58 +113,85 @@ } if($type == "css") $content_buff = '@charset "utf-8";'."\n".$content_buff; - if($type!="css" && Context::isGzEnabled()) $content_buff = ob_gzhandler($content_buff, 5); - - - $content_file = eregi_replace("\.php$","",$filename); - $content_filename = str_replace($this->cache_path, '', $content_file); - - FileHandler::writeFile($content_file, $content_buff); + $content_filename = substr($filename, 0, -4); + FileHandler::writeFile($path.'/'.$content_filename, $content_buff); /** - * 압축을 지원하고 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함 + * 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함 **/ - // php의 헤더파일 생성 - // gzip 압축 체크 - if($type!="css" && Context::isGzEnabled()) $gzip_header = 'header("Content-Encoding: gzip");'; - // 확장자별 content-type 체크 if($type == 'css') $content_type = 'text/css'; - elseif($type == 'js') $content_type = 'text/javascript'; + elseif($type == 'js') $content_type = 'application/x-javascript'; - $header_buff = << -EndOfBuff; - FileHandler::writeFile($filename, $header_buff); +if( preg_match("/MSIE 6.0/i",$_SERVER["HTTP_USER_AGENT"]) || strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")===false || !function_exists("ob_gzhandler") ) { + $size = filesize($content_filename); +} else { + $f = fopen($content_filename,"r"); + $buff = fread($f, filesize($content_filename)); + fclose($f); + $buff = ob_gzhandler($buff, 5); + $size = strlen($buff); + header("Content-Encoding: gzip"); +} + +header("Content-Type: '.$content_type.'; charset=utf-8"); +header("Date: '.substr(gmdate('r'), 0, -5).'GMT"); +header("Expires: '.substr(gmdate('r', strtotime('+1 MONTH')), 0, -5).'GMT"); +header("Cache-Control: private, max-age=2592000"); +header("Pragma: cache"); +header("Last-Modified: '.substr(gmdate('r', $mtime), 0, -5).'GMT"); +header("ETag: \"'.dechex($unique).'-".dechex($size)."-'.dechex($mtime).'\""); + +if(!$cached) { + if(!$buff) { + $f = fopen($content_filename,"r"); + fpassthru($f); + } else print $buff; +} + +?>'; + FileHandler::writeFile($path.'/'.$filename, $header_buff); } /** * @brief css의 경우 import/ background 등의 속성에서 사용되는 url내의 경로를 변경시켜줌 **/ function replaceCssPath($file, $str) { - $this->tmp_css_path = Context::getRequestUri().ereg_replace("^\.\/","",dirname($file))."/"; - $str = preg_replace_callback('!url\(("|\')?([^\)]+)("|\')?\)!is', array($this, '_replaceCssPath'), $str); + // css 파일의 위치를 구함 + $this->tmp_css_path = './'.preg_replace("/^\.\//is","",dirname($file))."/"; + // url() 로 되어 있는 css 파일의 경로를 변경 + $str = preg_replace_callback('!url\(("|\')?([^\)]+)("|\')?\)!is', array($this, '_replaceCssPath'), $str); $str = preg_replace('!\/([^\/]*)\/\.\.\/!is','/', $str); + // charset 지정 문구를 제거 $str = preg_replace('!@charset([^;]*?);!is','',$str); return $str; } function _replaceCssPath($matches) { - if(eregi("^(http|\/|\.\/common\/)",$matches[2])) return $matches[0]; + if(preg_match("/^(http|\/|\.\/common\/)/is",$matches[2])) return $matches[0]; return sprintf('url(%s%s)', $matches[1], $this->tmp_css_path.$matches[2]); } diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 5a4abfbf2..00971499f 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -38,7 +38,7 @@ if(__DEBUG__==3 ) $start = getMicroTime(); // 변수 체크 - $tpl_path = ereg_replace('(\/+)$', '', $tpl_path).'/'; + if(substr($tpl_path,-1)!='/') $tpl_path .= '/'; if(substr($tpl_filename,-5)!='.html') $tpl_filename .= '.html'; // tpl_file 변수 생성 @@ -104,13 +104,13 @@ //$buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff); // 이미지 태그 img의 src의 값이 http:// 나 / 로 시작하지 않으면 제로보드의 root경로부터 시작하도록 변경 - $buff = preg_replace_callback('!(img|input)([^>]*)src=[\'"]{1}(.*?)[\'"]{1}!is', array($this, '_compileImgPath'), $buff); + $buff = preg_replace_callback('/(img|input)([^>]*)src=[\'"]{1}(?!http)(.*?)[\'"]{1}/is', array($this, '_compileImgPath'), $buff); // 변수를 변경 - $buff = preg_replace_callback('/\{[^@^ ]([^\}]+)\}/i', array($this, '_compileVarToContext'), $buff); + $buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff); // 결과를 출력하지 않는 구문 변경 - $buff = preg_replace_callback('/\{\@([^\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff); + $buff = preg_replace_callback('/\{\@([^\{\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff); // 의 변경 $buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff); @@ -145,7 +145,7 @@ $str1 = $matches[0]; $str2 = $path = $matches[3]; - if(!eregi("^([a-z0-9\_\.])",$path)) return $str1; + if(!preg_match('/^([a-z0-9\_\.])/i',$path)) return $str1; $path = preg_replace('/^(\.\/|\/)/','',$path); $path = 'tpl_path?>'.$path; @@ -205,7 +205,7 @@ $tmp_arr = explode("/", $arg); for($i=0;$itpl_path, $given_file); if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); @@ -343,10 +343,7 @@ @include($compiled_tpl_file); } - $output = ob_get_contents(); - ob_end_clean(); - - return $output; + return ob_get_clean(); } } ?> diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php index 4e576b4e9..473888751 100644 --- a/classes/widget/WidgetHandler.class.php +++ b/classes/widget/WidgetHandler.class.php @@ -12,23 +12,51 @@ /** * @brief 위젯 캐시 처리 **/ - function getCache($sequence, $cache) { - if(!$sequence || !$cache) return; + function getCache($widget, $args) { - $cache_path = './files/cache/widget_cache/'; - if(!is_dir($cache_path)) { - FileHandler::makeDir($cache_path); - return; + // widget, 캐시 번호와 캐시값이 설정되어 있는지 확인 + $widget_sequence = $args->widget_sequence; + $widget_cache = $args->widget_cache; + + /** + * 캐시 번호와 캐시 값이 아예 없으면 바로 데이터를 추출해서 리턴 + **/ + if(!$widget_cache || !$widget_sequence) { + $oWidget = WidgetHandler::getObject($widget); + if(!$oWidget) return; + + return $oWidget->proc($args); } - $cache_file = sprintf('%s%d.%s.cache', $cache_path, $sequence, Context::getLangType()); - if(!file_exists($cache_file)) return; + /** + * 캐시 번호와 캐시값이 설정되어 있으면 캐시 파일을 불러오도록 함 + **/ + + // 캐시 디렉토리가 없으면 생성 + $cache_path = './files/cache/widget_cache/'; + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); - $filemtime= filemtime($cache_file); - if($filemtime + $cache*60 < time()) return; + // 캐시파일명을 구함 + $cache_file = sprintf('%s%d.%s.cache', $cache_path, $widget_sequence, Context::getLangType()); - $output = FileHandler::readFile($cache_file); - return $output; + // 캐시 파일이 존재하면 해당 파일의 유효성 검사 + if(file_exists($cache_file)) { + $filemtime = filemtime($cache_file); + + // 수정 시간을 비교해서 캐싱중이어야 하거나 WidgetHandler.class.php 파일보다 나중에 만들어 졌다면 캐시값을 return + if($filemtime + $widget_cache*60 > time() && $filemtime > filemtime('./classes/widget/WidgetHandler.class.php')) { + return FileHandler::readFile($cache_file); + } + } + + // 캐시를 새로 해야 할 경우임 + $oWidget = WidgetHandler::getObject($widget); + if(!$oWidget) return; + + $widget_content = $oWidget->proc($args); + WidgetHandler::writeCache($widget_sequence, $widget_content); + + return $widget_content; } /** @@ -42,128 +70,148 @@ /** * @brief 위젯을 찾아서 실행하고 결과를 출력 - *
태그 사용 templateHandler에서 WidgetHandler::execute()를 실행하는 코드로 대체하게 된다 + * 태그 사용 templateHandler에서 WidgetHandler::execute()를 실행하는 코드로 대체하게 된다 * - * $include_info가 true일 경우 css 코드와 위젯핸들링을 위한 코드까지 포함하도록 한다 + * $include_info가 true일 경우 페이지 수정시 위젯 핸들링을 위한 코드까지 포함함 **/ function execute($widget, $args, $include_info = false) { // 디버그를 위한 위젯 실행 시간 저장 if(__DEBUG__==3) $start = getMicroTime(); - // widget중 widgetContent 는 page 모듈에 종속적인 위젯으로 직접 page.admin.controller.php를 호출하여 처리를 해야 함 (차후 정리 필요) - if($widget == 'widgetContent') { - $style = $args->style; - $body = base64_decode($args->body); - $widget_padding_left = $args->widget_padding_left; - $widget_padding_right = $args->widget_padding_right; - $widget_padding_top = $args->widget_padding_top; - $widget_padding_bottom = $args->widget_padding_bottom; - if($include_info) { - $oWidgetController = &getController('widget'); - $tpl = $oWidgetController->transEditorContent($body, $args); - } else { - $tpl = sprintf('
%s
', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $body); + // args값에서 urldecode를 해줌 + $object_vars = get_object_vars($args); + if(count($object_vars)) { + foreach($object_vars as $key => $val) { + if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right'))) continue; + $args->{$key} = utf8RawUrlDecode($val); } - return $tpl; - // widget Box일 경우 간단히 변경만 시도함 - } else if($widget == 'widgetBox') { - $style = $args->style; - $widget_padding_left = $args->widget_padding_left; - $widget_padding_right = $args->widget_padding_right; - $widget_padding_top = $args->widget_padding_top; - $widget_padding_bottom = $args->widget_padding_bottom; - if($include_info) { - $tpl = sprintf('
', $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('
%s', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $body); - } - return $tpl; } - // 설치된 위젯들에 대한 처리 - if(!is_dir(sprintf('./widgets/%s/',$widget))) return; + /** + * 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함 + **/ + if($widget != 'widgetContent' && $widget != 'widgetBox') { + if(!is_dir(sprintf('./widgets/%s/',$widget))) return; - $cache_path = './files/cache/widget_cache/'; - if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + // 위젯의 내용을 담을 변수 + $widget_content = WidgetHandler::getCache($widget, $args); + } - // $widget의 객체를 받음 - $oWidget = WidgetHandler::getObject($widget); - if(!$oWidget) return; + /** + * 관리자가 지정한 위젯의 style을 구함 + **/ + // 가끔 잘못된 코드인 background-image:url(none)이 들어 있을 수가 있는데 이럴 경우 none에 대한 url을 요청하므로 무조건 제거함 + $style = preg_replace('/background\-image: url\(none\)/is','', $args->style); - // 위젯 output을 생성하기 위한 변수 설정 - $widget_padding_top = $args->widget_padding_top; - $widget_padding_bottom = $args->widget_padding_bottom; + // 내부 여백을 둔 것을 구해서 style문으로 미리 변경해 놓음 $widget_padding_left = $args->widget_padding_left; $widget_padding_right = $args->widget_padding_right; - + $widget_padding_top = $args->widget_padding_top; + $widget_padding_bottom = $args->widget_padding_bottom; $inner_style = sprintf("padding:%dpx %dpx %dpx %dpx !important; padding:none !important;", $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left); /** - * 출력을 위해 위젯 내용을 div로 꾸밈 + * 위젯 출력물을 구함 **/ - // 서비스에 사용하기 위해 위젯 정보를 포함하지 않을 경우 + // 일반 페이지 호출일 경우 지정된 스타일만 꾸면서 바로 return 함 if(!$include_info) { + switch($widget) { + // 내용 직접 추가일 경우 + case 'widgetContent' : + $body = base64_decode($args->body); + $output = sprintf('
%s
', $style, $inner_style, $body); + break; - // 위젯 실행 - $html = $oWidget->proc($args); - $output = sprintf('
%s
', $args->style, $inner_style, $html); + // 위젯 박스일 경우 + case 'widgetBox' : + $output = sprintf('
', $style, $inner_style); + break; - // 위젯 sequence가 있고 위젯의 캐싱을 지정하였고 위젯정보를 담지 않도록 하였을 경우 캐시 파일을 저장 - if($args->widget_sequence && $args->widget_cache) WidgetHandler::writeCache($args->widget_sequence, $output); + // 일반 위젯일 경우 + default : + $output = sprintf('
%s
', $style, $inner_style, $widget_content); + break; + } - // 에디팅등에 사용하기 위한 목적으로 위젯 정보를 포함할 경우 + // 페이지 수정시에 호출되었을 경우 위젯 핸들링을 위한 코드 추가 } else { - // 위젯 실행 - //if($args->widget_sequence && $args->widget_cache) $html = WidgetHandler::getCache($args->widget_sequence, $args->widget_cache); - //if(!$html) $html = $oWidget->proc($args); - $html = $oWidget->proc($args); + switch($widget) { + // 내용 직접 추가일 경우 + case 'widgetContent' : + $body = base64_decode($args->body); + $oWidgetController = &getController('widget'); - // args 정리 - $attribute = array(); - if($args) { - foreach($args as $key => $val) { - if($key == 'class' || $key == 'style') continue; - if(strpos($val,'|@|')>0) { - $val = str_replace('|@|',',',$val); - } - $attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val)); - } + $output = sprintf( + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '%s'. + '
'. + '
'. + ''. + '
', + $style, + $args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom, + $inner_style, + $body, + base64_encode($body) + ); + break; + + // 위젯 박스일 경우 + case 'widgetBox' : + $output = sprintf( + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
', + $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $inner_style); + break; + + // 일반 위젯일 경우 + default : + // args 정리 + $attribute = array(); + if($args) { + foreach($args as $key => $val) { + if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget'))) continue; + if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val); + $attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val)); + } + } + + $output = sprintf( + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '
'. + '%s'. + '
'. + '
'. + '
', + $style, + $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, + $widget, implode(' ',$attribute), + $inner_style, + $widget_content + ); + break; } - - // 결과물에 있는 css Meta 목록을 구해와서 해당 css를 아예 읽어버림 - require_once("./classes/optimizer/Optimizer.class.php"); - $oOptimizer = new Optimizer(); - preg_match_all('!<\!\-\-Meta:([^\-]*?)\-\->!is', $html, $matches); - $css_header = null; - for($i=0;$ireplaceCssPath($css_file, $buff)."\n"; - } - - if(!$html) $html = ' '; - $output = sprintf( - '
'. - '
'. - '
'. - '
'. - '
'. - '
'. - '
'. - '
'. - '
'. - '
'. - '%s'. - '
'. - '
'. - '
', - $css_header, - $args->style, - $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, - $widget, implode(' ',$attribute), - $inner_style, - $html - ); } // 위젯 결과물 생성 시간을 debug 정보에 추가 diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index 163ddcaad..e08dffab4 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -46,7 +46,7 @@ $alias = $val->attrs->alias; if(!$alias) $alias = $table_name; - $output->tables[$table_name] = $alias; + $output->tables[$alias] = $table_name; // 테이블을 찾아서 컬럼의 속성을 구함 $table_file = sprintf('./%s/%s/schemas/%s.xml', 'modules', $module, $table_name); diff --git a/common/css/default.css b/common/css/default.css index 7d785c13e..a656b7b81 100644 --- a/common/css/default.css +++ b/common/css/default.css @@ -23,7 +23,7 @@ IE7 & IE6 & Below .nowrap { white-space:nowrap; } /* default.css - Type Selector Definition */ -* { margin:0; padding:0; } +body,p,div,ul,ol,li,dd,dt,span,fieldset,h1,h2,h3,h4,h5,h6 { margin:0; padding:0; } html { width:100%; } body { margin:0; font-size:.75em; _font-size:9pt; font-family:sans-serif;} *:first-child+html body { font-size:9pt; } @@ -70,7 +70,6 @@ form { margin:0; padding:0; } .w300 { width:300px; } .w400 { width:400px; } - /* editor style */ a.bold { font-weight:bold; } @@ -88,15 +87,20 @@ a.bold { font-weight:bold; } .folder_area { display: none; } .zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;} -.member_signature { margin-top:10px; border:1px solid #DDDDDD; padding:10px; overflow:hidden;} -.member_profile_image { float:left; margin-right:10px; } +/* xe content */ +div.xe_content { line-height:140%; !important} +div.xe_content ol { margin-left:40px; !important} +div.xe_content ul { margin-left:40px; !important} +div.xe_content blockquote { margin-left:40px; !important} + +/* xe layer */ #waitingforserverresponse { display:inline; border:2px solid #444444; background-color:#FFFFFF; padding:15px 20px 13px 20px; font-weight:bold; color:#444444; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; } #fororiginalimageareabg { z-index:1001; background-color:#FFFFFF; width:100%; height:100%; top:0px; left:0px; position:relative; padding:20px 10px 10px 10px; border:8px solid #DDDDDD; } #fororiginalimagearea { visibility:hidden; padding:0px; margin:0px; width:100%; height:100%; top:0px; left:0px; position:absolute; z-index:1000; text-align:left; overflow:hidden; } #fororiginalimage { z-index:1002; } #closeOriginalImageBtn { position:absolute; right:8px; top:5px; cursor:pointer; width:50px; height:12px; z-index:1003; } #popup_menu_area { position:absolute; left:0px; top:0px; z-index:1003; visibility:hidden; border:2px solid #D9D9D9; background-color:#FFFFFF; padding:0; } -#popup_menu_area .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; line-height:22px;} -#popup_menu_area .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 0; white-space:nowrap; height:22px;} -#popup_menu_area .item_on { color:#333333; font-weight:bold; margin:0; cursor:pointer; padding:3px 0 3px 0; height:22px; letter-spacing:-1px; white-space:nowrap;} +#popup_menu_area .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; } +#popup_menu_area .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 0; white-space:nowrap; } +#popup_menu_area .item_on { color:#333333; font-weight:bold; margin:0; cursor:pointer; padding:3px 0 3px 0; letter-spacing:-1px; white-space:nowrap;} diff --git a/common/js/common.js b/common/js/common.js index 9ff690d7d..57f0e7001 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -168,15 +168,16 @@ function move_url(url, open_wnidow) { **/ function toggleDisplay(obj, opt) { obj = xGetElementById(obj); + if(!obj) return; if(typeof(opt)=="undefined") opt = "inline"; - if(obj.style.display == "none") obj.style.display = opt; - else obj.style.display = "none"; + if(!obj.style.display || obj.style.display == "block") obj.style.display = 'none'; + else obj.style.display = opt; } /** * @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용) **/ -function displayMultimedia(src, width, height, auto_start) { +function displayMultimedia(src, width, height, auto_start, flashvars) { if(src.indexOf('files')==0) src = request_uri+src; if(auto_start) auto_start = "true"; else auto_start = "false"; @@ -185,15 +186,18 @@ function displayMultimedia(src, width, height, auto_start) { var codebase = ""; var html = ""; + if(typeof(flashvars)=="undefined") flashvars = ""; + if(/\.swf/i.test(src)) { clsid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; html = ""+ - ""+ + ""+ ""+ ""+ ""+ ""+ + ""+ ""+ "<\/object>"; } else if(/\.flv/i.test(src)) { @@ -224,10 +228,10 @@ function resizeImageContents() { // 상위 node의 className이 document_ 또는 comment_ 로 시작하지 않으면 패스 var parent = obj.parentNode; while(parent) { - if(parent.className && parent.className.search(/document_|comment_/i) != -1) break; + if(parent.className && parent.className.search(/xe_content|document_|comment_/i) != -1) break; parent = parent.parentNode; } - if (!parent || parent.className.search(/document_|comment_/i) < 0) continue; + if (!parent || parent.className.search(/xe_content|document_|comment_/i) < 0) continue; if(parent.parentNode) xWidth(parent, xWidth(parent.parentNode)); parent.style.width = '100%'; @@ -595,8 +599,8 @@ function displayPopupMenu(ret_obj, response_tags, params) { if(!str || !func) continue; - if(icon) html += ""+str+"
"; - else html += ""+str+"
"; + if(icon) html += "
"+str+"
"; + else html += "
"+str+"
"; } } loaded_popup_menu_list[menu_id] = html; @@ -936,3 +940,34 @@ var Base64 = { } } + +/* select - option의 disabled=disabled 속성을 IE에서도 체크하기 위한 함수 */ +if(xIE4Up) { + xAddEventListener(window, 'load', activateOptionDisabled); + + function activateOptionDisabled(evt) { + var sels = xGetElementsByTagName('select'); + for(var i=0; i < sels.length; i++){ + var disabled_exists = false; + for(var j=0; j < sels[i].options.length; j++) { + if(sels[i].options[j].disabled) { + sels[i].options[j].style.color = '#CCCCCC'; + disabled_exists = true; + } + } + + if(!disabled_exists) continue; + + sels[i].onchange = function() { + if(this.options[this.selectedIndex].disabled) { + if(this.options.length<=1) this.selectedIndex = -1; + else if(this.selectedIndex < this.options.length - 1) this.selectedIndex++; + else this.selectedIndex--; + } + } + + if(sels[i].selectedIndex >= 0 && sels[i].options[ sels[i].selectedIndex ].disabled) sels[i].onchange(); + + } + } +} diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js index c3dace935..10a26d2df 100644 --- a/common/js/xml_handler.js +++ b/common/js/xml_handler.js @@ -44,6 +44,11 @@ function xml_response_filter(oXml, callback_func, response_tags, callback_func_a return null; } + if(ret_obj["redirect_url"]) { + location.href=ret_obj["redirect_url"]; + return null; + } + if(!callback_func) return null; callback_func(ret_obj, response_tags, callback_func_arg, fo_obj); diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js index 07e2d1ef9..5ef23d42f 100644 --- a/common/js/xml_js_filter.js +++ b/common/js/xml_js_filter.js @@ -231,6 +231,8 @@ function XmlJsFilterCheckFieldItem() { var equalto = item[4]; var filter = item[5].split(","); + if(typeof(this.fo_obj[target])=='undefined') continue; + for(var j=0; jcmd_reset = 'Reset'; $lang->cmd_remake_cache = "Re-create cache file"; $lang->cmd_publish = "Publish"; + $lang->cmd_layout_setup = 'Configure layout'; + $lang->cmd_layout_edit = 'Edit layout'; $lang->enable = 'Enable'; $lang->disable = 'Disable'; @@ -82,7 +84,7 @@ $lang->email_address = 'Email'; $lang->homepage = 'Homepage'; $lang->blog = 'Blog'; - $lang->birthday = 'Birthdate'; + $lang->birthday = 'Birthday'; $lang->browser_title = 'Browser Title'; $lang->title = 'Subject'; $lang->title_content = 'Subject+Content'; @@ -124,6 +126,7 @@ $lang->document_count = 'Total Articles'; $lang->page_count = 'Page Count'; $lang->list_count = 'List Count'; + $lang->search_list_count = 'Search List Count'; $lang->readed_count = 'Views'; $lang->voted_count = 'Votes'; $lang->member_count = 'Member Count'; @@ -147,7 +150,10 @@ $lang->use = 'Use'; $lang->notuse = 'Not use'; - $lang->not_exists = "Does not exist"; + $lang->not_exists = "Doesn't exist"; + + $lang->public = 'public'; + $lang->private = 'private'; $lang->unit_sec = 'sec'; $lang->unit_min = 'min'; diff --git a/common/lang/es.lang.php b/common/lang/es.lang.php index dc36eb62f..764a18a13 100644 --- a/common/lang/es.lang.php +++ b/common/lang/es.lang.php @@ -21,16 +21,16 @@ $lang->cmd_comment_registration = 'Agregar commentarios'; $lang->cmd_insert = 'Insertar'; $lang->cmd_save = 'Guardar'; - $lang->cmd_load = '불러오기'; + $lang->cmd_load = 'Carga'; $lang->cmd_input = 'Ingresar'; $lang->cmd_search = 'Buscar'; $lang->cmd_cancel = 'Cancelar'; $lang->cmd_back = 'Atrás'; $lang->cmd_vote = 'Recomendar'; - $lang->cmd_vote_down = '비추천'; - $lang->cmd_declare = '신고'; - $lang->cmd_cancel_declare = '신고 취소'; - $lang->cmd_declared_list = '신고 목록'; + $lang->cmd_vote_down = 'Critique'; + $lang->cmd_declare = 'Acusan'; + $lang->cmd_cancel_declare = 'Cancelar acusan'; + $lang->cmd_declared_list = 'Lista acusaciones'; $lang->cmd_copy = 'Copia'; $lang->cmd_move = 'Mover'; $lang->cmd_move_up = 'Arriba'; @@ -48,7 +48,7 @@ $lang->cmd_close = 'Cerrar'; $lang->cmd_open = 'Abrir'; $lang->cmd_setup = 'Configuración'; - $lang->cmd_addition_setup = '추가 설정'; + $lang->cmd_addition_setup = 'Configurar'; $lang->cmd_option = 'Opción'; $lang->cmd_apply = 'Aplicar'; $lang->cmd_open_calendar = 'Abrir el calendario'; @@ -57,8 +57,10 @@ $lang->cmd_scrap = 'Scrap'; $lang->cmd_preview = 'Previo'; $lang->cmd_reset = 'Rehacer'; - $lang->cmd_remake_cache = "캐시파일 재생성"; - $lang->cmd_publish = "발행"; + $lang->cmd_remake_cache = "Re-crear el archivo caché"; + $lang->cmd_publish = "Publicar"; + $lang->cmd_layout_setup = 'Configuración del diseño'; + $lang->cmd_layout_edit = 'Editar el diseño'; $lang->enable = 'Activar'; $lang->disable = 'Desactivar'; @@ -85,8 +87,8 @@ $lang->browser_title = 'Título del navegador'; $lang->title = 'Título'; $lang->title_content = 'Título+Contenido'; - $lang->topic = '주제'; - $lang->replies = '응답'; + $lang->topic = 'Tema'; + $lang->replies = 'Responder'; $lang->content = 'Contenidos'; $lang->document = 'Documentos'; $lang->comment = 'Commentarios'; @@ -123,13 +125,14 @@ $lang->document_count = 'Cantidad de documentos'; $lang->page_count = 'Cantidad de páginas'; $lang->list_count = 'Cantidad de listas'; + $lang->search_list_count = 'Buscar lista Conde'; $lang->readed_count = 'Leídos'; $lang->voted_count = 'Recomendados'; $lang->member_count = 'Cantidad de usuarios'; $lang->date = 'Fecha'; $lang->regdate = 'Fecha publicada'; $lang->last_update = 'Ultima actualización'; - $lang->last_post = '최근 등록'; + $lang->last_post = 'Último mensaje'; $lang->signup_date = 'Fecha del registro'; $lang->last_login = 'Ultima conección'; $lang->first_page = 'Primera página'; @@ -148,6 +151,9 @@ $lang->notuse = 'No usar'; $lang->not_exists = 'No existe'; + $lang->public = 'Público'; + $lang->private = 'Privado'; + $lang->unit_sec = 'segundo'; $lang->unit_min = 'minuto'; $lang->unit_hour = 'hora'; @@ -178,7 +184,7 @@ $lang->msg_module_is_not_standalone = 'Módulo solicitado no puede ser ejecutado independientemente'; $lang->success_registed = 'Agregado con éxito'; - $lang->success_declared = '신고되었습니다'; + $lang->success_declared = 'Acusado con éxito'; $lang->success_updated = 'Actualizado con éxito'; $lang->success_deleted = 'Boarrado con éxito'; $lang->success_voted = 'Recomendado con éxito'; @@ -186,13 +192,13 @@ $lang->success_sended = 'Enviado con éxito'; $lang->success_reset = 'Reajustado con éxito'; $lang->success_leaved = 'Abandonado con éxito'; - $lang->success_saved = '저장되었습니다'; + $lang->success_saved = 'Guardado correctamente'; $lang->fail_to_delete = 'No puede ser borrado'; $lang->fail_to_move = 'No puede ser movido'; $lang->failed_voted = 'No puede ser recomendado'; - $lang->failed_declared = '신고를 하실 수 없습니다'; + $lang->failed_declared = 'No se ha podido acusar'; $lang->fail_to_delete_have_children = 'No puede ser borrado, ya que el mensaje posee respuestas '; $lang->confirm_submit = '¿Está seguro que desea enviar?'; diff --git a/common/lang/fr.lang.php b/common/lang/fr.lang.php index 19fe1aa61..872498dfe 100644 --- a/common/lang/fr.lang.php +++ b/common/lang/fr.lang.php @@ -59,6 +59,8 @@ $lang->cmd_reset = '초기화'; $lang->cmd_remake_cache = "캐시파일 재생성"; $lang->cmd_publish = "발행"; + $lang->cmd_layout_setup = '레이아웃 설정'; + $lang->cmd_layout_edit = '레이아웃 편집'; $lang->enable = 'Permettre'; $lang->disable = 'Neutraliser'; @@ -122,6 +124,7 @@ $lang->document_count = 'Nombre Total des Articles'; $lang->page_count = 'Nombre de Pages'; $lang->list_count = 'Nombre de Listes'; + $lang->search_list_count = '검색 목록 수'; $lang->readed_count = 'Nombre de Fois Lues'; $lang->voted_count = 'Nombre de Voix'; $lang->member_count = 'Nombre de Membres'; @@ -147,6 +150,9 @@ $lang->notuse = 'Ne pas Utiliser'; $lang->not_exists = 'n\'Existe Pas'; + $lang->public = 'public'; + $lang->private = 'private'; + $lang->unit_sec = 'sec'; $lang->unit_min = 'min'; $lang->unit_hour = 'heur'; diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index aaba5548a..443689616 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -60,6 +60,8 @@ $lang->cmd_reset = '初期化'; $lang->cmd_remake_cache = "キャッシュファイル再生成"; $lang->cmd_publish = "発行"; + $lang->cmd_layout_setup = 'レイアウト設定'; + $lang->cmd_layout_edit = 'レイアウト編集'; $lang->enable = '可能'; $lang->disable = '不可'; @@ -124,6 +126,7 @@ $lang->document_count = '書き込み数'; $lang->page_count = 'ページ数'; $lang->list_count = 'リスト数'; + $lang->search_list_count = '검색 목록 수'; $lang->readed_count = '照合数'; $lang->voted_count = '推薦数'; $lang->member_count = '会員数'; @@ -149,6 +152,9 @@ $lang->notuse = '未使用'; $lang->not_exists = 'なし'; + $lang->public = 'public'; + $lang->private = 'private'; + $lang->unit_sec = '秒'; $lang->unit_min = '分'; $lang->unit_hour = '時'; diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index 011c37ca8..eae8e8340 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -60,6 +60,8 @@ $lang->cmd_reset = '초기화'; $lang->cmd_remake_cache = "캐시파일 재생성"; $lang->cmd_publish = "발행"; + $lang->cmd_layout_setup = '레이아웃 설정'; + $lang->cmd_layout_edit = '레이아웃 편집'; $lang->enable = '가능'; $lang->disable = '불가능'; @@ -124,6 +126,7 @@ $lang->document_count = '글수'; $lang->page_count = '페이지수'; $lang->list_count = '목록 수'; + $lang->search_list_count = '검색 목록 수'; $lang->readed_count = '조회수'; $lang->voted_count = '추천수'; $lang->member_count = '회원수'; @@ -149,6 +152,9 @@ $lang->notuse = '미사용'; $lang->not_exists = '없음'; + $lang->public = '공개'; + $lang->private = '비공개'; + $lang->unit_sec = '초'; $lang->unit_min = '분'; $lang->unit_hour = '시'; diff --git a/common/lang/lang.info b/common/lang/lang.info index 66722fbe2..bd717093c 100644 --- a/common/lang/lang.info +++ b/common/lang/lang.info @@ -3,4 +3,4 @@ en,English zh-CN,中文 jp,日本語 es,Español -ru,Русский +ru,Русский \ No newline at end of file diff --git a/common/lang/ru.lang.php b/common/lang/ru.lang.php index 817668f0e..cd302a578 100644 --- a/common/lang/ru.lang.php +++ b/common/lang/ru.lang.php @@ -60,6 +60,8 @@ $lang->cmd_reset = 'Сброс'; $lang->cmd_remake_cache = "Пере-создать файл кэша"; $lang->cmd_publish = "Опубликовать"; + $lang->cmd_layout_setup = 'Конфигурировать лейаут'; + $lang->cmd_layout_edit = 'Редактировать лейаут'; $lang->enable = 'Включено'; $lang->disable = 'Выключено'; @@ -124,6 +126,7 @@ $lang->document_count = 'Всего статей'; $lang->page_count = 'Кол-во страниц'; $lang->list_count = 'Кол-во списков'; + $lang->search_list_count = 'Поиск Список кол'; $lang->readed_count = 'Хиты'; $lang->voted_count = 'Голоса'; $lang->member_count = 'Кол-во пользователей'; @@ -149,6 +152,9 @@ $lang->notuse = 'Не использовать'; $lang->not_exists = "Не существует"; + $lang->public = 'общественности'; + $lang->private = 'частный'; + $lang->unit_sec = 'сек.'; $lang->unit_min = 'мин.'; $lang->unit_hour = 'ч.'; diff --git a/common/lang/zh-CN.lang.php b/common/lang/zh-CN.lang.php index 324168621..054c2aaca 100644 --- a/common/lang/zh-CN.lang.php +++ b/common/lang/zh-CN.lang.php @@ -60,6 +60,8 @@ $lang->cmd_reset = '初始化'; $lang->cmd_remake_cache = "重新生成缓冲文件"; $lang->cmd_publish = "发表"; + $lang->cmd_layout_setup = '布局设置'; + $lang->cmd_layout_edit = '编辑布局'; $lang->enable = '可用'; $lang->disable = '禁用'; @@ -124,6 +126,7 @@ $lang->document_count = '帖子数'; $lang->page_count = '页数'; $lang->list_count = '目录数'; + $lang->search_list_count = '搜索目录'; $lang->readed_count = '查看'; $lang->voted_count = '推荐'; $lang->member_count = '会员数'; @@ -149,6 +152,9 @@ $lang->notuse = '未使用'; $lang->not_exists = '无'; + $lang->public = 'public'; + $lang->private = 'private'; + $lang->unit_sec = '秒'; $lang->unit_min = '分'; $lang->unit_hour = '时'; diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index e8b0015b1..332403262 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -2,7 +2,7 @@ - + diff --git a/config/config.inc.php b/config/config.inc.php index 33c7fe0f8..460aae9a7 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -14,7 +14,7 @@ * 이 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며 * config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 함 **/ - define('__ZBXE_VERSION__', '0.2.8'); + define('__ZBXE_VERSION__', '0.2.9'); /** * @brief 디버깅 메세지 출력 diff --git a/config/func.inc.php b/config/func.inc.php index e0100c5fa..3a455a101 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -256,8 +256,8 @@ * @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"); + $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]; } @@ -463,4 +463,55 @@ return sprintf("%08lx%08lx", $nr, $nr2); } + /** + * 현재 요청받은 스크립트 경로를 return + **/ + function getScriptPath() { + //if(function_exists('php_sapi_name') && php_sapi_name()=='cgi') return preg_replace('/index.php/i','',$_SERVER['PATH_INFO']); + return preg_replace('/index.php/i','',$_SERVER['SCRIPT_NAME']); + } + + /** + * javascript의 escape의 php unescape 함수 + * Function converts an Javascript escaped string back into a string with specified charset (default is UTF-8). + * Modified function from http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps + **/ + function utf8RawUrlDecode ($source) { + $decodedStr = ""; + $pos = 0; + $len = strlen ($source); + while ($pos < $len) { + $charAt = substr ($source, $pos, 1); + if ($charAt == '%') { + $pos++; + $charAt = substr ($source, $pos, 1); + if ($charAt == 'u') { + // we got a unicode character + $pos++; + $unicodeHexVal = substr ($source, $pos, 4); + $unicode = hexdec ($unicodeHexVal); + $decodedStr .= _code2utf($unicode); + $pos += 4; + } + else { + // we have an escaped ascii character + $hexVal = substr ($source, $pos, 2); + $decodedStr .= chr (hexdec ($hexVal)); + $pos += 2; + } + } else { + $decodedStr .= $charAt; + $pos++; + } + } + return $decodedStr; + } + + function _code2utf($num){ + if($num<128)return chr($num); + if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128); + if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); + if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128); + return ''; + } ?> diff --git a/index.php b/index.php index f0b1f9f29..2647f79aa 100644 --- a/index.php +++ b/index.php @@ -14,7 +14,7 @@ * zeroboard XE 는 오픈 프로젝트로 개발되는 오픈 소스입니다.\n * 자세한 내용은 아래 링크를 참조하세요. * - 공식홈페이지 : http://www.zeroboard.com - * - 오픈프로젝트 사이트 : http://spring.zeroboard.com + * - zbXE 포럼 : http://www.zeroboard.com/forum_main * - 이슈트래킹 : http://trac.zeroboard.com * - SVN Repository : http://svn.zeroboard.com/zeroboard_xe/trunk * - document : http://doc.zeroboard.com diff --git a/layouts/xe_blog/conf/info.xml b/layouts/xe_blog/conf/info.xml new file mode 100644 index 000000000..2dbc62912 --- /dev/null +++ b/layouts/xe_blog/conf/info.xml @@ -0,0 +1,217 @@ + + + 제로보드XE 블로그 기본 스킨 + ZBXEブログのデフォルトスキン + Zeroboard XE博客默认皮肤 + Default Skin of Zeroboard XE blog + Cuidado de la Piel por defecto de Zeroboard XE blog + По умолчанию Кожа Zeroboard XE блоге + + zero + zero + zero + zero + zero + zero + + 제로보드XE 블로그 기본 스킨입니다. + 디자인 : 서기정 (http://blog.naver.com/addcozy) + HTML/CSS : 정찬명 (http://naradesign.net) + + + ゼロボードXEブログの基本スキンです。 + デザイン:ソギジョン (http://blog.naver.com/addcozy) + HTML/CSS:ジョンチャンミョン (http://naradesign.net) + + + Zeroboard XE博客默认皮肤。 + 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + This is default skin of Zeroboard XE blog. + Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + Esto es por defecto de la piel Zeroboard XE blog. + Diseño: Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML / CSS: Jeong Chan-Myung (http://naradesign.net) + + + Это умолчанию кожи Zeroboard XE блоге. + Дизайн: Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML / CSS: Jeong Chan-Myung (http://naradesign.net) + + + + + 컬러셋 + カラーセット + 颜色 + Colorset + Set de Colores + Colorset + 원하시는 컬러셋을 선택해주세요. + 希望するカラーセットを選択してください。 + 请选择颜色。 + Please select a colorset you want. + Выберите colorset хотите. + Seleccione set de colores que desea. + + 하얀색(기본) + 白色(基本) + 白色(默认) + White (default) + Blanco (por defecto) + Белые (по умолчанию) + white + + + 청록색 + 青緑 + 青绿色 + Cyan + Cian + Cyan + cyan + + + 초록색 + + 绿色 + Green + Verde + Green + green + + + 빨간색 + + 红色 + Red + Roja + Красный + red + + + 보라색 + + 紫色 + Purple + Púrpura + Фиолетовый + purple + + + + 기본 모듈 + 기본 모듈 + 기본 모듈 + Basic module + Módulo Básico + Основной модуль + 기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다 + 기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다 + 기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다 + The widgets that are being displayed in the layout will work properly if you select the basic module + Los reproductores que se muestran en el diseño funcionará correctamente si selecciona el módulo básico + В виджеты, которые отображаются в формате будет работать правильно, если вы выбираете основной модуль + + + 상단 제목 + 上段タイトル + 博客标题 + Top Title + Top Título + Рейтинг Название + 레이아웃의 상단에 표시할 제목을 입력하세요. + レイアウト上段に表示させるタイトルを入力してください。 + 请输入博客主标题。 + Please input title which will be displayed on top of layout. + Introduce el título que se mostrará en la parte superior de diseño. + Введите название, которое будет отображаться в верхней части формы. + + + 부제 + サブタイトル + 副标题 + Subtitle + Subtítulo + Подзаголовок + 레이아웃의 상단에 큰 제목 아래 부제목을 입력하세요. + レイアウトの上段にメインタイトルの下のサブタイトルを入力してください。 + 请输入副标题。 + Please input subtitle which will be displayed under the top title. + Por favor, de entrada subtítulo que se mostrará bajo el título arriba. + Введите субтитров, которые будут отображаться в верхней заголовок. + + + 로고이미지 + ロゴイメージ + LOGO图片 + Logo Image + Imagen Logo + Изображения логотипа + 레이아웃의 상단에 표시될 로고이미지를 입력하세요. + レイアウトの上段に表示されるロゴイメージを入力してください。 + 上传博客LOGO图片。 + Please input logo image which will be displayed on top of layout. + Introduce el logotipo imagen que se mostrará en la parte superior de diseño. + Введите логотипа изображение, которое будет отображаться в верхней части формы. + + + 프로필 이미지 + プロフィールイメージ + 博客个性图片 + Profile Image + Perfil de Imagen + Профиль Изображение + 프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다) + プロフィールイメージを入力してください(横幅は「160px」が一番適しています)。 + 请输入博客个性图片(推荐宽度160px)。 + Please input profile image (It is recommended to set width as 160px) + Por favor, el perfil de entrada de imagen (Se recomienda configurar el ancho de 160px) + Введите профиля изображения (Рекомендуется устанавливать ширину, 160px) + + + 배경 이미지 + 背景イメージ + 背景图片 + Background Image + Imagen de fondo + Фоновое изображение + 배경 이미지를 사용하시려면 등록해주세요. + 背景イメージを使う場合は、登録してください。 + 要想使用背景图片请在这里上传。 + Please input if you want to use background image. + Entre, por favor, si desea utilizar la imagen de fondo. + Введите, если вы хотите использовать фоновое изображение. + + + 프로필 + プロフィール + 简介 + Profile + Perfil + Профиль + 간단한 프로필을 입력해주세요 + 簡単なプロフィールを入力してください。 + 请输入简单介绍。 + Please input your simple profile + Por favor, introduzca su perfil simple + Введите простое профиль + + + + + 상단 메뉴 + 上段メニュー + 菜单 + Top Menu + Menú superior + Главное меню + 1 + + + diff --git a/layouts/xe_blog/css/cyan.css b/layouts/xe_blog/css/cyan.css new file mode 100644 index 000000000..e9e15e7cc --- /dev/null +++ b/layouts/xe_blog/css/cyan.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#2895c0;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/cyan/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/cyan/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +/* account Navigation */ +#blogAccountNavigation li.join a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +#blogAccountNavigation li.myInfo a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* widget common css */ +.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } diff --git a/layouts/xe_blog/css/green.css b/layouts/xe_blog/css/green.css new file mode 100644 index 000000000..301e782df --- /dev/null +++ b/layouts/xe_blog/css/green.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#38b549;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/green/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/green/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +/* account Navigation */ +#blogAccountNavigation li.join a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +#blogAccountNavigation li.myInfo a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* widget common css */ +.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } diff --git a/modules/blog/skins/xe_blog/css/layout.css b/layouts/xe_blog/css/layout.css similarity index 63% rename from modules/blog/skins/xe_blog/css/layout.css rename to layouts/xe_blog/css/layout.css index ba917b378..d26e86f19 100644 --- a/modules/blog/skins/xe_blog/css/layout.css +++ b/layouts/xe_blog/css/layout.css @@ -27,28 +27,30 @@ a { text-decoration:none; } #bodyWrap #accountNavigation li a { display:block; float:left; padding:0 .75em; color:#888888; white-space:nowrap;} /* account Navigation */ -#blogAccountNavigation { float:right; margin:1em; } -#blogAccountNavigation li { float:left; margin-left:7px; list-style:none; padding-top:3px;} +#blogAccountNavigation { float:right; margin:10px 10px 0 0; } +#blogAccountNavigation li { float:left; margin-left:7px; list-style:none; } #blogAccountNavigation li a { font-size:12px; white-space:nowrap; color:#666666; text-decoration:none;} -#blogAccountNavigation li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } -#blogAccountNavigation li.admin a { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; } -#blogAccountNavigation li.listType { margin-left:5px; } -#blogAccountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; _padding-top:5px;} -#blogAccountNavigation li.write a { background:url(../images/common/iconWrite.gif) no-repeat left center; padding-left:14px;} -*:first-child+html #blogAccountNavigation li.loginAndLogout { padding-top:5px; } + +#blogAccountNavigation li.admin { background:url(../images/common/iconAdmin.gif) no-repeat left 1px; padding-left:12px; } +#blogAccountNavigation li.setup { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } +#blogAccountNavigation li.layout_setup { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; } +#blogAccountNavigation li.layout_edit { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; } +#blogAccountNavigation li.myinfo { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; } +#blogAccountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; } +#blogAccountNavigation li.write { background:url(../images/common/iconWrite.gif) no-repeat left top; padding-left:14px;} /* Blog header Child*/ -#bodyWrap #header h1 { font-size:2em; padding:.8em 0 .2em 30px; letter-spacing:-.05em;} +#bodyWrap #header h1 { position:relative; left:20px; top:30px; font-size:2em; letter-spacing:-.05em;} #bodyWrap #header h1 a { font-family:Tahoma; color:#53554a;} -#bodyWrap #header #tagLine { padding:0 0 0 30px; color:#7e7f77;} +#bodyWrap #header #tagLine { position:relative; left:20px; top:30px; color:#7e7f77;} -#bodyWrap #header #globalNavigation { float:right; padding:1em 1em 1em 0; overflow:hidden;} +#bodyWrap #header #globalNavigation { line-height:11pt; font-size:9pt; float:right; overflow:hidden; margin:45px 3px 0 0; } #bodyWrap #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/blogHeaderVr.gif) no-repeat left center;} -#bodyWrap #header #globalNavigation li a { display:block; float:left; padding:0 .75em; font-weight:bold; font-family:Tahoma; color:#54564b; white-space:nowrap;} +#bodyWrap #header #globalNavigation li a { display:block; float:left; padding:0 7px; font-weight:bold; color:#54564b; white-space:nowrap;} /* Column Left & Right Common Child */ .boxTypeA { position:relative; border:1px solid #e0e1db; margin-bottom:.7em;} -.boxTypeB h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;} +.boxTypeB h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; font-size:1em; color:#54564b; font-family:Tahoma;} *:first-child+html .boxTypeB h2 { height:20px;} .boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;} .boxTypeB .showHide { position:relative;} @@ -67,8 +69,6 @@ div#profile dl#hello dt a { color:#333333;} div#profile dl#hello dd { color:#777777; margin-bottom:1em;} div#profile ul#admin { overflow:hidden; height:1.2em;} -div#blog_category { background-color:#FFFFFF; } - /* Search Box */ div#searchBox { margin-bottom:.7em; overflow:hidden; width:100%;} div#searchBox fieldset { border:none;} @@ -79,3 +79,10 @@ div#searchBox .imgBtn {vertical-align:middle; _position:relative; top:-4px; } /* powered by zbxe */ #poweredbyzbxe { text-align:center; margin-top:2em; } #poweredbyzbxe img { width:138px; height:35px; border:0;} + +/* widget common css */ +.category_widget { border:1px solid #e0e1db; margin-bottom:10px; padding:15px 5px 10px 5px; overflow:hidden;} +.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; } diff --git a/layouts/xe_blog/css/purple.css b/layouts/xe_blog/css/purple.css new file mode 100644 index 000000000..419f86dce --- /dev/null +++ b/layouts/xe_blog/css/purple.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#b1ae00;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/purple/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/purple/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +/* account Navigation */ +#blogAccountNavigation li.join a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +#blogAccountNavigation li.myInfo a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* widget common css */ +.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } diff --git a/layouts/xe_blog/css/red.css b/layouts/xe_blog/css/red.css new file mode 100644 index 000000000..712c662c6 --- /dev/null +++ b/layouts/xe_blog/css/red.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#fe3614;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/red/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/red/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +/* account Navigation */ +#blogAccountNavigation li.join a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +#blogAccountNavigation li.myInfo a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* widget common css */ +.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } diff --git a/layouts/xe_blog/css/white.css b/layouts/xe_blog/css/white.css new file mode 100644 index 000000000..45b34bcc9 --- /dev/null +++ b/layouts/xe_blog/css/white.css @@ -0,0 +1,14 @@ +@charset "utf-8"; + +.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} +#bodyWrap #header #globalNavigation li.on a { color:#fe3614;} + +#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/white/blogHeaderVr.gif) no-repeat right center;} +#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/white/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} + +/* account Navigation */ +#blogAccountNavigation li.join { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +#blogAccountNavigation li.myInfo { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* widget common css */ +.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } diff --git a/modules/blog/skins/xe_blog/images/common/blank.gif b/layouts/xe_blog/images/common/blank.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/blank.gif rename to layouts/xe_blog/images/common/blank.gif diff --git a/modules/blog/skins/xe_blog/images/common/blogHeaderVr.gif b/layouts/xe_blog/images/common/blogHeaderVr.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/blogHeaderVr.gif rename to layouts/xe_blog/images/common/blogHeaderVr.gif diff --git a/modules/blog/skins/xe_blog/images/common/buttonHelp.gif b/layouts/xe_blog/images/common/buttonHelp.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/buttonHelp.gif rename to layouts/xe_blog/images/common/buttonHelp.gif diff --git a/modules/blog/skins/xe_blog/images/common/find_button.gif b/layouts/xe_blog/images/common/find_button.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/find_button.gif rename to layouts/xe_blog/images/common/find_button.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconAdmin.gif b/layouts/xe_blog/images/common/iconAdmin.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconAdmin.gif rename to layouts/xe_blog/images/common/iconAdmin.gif diff --git a/layouts/xe_blog/images/common/iconAllTags.gif b/layouts/xe_blog/images/common/iconAllTags.gif new file mode 100644 index 000000000..31602d819 Binary files /dev/null and b/layouts/xe_blog/images/common/iconAllTags.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/iconArrowD8.gif b/layouts/xe_blog/images/common/iconArrowD8.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconArrowD8.gif rename to layouts/xe_blog/images/common/iconArrowD8.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconRss.gif b/layouts/xe_blog/images/common/iconRss.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconRss.gif rename to layouts/xe_blog/images/common/iconRss.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconSetup.gif b/layouts/xe_blog/images/common/iconSetup.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconSetup.gif rename to layouts/xe_blog/images/common/iconSetup.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconWrite.gif b/layouts/xe_blog/images/common/iconWrite.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconWrite.gif rename to layouts/xe_blog/images/common/iconWrite.gif diff --git a/modules/blog/skins/xe_blog/images/common/line_1x10_e0e0e0.gif b/layouts/xe_blog/images/common/line_1x10_e0e0e0.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/line_1x10_e0e0e0.gif rename to layouts/xe_blog/images/common/line_1x10_e0e0e0.gif diff --git a/modules/blog/skins/xe_blog/images/common/poweredbyzbxe.png b/layouts/xe_blog/images/common/poweredbyzbxe.png similarity index 100% rename from modules/blog/skins/xe_blog/images/common/poweredbyzbxe.png rename to layouts/xe_blog/images/common/poweredbyzbxe.png diff --git a/modules/blog/skins/xe_blog/images/cyan/bgBoxTypeB.gif b/layouts/xe_blog/images/cyan/bgBoxTypeB.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/bgBoxTypeB.gif rename to layouts/xe_blog/images/cyan/bgBoxTypeB.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/blogHeaderLine.gif b/layouts/xe_blog/images/cyan/blogHeaderLine.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/blogHeaderLine.gif rename to layouts/xe_blog/images/cyan/blogHeaderLine.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/blogHeaderVr.gif b/layouts/xe_blog/images/cyan/blogHeaderVr.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/blogHeaderVr.gif rename to layouts/xe_blog/images/cyan/blogHeaderVr.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/iconMyInfo.gif b/layouts/xe_blog/images/cyan/iconMyInfo.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/iconMyInfo.gif rename to layouts/xe_blog/images/cyan/iconMyInfo.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/iconWrite.gif b/layouts/xe_blog/images/cyan/iconWrite.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/iconWrite.gif rename to layouts/xe_blog/images/cyan/iconWrite.gif diff --git a/modules/blog/skins/xe_blog/images/green/bgBoxTypeB.gif b/layouts/xe_blog/images/green/bgBoxTypeB.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/bgBoxTypeB.gif rename to layouts/xe_blog/images/green/bgBoxTypeB.gif diff --git a/modules/blog/skins/xe_blog/images/green/blogHeaderLine.gif b/layouts/xe_blog/images/green/blogHeaderLine.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/blogHeaderLine.gif rename to layouts/xe_blog/images/green/blogHeaderLine.gif diff --git a/modules/blog/skins/xe_blog/images/green/blogHeaderVr.gif b/layouts/xe_blog/images/green/blogHeaderVr.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/blogHeaderVr.gif rename to layouts/xe_blog/images/green/blogHeaderVr.gif diff --git a/modules/blog/skins/xe_blog/images/green/iconMyInfo.gif b/layouts/xe_blog/images/green/iconMyInfo.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/iconMyInfo.gif rename to layouts/xe_blog/images/green/iconMyInfo.gif diff --git a/modules/blog/skins/xe_blog/images/green/iconWrite.gif b/layouts/xe_blog/images/green/iconWrite.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/iconWrite.gif rename to layouts/xe_blog/images/green/iconWrite.gif diff --git a/modules/blog/skins/xe_blog/images/purple/bgBoxTypeB.gif b/layouts/xe_blog/images/purple/bgBoxTypeB.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/bgBoxTypeB.gif rename to layouts/xe_blog/images/purple/bgBoxTypeB.gif diff --git a/modules/blog/skins/xe_blog/images/purple/blogHeaderLine.gif b/layouts/xe_blog/images/purple/blogHeaderLine.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/blogHeaderLine.gif rename to layouts/xe_blog/images/purple/blogHeaderLine.gif diff --git a/modules/blog/skins/xe_blog/images/purple/blogHeaderVr.gif b/layouts/xe_blog/images/purple/blogHeaderVr.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/blogHeaderVr.gif rename to layouts/xe_blog/images/purple/blogHeaderVr.gif diff --git a/modules/blog/skins/xe_blog/images/purple/iconMyInfo.gif b/layouts/xe_blog/images/purple/iconMyInfo.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/iconMyInfo.gif rename to layouts/xe_blog/images/purple/iconMyInfo.gif diff --git a/modules/blog/skins/xe_blog/images/purple/iconWrite.gif b/layouts/xe_blog/images/purple/iconWrite.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/iconWrite.gif rename to layouts/xe_blog/images/purple/iconWrite.gif diff --git a/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif b/layouts/xe_blog/images/red/bgBoxTypeB.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif rename to layouts/xe_blog/images/red/bgBoxTypeB.gif diff --git a/modules/blog/skins/xe_blog/images/red/blogHeaderLine.gif b/layouts/xe_blog/images/red/blogHeaderLine.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/blogHeaderLine.gif rename to layouts/xe_blog/images/red/blogHeaderLine.gif diff --git a/modules/blog/skins/xe_blog/images/red/blogHeaderVr.gif b/layouts/xe_blog/images/red/blogHeaderVr.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/blogHeaderVr.gif rename to layouts/xe_blog/images/red/blogHeaderVr.gif diff --git a/modules/blog/skins/xe_blog/images/red/iconMyInfo.gif b/layouts/xe_blog/images/red/iconMyInfo.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/iconMyInfo.gif rename to layouts/xe_blog/images/red/iconMyInfo.gif diff --git a/modules/blog/skins/xe_blog/images/red/iconWrite.gif b/layouts/xe_blog/images/red/iconWrite.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/iconWrite.gif rename to layouts/xe_blog/images/red/iconWrite.gif diff --git a/modules/blog/skins/xe_blog/images/white/bgBoxTypeB.gif b/layouts/xe_blog/images/white/bgBoxTypeB.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/bgBoxTypeB.gif rename to layouts/xe_blog/images/white/bgBoxTypeB.gif diff --git a/modules/blog/skins/xe_blog/images/white/blogHeaderLine.gif b/layouts/xe_blog/images/white/blogHeaderLine.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/blogHeaderLine.gif rename to layouts/xe_blog/images/white/blogHeaderLine.gif diff --git a/modules/blog/skins/xe_blog/images/white/blogHeaderVr.gif b/layouts/xe_blog/images/white/blogHeaderVr.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/blogHeaderVr.gif rename to layouts/xe_blog/images/white/blogHeaderVr.gif diff --git a/modules/blog/skins/xe_blog/images/white/iconMyInfo.gif b/layouts/xe_blog/images/white/iconMyInfo.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/iconMyInfo.gif rename to layouts/xe_blog/images/white/iconMyInfo.gif diff --git a/modules/blog/skins/xe_blog/images/white/iconWrite.gif b/layouts/xe_blog/images/white/iconWrite.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/iconWrite.gif rename to layouts/xe_blog/images/white/iconWrite.gif diff --git a/modules/blog/skins/xe_blog/layout.html b/layouts/xe_blog/layout.html similarity index 74% rename from modules/blog/skins/xe_blog/layout.html rename to layouts/xe_blog/layout.html index fd2cf55b7..1ee1adea5 100644 --- a/modules/blog/skins/xe_blog/layout.html +++ b/layouts/xe_blog/layout.html @@ -1,10 +1,5 @@ - - - - - @@ -12,7 +7,6 @@ - @@ -26,14 +20,6 @@ - - - - {$layout_info->header_text} - @@ -117,34 +105,36 @@ - -
- + +
+ +
+ - + - + - + - + - + - + @@ -165,6 +155,3 @@ - - -{$layout_info->footer_text} diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml index bd0898b99..34673e5ac 100644 --- a/layouts/xe_official/conf/info.xml +++ b/layouts/xe_official/conf/info.xml @@ -3,12 +3,14 @@ ZBXE 공식 사이트 레이아웃 ZBXEオフィシャルレイアウト ZBXE Official website layout + ZBXE Официальный сайт макет Diseño oficial de la página web de ZBXE ZBXE 官方网站布局 zero Zero zero + zero zero zero @@ -28,6 +30,12 @@ Designer : So-Ra Lee HTML/CSS : Chan-Myung Jeong Layout producer : zero + + + Этот формат является Zeroboard XE Официальный сайт компоновку. + Дизайнер: So-Ra Lee + HTML / CSS: Chan-Myung Jeong + Макет производителя: ноль Este diseño is el diseño oficial de la página web de Zerobard XE. @@ -48,16 +56,19 @@ カラーセット 颜色 Colorset + Colorset Set de colores 원하시는 컬러셋을 선택해주세요. 希望するカラーセットを選択してください。 请选择颜色。 Please select a colorset you want. + Выберите colorset хотите. Seleccione set de colores que desea. 기본 デフォルト Basic + Базовые Básico 默认 default @@ -66,6 +77,7 @@ 검은색 Black + Черного Negro 黑色 black @@ -74,6 +86,7 @@ 하얀색 white + белый Blanco 白色 white @@ -84,11 +97,13 @@ ロゴイメージ LOGO图片 Logo image + Изображения логотипа Imagen del logotipo 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다) レイアウトの上段に表示されるロゴイメージを入力してください。 (縦幅が23pxである透明イメージが最も合います。) 请输入显示在布局顶部的LOGO图片。(高度为23px的透明图片为适。) Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 23px is recommended.) + Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 23px рекомендуется.) Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px. @@ -96,11 +111,13 @@ ホームページURL 主页地址 Homepage URL + Домашняя страница URL URL de la página web 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. ロゴをクリックした時に移動するホームページのURLを入力してください。 点击网站LOGO时要移动的页面URL。 Please input the URL to redirect when user clicks the logo + Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип Ingresar el URL de la página web para redireccionar al pulsar el logotipo @@ -108,11 +125,13 @@ 背景イメージ 背景图片 Background Image - Imagen de fondo + Фоновое изображение + Imagen de fondo 배경 이미지를 사용하시려면 등록해주세요. 背景イメージを使う場合は、登録してください。 要想使用背景图片请在这里上传。 Please input if you want to use background image. + Введите, если вы хотите использовать фоновое изображение. Ingresar imagen de fondo si desea usar. @@ -122,6 +141,7 @@ 上段メニュー 主菜单 Top menu + Верхнее меню Menú Principal 3 @@ -130,6 +150,7 @@ 下段メニュー 底部菜单 Bottom menu + Внизу меню Menú Inferior 1 diff --git a/layouts/xe_official/css/black.css b/layouts/xe_official/css/black.css index 9121e584a..92139ae87 100644 --- a/layouts/xe_official/css/black.css +++ b/layouts/xe_official/css/black.css @@ -63,7 +63,7 @@ body { background:#3d3d3d url(../images/black/bgBody.gif) repeat-x;} #lnb li.on a { color:#ffffff; background:#e61700; border:1px solid #ff1a00;} #lnb li.on a:hover, #lnb li.on a:focus { font-weight:bold;} -#lnb li ul { display:none; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #3d3d3d; overflow:hidden;} +#lnb li ul { display:block; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #3d3d3d; overflow:hidden;} #lnb li.on ul { display:block;} #lnb li ul li { padding:0; border-top:1px solid #474747; position:relative; top:-1px;} #lnb li ul li a { padding:6px 5px 6px 10px; width:169px; color:#818181 !important; border:none; background:none !important; border:none !important;} diff --git a/layouts/xe_official/css/default.css b/layouts/xe_official/css/default.css index f37a55491..a64c31bde 100644 --- a/layouts/xe_official/css/default.css +++ b/layouts/xe_official/css/default.css @@ -65,7 +65,7 @@ body { background:#FFFFFF url(../images/default/bgBody.gif) repeat-x left top; } #lnb li.on a { color:#ffffff; background:#de4332; border:1px solid #de4332;} #lnb li.on a:hover, #lnb li.on a:focus { font-weight:bold;} -#lnb li ul { display:none; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #ffffff; overflow:hidden;} +#lnb li ul { display:block; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #ffffff; overflow:hidden;} #lnb li.on ul { display:block;} #lnb li ul li { padding:0; border-top:1px solid #f2f2f2; position:relative; top:-1px;} #lnb li ul li a { padding:6px 5px 6px 10px; width:169px; color:#818181 !important; border:none; background:none !important; border:none !important;} diff --git a/layouts/xe_official/css/white.css b/layouts/xe_official/css/white.css index d8a4ae3c6..f2e1337bc 100644 --- a/layouts/xe_official/css/white.css +++ b/layouts/xe_official/css/white.css @@ -64,7 +64,7 @@ body { background:#ffffff;} #lnb li.on a { color:#ffffff; background:#de4332; border:1px solid #de4332;} #lnb li.on a:hover, #lnb li.on a:focus { font-weight:bold;} -#lnb li ul { display:none; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #ffffff; overflow:hidden;} +#lnb li ul { display:block; position:relative; width:184px; padding:0 3px; position:relative; border-top:1px solid #ffffff; overflow:hidden;} #lnb li.on ul { display:block;} #lnb li ul li { padding:0; border-top:1px solid #f2f2f2; position:relative; top:-1px;} #lnb li ul li a { padding:6px 5px 6px 10px; width:169px; color:#818181 !important; border:none; background:none !important; border:none !important;} diff --git a/layouts/xe_official/layout.html b/layouts/xe_official/layout.html index d6a508b26..518799dd0 100644 --- a/layouts/xe_official/layout.html +++ b/layouts/xe_official/layout.html @@ -36,12 +36,12 @@ diff --git a/modules/springnote/lib/PEAR/HTTP/Request.php b/libs/PEAR/HTTP/Request.php similarity index 100% rename from modules/springnote/lib/PEAR/HTTP/Request.php rename to libs/PEAR/HTTP/Request.php diff --git a/modules/springnote/lib/PEAR/HTTP/Request/Listener.php b/libs/PEAR/HTTP/Request/Listener.php similarity index 100% rename from modules/springnote/lib/PEAR/HTTP/Request/Listener.php rename to libs/PEAR/HTTP/Request/Listener.php diff --git a/modules/springnote/lib/PEAR/Net/Socket.php b/libs/PEAR/Net/Socket.php similarity index 100% rename from modules/springnote/lib/PEAR/Net/Socket.php rename to libs/PEAR/Net/Socket.php diff --git a/modules/springnote/lib/PEAR/Net/URL.php b/libs/PEAR/Net/URL.php similarity index 100% rename from modules/springnote/lib/PEAR/Net/URL.php rename to libs/PEAR/Net/URL.php diff --git a/modules/springnote/lib/PEAR/PEAR.php b/libs/PEAR/PEAR.php similarity index 100% rename from modules/springnote/lib/PEAR/PEAR.php rename to libs/PEAR/PEAR.php diff --git a/modules/addon/addon.class.php b/modules/addon/addon.class.php index 46bb3a4b6..9ea945b38 100644 --- a/modules/addon/addon.class.php +++ b/modules/addon/addon.class.php @@ -22,16 +22,16 @@ $oAddonController->doInsert('blogapi'); $oAddonController->doInsert('counter'); $oAddonController->doInsert('member_extra_info'); - $oAddonController->doInsert('naver_search'); $oAddonController->doInsert('openid_delegation_id'); $oAddonController->doInsert('rainbow_link'); - $oAddonController->doInsert('spamfilter'); + $oAddonController->doInsert('point_level_icon'); + $oAddonController->doInsert('referer'); // 몇가지 애드온을 기본 활성화 상태로 변경 $oAddonController->doActivate('member_extra_info'); $oAddonController->doActivate('counter'); $oAddonController->doActivate('blogapi'); - $oAddonController->doActivate('spamfilter'); + $oAddonController->doActivate('referer'); $oAddonController->procAddonAdminToggleActivate(); return new Object(); } diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 6e2260eeb..bdb1b0f21 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -28,10 +28,9 @@ $oModuleModel = &getModel('module'); $installed_module_list = $oModuleModel->getModulesXmlInfo(); Context::set('installed_module_list', $installed_module_list); - // 현재 실행중인 모듈을 구해 놓음 - $running_module = strtolower(preg_replace('/([a-z]+)([A-Z]+)([a-z]+)(.*)/', '\\2\\3', $this->act)); + $running_module = strtolower(preg_replace('/([a-z]+)([A-Z]+)([a-z0-9]+)(.*)/', '\\2\\3', $this->act)); Context::set('running_module', $running_module); $db_info = Context::getDBInfo(); diff --git a/modules/admin/lang/es.lang.php b/modules/admin/lang/es.lang.php index 06761c41b..e516ac296 100644 --- a/modules/admin/lang/es.lang.php +++ b/modules/admin/lang/es.lang.php @@ -5,26 +5,26 @@ * @sumario Paquete del idioma español (sólo los básicos) **/ - $lang->admin_info = '관리자 정보'; - $lang->admin_index = '관리자 초기 페이지'; + $lang->admin_info = 'Administrador de Información'; + $lang->admin_index = 'Índice de la página admin'; $lang->module_category_title = array( - 'service' => '서비스형 모듈', - 'manager' => '관리형 모듈', - 'utility' => '기능성 모듈', - 'accessory' => '부가 모듈', - 'base' => '기본 모듈', + 'service' => 'Módulos de Servicio', + 'manager' => 'La gestión de módulos', + 'utility' => 'Utilidad de módulos', + 'accessory' => 'Módulos adicionales', + 'base' => 'Módulos por defecto', ); $lang->newest_news = "Noticias recientes"; $lang->env_setup = "Configuración"; - $lang->env_information = "환경 정보"; - $lang->current_version = "설치된 버전"; - $lang->current_path = "설치된 경로"; - $lang->released_version = "최신 버전"; - $lang->about_download_link = "설치된 버전보다 최신의 버전이 배포되었습니다. download링크를 클릭하시면 다운 받으실 수 있습니다."; + $lang->env_information = "Información Ambiental"; + $lang->current_version = "Versión actual"; + $lang->current_path = "Instalado Sendero"; + $lang->released_version = "Versión más reciente"; + $lang->about_download_link = "La versión más reciente de Zerboard XE está disponible. Para descargar la versión más reciente, haga clic en enlace de descarga."; $lang->item_module = "Lista de Módulos"; $lang->item_addon = "Lista de Addons"; @@ -46,7 +46,7 @@ $lang->welcome_to_zeroboard_xe = 'Esta es la página del Administrador de Zeroboard XE'; $lang->about_admin_page = "La página del Administrador aún está en desarrollo."; - $lang->about_lang_env = "위 설정한 언어셋을 처음 방문하는 사용자들에게 동일하게 적용하기 위해서는 원하는 언어로 변경후 아래 [저장] 버튼을 클릭하시면 됩니다"; + $lang->about_lang_env = "Para aplicar idioma seleccionado conjunto de los usuarios, como por defecto, haga clic en el botón [Guardar] el cambio."; $lang->zeroboard_xe_user_links = 'Enlaces para los usuarios '; $lang->zeroboard_xe_developer_links = 'Enlace para los desarrolladores'; diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 21ce08c60..8cb1509ae 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -130,6 +130,6 @@ h4 .view { color:#158692; padding-right:.6em; font:bold .9em Tahoma; background: #popFooter { width:620px; background:#f7f7f6; border-top:1px solid #e8e8e7; padding:.5em 0 .5em 0; overflow:hidden; } #popFooter .close { position:relative; left:50%; margin-left:-1em; float:left;} -.layout_editor { width:100%; height:500px; border:0px; font-size:1em; } +.layout_editor { width:99%; height:500px; border:0px; font-size:1em; } .layout_editor_box { padding:10px; border:1px solid #DDDDDD; } diff --git a/modules/blog/blog.admin.controller.php b/modules/blog/blog.admin.controller.php deleted file mode 100644 index 42dfd8e67..000000000 --- a/modules/blog/blog.admin.controller.php +++ /dev/null @@ -1,466 +0,0 @@ -xml_info->grant; - - if(count($grant_list)) { - foreach($grant_list as $key => $val) { - $group_srls = Context::get($key); - if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls); - } - $grants = serialize($arr_grant); - } - - $oModuleController = &getController('module'); - $oModuleController->updateModuleGrant($module_srl, $grants); - - $this->add('module_srl',Context::get('module_srl')); - $this->setMessage('success_registed'); - } - - /** - * @brief 스킨 정보 업데이트 - **/ - function procBlogAdminUpdateSkinInfo() { - // module_srl에 해당하는 정보들을 가져오기 - $module_srl = Context::get('module_srl'); - - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - $skin = $module_info->skin; - - // 스킨의 정보르 구해옴 (extra_vars를 체크하기 위해서) - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - - // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) - $obj = Context::getRequestVars(); - unset($obj->act); - unset($obj->module_srl); - unset($obj->page); - - // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 - if($skin_info->extra_vars) { - foreach($skin_info->extra_vars as $vars) { - if($vars->type!='image') continue; - - $image_obj = $obj->{$vars->name}; - - // 삭제 요청에 대한 변수를 구함 - $del_var = $obj->{"del_".$vars->name}; - unset($obj->{"del_".$vars->name}); - if($del_var == 'Y') { - @unlink($module_info->{$vars->name}); - continue; - } - - // 업로드 되지 않았다면 이전 데이터를 그대로 사용 - if(!$image_obj['tmp_name']) { - $obj->{$vars->name} = $module_info->{$vars->name}; - continue; - } - - // 정상적으로 업로드된 파일이 아니면 무시 - if(!is_uploaded_file($image_obj['tmp_name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 이미지 파일이 아니어도 무시 - if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 경로를 정해서 업로드 - $path = sprintf("./files/attach/images/%s/", $module_srl); - - // 디렉토리 생성 - if(!FileHandler::makeDir($path)) return false; - - $filename = $path.$image_obj['name']; - - // 파일 이동 - if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { - unset($obj->{$vars->name}); - continue; - } - - // 변수를 바꿈 - unset($obj->{$vars->name}); - $obj->{$vars->name} = $filename; - } - } - - // 메뉴 관리 - $menus = get_object_vars($skin_info->menu); - if(count($menus)) { - foreach($menus as $menu_id => $val) { - $menu_srl = Context::get($menu_id); - if($menu_srl) { - $obj->menu->{$menu_id} = $menu_srl; - $obj->{$menu_id} = $menu_srl; - $menu_srl_list[] = $menu_srl; - } - } - - // 정해진 메뉴가 있으면 모듈 및 메뉴에 대한 레이아웃 연동 - if(count($menu_srl_list)) { - // 해당 메뉴와 레이아웃 값을 매핑 - $oMenuAdminController = &getAdminController('menu'); - $oMenuAdminController->updateMenuLayout($module_srl, $menu_srl_list); - - // 해당 메뉴에 속한 mid의 layout값을 모두 변경 - $oModuleController->updateModuleLayout($module_srl, $menu_srl_list); - } - } - - // serialize하여 저장 - $oDocumentModel = &getModel('document'); - $obj->category_xml_file = $oDocumentModel->getCategoryXmlFile($module_srl); - $obj->mid = $module_info->mid; - $skin_vars = serialize($obj); - - $oModuleController->updateModuleSkinVars($module_srl, $skin_vars); - - // 레이아웃 확장변수 수정 - $layout_args->mid = $obj->mid; - $layout_args->extra_vars = $skin_vars; - $layout_args->layout_srl = $module_srl; - $oLayoutAdminController = &getAdminController('layout'); - $output = $oLayoutAdminController->updateLayout($layout_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - $this->setLayoutPath('./common/tpl'); - $this->setLayoutFile('default_layout.html'); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile("top_refresh.html"); - } - - /** - * @brief 블로그 추가 - **/ - function procBlogAdminInsertBlog() { - // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 - $args = Context::gets('module_srl','module_category_srl','blog_name','skin','browser_title','description','is_default','header_text','footer_text','admin_id'); - $args->module = 'blog'; - $args->mid = $args->blog_name; - unset($args->blog_name); - if($args->is_default!='Y') $args->is_default = 'N'; - - // 기본 값외의 것들을 정리 - $extra_var = delObjectVars(Context::getRequestVars(), $args); - unset($extra_var->act); - unset($extra_var->page); - unset($extra_var->blog_name); - - // 확장변수(20개로 제한된 고정 변수) 체크 - $user_defined_extra_vars = array(); - foreach($extra_var as $key => $val) { - if(substr($key,0,11)!='extra_vars_') continue; - preg_match('/^extra_vars_([0-9]+)_(.*)$/i', $key, $matches); - if(!$matches[1] || !$matches[2]) continue; - - $user_defined_extra_vars[$matches[1]]->{$matches[2]} = $val; - unset($extra_var->{$key}); - } - for($i=1;$i<=20;$i++) if(!$user_defined_extra_vars[$i]->name) unset($user_defined_extra_vars[$i]); - $extra_var->extra_vars = $user_defined_extra_vars; - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // module_srl이 넘어오면 원 모듈이 있는지 확인 - if($args->module_srl) { - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); - - // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리 - if($module_info->module_srl != $args->module_srl) unset($args->module_srl); - } - - // $extra_var를 serialize - $args->extra_vars = serialize($extra_var); - - // module 모듈의 controller 객체 생성 - $oModuleController = &getController('module'); - - // is_default=='Y' 이면 - if($args->is_default=='Y') $oModuleController->clearDefaultModule(); - - // module_srl의 값에 따라 insert/update - if(!$args->module_srl) { - // 블로그 등록 - $output = $oModuleController->insertModule($args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 글작성, 파일첨부, 댓글 파일첨부, 관리에 대한 권한 지정 - if($output->toBool()) { - $oMemberModel = &getModel('member'); - $admin_group = $oMemberModel->getAdminGroup(); - $admin_group_srl = $admin_group->group_srl; - - $module_srl = $output->get('module_srl'); - $grants = serialize(array('write_document'=>array($admin_group_srl), 'fileupload'=>array($admin_group_srl), 'comment_fileupload'=>array($admin_group_srl), 'manager'=>array($admin_group_srl))); - - $output = $oModuleController->updateModuleGrant($module_srl, $grants); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - - // 레이아웃 등록 - $layout_args->layout_srl = $layout_args->module_srl = $module_srl; - $layout_args->layout = 'blog'; - $layout_args->title = sprintf('%s - %s',$args->browser_title, $args->mid); - $layout_args->layout_path = sprintf('./modules/blog/skins/%s/layout.html', $args->skin); - - $oLayoutController = &getAdminController('layout'); - $output = $oLayoutController->insertLayout($layout_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 기본 카테고리 등록 - $category_args->module_srl = $args->module_srl; - $category_args->category_srl = getNextSequence(); - $category_args->title = 'Story'; - $category_args->expand = 'N'; - $this->procBlogAdminInsertCategory($category_args); - - $msg_code = 'success_registed'; - } else { - // 블로그 데이터 수정 - $output = $oModuleController->updateModule($args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 레이아웃 수정 - $layout_args->mid = $args->mid; - $layout_args->layout_srl = $layout_args->module_srl = $module_srl = $output->get('module_srl'); - $layout_args->title = $args->browser_title; - $layout_args->layout_path = sprintf('./modules/blog/skins/%s/layout.html', $args->skin); - - $oLayoutAdminController = &getAdminController('layout'); - $output = $oLayoutAdminController->updateLayout($layout_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - $msg_code = 'success_updated'; - } - - $oDB->commit(); - - $this->add('page',Context::get('page')); - $this->add('module_srl',$output->get('module_srl')); - $this->setMessage($msg_code); - } - - /** - * @brief 카테고리 추가 - **/ - function procBlogAdminInsertCategory($args = null) { - // 입력할 변수 정리 - if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','title','expand','group_srls'); - - if($args->expand !="Y") $args->expand = "N"; - $args->group_srls = str_replace('|@|',',',$args->group_srls); - $args->parent_srl = (int)$args->parent_srl; - - $oDocumentController = &getController('document'); - $oDocumentModel = &getModel('document'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 이미 존재하는지를 확인 - if($args->category_srl) { - $category_info = $oDocumentModel->getCategory($args->category_srl); - if($category_info->category_srl != $args->category_srl) $args->category_srl = null; - } - - // 존재하게 되면 update를 해준다 - if($args->category_srl) { - $output = $oDocumentController->updateCategory($args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 존재하지 않으면 insert를 해준다 - } else { - $output = $oDocumentController->insertCategory($args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - - // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $oDocumentController->makeCategoryXmlFile($args->module_srl); - - $oDB->commit(); - - $this->add('xml_file', $xml_file); - $this->add('module_srl', $args->module_srl); - $this->add('category_srl', $args->category_srl); - $this->add('parent_srl', $args->parent_srl); - } - - - /** - * @brief 블로그 삭제 - **/ - function procBlogAdminDeleteBlog() { - $module_srl = Context::get('module_srl'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 블로그 모듈 삭제 - $oModuleController = &getController('module'); - $output = $oModuleController->deleteModule($module_srl); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 레이아웃 삭제 - $layout_args->layout_srl = $layout_args->module_srl = $module_srl; - $oLayoutAdminController = &getAdminController('layout'); - $output = $oLayoutAdminController->deleteLayout($layout_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - $oDB->commit(); - - $this->add('module','blog'); - $this->add('page',Context::get('page')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 카테고리 삭제 - **/ - function procBlogAdminDeleteCategory() { - // 변수 정리 - $args = Context::gets('module_srl','category_srl'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $oDocumentModel = &getModel('document'); - - // 원정보를 가져옴 - $category_info = $oDocumentModel->getCategory($args->category_srl); - if($category_info->parent_srl) $parent_srl = $category_info->parent_srl; - - // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 - if($oDocumentModel->getCategoryChlidCount($args->category_srl)) return new Object(-1, 'msg_cannot_delete_for_child'); - - // DB에서 삭제 - $oDocumentController = &getController('document'); - $output = $oDocumentController->deleteCategory($args->category_srl); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $oDocumentController->makeCategoryXmlFile($args->module_srl); - - $oDB->commit(); - - $this->add('xml_file', $xml_file); - $this->add('category_srl', $parent_srl); - $this->setMessage('success_deleted'); - } - - /** - * @brief 카테고리 이동 - **/ - function procBlogAdminMoveCategory() { - $source_category_srl = Context::get('source_category_srl'); - $target_category_srl = Context::get('target_category_srl'); - - $oDocumentModel = &getModel('document'); - $oDocumentController = &getController('document'); - - $target_category = $oDocumentModel->getCategory($target_category_srl); - $source_category = $oDocumentModel->getCategory($source_category_srl); - - // source_category에 target_category_srl의 parent_srl, list_order 값을 입력 - $source_args->category_srl = $source_category_srl; - $source_args->parent_srl = $target_category->parent_srl; - $source_args->list_order = $target_category->list_order; - $output = $oDocumentController->updateCategory($source_args); - if(!$output->toBool()) return $output; - - // target_category의 list_order값을 +1해 준다 - $target_args->category_srl = $target_category_srl; - $target_args->parent_srl = $source_category->parent_srl; - $target_args->list_order = $source_category->list_order; - $output = $oDocumentController->updateCategory($target_args); - if(!$output->toBool()) return $output; - - // xml파일 재생성 - $xml_file = $oDocumentController->makeCategoryXmlFile($source_category->module_srl); - - // return 변수 설정 - $this->add('xml_file', $xml_file); - $this->add('source_category_srl', $source_category_srl); - } - - /** - * @brief xml 파일을 갱신 - * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n - * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n - * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 - **/ - function procBlogAdminMakeXmlFile() { - // 입력값을 체크 - $module_srl = Context::get('module_srl'); - - // xml파일 재생성 - $oDocumentController = &getController('document'); - $xml_file = $oDocumentController->makeCategoryXmlFile($module_srl); - - // return 값 설정 - $this->add('xml_file',$xml_file); - } - } -?> diff --git a/modules/blog/blog.admin.view.php b/modules/blog/blog.admin.view.php deleted file mode 100644 index 42947375f..000000000 --- a/modules/blog/blog.admin.view.php +++ /dev/null @@ -1,227 +0,0 @@ -module_srl) { - $module_srl = $this->module_srl; - Context::set('module_srl', $module_srl); - } - - // module model 객체 생성 - $oModuleModel = &getModel('module'); - - // module_srl이 넘어오면 해당 모듈의 정보를 미리 구해 놓음 - if($module_srl) { - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl == $module_srl) { - $this->module_info = $module_info; - Context::set('module_info',$module_info); - } - } - - // 모듈 카테고리 목록을 구함 - $module_category = $oModuleModel->getModuleCategories(); - Context::set('module_category', $module_category); - - // 만약 블로그 서비스 페이지에서 관리자 기능 호출시 요청된 블로그의 정보와 레이아웃 가져옴 - if($this->mid) { - $oView = &getView('blog'); - $oView->setModuleInfo($this->module_info, $this->xml_info); - $oView->init(); - } - - // 템플릿 경로 지정 (blog의 경우 tpl에 관리자용 템플릿 모아놓음) - $this->setTemplatePath($this->module_path."tpl"); - } - - /** - * @brief 블로그 관리 목록 보여줌 - **/ - function dispBlogAdminContent() { - // 등록된 blog 모듈을 불러와 세팅 - $args->sort_index = "module_srl"; - $args->page = Context::get('page'); - $args->list_count = 40; - $args->page_count = 10; - $args->s_module_category_srl = Context::get('module_category_srl'); - $output = executeQuery('blog.getBlogList', $args); - - // 템플릿에 쓰기 위해서 context::set - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('blog_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 파일 지정 - $this->setTemplateFile('index'); - } - - /** - * @brief 선택된 블로그의 정보 출력 - **/ - function dispBlogAdminBlogInfo() { - - // module_srl 값이 없다면 그냥 index 페이지를 보여줌 - if(!Context::get('module_srl')) return $this->dispBlogAdminContent(); - - // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) - if($this->module_info->layout_srl) { - $oLayoutModel = &getModel('layout'); - $layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl); - $this->module_info->layout = $layout_info->layout; - $this->module_info->layout_title = $layout_info->layout_title; - } - - // 정해진 스킨이 있으면 해당 스킨의 정보를 구함 - if($this->module_info->skin) { - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin); - $this->module_info->skin_title = $skin_info->title; - } - - // 템플릿 파일 지정 - $this->setTemplateFile('blog_info'); - } - - /** - * @brief 블로그 추가 폼 출력 - **/ - function dispBlogAdminInsertBlog() { - - // 스킨 목록을 구해옴 - $oModuleModel = &getModel('module'); - $skin_list = $oModuleModel->getSkins($this->module_path); - Context::set('skin_list',$skin_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('blog_insert'); - } - - /** - * @brief 블로그 추가 설정 보여줌 - * 추가설정은 서비스형 모듈들에서 다른 모듈과의 연계를 위해서 설정하는 페이지임 - **/ - function dispBlogAdminBlogAdditionSetup() { - // content는 다른 모듈에서 call by reference로 받아오기에 미리 변수 선언만 해 놓음 - $content = ''; - - // 추가 설정을 위한 트리거 호출 - // 블로그 모듈이지만 차후 다른 모듈에서의 사용도 고려하여 trigger 이름을 공용으로 사용할 수 있도록 하였음 - $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'before', $content); - $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'after', $content); - Context::set('setup_content', $content); - - // 템플릿 파일 지정 - $this->setTemplateFile('addition_setup'); - } - - /** - * @brief 블로그 삭제 화면 출력 - **/ - function dispBlogAdminDeleteBlog() { - - if(!Context::get('module_srl')) return $this->dispBlogAdminContent(); - - $module_info = Context::get('module_info'); - - $oDocumentModel = &getModel('document'); - $document_count = $oDocumentModel->getDocumentCount($module_info->module_srl); - $module_info->document_count = $document_count; - - Context::set('module_info',$module_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('blog_delete'); - } - - /** - * @brief 스킨 정보 보여줌 - **/ - function dispBlogAdminSkinInfo() { - - // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 - $module_info = Context::get('module_info'); - $skin = $module_info->skin; - - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - - // skin_info에 extra_vars 값을 지정 - if(count($skin_info->extra_vars)) { - foreach($skin_info->extra_vars as $key => $val) { - $name = $val->name; - $type = $val->type; - $value = $module_info->{$name}; - if($type=="checkbox"&&!$value) $value = array(); - $skin_info->extra_vars[$key]->value= $value; - } - } - - // skin_info에 menu값을 지정 - if(count($skin_info->menu)) { - foreach($skin_info->menu as $key => $val) { - if($module_info->{$key}) $skin_info->menu->{$key}->menu_srl = $module_info->{$key}; - } - } - - // 메뉴를 가져옴 - $oMenuAdminModel = &getAdminModel('menu'); - $menu_list = $oMenuAdminModel->getMenus(); - Context::set('menu_list', $menu_list); - - Context::set('skin_info', $skin_info); - $this->setTemplateFile('skin_info'); - } - - /** - * @brief 카테고리의 정보 출력 - **/ - function dispBlogAdminCategoryInfo() { - // module_srl을 구함 - $module_srl = $this->module_info->module_srl; - - // 카테고리 정보를 가져옴 - $oDocumentModel = &getModel('document'); - $category_xml_file = $oDocumentModel->getCategoryXmlFile($module_srl); - - Context::set('category_xml_file', $category_xml_file); - Context::addJsFile('./common/js/tree_menu.js'); - - Context::set('layout','none'); - $this->setTemplateFile('category_list'); - } - - /** - * @brief 권한 목록 출력 - **/ - function dispBlogAdminGrantInfo() { - // module_srl을 구함 - $module_srl = Context::get('module_srl'); - - // module.xml에서 권한 관련 목록을 구해옴 - $grant_list = $this->xml_info->grant; - Context::set('grant_list', $grant_list); - - // 권한 그룹의 목록을 가져온다 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - Context::set('group_list', $group_list); - - $this->setTemplateFile('grant_list'); - } - } -?> diff --git a/modules/blog/blog.class.php b/modules/blog/blog.class.php deleted file mode 100644 index 1a5c80c7c..000000000 --- a/modules/blog/blog.class.php +++ /dev/null @@ -1,90 +0,0 @@ -insertActionForward('blog', 'view', 'dispBlogAdminContent'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminBlogInfo'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminBlogAdditionSetup'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminInsertBlog'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminDeleteBlog'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminSkinInfo'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminCategoryInfo'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminMenuInfo'); - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminGrantInfo'); - $oModuleController->insertActionForward('blog', 'controller', 'procBlogAdminUpdateSkinInfo'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oModuleModel = &getModel('module'); - - /** - * 2007. 10. 17 : 게시판 모듈설정에 추가 설정 액션 설정 - **/ - if(!$oModuleModel->getActionForward('dispBlogAdminBlogAdditionSetup')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - /** - * 2007. 10. 17 : 게시판 모듈설정에 추가 설정 액션 설정 - **/ - if(!$oModuleModel->getActionForward('dispBlogAdminBlogAdditionSetup')) - $oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminBlogAdditionSetup'); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // 블로그 모듈의 캐시 파일 모두 삭제 - FileHandler::removeDir("./files/cache/blog_category"); - - $oModuleModel = &getModel('module'); - $oDocumentController = &getController('document'); - - // 블로그 모듈 목록을 모두 구함 - $args->module = 'blog'; - $output = executeQueryArray("module.getMidList", $args); - $list = $output->data; - if(!count($list)) return; - - // 블로그 모듈에서 사용되는 모든 메뉴 목록을 재 생성 - foreach($list as $blog_item) { - $module_srl = $blog_item->module_srl; - $oDocumentController->makeCategoryXmlFile($module_srl); - } - - } - } -?> diff --git a/modules/blog/blog.controller.php b/modules/blog/blog.controller.php deleted file mode 100644 index 0002ae302..000000000 --- a/modules/blog/blog.controller.php +++ /dev/null @@ -1,221 +0,0 @@ -grant->write_document) return new Object(-1, 'msg_not_permitted'); - - // 글작성시 필요한 변수를 세팅 - $obj = Context::getRequestVars(); - $obj->module_srl = $this->module_srl; - if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N'; - - // document module의 model 객체 생성 - $oDocumentModel = &getModel('document'); - - // document module의 controller 객체 생성 - $oDocumentController = &getController('document'); - - // 이미 존재하는 글인지 체크 - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - - // 이미 존재하는 경우 수정 - if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { - $output = $oDocumentController->updateDocument($oDocument, $obj); - $msg_code = 'success_updated'; - - // 그렇지 않으면 신규 등록 - } else { - $output = $oDocumentController->insertDocument($obj); - $msg_code = 'success_registed'; - $obj->document_srl = $output->get('document_srl'); - } - - // 오류 발생시 멈춤 - if(!$output->toBool()) return $output; - - // 트랙백이 있으면 트랙백 발송 - $trackback_url = Context::get('trackback_url'); - $trackback_charset = Context::get('trackback_charset'); - if($trackback_url) { - $oTrackbackController = &getController('trackback'); - $oTrackbackController->sendTrackback($obj, $trackback_url, $trackback_charset); - } - - // 결과를 리턴 - $this->add('mid', Context::get('mid')); - $this->add('document_srl', $output->get('document_srl')); - - // 성공 메세지 등록 - $this->setMessage($msg_code); - } - - /** - * @brief 문서 삭제 - **/ - function procBlogDeleteDocument() { - // 문서 번호 확인 - $document_srl = Context::get('document_srl'); - - // 문서 번호가 없다면 오류 발생 - if(!$document_srl) return $this->doError('msg_invalid_document'); - - // document module model 객체 생성 - $oDocumentController = &getController('document'); - - // 삭제 시도 - $output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager); - if(!$output->toBool()) return $output; - - // 성공 메세지 등록 - $this->add('mid', Context::get('mid')); - $this->add('page', $output->get('page')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 코멘트 추가 - **/ - function procBlogInsertComment() { - // 권한 체크 - if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted'); - - // 댓글 입력에 필요한 데이터 추출 - $obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage','is_secret','notify_message'); - $obj->module_srl = $this->module_srl; - - // comment 모듈의 model 객체 생성 - $oCommentModel = &getModel('comment'); - - // comment 모듈의 controller 객체 생성 - $oCommentController = &getController('comment'); - - /** - * 존재하는 댓글인지를 확인하여 존재 하지 않는 댓글이라면 신규로 등록하기 위해서 comment_srl의 sequence값을 받는다 - **/ - if(!$obj->comment_srl) { - $obj->comment_srl = getNextSequence(); - } else { - $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager); - } - - // comment_srl이 없을 경우 신규 입력 - if($comment->comment_srl != $obj->comment_srl) { - - // parent_srl이 있으면 답변으로 - if($obj->parent_srl) { - $parent_comment = $oCommentModel->getComment($obj->parent_srl); - if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request'); - - $output = $oCommentController->insertComment($obj); - - // 없으면 신규 - } else { - $output = $oCommentController->insertComment($obj); - } - - // comment_srl이 있으면 수정으로 - } else { - $obj->parent_srl = $comment->parent_srl; - $output = $oCommentController->updateComment($obj, $this->grant->manager); - $comment_srl = $obj->comment_srl; - } - - if(!$output->toBool()) return $output; - - $this->add('mid', Context::get('mid')); - $this->add('document_srl', $obj->document_srl); - $this->add('comment_srl', $obj->comment_srl); - - $this->setMessage('success_registed'); - } - - /** - * @brief 코멘트 삭제 - **/ - function procBlogDeleteComment() { - // 댓글 번호 확인 - $comment_srl = Context::get('comment_srl'); - if(!$comment_srl) return $this->doError('msg_invalid_request'); - - // comment 모듈의 controller 객체 생성 - $oCommentController = &getController('comment'); - - $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager); - if(!$output->toBool()) return $output; - - $this->add('mid', Context::get('mid')); - $this->add('page', Context::get('page')); - $this->add('document_srl', $output->get('document_srl')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 엮인글 삭제 - **/ - function procBlogDeleteTrackback() { - $trackback_srl = Context::get('trackback_srl'); - - // trackback module의 controller 객체 생성 - $oTrackbackController = &getController('trackback'); - $output = $oTrackbackController->deleteTrackback($trackback_srl, $this->grant->manager); - if(!$output->toBool()) return $output; - - $this->add('mid', Context::get('mid')); - $this->add('page', Context::get('page')); - $this->add('document_srl', $output->get('document_srl')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 문서와 댓글의 비밀번호를 확인 - **/ - function procBlogVerificationPassword() { - // 비밀번호와 문서 번호를 받음 - $password = Context::get('password'); - $document_srl = Context::get('document_srl'); - $comment_srl = Context::get('comment_srl'); - - $oMemberModel = &getModel('member'); - - // comment_srl이 있을 경우 댓글이 대상 - if($comment_srl) { - // 문서번호에 해당하는 글이 있는지 확인 - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl); - if(!$oComment->isExists()) return new Object(-1, 'msg_invalid_request'); - - // 문서의 비밀번호와 입력한 비밀번호의 비교 - if(!$oMemberModel->isValidPassword($oComment->get('password'),$password)) return new Object(-1, 'msg_invalid_password'); - - $oComment->setGrant(); - } else { - // 문서번호에 해당하는 글이 있는지 확인 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request'); - - // 문서의 비밀번호와 입력한 비밀번호의 비교 - if(!$oMemberModel->isValidPassword($oDocument->get('password'),$password)) return new Object(-1, 'msg_invalid_password'); - - $oDocument->setGrant(); - } - } - - } -?> diff --git a/modules/blog/blog.model.php b/modules/blog/blog.model.php deleted file mode 100644 index 7bed8b2a9..000000000 --- a/modules/blog/blog.model.php +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/modules/blog/blog.view.php b/modules/blog/blog.view.php deleted file mode 100644 index 3809afc3b..000000000 --- a/modules/blog/blog.view.php +++ /dev/null @@ -1,400 +0,0 @@ -module_srl) Context::set('module_srl',$this->module_srl); - - // 기본 모듈 정보들 설정 - $this->list_count = $this->module_info->list_count?$this->module_info->list_count:1; - $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10; - - // 카테고리 목록을 가져오고 선택된 카테고리의 값을 설정 - $oDocumentModel = &getModel('document'); - $this->category_list = $oDocumentModel->getCategoryList($this->module_srl); - Context::set('category_list', $this->category_list); - - // 스킨 경로 구함 - $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); - $this->setTemplatePath($template_path); - - // 레이아웃의 정보를 속이기 위해서 layout_srl을 현 블로그의 module_srl로 입력 - $this->module_info->layout_srl = $this->module_info->module_srl; - - /** - * 블로그는 자체 레이아웃을 관리하기에 이와 관련된 세팅을 해줌 - **/ - // 레이아웃 경로와 파일 지정 (블로그는 자체 레이아웃을 가지고 있음) - $this->setLayoutPath($template_path); - $this->setLayoutFile("layout"); - - // 수정된 레이아웃 파일이 있으면 지정 - $edited_layout = sprintf('./files/cache/layout/%d.html', $this->module_info->module_srl); - if(file_exists($edited_layout)) $this->setEditedLayoutFile($edited_layout); - - // 카테고리 xml 파일 위치 지정 - $this->module_info->category_xml_file = getUrl().$oDocumentModel->getCategoryXmlFile($this->module_info->module_srl); - - // 메뉴 등록시 메뉴 정보를 구해옴 - if($this->module_info->menu) { - foreach($this->module_info->menu as $menu_id => $menu_srl) { - $menu_php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); - if(file_exists($menu_php_file)) @include($menu_php_file); - Context::set($menu_id, $menu); - } - } - - // layout_info 변수 설정 - Context::set('layout_info',$this->module_info); - - // 모듈정보 세팅 - Context::set('module_info',$this->module_info); - } - - /** - * @brief 목록 및 선택된 글 출력 - **/ - function dispBlogContent() { - // 권한 체크 - if(!$this->grant->list) return $this->dispBlogMessage('msg_not_permitted'); - - // 모듈정보를 확인하여 확장변수에서도 검색이 설정되어 있는지 확인 - for($i=1;$i<=20;$i++) { - $ex_name = $this->module_info->extra_vars[$i]->name; - $ex_search = $this->module_info->extra_vars[$i]->search; - if($ex_name && $ex_search == 'Y') { - $search_option['extra_vars'.$i] = $ex_name; - } - } - Context::set('search_option', $search_option); - - // 목록 구현에 필요한 변수들을 가져온다 - $document_srl = Context::get('document_srl'); - $page = Context::get('page'); - - // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-; - $oDocumentModel = &getModel('document'); - - $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); - - // document_srl이 있다면 해당 글만 출력 - if($this->grant->list && $document_srl) { - - // 글을 구함 - $oDocument->setDocument($document_srl); - - // 찾아지지 않았다면 초기화 - if(!$oDocument->isExists()) { - unset($document_srl); - Context::set('document_srl','',true); - } else { - - // 브라우저 타이틀 설정 - Context::addBrowserTitle($oDocument->getTitleText()); - - // 댓글에디터 설정 - if($this->grant->write_comment && $oDocument->allowComment() && !$oDocument->isLocked()) $comment_editor[$oDocument->document_srl] = $this->getCommentEditor($oDocument->document_srl, 0, 100); - - // 조회수 증가 - $oDocument->updateReadedCount(); - - // 카테고리 설정 - Context::set('category', $oDocument->get('category_srl')); - - // 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이 없다면 정해진데로 목록을 구함 - 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->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; - - // 키워드 검색의 경우 제목,내용으로 검색 대상 고정 - if($args->search_keyword && !$args->search_target) $args->search_target = "title_content"; - - // 블로그 카테고리 - $args->category_srl = (int)Context::get('category'); - - $args->sort_index = 'list_order'; ///< 소팅 값 - - // 목록 구함, 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); - - // 문서 갯수만큼 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); - - // 템플릿에서 사용할 검색옵션 세팅 - $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); - } - - // 블로그의 코멘트는 ajax로 호출되기에 미리 css, js파일을 import - //Context::addJsFile('./modules/editor/tpl/js/editor.js'); - //Context::addCSSFile('./modules/editor/tpl/css/editor.css'); - - $this->setTemplateFile('list'); - } - - /** - * @brief 글 작성 화면 출력 - **/ - function dispBlogWrite() { - // 권한 체크 - if(!$this->grant->write_document) return $this->dispBlogMessage('msg_not_permitted'); - - // GET parameter에서 document_srl을 가져옴 - $document_srl = Context::get('document_srl'); - - // document 모듈 객체 생성 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager); - - // 지정된 글이 없다면 (신규) 새로운 번호를 만든다 - if(!$oDocument->isExists()) { - $document_srl = getNextSequence(); - Context::set('document_srl',''); - } - - // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 - if($oDocument->isExists()&&!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); - - Context::set('document_srl',$document_srl); - Context::set('oDocument', $oDocument); - - // 에디터 모듈의 getEditor를 호출하여 세팅 - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'document_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = $this->grant->fileupload; - $option->enable_autosave = true; - $option->enable_default_component = true; - $option->enable_component = true; - $option->resizable = true; - $option->height = 400; - $editor = $oEditorModel->getEditor($document_srl, $option); - Context::set('editor', $editor); - - $this->setTemplateFile('write_form'); - } - - /** - * @brief 문서 삭제 화면 출력 - **/ - function dispBlogDelete() { - // 권한 체크 - if(!$this->grant->write_document) return $this->dispBlogMessage('msg_not_permitted'); - - // 삭제할 문서번호를 가져온다 - $document_srl = Context::get('document_srl'); - - // 지정된 글이 있는지 확인 - if($document_srl) { - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - } - - // 삭제하려는 글이 없으면 에러 - if(!$oDocument->isExists()) return $this->dispBlogContent(); - - // 권한이 없는 경우 비밀번호 입력화면으로 - if(!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); - - Context::set('oDocument',$oDocument); - - $this->setTemplateFile('delete_form'); - } - - /** - * @brief 댓글의 답글 화면 출력 - **/ - function dispBlogReplyComment() { - // 권한 체크 - if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted'); - - // 목록 구현에 필요한 변수들을 가져온다 - $document_srl = Context::get('document_srl'); - $parent_srl = Context::get('comment_srl'); - - // 지정된 원 댓글이 없다면 오류 - if(!$parent_srl) return new Object(-1, 'msg_invalid_request'); - - // 해당 댓글를 찾아본다 - $oCommentModel = &getModel('comment'); - $oSourceComment = $oCommentModel->getComment($parent_srl, $this->grant->manager); - - // 댓글이 없다면 오류 - if(!$oSourceComment->isExists()) return $this->dispBlogMessage('msg_invalid_request'); - - // 대상 댓글을 생성 - $oComment = $oCommentModel->getComment(); - $oComment->add('parent_srl', $parent_srl); - $oComment->add('document_srl', $oSourceComment->get('document_srl')); - - // 필요한 정보들 세팅 - Context::set('oSourceComment',$oSourceComment); - Context::set('oComment',$oComment); - - // 댓글 에디터 세팅 - Context::set('editor', $this->getCommentEditor($document_srl, 0, 400)); - - $this->setTemplateFile('comment_form'); - } - - /** - * @brief 댓글 수정 폼 출력 - **/ - function dispBlogModifyComment() { - // 권한 체크 - if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted'); - - // 목록 구현에 필요한 변수들을 가져온다 - $document_srl = Context::get('document_srl'); - $comment_srl = Context::get('comment_srl'); - - // 지정된 댓글이 없다면 오류 - if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); - - // 해당 댓글를 찾아본다 - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, $this->grant->manager); - - // 댓글이 없다면 오류 - if(!$oComment->isExists()) return $this->dispBlogMessage('msg_invalid_request'); - - // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 - if(!$oComment->isGranted()) return $this->setTemplateFile('input_password_form'); - - // 필요한 정보들 세팅 - Context::set('oSourceComment', $oCommentModel->getComment()); - Context::set('oComment', $oComment); - - // 댓글 에디터 세팅 - Context::set('editor', $this->getCommentEditor($document_srl, $comment_srl, 400)); - - $this->setTemplateFile('comment_form'); - } - - /** - * @brief 댓글 삭제 화면 출력 - **/ - function dispBlogDeleteComment() { - // 권한 체크 - if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted'); - - // 삭제할 댓글번호를 가져온다 - $comment_srl = Context::get('comment_srl'); - - // 삭제하려는 댓글이 있는지 확인 - if($comment_srl) { - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, $this->grant->manager); - } - - // 삭제하려는 글이 없으면 에러 - if(!$oComment->isExists()) return $this->dispBlogContent(); - - Context::set('document_srl',$comment->document_srl); - - // 권한이 없는 경우 비밀번호 입력화면으로 - if(!$oComment->isGranted()) return $this->setTemplateFile('input_password_form'); - - Context::set('oComment',$oComment); - - $this->setTemplateFile('delete_comment_form'); - } - - /** - * @brief 엮인글 삭제 화면 출력 - **/ - function dispBlogDeleteTrackback() { - // 삭제할 댓글번호를 가져온다 - $trackback_srl = Context::get('trackback_srl'); - - // 삭제하려는 댓글가 있는지 확인 - $oTrackbackModel = &getModel('trackback'); - $output = $oTrackbackModel->getTrackback($trackback_srl); - $trackback = $output->data; - - // 삭제하려는 글이 없으면 에러 - if(!$trackback) return $this->dispBlogContent(); - - Context::set('trackback',$trackback); - - $this->setTemplateFile('delete_trackback_form'); - } - - /** - * @brief 메세지 출력 - **/ - function dispBlogMessage($msg_code) { - $msg = Context::getLang($msg_code); - if(!$msg) $msg = $msg_code; - Context::set('message', $msg); - $this->setTemplateFile('message'); - } - - /** - * @brief 댓글의 editor 를 세팅 - * 댓글의 경우 수정하는 경우가 아니라면 고유값이 없음.\n - * 따라서 고유값이 없을 경우 고유값을 가져와서 지정해 주어야 함 - **/ - function getCommentEditor($editor_sequence, $comment_srl=0, $height = 100) { - $oEditorModel = &getModel('editor'); - $option->editor_sequence = $editor_sequence; - $option->primary_key_name = 'comment_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = $this->grant->comment_fileupload; - $option->enable_autosave = false; - $option->enable_default_component = true; - $option->enable_component = true; - $option->resizable = true; - $option->height = $height; - $comment_editor = $oEditorModel->getEditor($comment_srl, $option); - return $comment_editor; - } - - } -?> diff --git a/modules/blog/conf/info.xml b/modules/blog/conf/info.xml deleted file mode 100644 index 96c5394f4..000000000 --- a/modules/blog/conf/info.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 블로그 - ブログ - Blog - Blog - 博客 - Блог - - 제로 - Zero - zero - zero - zero - zero - - 블로그의 기능을 담당하는 모듈. - 게시판과 비슷하지만 보여지는 view가 다르고 블로그에 적합한 method가 추가되었음. - 레이아웃과 기본 메뉴를 직접 담당 - - - ブログの機能を担当するモジュール - 掲示板と似ているが、内容の表示が異なり、ブログに適切なメソッドが追加されている。 - レイアウトと基本メニューを直接担当します。 - - - This module contains the blog functions. - It's similar to the bbs module, but it has diffent views and more suitable methods for blog has been included. - This module manages layout and basic menu itself. - - - Este módulo contiene funciones de blog. - Esto es similar al módulo de tablero, sin embargo la vista que se muestra es diferente e incluye metodos apropiados para blog. - El diseño y el menú básico es manejado por si mismo. - - - 是负责博客功能的模块。 - 虽然类似版面,但其显示模式不同,且还添加了适合博客的method。 - 内置布局和基本的菜单。 - - - Этот модуль содержит функции блога. - Он похож на модуль BBS, но имеет другой вид и более подходящие методы для блога. - Этот модуль управляет лейвутом и базовым меню самостоятельно. - - - diff --git a/modules/blog/conf/module.xml b/modules/blog/conf/module.xml deleted file mode 100644 index 59af1a282..000000000 --- a/modules/blog/conf/module.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - 목록 - 目录 - list - リスト - - - 글 작성 - 发表新主题 - write document - 書き込む - - - 댓글 작성 - 发表评论 - write comment - コメント作成 - - - 파일 첨부 - 附件 - file upload - 添付ファイル - - - 댓글 파일 첨부 - 评论附件 - comment file upload - コメントファイル添付 - - - 관리 - 管理 - manager - 管理 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/blog/lang/en.lang.php b/modules/blog/lang/en.lang.php deleted file mode 100644 index bf04035ee..000000000 --- a/modules/blog/lang/en.lang.php +++ /dev/null @@ -1,33 +0,0 @@ -cmd_blog_list = 'Blog List'; - $lang->cmd_module_config = 'Common blog setting'; - $lang->cmd_view_info = 'Blog Info'; - $lang->cmd_manage_menu = 'Menu management'; - $lang->cmd_make_child = 'Add child category'; - $lang->cmd_enable_move_category = "Change category position (Drag the top menu after selection)"; - $lang->cmd_remake_cache = 'Rebuild cache file'; - $lang->cmd_layout_setup = 'Configure layout'; - $lang->cmd_layout_edit = 'Edit layout'; - - // Item - $lang->parent_category_title = 'Parent category'; - $lang->category_title = 'Category'; - $lang->expand = 'Expand'; - $lang->category_group_srls = 'Accessable Group'; - $lang->search_result = 'Search result'; - - // blah blah.. - $lang->about_category_title = 'Please input category name'; - $lang->about_expand = 'By selecting this option, it will be always expanded'; - $lang->about_category_group_srls = 'Only the selected group will be able to see current categories. (Manually open xml file to expose)'; - $lang->about_layout_setup = 'You can manually modify blog layout code. Insert or manage the widget code anywhere you want'; - $lang->about_blog_category = 'You can make blog categories.
When blog category is broken, try rebuilding the cache file manually.'; - $lang->about_blog = "This is a blog module that can create and manage blog.\nAfter creating a blog, please decorate your blog by category and skin management because this blog module uses layout that is included in the blog skin.\nIf you want to connect other boards inside the blog, use the menu module to create a menu and then connect it with the skin manager"; -?> diff --git a/modules/blog/lang/es.lang.php b/modules/blog/lang/es.lang.php deleted file mode 100644 index 42efddc1e..000000000 --- a/modules/blog/lang/es.lang.php +++ /dev/null @@ -1,33 +0,0 @@ -cmd_blog_list = 'Lista de blogs'; - $lang->cmd_module_config = 'Configuración común de blog '; - $lang->cmd_view_info = 'Información de blog'; - $lang->cmd_manage_menu = 'Manejo del menú'; - $lang->cmd_make_child = 'Agregar sub categoría'; - $lang->cmd_enable_move_category = "Cambiar la posición de la categoría. (arrastrar y soltar luego de haber selecionado)"; - $lang->cmd_remake_cache = 'Rehacer archivo caché'; - $lang->cmd_layout_setup = 'Configuración del diseño'; - $lang->cmd_layout_edit = 'Editar el diseño'; - - // Artículos - $lang->parent_category_title = 'Categoría Superior'; - $lang->category_title = 'Nombre de la categoría'; - $lang->expand = 'Expandir'; - $lang->category_group_srls = 'Limitar el grupo'; - $lang->search_result = 'Resultado de la búsqueda'; - - // bla bla... - $lang->about_category_title = 'Ingresar el nombre de la categoría.'; - $lang->about_expand = 'Si seleccionas esta opción, siempre estará expandido.'; - $lang->about_category_group_srls = 'Solo se verán los grupos seleccionados en la actual categoría. (Abrir manualmente en archivo xml para la exposición)'; - $lang->about_layout_setup = 'Puede modificar manualmente el código del diseño de blog. Insertar o modificar el código de widget.'; - $lang->about_blog_category = 'Puede crear las categorias de blog.
Cuando no funciona la categoría de blog, rehacer el archivo caché manualmente para solucionar.'; - $lang->about_blog = "Este is el módulo para crear y manejar blog.\nLuego de crear un blog, por favor decora tu blog por categoría y manejo de tema por que este módulo de blog usa el diseño que está incluido en el tema de blog.\nSi desea conectar otros tableros en su blog, usa el menú de módulo para crear un menú y luego conecta con el manejo de temas."; -?> diff --git a/modules/blog/lang/jp.lang.php b/modules/blog/lang/jp.lang.php deleted file mode 100644 index 2cb5bd03f..000000000 --- a/modules/blog/lang/jp.lang.php +++ /dev/null @@ -1,33 +0,0 @@ -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 = '検索結果'; - - // その他 - $lang->about_category_title = 'カテゴリ名を入力して下さい。'; - $lang->about_expand = 'チェックすると常に展開された状態になります。'; - $lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになります(XMLファイルを直接閲覧すると表示されます)。'; - $lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。'; - $lang->about_blog_category = 'ブログのカテゴリを作成します。
ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。'; - $lang->about_blog = "ブログの作成、および管理できるブログモジュールです。\nブログモジュールはブログスキンに含まれているレイアウトを利用するので生成後必ずカテゴリ、およびスキン管理を用いてブログを編集して下さい。\nブログ内に他の掲示板を連動させたい場合は「メニュモジュール」でメニューを作成した後、「スキン管理」で行ってください。"; -?> diff --git a/modules/blog/lang/ko.lang.php b/modules/blog/lang/ko.lang.php deleted file mode 100644 index 160caaa92..000000000 --- a/modules/blog/lang/ko.lang.php +++ /dev/null @@ -1,33 +0,0 @@ -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 = '검색결과'; - - // 주절 주절.. - $lang->about_category_title = '카테고리 이름을 입력해주세요'; - $lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다'; - $lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)'; - $lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요'; - $lang->about_blog_category = '블로그 분류를 만드실 수 있습니다.
블로그 분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.'; - $lang->about_blog = "블로그를 만드시고 관리할 수 있는 블로그 모듈입니다.\n블로그 모듈은 블로그 스킨에 포함된 레이아웃을 이용하니 생성후 꼭 분류 및 스킨 관리를 통해서 블로그를 꾸미시기 바랍니다.\n블로그내에 다른 게시판을 연결하시고 싶을때에는 메뉴모듈로 메뉴를 만들고 나서 스킨관리에 연결해 주시면 됩니다"; -?> diff --git a/modules/blog/lang/ru.lang.php b/modules/blog/lang/ru.lang.php deleted file mode 100644 index ee7395564..000000000 --- a/modules/blog/lang/ru.lang.php +++ /dev/null @@ -1,33 +0,0 @@ - | 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 = 'Вы можете сделать категории блога.
Когда категория блога испорчена, попробуйте перепостроить файл кеша вручную.'; - $lang->about_blog = "Это модуть блогов, который может создавать и управлять блогом.\nПосле создания блога, пожалуйста, украсьте Ваш блог посредством менеджера категорий и скинов, поскольку этот модуль блогов использует лейаут включенный в скин блога.\nЕсли Вы хотите подключить другие форумы внутри блога, используйте модуль меню для создания меню и, затем, подключите его к менеджеру скинов"; -?> diff --git a/modules/blog/lang/zh-CN.lang.php b/modules/blog/lang/zh-CN.lang.php deleted file mode 100644 index 8e93a1f12..000000000 --- a/modules/blog/lang/zh-CN.lang.php +++ /dev/null @@ -1,33 +0,0 @@ -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 = '搜索结果'; - - // 信息、提示.. - $lang->about_category_title = '请输入分类名。'; - $lang->about_expand = '选择此项将维持展开状态。'; - $lang->about_category_group_srls = '被选的用户组才可以查看此分类。'; - $lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。'; - $lang->about_blog_category = '可以添加/删除博客分类
博客分类有异常情况时,可以尝试重新生成缓冲文件。'; - $lang->about_blog = "可生成,管理博客的模块。\n博客模块将利用博客皮肤里包含的布局,因此生成博客后尽早布置为适。\n在博客内,想使用其他版面时,可以先在菜单模块当中生成菜单后,在博客皮肤管理中连接即可。"; -?> diff --git a/modules/blog/queries/deleteCategories.xml b/modules/blog/queries/deleteCategories.xml deleted file mode 100644 index 0b5ffd063..000000000 --- a/modules/blog/queries/deleteCategories.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/modules/blog/queries/deleteCategory.xml b/modules/blog/queries/deleteCategory.xml deleted file mode 100644 index 79b75d5c2..000000000 --- a/modules/blog/queries/deleteCategory.xml +++ /dev/null @@ -1,8 +0,0 @@ - - -
- - - - - diff --git a/modules/blog/queries/getAllBlog.xml b/modules/blog/queries/getAllBlog.xml deleted file mode 100644 index b56e6f6b3..000000000 --- a/modules/blog/queries/getAllBlog.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -
- - - - - - - - - - - diff --git a/modules/blog/queries/getBlogCategories.xml b/modules/blog/queries/getBlogCategories.xml deleted file mode 100644 index d732b5ca9..000000000 --- a/modules/blog/queries/getBlogCategories.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -
- - - - - - - - - - - diff --git a/modules/blog/queries/getBlogList.xml b/modules/blog/queries/getBlogList.xml deleted file mode 100644 index d6dd2e60e..000000000 --- a/modules/blog/queries/getBlogList.xml +++ /dev/null @@ -1,24 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - diff --git a/modules/blog/queries/getCategory.xml b/modules/blog/queries/getCategory.xml deleted file mode 100644 index ac2827142..000000000 --- a/modules/blog/queries/getCategory.xml +++ /dev/null @@ -1,11 +0,0 @@ - - -
- - - - - - - - diff --git a/modules/blog/queries/getCategoryInfo.xml b/modules/blog/queries/getCategoryInfo.xml deleted file mode 100644 index 3ebe79059..000000000 --- a/modules/blog/queries/getCategoryInfo.xml +++ /dev/null @@ -1,11 +0,0 @@ - - -
- - - - - - - - diff --git a/modules/blog/queries/getChildCategoryCount.xml b/modules/blog/queries/getChildCategoryCount.xml deleted file mode 100644 index b82d7c15a..000000000 --- a/modules/blog/queries/getChildCategoryCount.xml +++ /dev/null @@ -1,11 +0,0 @@ - - -
- - - - - - - - diff --git a/modules/blog/queries/insertCategory.xml b/modules/blog/queries/insertCategory.xml deleted file mode 100644 index 9205cdad8..000000000 --- a/modules/blog/queries/insertCategory.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -
- - - - - - - - - - - - diff --git a/modules/blog/queries/updateCategory.xml b/modules/blog/queries/updateCategory.xml deleted file mode 100644 index f8ea145f2..000000000 --- a/modules/blog/queries/updateCategory.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -
- - - - - - - - - - diff --git a/modules/blog/queries/updateCategoryParent.xml b/modules/blog/queries/updateCategoryParent.xml deleted file mode 100644 index 3c34004ad..000000000 --- a/modules/blog/queries/updateCategoryParent.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -
- - - - - - - - - diff --git a/modules/blog/schemas/blog_category.xml b/modules/blog/schemas/blog_category.xml deleted file mode 100644 index ca3165dc4..000000000 --- a/modules/blog/schemas/blog_category.xml +++ /dev/null @@ -1,10 +0,0 @@ -
- - - - - - - - -
diff --git a/modules/blog/skins/xe_blog/comment_form.html b/modules/blog/skins/xe_blog/comment_form.html deleted file mode 100644 index 840b09f3e..000000000 --- a/modules/blog/skins/xe_blog/comment_form.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - -
-
-
{$oSourceComment->getNickName()}
-
- {$oSourceComment->getRegdate("Y.m.d H:i")} - - ({$oSourceComment->get('ipaddress')}) - -
-
- -
- {$oSourceComment->getContent(false)} -
-
-
- - - - -
- - fileupload)-->enctype="multipart/form-data" class="blogEditor" > -
- - - - - - -
- - - - - - - - - - - - - - useNotify())-->checked="checked" id="notify_message" /> - - - - isSecret())-->checked="checked" id="is_secret" /> - -
- -
class="borderTop">{$editor}
- -
- -
- - -
- -
- - diff --git a/modules/blog/skins/xe_blog/css/blog_tree_menu.css b/modules/blog/skins/xe_blog/css/blog_tree_menu.css deleted file mode 100644 index 2bf3e4a1f..000000000 --- a/modules/blog/skins/xe_blog/css/blog_tree_menu.css +++ /dev/null @@ -1,88 +0,0 @@ - -#blog_category .title_box { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; } - -#blog_category .category_list { padding:.8em 0 .8em 0; } - -#blog_category .node_item a { color:#6b6b6b; } - -#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#54564b; } - -#blog_category .unselected { cursor:pointer; font-size:1em; color:#54564b; } - -#blog_category .document_count { - margin-left:5px; - color:#AAAAAA; - font-size:.8em; -} - -#blog_category .page { - cursor:pointer; - background:url(../images/common/iconList.gif) no-repeat left; -} - -#blog_category .folder_open { - cursor:pointer; - background:url(../images/common/iconFolderClose.gif) no-repeat left; -} - -#blog_category .folder_close { - cursor:pointer; - background:url(../images/common/iconFolderClose.gif) no-repeat left; -} - -#blog_category .item_open { - display:block; - padding-left:18px; -} - -#blog_category .item_close { - display:none; - padding-left:18px; -} - -#blog_category .line_null { - padding-left:13px; -} - -#blog_category .line_open { - display:block; - padding-left:18px; - /*background:url(../images/tree_menu/line.gif) repeat-y left;*/ -} - -#blog_category .line_close { - display:none; - padding-left:18px; - /*background:url(../images/tree_menu/line.gif) repeat-y left;*/ -} - -#blog_category .plus { - padding-left:18px; - /*background:url(../images/tree_menu/plus.gif) repeat-y left;*/ -} - -#blog_category .plus_bottom { - padding-left:18px; - /*background:url(../images/tree_menu/plusbottom.gif) no-repeat left;*/ -} - -#blog_category .minus { - padding-left:18px; - /*background:url(../images/tree_menu/minus.gif) repeat-y left;*/ -} - -#blog_category .minus_bottom { - padding-left:18px; - /*background:url(../images/tree_menu/minusbottom.gif) no-repeat left;*/ -} - -#blog_category .join { - padding-left:18px; - /*background:url(../images/tree_menu/join.gif) repeat-y left;*/ -} - -#blog_category .join_bottom { - padding-left:18px; - /*background:url(../images/tree_menu/joinbottom.gif) no-repeat left;*/ -} - diff --git a/modules/blog/skins/xe_blog/css/common.css b/modules/blog/skins/xe_blog/css/common.css deleted file mode 100644 index d1d225514..000000000 --- a/modules/blog/skins/xe_blog/css/common.css +++ /dev/null @@ -1,293 +0,0 @@ -@charset "utf-8"; - -/* -NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) -Jeong, Chan Myeong 070601~070630 -*/ - -/** - * Header - **/ - -/* blog Title */ -.blogHeader { border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden; _width:100%;} -.blogHeader h3 { float:left; font-size:1.2em; padding:1em 2em .7em 1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} - -/* blog Description */ -.blogDescription { color:#AEAEAE; border:1px solid #DDDDDD; overflow:hidden; padding:1em; margin-top:1em;} - -/* blog Information */ -.blogInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} -.articleNum { float:left; padding:0 0 0 15px; } - -/* gallery sub menu */ -.blogSubMenu { margin:0 0 .5em 0; padding:1em 0 .5em .5em; border-bottom:1px solid #e0e1db;} -.blogSubMenu 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; } -.blogSubMenu img.sort { vertical-align:middle; } - -/* list */ -.blogList { width:100%; border:1px solid #e0e1db; border-top:none;} -.blogListNoTopBorder { border:none; } -.blogList th { color:#3e3f3e; font-weight:normal; border-top:1px solid #e0e1db; border-bottom:1px solid #ffffff; padding-top:5px; white-space:nowrap; height:33px; overflow:hidden;} -.blogList th.no_line { background-position:-3px bottom; } -.blogList th a { color:#3e3f3e; text-decoration:none; } -.blogList th.num { border-left:1px solid #ffffff; } -.blogList th.checkbox { text-align:center; } -.blogList th.title { text-align:center; padding-left:1em; } -.blogList th.topic { text-align:left; padding-left:1em; } -.blogList th.category { text-align:left; padding-left:1em; } -.blogList th.category select { vertical-align:middle; width:200px; height:20px;} -.blogList th.reading, th.recommend , th.date { white-space:nowrap;} -.blogList th .sort { padding:0 .2em; vertical-align:middle;} - -.blogList tr.notice { background:#f8f8f8; } -.blogList tr.notice .num { font-weight:bold;} -.blogList tr.bg1 { background:#ffffff} -.blogList tr.bg2 { background:#fbfbfb;} -.blogList td { border-top:1px solid #eff0ed; padding:.5em;} -.blogList td.num { font:.8em tahoma; color:#999999; padding:.5em 1em; text-align:center;} -.blogList td.checkbox { font:.8em tahoma; color:#999999; text-align:center;} -.blogList tr.notice td.num { padding:.5em; white-space:nowrap;} -.blogList tr.notice td.notice { font-size:.9em; color:#999999; font-weight:bold; text-align:center;} -.blogList td.thumb img { border:1px solid #E0E1DB; padding:3px; } - -.blogList td.title {padding-left:1em; } -.blogList td.title strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} -.blogList td.title.bold { font-size:1.2em; font-weight:bold;} -.blogList td.title.bold a { position:relative; top:.3em;} -.blogList td.title * { vertical-align:middle;} -.blogList td.title, -.blogList td.title a { color:#444444; text-decoration:none;} -.blogList td.title a:visited { color:#777777;} - -.blogList td.topic { padding-left:1em; color:#888888; } -.blogList td.topic strong a { font-size:1.2em; font-weight:bold; text-decoration:none; color:#444444; } -.blogList td.topic strong a:visited { color:#777777; } -.blogList td.topic .category { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 3px; padding-left:.5em; margin-left:.5em; color:#AAAAAA; } -.blogList td.topic div.author { margin-top:.5em; color:#BBBBBB; font-size:0.8em; } -.blogList td.topic div.author strong { font-size:1.2em; font-weight:normal; color:#666666; } -.blogList td.commentCount { font:bold .8em Tahoma; color:#888888; text-align:center; } - -.blogList td.latestPost { color:#888888; } -.blogList td.latestPost div.author { margin-top:.5em; color:#BBBBBB; font-size:0.8em; } -.blogList td.latestPost div.author strong { font-size:1.2em; font-weight:normal; color:#666666; } -.blogList td.latestPost div.date { font-size:0.8em; margin-top:.5em; } -.blogList td.latestPost div.date strong { font-family:Tahoma; font-weight:normal; color:#666666; } - -.blogListNoTopBorder td { border-top:none; border-bottom:1px solid #eff0ed; padding:.5em;} - -.blogList td.webzineTitle { padding-left:1em; color:#777777;} -.blogList td.webzineTitle strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} -.blogList td.webzineTitle.bold { font-size:1.2em; font-weight:bold;} -.blogList td.webzineTitle * { vertical-align:middle;} -.blogList td.webzineTitle, -.blogList td.webzineTitle a { color:#444444; text-decoration:none;} -.blogList td.webzineTitle a:visited { color:#777777;} - -.blogList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em; padding-left:1em;} -.blogList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} -.blogList td.summary a:visited { color:#999999;} - -.blogList td .replyAndTrackback img.trackback { margin-bottom:-.1em;} -.blogList td .replyAndTrackback strong { font:bold 1em Tahoma;} -.blogList td .replyAndTrackback { font:.8em Tahoma; } -.blogList td.author { color:#333333; font-size:.95em; padding-left:1em;} -.blogList td.author a { font-size:1em; color:#333333;} -.blogList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} -.blogList td.recommend { font:bold .8em Tahoma; text-align:center;} -.blogList td.date { font:.8em Tahoma; color:#999999; text-align:center; white-space:nowrap;} -.blogList td input { _margin:-3px;} - -.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; font:.75em Tahoma; text-align:center;} -*:first-child+html .buttonTypeGo { position:relative; top:3px; } - -.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;} - -/* list button */ -.leftButtonBox { float: left; margin-top:1em;} -.rightButtonBox { float: right; margin-top:1em;} - -/* pageNavigation */ -.pageNavigation { display:block; margin-top:1em; text-align:center; font:bold 11px Tahoma; margin-top:1.5em;} -.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } -.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; text-decoration:none; line-height:1em; } -.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } -.pageNavigation a:visited { color:#999999; } -.pageNavigation a.goToFirst, .pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} -.pageNavigation a.goToFirst img, .pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} - -/* Search Form */ -.blogSearch { margin-left:auto; margin-right:auto; clear:both; text-align:center;} -.blogSearch select { height:20px; } -.blogSearch input { height:18px; } - -/* blogRead */ -.blogRead { padding:0; margin:0; } -.blogRead .originalContent { padding:1.5em .5em .5em .5em;} -.blogRead .readHeader { padding:0 0 .5em 0; margin-bottom:1em; overflow:hidden;} - -.blogRead .blogTitle{ clear:both; } -.blogRead .blogTitle h4 { font-size:1.4em; display:inline; } - -.blogRead .dateAndCategory { float:left; overflow:hidden; white-space:nowrap; font-size:.9em; color:#888888; padding-top:1em; padding-left:.2em; } -.blogRead .dateAndCategory a { text-decoration:underline; color:#666666; } - -.blogRead .userInfo { white-space:nowrap; float:left; color:#3074a5; padding-top:1em; padding-left:.2em; font-size:.9em; margin-left:1em; } -.blogRead .userInfo a { font-size:.9em; color:#3074a5; text-decoration:none; } -.blogRead .userInfo .ipaddress { font-size:.9em; color:#AAAAAA; } - -.blogRead .readedAndVoted { float:right; overflow:hidden; white-space:nowrap; font-size:.9em; color:#888888; padding-top:1em; padding-left:.2em; } - -.blogRead ul.uri { overflow:hidden; margin:0 0 2em .3em; } -.blogRead ul.uri li { font-size:8pt; color:#c5c7c0; } - -.blogRead .contentBody { width:100%; overflow:hidden; } -.blogRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em; clear:both; margin-top:2em;} -.blogRead .readBody p { margin:1em 0; line-height:1.5em;} -.blogRead .readBody .alignLeft { float:left; margin:0 1em 1em 0; } -.blogRead .readBody .alignRight { float:right; margin:0 0 1em 1em; } -.blogRead .readBody .valignCenter { vertical-align:middle;} -.blogRead .readBody .clearBoth { display:block; margin:0 0 1em 0;} -.blogRead .readFooter { padding:0 .3em;} -.blogRead .readFooter .tag { margin-bottom:1em;} -.blogRead .readFooter .tag h5 { display:inline; font-size:1em; margin-right:.5em;} -.blogRead .readFooter .tag ul, -.blogRead .readFooter .tag li { display:inline;} -.blogRead .readFooter .tag a { color:#444444;} -.blogRead .readFooter .tag .tagIcon { vertical-align:middle;} -.blogRead .readFooter .fileAttached { border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb;} -.blogRead .readFooter .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; margin:.5em .5em 0 .5em; line-height:1.5em;} -.blogRead .readFooter .fileAttached ul { float:left; margin-top:.5em; padding-bottom:1em; } -.blogRead .readFooter .fileAttached li { display:inline; margin-right:.75em; line-height:1.5em;} -.blogRead .readFooter .fileAttached li a { text-decoration:none; font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; } -.blogRead .readFooter .fileAttached li a:visited { color:#777777;} -.blogRead .buttonBox { float:right; height:40px; margin-right:1em;} - -.blogRead .replyAndTrackbackBox { overflow:hidden; height:40px; float:left;} -.blogRead .replyAndTrackback li { margin-top:10px; _margin-top:8px; margin-left:1em; padding-left:1.4em; float:left; list-style:none;} -.blogRead .replyAndTrackback li.reply { background:url(../images/common/iconReply.gif) no-repeat left top;} -.blogRead .replyAndTrackback li.reply a { _position:relative; _top:-.6em;} -.blogRead .replyAndTrackback li.trackback { background:url(../images/common/iconTrackback.gif) no-repeat left top;} -.blogRead .replyAndTrackback li.trackback a { _position:relative; _top:0em;} -.blogRead .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none;} -.blogRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;} -.blogRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;} -.blogRead .replyAndTrackback .listButton { position:relative; right: 10px; top:-7px; _top:-6px; float:right;} - -/* extraVars list */ -.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em; margin-top:1em; border-bottom:none;} -.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 #e0e1db; border-right:1px solid #e0e1db;} -.extraVarsList td { border-bottom:1px solid #e0e1db; padding:.5em .5em .5em 1em; white-space:nowrap; overflow:hidden;} - -.trackbackBox { padding:.6em .6em; color:#666666; border-top:1px dotted #e0e1db;;margin-top:.5em;} -.trackbackBox .trackbackItem { padding:.6em .8em .6em .6em; line-height:1.25em; border-bottom:1px dotted #EEEEEE; list-style:none;} -.trackbackBox p { display:inline; margin-bottom:1em;} -.trackbackBox a { color:#666666; text-decoration:none;} -.trackbackBox div { clear:both; } -.trackbackBox address { display:block; padding:0 .3em 0 0; } -.trackbackBox address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} -.trackbackBox address .date { font:.8em Tahoma; color:#cccccc; float:right;} - -.replyBox { padding:.6em .6em; color:#666666; border-top:1px dotted #e0e1db; margin-top:.5em;} -.replyBox .replyItem { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} -.replyBox p { display:inline; margin-bottom:1em;} -.replyBox .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} -.replyBox .author a { color:#3074a5; margin-right:.3em; text-decoration:none; } -.replyBox .voted { float:left; font-size:.9em; color:#AAAAAA; margin:0 .3em .5em 1em;} -.replyBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} - -.replyBox .replyOption { float:right; white-space:nowrap; margin-left:.2em;} -.replyBox .replyOption img { vertical-align:middle;} - -.replyBox .replyContent { clear:left; } -.replyBox .replyContent p { display:block; } -.replyBox .replyContent ul li { padding:0; border:none; line-height:1.25em; list-style:disc;} -.replyBox .replyContent ol li { padding:0; border:none; line-height:1.25em; list-style:decimal;} -.replyBox .reply { background-color:#FAFAFA;} -.replyBox .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} - -.replyBox .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} -.replyBox .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} -.replyBox .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } -.replyBox .fileAttached li a:visited { color:#777777;} - -.commentButton { margin-top:.5em; } - -/* blogEditor */ -.blogEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;} -.blogEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;} -.blogEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;} -.blogEditor fieldset { _width:100%; border:1px solid #eaeae7; border-top:none;} -.blogEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;} -.blogEditor .userNameAndPw * { vertical-align:middle;} -.blogEditor .userNameAndPw label { margin-right:.2em; color:#666760;} -.blogEditor .userNameAndPw input { color:#aaaaaa;} -.blogEditor .userNameAndPw .userName { width:6em; margin-right:.8em;} -.blogEditor .userNameAndPw .userPw { width:5em;} -.blogEditor .userNameAndPw .emailAddress { width:6em;} -.blogEditor .userNameAndPw .homePage { width:6em;} -.blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;} -.blogEditor .borderTop { border-top:1px solid #eaeae7; } - -/* blogWrite */ -.blogWrite { width:100%; position:relative;} -.blogWrite .userNameAndPw { margin-bottom:-1px;} -.blogWrite .blogEditor fieldset { width:auto; position:relative;} -.blogWrite div.title { border-bottom:1px solid #eff0ed; border-top:1px solid #eff0ed; padding:.5em 0 .5em 1em; white-space:nowrap;} -.blogWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:8em; white-space:nowrap;} -.blogWrite div.title input#title { width:60%;} -.blogWrite .option { border-bottom:1px solid #e1e1e1; padding:.5em 0 .5em 1em; overflow:hidden; _height:20px; } -.blogWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:8em; white-space:nowrap;} -.blogWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} -.blogWrite .option dd * { vertical-align:middle;} -.blogWrite .option dd select { width:7em; font-size:.95em;height:20px;} -.blogWrite .inputTypeText { background:#fbfbfb;} -.blogWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;} -.blogWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} -.blogWrite .trackbackURI .inputTypeText { width:50%;} -.blogWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} -.blogWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} -.blogWrite .tag .inputTypeText { width:50%;} -.blogWrite .tag .help { vertical-align:middle;} -.blogWrite .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;} -.blogWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;} -.blogWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;} -.blogWrite .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;} -.blogWrite .extra_vars ul li { float:left; margin-right:1em; } - -.smallBox { border:1px solid #e0e1db; margin-left:auto; margin-right:auto; } -.smallBox.w268 { width:268px;} -.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} -.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } -.smallBox .complex { padding:1.5em 2em 2em 2em;} -.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;} - - -/* 게시물의 팝업 메뉴 */ -.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; } diff --git a/modules/blog/skins/xe_blog/css/cyan.css b/modules/blog/skins/xe_blog/css/cyan.css deleted file mode 100644 index 93887b1e8..000000000 --- a/modules/blog/skins/xe_blog/css/cyan.css +++ /dev/null @@ -1,40 +0,0 @@ -@charset "utf-8"; - -/* blog Title */ -.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} -.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} - -#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } -.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} -#bodyWrap #header #globalNavigation li.on a { color:#2895c0;} - -#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/cyan/blogHeaderVr.gif) no-repeat right center;} -#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/cyan/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} - -/* account Navigation */ -#blogAccountNavigation li.join a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; } -#blogAccountNavigation li.myInfo a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; } - -/* blog Information */ -.articleNum { float:left; background:url(../images/cyan/iconArticle.gif) no-repeat left top; } -.articleNum strong { font:bold 11px Tahoma; color:#2895c0;} - -/* style.list */ -.blogList th { background:#ffffff url(../images/cyan/lineBlogListTh.gif) no-repeat left bottom; } -.blogList td.recommend { color:#2895c0; } -.blogList td .replyAndTrackback { color:#2895c0; } -.buttonTypeGo { background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; } - -/* pageNavigation */ -.pageNavigation .current { color:#2895c0; border-right:1px solid #CCCCCC; } - -/* blogRead */ -blogRead .readFooter .fileAttached li a { background:url(../images/cyan/iconFile.gif) no-repeat left top;} - -/* replyAndTrackback */ -.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; } diff --git a/modules/blog/skins/xe_blog/css/green.css b/modules/blog/skins/xe_blog/css/green.css deleted file mode 100644 index 7b5d25aab..000000000 --- a/modules/blog/skins/xe_blog/css/green.css +++ /dev/null @@ -1,41 +0,0 @@ -@charset "utf-8"; - -/* blog Title */ -.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} -.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} - -#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } -.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} -#bodyWrap #header #globalNavigation li.on a { color:#38b549;} - -#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/green/blogHeaderVr.gif) no-repeat right center;} -#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/green/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} - - -/* account Navigation */ -#blogAccountNavigation li.join a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; } -#blogAccountNavigation li.myInfo a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; } - -/* blog Information */ -.articleNum { float:left; background:url(../images/green/iconArticle.gif) no-repeat left top; } -.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} - -/* style.list */ -.blogList th { background:#ffffff url(../images/green/lineBlogListTh.gif) no-repeat left bottom; } -.blogList td.recommend { color:#38b549; } -.blogList td .replyAndTrackback { color:#38b549; } -.buttonTypeGo { background:url(../images/green/buttonTypeInput24.gif) no-repeat; } - -/* pageNavigation */ -.pageNavigation .current { color:#38b549; border-right:1px solid #CCCCCC; } - -/* blogRead */ -.blogRead .readFooter .fileAttached li a { background:url(../images/green/iconFile.gif) no-repeat left top;} - -/* replyAndTrackback */ -.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; } diff --git a/modules/blog/skins/xe_blog/css/purple.css b/modules/blog/skins/xe_blog/css/purple.css deleted file mode 100644 index 34388a176..000000000 --- a/modules/blog/skins/xe_blog/css/purple.css +++ /dev/null @@ -1,40 +0,0 @@ -@charset "utf-8"; - -/* blog Title */ -.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} -.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} - -#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } -.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} -#bodyWrap #header #globalNavigation li.on a { color:#b1ae00;} - -#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/purple/blogHeaderVr.gif) no-repeat right center;} -#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/purple/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} - -/* account Navigation */ -#blogAccountNavigation li.join a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; } -#blogAccountNavigation li.myInfo a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; } - -/* blog Information */ -.articleNum { float:left; background:url(../images/purple/iconArticle.gif) no-repeat left top; } -.articleNum strong { font:bold 11px Tahoma; color:#b1ae00;} - -/* style.list */ -.blogList th { background:#ffffff url(../images/purple/lineBlogListTh.gif) no-repeat left bottom; } -.blogList td.recommend { color:#b1ae00; } -.blogList td .replyAndTrackback { color:#b1ae00; } -.buttonTypeGo { background:url(../images/purple/buttonTypeInput24.gif) no-repeat; } - -/* pageNavigation */ -.pageNavigation .current { color:#b1ae00; border-right:1px solid #CCCCCC; } - -/* blogRead */ -.blogRead .readFooter .fileAttached li a { background:url(../images/purple/iconFile.gif) no-repeat left top;} - -/* replyAndTrackback */ -.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; } diff --git a/modules/blog/skins/xe_blog/css/red.css b/modules/blog/skins/xe_blog/css/red.css deleted file mode 100644 index 1737da23e..000000000 --- a/modules/blog/skins/xe_blog/css/red.css +++ /dev/null @@ -1,40 +0,0 @@ -@charset "utf-8"; - -/* blog Title */ -.blogHeader { position:relative; _width:100%; border-top:1px solid #d1d9db; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) no-repeat right bottom; overflow:hidden;} -.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ed135a; background:url(../images/common/lineH3.gif) no-repeat right bottom;} - -#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } -.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} -#bodyWrap #header #globalNavigation li.on a { color:#fe3614;} - -#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/red/blogHeaderVr.gif) no-repeat right center;} -#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/red/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} - -/* account Navigation */ -#blogAccountNavigation li.join a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; } -#blogAccountNavigation li.myInfo a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; } - -/* blog Information */ -.articleNum { float:left; background:url(../images/red/iconArticle.gif) no-repeat left top; } -.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} - -/* style.list */ -.blogList th { background:#ffffff url(../images/red/lineBlogListTh.gif) no-repeat left bottom; } -.blogList td.recommend { color:#ff6600; } -.blogList td .replyAndTrackback { color:#ff6600; } -.buttonTypeGo { background:url(../images/red/buttonTypeInput24.gif) no-repeat; } - -/* pageNavigation */ -.pageNavigation .current { color:#ff6600; border-right:1px solid #CCCCCC; } - -/* blogRead */ -.blogRead .readFooter .fileAttached li a { background:url(../images/red/iconFile.gif) no-repeat left top;} - -/* replyAndTrackback */ -.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; } diff --git a/modules/blog/skins/xe_blog/css/white.css b/modules/blog/skins/xe_blog/css/white.css deleted file mode 100644 index f0e834389..000000000 --- a/modules/blog/skins/xe_blog/css/white.css +++ /dev/null @@ -1,40 +0,0 @@ -@charset "utf-8"; - -/* blog Title */ -.blogHeader { position:relative; _width:100%; border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} -.blogHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-bottom:3px solid #fe3614; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} - -#blog_category { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; } -.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;} -#bodyWrap #header #globalNavigation li.on a { color:#fe3614;} - -#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/white/blogHeaderVr.gif) no-repeat right center;} -#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/white/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;} - -/* account Navigation */ -#blogAccountNavigation li.join a { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } -#blogAccountNavigation li.myInfo a { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } - -/* blog Information */ -.articleNum { float:left; background:url(../images/white/iconArticle.gif) no-repeat left top; } -.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} - -/* style.list */ -.blogList th { background:#ffffff url(../images/white/lineBlogListTh.gif) no-repeat left bottom; } -.blogList td.recommend { color:#ff6600; } -.blogList td .replyAndTrackback { color:#ff6600; } -.buttonTypeGo { background:url(../images/white/buttonTypeInput24.gif) no-repeat; } - -/* pageNavigation */ -.pageNavigation .current { color:#ff6600; border-right:1px solid #CCCCCC; } - -/* blogRead */ -.blogRead .readFooter .fileAttached li a { background:url(../images/white/iconFile.gif) no-repeat left top;} - -/* replyAndTrackback */ -.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; } diff --git a/modules/blog/skins/xe_blog/filter/insert.xml b/modules/blog/skins/xe_blog/filter/insert.xml deleted file mode 100644 index 254dad45d..000000000 --- a/modules/blog/skins/xe_blog/filter/insert.xml +++ /dev/null @@ -1,17 +0,0 @@ - -
- - - - - - - - - - - - - - -
diff --git a/modules/blog/skins/xe_blog/footer.html b/modules/blog/skins/xe_blog/footer.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/modules/blog/skins/xe_blog/header.html b/modules/blog/skins/xe_blog/header.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/modules/blog/skins/xe_blog/images/common/bgBlogEditorOption.gif b/modules/blog/skins/xe_blog/images/common/bgBlogEditorOption.gif deleted file mode 100644 index 559588af6..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/bgBlogEditorOption.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/bgEditorFileList.gif b/modules/blog/skins/xe_blog/images/common/bgEditorFileList.gif deleted file mode 100644 index e5050341c..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/bgEditorFileList.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonAscending.gif b/modules/blog/skins/xe_blog/images/common/buttonAscending.gif deleted file mode 100644 index b405cc323..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/buttonAscending.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonDescending.gif b/modules/blog/skins/xe_blog/images/common/buttonDescending.gif deleted file mode 100644 index 2dc5575ff..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/buttonDescending.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/buttonTextAreaDrag.gif b/modules/blog/skins/xe_blog/images/common/buttonTextAreaDrag.gif deleted file mode 100644 index 148e9ee10..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/buttonTextAreaDrag.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/iconFolderClose.gif b/modules/blog/skins/xe_blog/images/common/iconFolderClose.gif deleted file mode 100644 index 3a780968d..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/iconFolderClose.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/iconH3.gif b/modules/blog/skins/xe_blog/images/common/iconH3.gif deleted file mode 100644 index 8ea0cec82..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/iconH3.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/iconTag.gif b/modules/blog/skins/xe_blog/images/common/iconTag.gif deleted file mode 100644 index ecfdb5585..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/iconTag.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/lineTextAreaDrag.gif b/modules/blog/skins/xe_blog/images/common/lineTextAreaDrag.gif deleted file mode 100644 index 3df035047..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/lineTextAreaDrag.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/typeGallery.gif b/modules/blog/skins/xe_blog/images/common/typeGallery.gif deleted file mode 100644 index 8479abbbd..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/typeGallery.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/typeList.gif b/modules/blog/skins/xe_blog/images/common/typeList.gif deleted file mode 100644 index f031faa8c..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/typeList.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/common/typeWebzine.gif b/modules/blog/skins/xe_blog/images/common/typeWebzine.gif deleted file mode 100644 index 09fcaac9b..000000000 Binary files a/modules/blog/skins/xe_blog/images/common/typeWebzine.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif.1 b/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif.1 deleted file mode 100644 index 01406b48a..000000000 Binary files a/modules/blog/skins/xe_blog/images/red/bgBoxTypeB.gif.1 and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/red/iconList.gif b/modules/blog/skins/xe_blog/images/red/iconList.gif deleted file mode 100644 index 2e67636f5..000000000 Binary files a/modules/blog/skins/xe_blog/images/red/iconList.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/folder.gif b/modules/blog/skins/xe_blog/images/tree_menu/folder.gif deleted file mode 100644 index eb129763d..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/folder.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/join.gif b/modules/blog/skins/xe_blog/images/tree_menu/join.gif deleted file mode 100644 index 46162d1f8..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/join.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/line.gif b/modules/blog/skins/xe_blog/images/tree_menu/line.gif deleted file mode 100644 index 96321884d..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/line.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/minus.gif b/modules/blog/skins/xe_blog/images/tree_menu/minus.gif deleted file mode 100644 index 2e8a1123d..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/minus.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/page.gif b/modules/blog/skins/xe_blog/images/tree_menu/page.gif deleted file mode 100644 index 42d7318c5..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/page.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/page_folder.gif b/modules/blog/skins/xe_blog/images/tree_menu/page_folder.gif deleted file mode 100644 index e6d880347..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/page_folder.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/plus.gif b/modules/blog/skins/xe_blog/images/tree_menu/plus.gif deleted file mode 100755 index c064c11f1..000000000 Binary files a/modules/blog/skins/xe_blog/images/tree_menu/plus.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/images/white/buttonTypeInput24.gif b/modules/blog/skins/xe_blog/images/white/buttonTypeInput24.gif deleted file mode 100644 index 0dcfc0e3d..000000000 Binary files a/modules/blog/skins/xe_blog/images/white/buttonTypeInput24.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/js/blog_tree_menu.js b/modules/blog/skins/xe_blog/js/blog_tree_menu.js deleted file mode 100644 index a62be3f79..000000000 --- a/modules/blog/skins/xe_blog/js/blog_tree_menu.js +++ /dev/null @@ -1,277 +0,0 @@ -/** - * @file blog_tree_menu.js - * @author zero (zero@nzeo.com) - * @brief xml파일을 읽어서 트리 메뉴를 그려줌 - * - * common/tpl/tree_menu.js 를 서비스용으로만 사용하기 위해서 수정한 것. - * 관리 기능이 없고 css 적용이 가능 - **/ - -// 폴더를 모두 열고/닫기 위한 변수 설정 -var blog_tree_menu_folder_list = new Array(); - -// 노드의 정보를 가지고 있을 변수 -var blog_node_info_list = new Array(); - -// 카테고리의 node_srl로 문서 갯수를 리턴하는 함수 -function getDocumentCount(node_srl) { - return parseInt(category_document_count[node_srl],10); -} - -// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 -function blogLoadTreeMenu(xml_url, title, index_url) { - // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) - var zone = xGetElementById("blog_category"); - if(typeof(zone)=="undefined") return; - - // 제목이 없으면 제목을 category로 지정 - if(typeof(title)=="undefined" || !title) title = "Category"; - - // index url이 없으면 현재 # 으로 대체 - if(!index_url) index_url= "#"; - - // xml_handler를 이용해서 직접 메뉴 xml파일를 읽음 - if(!xml_url) return; - var oXml = new xml_handler(); - oXml.reset(); - oXml.xml_path = xml_url; - - var param = {"title":title, "index_url":index_url} - - // 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용) - oXml.request(blogDrawTreeMenu, oXml, null, null, null, param); -} - -// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 -var blog_menu_selected = false; -function blogDrawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { - var title = param.title; - var index_url = param.index_url; - - var zone = xGetElementById("blog_category"); - var html = ""; - var document_count = 0; - - // 받아온 xml내용을 이용하여 트리 메뉴 그림 - var xmlDoc = oXml.getResponseXml(); - if(!xmlDoc) { - xInnerHtml(zone, html); - return null; - } - - // node 태그에 해당하는 값들을 가져와서 html을 작성 - var node_list = xmlDoc.getElementsByTagName("node"); - if(node_list.length>0) { - var root = xmlDoc.getElementsByTagName("root")[0]; - var output = blogDrawNode(root,0); - html += output.html; - document_count += parseInt(output.document_count,10); - } - - // 제목 지정 - var title_class = "selected"; - if(blog_menu_selected) title_class = "unselected"; - var title_html = '
'+title+' '; - if(document_count) title_html += '('+document_count+')'; - html = title_html+'
'+html+'
'; - - // 출력하려는 zone이 없다면 load후에 출력하도록 함 - if(!zone) { - xAddEventListener(window, 'load', function() { blogDrawTeeMenu(html); }); - - // 출력하려는 zone을 찾아졌다면 바로 출력 - } else { - xInnerHtml(zone, html); - } - - return null; -} - -// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 -function blogDrawTeeMenu(html) { - xInnerHtml("blog_category", html); -} - -// root부터 시작해서 recursive하게 노드를 표혐 -function blogDrawNode(parent_node, depth) { - var output = {html:"", expand:"N", document_count:0} - - for (var i=0; i< parent_node.childNodes.length; i++) { - var html = ""; - var selected = false; - - // nodeName이 node가 아니면 패스~ - var node = parent_node.childNodes.item(i); - if(node.nodeName!="node") continue; - - // node의 기본 변수들 체크 - var node_srl = node.getAttribute("node_srl"); - var text = node.getAttribute("text"); - var url = node.getAttribute("url"); - var expand = node.getAttribute("expand"); - var document_count = parseInt(node.getAttribute("document_count"),10); - if(!text) continue; - - // 자식 노드가 있는지 확인 - var hasChild = false; - if(node.hasChildNodes()) hasChild = true; - - // nextSibling가 있는지 확인 - var hasNextSibling = false; - if(i==parent_node.childNodes.length-1) hasNextSibling = true; - - // 후에 사용하기 위해 blog_node_info_list에 node_srl을 값으로 하여 node object 추가 - blog_node_info_list[node_srl] = node; - - // zone_id 값을 세팅 - var zone_id = "blog_category_"+node_srl; - blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = zone_id; - - var current_category = current_url.getQuery('category'); - if(current_category == node_srl) { - selected = true; - blog_menu_selected = true; - } - - // blog_selected_node이 node_srl과 같으면 펼침으로 처리 - if(selected) expand = "Y"; - - // 아이콘 설정 - var line_class = null; - var folder_class = null; - - // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 - var child_output = null; - var child_html = ""; - - if(hasChild) { - // 자식 노드의 zone id를 세팅 - var child_zone_id = zone_id+"_child"; - blog_tree_menu_folder_list[blog_tree_menu_folder_list.length] = child_zone_id; - - // html을 받아옴 - child_output = blogDrawNode(node, depth+1); - var chtml = child_output.html; - var cexpand = child_output.expand; - if(cexpand == "Y") expand = "Y"; - document_count += parseInt(child_output.document_count,10); - - // 무조건 펼침이 아닐 경우 - if(expand!="Y") { - var line_class = "line_close"; - if(hasNextSibling) line_class = "item_close"; - //if(depth==0) line_class = "line_null"; - child_html += '
'+chtml+'
'; - - // 무조건 펼침일 경우 - } else { - var line_class = "line_open"; - if(hasNextSibling) line_class = "item_open"; - //if(depth==0) line_class = "line_null"; - child_html += '
'+chtml+'
'; - } - } - - // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 - if(hasChild) { - - // 무조건 펼침이 아닐 경우 - if(expand != "Y") { - if(!hasNextSibling) { - line_class = "minus"; - folder_class = "folder_close"; - } else { - line_class = "minus_bottom"; - folder_class = "folder_close"; - } - // 무조건 펼침일 경우 - } else { - if(!hasNextSibling) { - line_class = "plus"; - folder_class = "folder_open"; - } else { - line_class = "plus_bottom"; - folder_class = "folder_open"; - } - } - - // 자식 노드가 없을 경우 - } else { - if(hasNextSibling) { - line_class = "join_bottom"; - folder_class = "page"; - } else { - line_class = "join"; - folder_class = "page"; - } - } - - if(depth==0) line_class = 'line_null'; - - - // html 작성 - var click_str = ' class="'+folder_class+'"' ; - if(hasChild) click_str += ' onclick="blogToggleFolder(\''+zone_id+'\');return false;" '; - - var text_class = "unselected"; - if(selected) text_class = "selected"; - - var document_count_text = ""; - if(document_count) document_count_text = '('+document_count+')'; - - // 왼쪽 폴더/페이지와 텍스트 위치를 맞추기 위해;;; table태그 일단 사용. 차후 바꾸자.. - html += '
'+ - '
'+ - ''+ - '
'+text+''+document_count_text+'
'+ - '
'; - - if(hasChild && child_html) html += child_html; - - html += '
'; - - output.html += html; - - if(expand=="Y") output.expand = "Y"; - - output.document_count += parseInt(document_count,10); - } - return output; -} - -// 노드의 폴더 아이콘 클릭시 -function blogToggleFolder(zone_id) { - // 아이콘을 클릭한 대상을 찾아봄 - var child_zone = xGetElementById(zone_id+"_child"); - if(!child_zone) return; - - var line_obj = xGetElementById(zone_id+'_line'); - var folder_obj = xGetElementById(zone_id+'_folder'); - - - // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 - if(folder_obj.className == "folder_open") { - child_zone.style.display = "none"; - - if(!line_obj.className.search('null')) { - if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'plus_bottom'; - else line_obj.className = 'plus'; - } - - folder_obj.className = 'folder_close' - } else { - child_zone.style.display = "block"; - - if(!line_obj.className.search('null')) { - if(line_obj.className.indexOf('bottom')>0) line_obj.className = 'minus_bottom'; - else line_obj.className = 'minus'; - } - - folder_obj.className = 'folder_open'; - } -} - -// 노드 클릭시 -function blogSelectNode(url) { - location.href = url; -} diff --git a/modules/blog/skins/xe_blog/list.html b/modules/blog/skins/xe_blog/list.html deleted file mode 100644 index dd99e17d4..000000000 --- a/modules/blog/skins/xe_blog/list.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/blog/skins/xe_blog/message.html b/modules/blog/skins/xe_blog/message.html deleted file mode 100644 index 00bf01814..000000000 --- a/modules/blog/skins/xe_blog/message.html +++ /dev/null @@ -1,11 +0,0 @@ - - -
- {$message} -
- - - {$lang->cmd_login} - - - diff --git a/modules/blog/skins/xe_blog/screenshot/cyan.gif b/modules/blog/skins/xe_blog/screenshot/cyan.gif deleted file mode 100644 index 570dd2cec..000000000 Binary files a/modules/blog/skins/xe_blog/screenshot/cyan.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/screenshot/green.gif b/modules/blog/skins/xe_blog/screenshot/green.gif deleted file mode 100644 index df96888e7..000000000 Binary files a/modules/blog/skins/xe_blog/screenshot/green.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/screenshot/purple.gif b/modules/blog/skins/xe_blog/screenshot/purple.gif deleted file mode 100644 index ccc3237d1..000000000 Binary files a/modules/blog/skins/xe_blog/screenshot/purple.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/screenshot/red.gif b/modules/blog/skins/xe_blog/screenshot/red.gif deleted file mode 100644 index a7a98c99f..000000000 Binary files a/modules/blog/skins/xe_blog/screenshot/red.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/screenshot/white.gif b/modules/blog/skins/xe_blog/screenshot/white.gif deleted file mode 100644 index 6bc4d89cc..000000000 Binary files a/modules/blog/skins/xe_blog/screenshot/white.gif and /dev/null differ diff --git a/modules/blog/skins/xe_blog/skin.xml b/modules/blog/skins/xe_blog/skin.xml deleted file mode 100644 index cea2939e9..000000000 --- a/modules/blog/skins/xe_blog/skin.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - 제로보드XE 블로그 기본 스킨 - ZBXEブログのデフォルトスキン - Zeroboard XE博客默认皮肤 - Default Skin of Zeroboard XE blog - - zero - zero - zero - zero - - 제로보드XE 블로그 기본 스킨입니다. - 디자인 : 서기정 (http://blog.naver.com/addcozy) - HTML/CSS : 정찬명 (http://naradesign.net) - - - ゼロボードXEブログの基本スキンです。 - デザイン:ソギジョン (http://blog.naver.com/addcozy) - HTML/CSS:ジョンチャンミョン (http://naradesign.net) - - - Zeroboard XE博客默认皮肤。 - 设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy) - HTML/CSS : Chan-Myung Jeong (http://naradesign.net) - - - This is default skin of Zeroboard XE blog. - Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) - HTML/CSS : Chan-Myung Jeong (http://naradesign.net) - - - - - 하얀색(기본) - 白色(基本) - 白色(默认) - White (default) - - - 청록색 - 青緑 - 青绿色 - Cyan - - - 초록색 - - 绿色 - Green - - - 빨간색 - - 红色 - Red - - - 보라색 - - 紫色 - Purple - - - - - 상단 제목 - 上段タイトル - 博客标题 - Top Title - 레이아웃의 상단에 표시할 제목을 입력하세요. - レイアウト上段に表示させるタイトルを入力してください。 - 请输入博客主标题。 - Please input title which will be displayed on top of layout. - - - 부제 - サブタイトル - 副标题 - Subtitle - 레이아웃의 상단에 큰 제목 아래 부제목을 입력하세요. - レイアウトの上段にメインタイトルの下のサブタイトルを入力してください。 - 请输入副标题。 - Please input subtitle which will be displayed under the top title. - - - 로고이미지 - ロゴイメージ - LOGO图片 - Logo Image - 레이아웃의 상단에 표시될 로고이미지를 입력하세요. - レイアウトの上段に表示されるロゴイメージを入力してください。 - 上传博客LOGO图片。 - Please input logo image which will be displayed on top of layout. - - - 프로필 이미지 - プロフィールイメージ - 博客个性图片 - Profile Image - 프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다) - プロフィールイメージを入力してください(横幅は「160px」が一番適しています)。 - 请输入博客个性图片(推荐宽度160px)。 - Please input profile image (It is recommended to set width as 160px) - - - 배경 이미지 - 背景イメージ - 背景图片 - Background Image - 배경 이미지를 사용하시려면 등록해주세요. - 背景イメージを使う場合は、登録してください。 - 要想使用背景图片请在这里上传。 - Please input if you want to use background image. - - - 프로필 - プロフィール - 简介 - Profile - 간단한 프로필을 입력해주세요 - 簡単なプロフィールを入力してください。 - 请输入简单介绍。 - Please input your simple profile - - - 카테고리명 - カテゴリ名 - 分类名 - Category - 카테고리의 이름을 입력해주세요. - カテゴリ名を入力してください。 - 请输入分类名。 - Please input the name of category. - - - 글쓴이 표시 - 投稿者表示 - 显示作者 - Display Author - 다수가 블로그를 함께 운영시에 글쓴이의 이름을 표시할 수 있습니다. - 多数の人が一緒に運営している場合、投稿者の名前を表示させることができます。 - 多人共同管理博客时可以显示日志发布者。 - It can display authors' name when the blog is being administrated by many administrators. - off - on - - - - - 상단 메뉴 - 上段メニュー - 菜单 - Top Menu - 1 - - - diff --git a/modules/blog/skins/xe_blog/style.list.html b/modules/blog/skins/xe_blog/style.list.html deleted file mode 100644 index c3f86a92d..000000000 --- a/modules/blog/skins/xe_blog/style.list.html +++ /dev/null @@ -1,74 +0,0 @@ - -
- - -
{$lang->document_count} {number_format($total_count)}
- -
- - -
- {@ $_col_count = 6 } - - - - {@ $_col_count++} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->no}{$lang->title}{$lang->writer}{$lang->readed_count}{$lang->voted_count}{$lang->date}{$lang->last_update}
- {$lang->no_documents} -
{$no} - {$document->getTitle($module_info->subject_cut_size)} - - - {$document->getCommentCount()} - - - - {$document->getTrackbackCount()} - - - {$document->printExtraImages(60*60*$module_info->duration_new)} -
{$document->getNickName()}
{(int)$document->get('readed_count')}{(int)$document->get('voted_count')}{$document->getRegdate('Y-m-d')}{zdate($document->get('last_update'),'Y-m-d H:i')}
-
- diff --git a/modules/blog/skins/xe_blog/trackback.html b/modules/blog/skins/xe_blog/trackback.html deleted file mode 100644 index 52581974e..000000000 --- a/modules/blog/skins/xe_blog/trackback.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -
- - -
- -
- {htmlspecialchars($val->title)} - {htmlspecialchars($val->blog_name)} - delete - - {zdate($val->regdate, "Y.m.d H:i")} - ({$val->ipaddress}) - -
- -
- - -
- diff --git a/modules/blog/skins/xe_blog/view_document.html b/modules/blog/skins/xe_blog/view_document.html deleted file mode 100644 index 8d6558c1c..000000000 --- a/modules/blog/skins/xe_blog/view_document.html +++ /dev/null @@ -1,190 +0,0 @@ - -
-
-
-
-

{$oDocument->getTitle()}

-
- -
- Posted {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} - at {$category_list[$oDocument->get('category_srl')]->title} -
- - -
- by {$oDocument->getNickName()} - - {$oDocument->get('ipaddress')} - -
- - -
- - {$lang->readed_count}: {$oDocument->get('readed_count')} - , - - - {$lang->voted_count}: {$oDocument->get('voted_count')} - -
-
-
- -
    -
  • {$lang->document_url} : {$oDocument->getPermanentUrl()}
  • - -
  • {$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
  • - -
- - - - - - - - - - - - - -
{$val->name} - - -
- - -
-
- - - {$lang->msg_is_secret} -
- - - - -
- -
- -
- - {$oDocument->getContent()} - -
-
- -
- {@ $tag_list = $oDocument->get('tag_list') } - -
-
{$lang->tag}
- -
- - - -
-
{$lang->uploaded_file} :
- -
-
- -
-
- - - - - - -
-
- - - - - - - - - - - - - - - -
- -
fileupload)-->enctype="multipart/form-data" class="blogEditor" > -
- - - - - -
- - - - - - - - - - - - - - - - - - - - -
- -
class="borderTop">{$editor?$editor:$comment_editor[$oDocument->document_srl]}
- -
- -
- -
-
-
- diff --git a/modules/blog/skins/xe_blog/write_form.html b/modules/blog/skins/xe_blog/write_form.html deleted file mode 100644 index dc8836973..000000000 --- a/modules/blog/skins/xe_blog/write_form.html +++ /dev/null @@ -1,112 +0,0 @@ - - - -
-
fileupload)-->enctype="multipart/form-data" class="blogEditor" id="fo_write"> -
- - - - - -
- - - - - - - - - - - -
- - -
- - - -
- -
- - {@ $_color = array('555555','222288','226622','2266EE','8866CC','88AA66','EE2222','EE6622','EEAA22','EEEE22') } -
-
- get('title_bold')=='Y')-->checked="checked" /> - -
-
- isLocked())-->checked="checked" id="lock_comment" /> - -
- -
- isSecret())-->checked="checked" id="is_secret" /> - -
-
- allowComment())-->checked="checked" id="allow_comment" /> - -
-
- allowTrackback())-->checked="checked" id="allow_trackback" /> - -
- -
- useNotify())-->checked="checked" id="notify_message" /> - -
- -
- -
{$editor}
- -
- - -

{$lang->about_tag}

-
- - - -
- - - -
- - - -
- -
- - - - -
- -
- - - -
- -
-
-
- diff --git a/modules/blog/tpl/addition_setup.html b/modules/blog/tpl/addition_setup.html deleted file mode 100644 index 944e5adb1..000000000 --- a/modules/blog/tpl/addition_setup.html +++ /dev/null @@ -1,3 +0,0 @@ - - -{$setup_content} diff --git a/modules/blog/tpl/blog_delete.html b/modules/blog/tpl/blog_delete.html deleted file mode 100644 index 2b0807218..000000000 --- a/modules/blog/tpl/blog_delete.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - -
{$lang->confirm_delete}
{$lang->module_name}{$module_info->mid}
{$lang->module}{$module_info->module}
{$lang->document_count}{$module_info->document_count}
- - - -
- diff --git a/modules/blog/tpl/blog_info.html b/modules/blog/tpl/blog_info.html deleted file mode 100644 index bd2c49fec..000000000 --- a/modules/blog/tpl/blog_info.html +++ /dev/null @@ -1,98 +0,0 @@ - - - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->module_category} - - {$lang->not_exists} - - {$module_category[$module_info->module_category_srl]->title} - -
{$lang->skin}{$module_info->skin_title} ({$module_info->skin})
{$lang->browser_title}{htmlspecialchars($module_info->browser_title)}
{$lang->list_count}{$module_info->list_count?$module_info->list_count:20}
{$lang->page_count}{$module_info->page_count?$module_info->page_count:10}
{$lang->description}{nl2br(htmlspecialchars($module_info->description))} 
{$lang->header_text}{htmlspecialchars($module_info->header_text)} 
{$lang->footer_text}{htmlspecialchars($module_info->footer_text)} 
{$lang->admin_id}{implode(",",$module_info->admin_id)} 
- {$lang->cmd_modify} - - {$lang->cmd_blog_list} - -
- - - - {@ $extra_vars_name = $module_info->extra_vars[$i]->name} - {@ $extra_vars_type = $module_info->extra_vars[$i]->type} - {@ $extra_vars_is_required = $module_info->extra_vars[$i]->is_required=='Y'?'Y':'N'} - {@ $extra_vars_default_value = $module_info->extra_vars[$i]->default?$module_info->extra_vars[$i]->default:' '} - {@ $extra_vars_desc = $module_info->extra_vars[$i]->desc?$module_info->extra_vars[$i]->desc:' '} - {@ $extra_vars_search = $module_info->extra_vars[$i]->search=='Y'?'Y':'N'} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->extra_vars} {$i}
{$lang->column_name}{$extra_vars_name}
{$lang->column_type}{$extra_vars_type}
{$lang->is_required}{$extra_vars_is_required}
{$lang->default_value}{$extra_vars_default_value}
{$lang->description}{$extra_vars_desc}
{$lang->cmd_search}{$extra_vars_search}
- - diff --git a/modules/blog/tpl/blog_insert.html b/modules/blog/tpl/blog_insert.html deleted file mode 100644 index 4048d5223..000000000 --- a/modules/blog/tpl/blog_insert.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->mid} - -

{$lang->about_mid}

-
{$lang->is_default} - is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> - -
{$lang->module_category} - -

{$lang->about_module_category}

-
{$lang->browser_title} - -

{$lang->about_browser_title}

-
{$lang->skin} - -

{$lang->about_skin}

-
{$lang->list_count} - -

{$lang->about_list_count}

-
{$lang->page_count} - -

{$lang->about_page_count}

-
{$lang->description} - -

{$lang->about_description}

-
{$lang->header_text} - -

{$lang->about_header_text}

-
{$lang->footer_text} - -

{$lang->about_footer_text}

-
{$lang->admin_id} - -

{$lang->about_admin_id}

-
- - -
- {@ $extra_vars_name = ''} - {@ $extra_vars_type = ''} - {@ $extra_vars_is_required = ''} - {@ $extra_vars_default_value = ''} - {@ $extra_vars_desc = ''} - {@ $extra_vars_search = ''} - - {@ $extra_vars_name = $module_info->extra_vars[$i]->name} - {@ $extra_vars_type = $module_info->extra_vars[$i]->type} - {@ $extra_vars_is_required = $module_info->extra_vars[$i]->is_required} - {@ $extra_vars_default_value = $module_info->extra_vars[$i]->default} - {@ $extra_vars_desc = $module_info->extra_vars[$i]->desc} - {@ $extra_vars_search = $module_info->extra_vars[$i]->search} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->extra_vars} {$i}
{$lang->column_name}
{$lang->column_type} - -
{$lang->is_required}checked="checked" />
{$lang->default_value}

{$lang->about_extra_vars_default_value}

{$lang->description}
{$lang->cmd_search}checked="checked" />
- - -
diff --git a/modules/blog/tpl/category_list.html b/modules/blog/tpl/category_list.html deleted file mode 100644 index 1b4203b92..000000000 --- a/modules/blog/tpl/category_list.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - -

{$lang->blog} {$lang->cmd_management}

-
{nl2br($lang->about_blog_category)}
- - - -

- - - -
- - - -
- -
-
- - - -
-
-
-
-
- - -
diff --git a/modules/blog/tpl/filter/delete_blog.xml b/modules/blog/tpl/filter/delete_blog.xml deleted file mode 100644 index 1244441eb..000000000 --- a/modules/blog/tpl/filter/delete_blog.xml +++ /dev/null @@ -1,10 +0,0 @@ - -
- - - - - - - -
diff --git a/modules/blog/tpl/filter/insert_blog.xml b/modules/blog/tpl/filter/insert_blog.xml deleted file mode 100644 index cae7c16e2..000000000 --- a/modules/blog/tpl/filter/insert_blog.xml +++ /dev/null @@ -1,149 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/blog/tpl/filter/insert_category.xml b/modules/blog/tpl/filter/insert_category.xml deleted file mode 100644 index 1e896f29a..000000000 --- a/modules/blog/tpl/filter/insert_category.xml +++ /dev/null @@ -1,23 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/blog/tpl/filter/insert_grant.xml b/modules/blog/tpl/filter/insert_grant.xml deleted file mode 100644 index ee69ea24a..000000000 --- a/modules/blog/tpl/filter/insert_grant.xml +++ /dev/null @@ -1,11 +0,0 @@ - -
- - - - - - - - -
diff --git a/modules/blog/tpl/filter/manage_checked_document.xml b/modules/blog/tpl/filter/manage_checked_document.xml deleted file mode 100644 index de9e65f32..000000000 --- a/modules/blog/tpl/filter/manage_checked_document.xml +++ /dev/null @@ -1,7 +0,0 @@ - -
- - - - - diff --git a/modules/blog/tpl/grant_list.html b/modules/blog/tpl/grant_list.html deleted file mode 100644 index d578beb99..000000000 --- a/modules/blog/tpl/grant_list.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - ----- - - - - - - - - - - - - - - - - - - - - -
{$lang->about_grant}
{$lang->grant}{$lang->target}
{$val->title} - -
- grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"/> - -
- -
{$lang->cmd_select_all}{$lang->cmd_unselect_all}
- -
diff --git a/modules/blog/tpl/header.html b/modules/blog/tpl/header.html deleted file mode 100644 index dbf21e153..000000000 --- a/modules/blog/tpl/header.html +++ /dev/null @@ -1,44 +0,0 @@ - - - -{@ - $blog_menu_list = array( - 'dispBlogAdminBlogInfo'=>$lang->cmd_view_info, - 'dispBlogAdminBlogAdditionSetup'=>$lang->cmd_addition_setup, - 'dispBlogAdminCategoryInfo'=>$lang->cmd_manage_category, - 'dispBlogAdminGrantInfo'=>$lang->cmd_manage_grant, - 'dispBlogAdminSkinInfo'=>$lang->cmd_manage_skin, - 'dispLayoutAdminEdit'=>$lang->cmd_layout_edit, - ); -} - -

{$lang->blog} {$lang->cmd_management}

- -
{nl2br($lang->about_blog)}
- - - -
- -

{$module_info->mid} ({$lang->is_default}) | View

- -
- - - - -
- diff --git a/modules/blog/tpl/index.html b/modules/blog/tpl/index.html deleted file mode 100644 index 1b7e4893d..000000000 --- a/modules/blog/tpl/index.html +++ /dev/null @@ -1,132 +0,0 @@ - - - -
- Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} -
- - - - -------- - -------- - -------- - -------- - -------- - -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->no} -
- - - - -
-
{$lang->mid} / {$lang->browser_title}{$lang->regdate}{$lang->cmd_view}{$lang->cmd_copy}{$lang->cmd_delete}
{$no} - - {$lang->not_exists} - - {$module_category[$val->module_category_srl]->title} - - - {$val->mid} - {htmlspecialchars($val->browser_title)} - {zdate($val->regdate,"Y-m-d")}{$lang->cmd_view}{$lang->cmd_copy}{$lang->cmd_delete} 
- - - - - - diff --git a/modules/blog/tpl/js/blog_admin.js b/modules/blog/tpl/js/blog_admin.js deleted file mode 100644 index 5bca5e37e..000000000 --- a/modules/blog/tpl/js/blog_admin.js +++ /dev/null @@ -1,283 +0,0 @@ -/** - * @file modules/blog/js/blog_admin.js - * @author zero (zero@nzeo.com) - * @brief blog 모듈의 관리자용 javascript - **/ - -/* 모듈 생성 후 */ -function completeInsertBlog(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - var page = ret_obj['page']; - - alert(message); - - var url = current_url.setQuery('act','dispBlogAdminBlogInfo'); - location.href = url; -} - -/* 모듈 삭제 후 */ -function completeDeleteBlog(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var page = ret_obj['page']; - alert(message); - - var url = current_url.setQuery('act','dispBlogAdminContent').setQuery('module_srl',''); - if(page) url = url.setQuery('page',page); - location.href = url; -} - -/* 카테고리 관련 작업들 */ -function doUpdateCategory(category_srl, mode, message) { - if(typeof(message)!='undefined'&&!confirm(message)) return; - - var fo_obj = xGetElementById('fo_category_info'); - fo_obj.category_srl.value = category_srl; - fo_obj.mode.value = mode; - - procFilter(fo_obj, update_category); -} - -/* 카테고리 정보 수정 후 */ -function completeUpdateCategory(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var module_srl = ret_obj['module_srl']; - var page = ret_obj['page']; - alert(message); - - var url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispBlogAdminCategoryInfo'); - if(page) url.setQuery('page',page); - location.href = url; -} - -/* 권한 관련 */ -function doSelectAll(obj, key) { - var fo_obj = obj.parentNode; - while(fo_obj.nodeName != 'FORM') { - fo_obj = fo_obj.parentNode; - } - - for(var i=0;i200) { - obj.style.marginTop = ( xScrollTop() - 210 )+'px'; - } else { - obj.style.marginTop = '0px'; - } - - var tpl = ret_obj['tpl']; - xInnerHtml(obj, tpl); - obj.style.display = 'block'; - - 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); - xTop(obj, y); - xRemoveEventListener(document,'mousedown',checkMousePosition); - - if(xGetElementById('cBody') && xHeight('cBody')< y+xHeight(obj)+50) { - xHeight('cBody', y + xHeight(obj) + 50); - } - - if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter(); - */ -} - -/* 카테고리 아이템 입력후 */ -function completeInsertCategory(ret_obj) { - var xml_file = ret_obj['xml_file']; - var category_srl = ret_obj['category_srl']; - var module_srl = ret_obj['module_srl']; - var parent_srl = ret_obj['parent_srl']; - - if(!xml_file) return; - - loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '',doGetCategoryInfo, category_srl, doMoveTree); - - if(!category_srl) { - xInnerHtml("category_info", ""); - } else { - var params = {node_srl:category_srl, parent_srl:parent_srl} - doGetCategoryInfo(null, params) - } - - if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter(); -} - - -/* 카테고리를 드래그하여 이동한 후 실행할 함수 , 이동하는 category_srl과 대상 category_srl을 받음 */ -function doMoveTree(category_id, source_category_srl, target_category_srl) { - source_category_srl = source_category_srl.replace(/menu_category_/,''); - target_category_srl = target_category_srl.replace(/menu_category_/,''); - var p_fo_obj = xGetElementById("fo_category"); - - var fo_obj = xGetElementById("fo_move_category"); - fo_obj.source_category_srl.value = source_category_srl; - fo_obj.target_category_srl.value = target_category_srl; - fo_obj.module_srl.value = p_fo_obj.module_srl.value; - - // 이동 취소를 선택하였을 경우 다시 그림;; - if(!procFilter(fo_obj, move_category)) { - var params = new Array(); - params["xml_file"] = xGetElementById('fo_category').xml_file.value; - params["source_category_srl"] = source_category_srl; - completeMoveCategory(params); - } -} - -function completeMoveCategory(ret_obj) { - var source_category_srl = ret_obj['source_category_srl']; - var xml_file = ret_obj['xml_file']; - - loadTreeMenu(xml_file, 'category', "zone_category", category_title, '', doGetCategoryInfo, source_category_srl, doMoveTree); -} - -/* 카테고리 목록 갱신 */ -function doReloadTreeCategory(module_srl) { - var params = new Array(); - params["module_srl"] = module_srl; - - // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. - var response_tags = new Array('error','message', 'xml_file'); - exec_xml('blog', 'procBlogAdminMakeXmlFile', params, completeInsertCategory, response_tags, params); -} - -/* 카테고리 삭제 */ -function doDeleteCategory(category_srl) { - var fo_obj = xGetElementById("fo_category"); - if(!fo_obj) return; - - procFilter(fo_obj, delete_category); -} - -/* 카테고리 아이템 삭제 후 */ -function completeDeleteCategory(ret_obj) { - var module_srl = ret_obj['module_srl']; - var category_srl = ret_obj['category_srl']; - var xml_file = ret_obj['xml_file']; - alert(ret_obj['message']); - - loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '', doGetCategoryInfo, category_srl, doMoveTree); - - var obj = xGetElementById('category_info'); - xInnerHtml(obj, ""); - obj.style.display = 'none'; -} - diff --git a/modules/blog/tpl/js/blog_tree_menu.js b/modules/blog/tpl/js/blog_tree_menu.js deleted file mode 100644 index cdd13e42f..000000000 --- a/modules/blog/tpl/js/blog_tree_menu.js +++ /dev/null @@ -1,584 +0,0 @@ -/** - * @file blog_tree_menu.js - * @author zero (zero@nzeo.com) - * @brief xml파일을 읽어서 트리 메뉴를 그려줌 - * - * common/tpl/tree_menu.js 를 서비스용으로만 사용하기 위해서 수정한 것. - * 관리 기능이 없고 css 적용이 가능 - **/ - -// 폴더를 모두 열고/닫기 위한 변수 설정 -var blog_tree_menu_folder_list = new Array(); - -// 노드의 정보를 가지고 있을 변수 -var blog_node_info_list = new Array(); - -// 트리메뉴의 정보를 담고 있는 xml파일을 읽고 drawTreeMenu()를 호출하는 함수 -function blogLoadTreeMenu(xml_url, title, index_url) { - // 일단 그릴 곳을 찾아서 사전 작업을 함 (그릴 곳이 없다면 아예 시도를 안함) - var zone = xGetElementById("blog_category"); - if(typeof(zone)=="undefined") return; - - // 노드 정보들을 담을 변수 세팅 - blog_node_info_list = new Array(); - - // 제목이 없으면 제목을 category로 지정 - if(typeof(title)=="undefined" || !title) title = "category"; - - // index url이 없으면 현재 # 으로 대체 - if(!index_url) index_url= "#"; - - // xml_handler를 이용해서 직접 메뉴 xml파일를 읽음 - if(!xml_url) return; - var oXml = new xml_handler(); - oXml.reset(); - oXml.xml_path = url; - - // menu_id, zone_id는 계속 달고 다녀야함 - var param = {"title":title, "index_url":index_url} - - // 요청후 drawTreeMenu()함수를 호출 (xml_handler.js에서 request method를 직접 이용) - oXml.request(blogDrawTreeMenu, oXml, null, null, null, param); -} - -// 트리메뉴 XML정보를 이용해서 정해진 zone에 출력 -function blogDrawTreeMenu(oXml, callback_func, resopnse_tags, null_func, param) { - var title = param.title; - var index_url = param.index_url; - - var zone = xGetElementById("blog_category"); - var html = ""; - - // 제목 지정 - html = '
'+title+'
'; - - var xmlDoc = oXml.getResponseXml(); - if(!xmlDoc) { - xInnerHtml(zone, html); - return null; - } - - blog_tree_menu_folder_list[menu_id] = new Array(); - - // node 태그에 해당하는 값들을 가져와서 html을 작성 - var node_list = xmlDoc.getElementsByTagName("node"); - if(node_list.length>0) { - var root = xmlDoc.getElementsByTagName("root")[0]; - var output = drawNode(root, menu_id); - html += output.html; - } - - // 출력하려는 zone이 없다면 load후에 출력하도록 함 - if(!zone) { - xAddEventListener(window, 'load', function() { drawTeeMenu(zone_id, menu_id, html); }); - - // 출력하려는 zone을 찾아졌다면 바로 출력 - } else { - xInnerHtml(zone, html); - if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); - } - - return null; -} - -// 페이지 랜더링 중에 메뉴의 html이 완성되었을때 window.onload event 후에 그리기 재시도를 하게 될 함수 -function drawTeeMenu(zone_id, menu_id, html) { - xInnerHtml(zone_id, html); - if(manual_select_node_srl) manualSelectNode(menu_id, manual_select_node_srl); -} - -// root부터 시작해서 recursive하게 노드를 표혐 -function drawNode(parent_node, menu_id) { - var output = {html:"", expand:"N"} - - for (var i=0; i< parent_node.childNodes.length; i++) { - var html = ""; - - // nodeName이 node가 아니면 패스~ - var node = parent_node.childNodes.item(i); - if(node.nodeName!="node") continue; - - // node의 기본 변수들 체크 - var node_srl = node.getAttribute("node_srl"); - var text = node.getAttribute("text"); - var url = node.getAttribute("url"); - var expand = node.getAttribute("expand"); - - if(!text) continue; - - // 자식 노드가 있는지 확인 - var hasChild = false; - if(node.hasChildNodes()) hasChild = true; - - // nextSibling가 있는지 확인 - var hasNextSibling = false; - if(i==parent_node.childNodes.length-1) hasNextSibling = true; - - // 후에 사용하기 위해 blog_node_info_list에 node_srl을 값으로 하여 node object 추가 - blog_node_info_list[menu_id][node_srl] = node; - - // zone_id 값을 세팅 - var zone_id = "menu_"+menu_id+"_"+node_srl; - blog_tree_menu_folder_list[menu_id][blog_tree_menu_folder_list[menu_id].length] = zone_id; - - // url을 확인하여 현재의 url과 동일하다고 판단되면 manual_select_node_srl 에 값을 추가 (관리자페이지일 경우는 무시함) - if(node_callback_func[menu_id] == moveTreeMenu && url && current_url.getQuery('category')==node_srl) manual_select_node_srl = node_srl; - - // manual_select_node_srl이 node_srl과 같으면 펼침으로 처리 - if(manual_select_node_srl == node_srl) expand = "Y"; - - // 아이콘 설정 - var line_icon = null; - var folder_icon = null; - - // 자식 노드가 있을 경우 자식 노드의 html을 구해옴 - var child_output = null; - var child_html = ""; - if(hasChild) { - // 자식 노드의 zone id를 세팅 - var child_zone_id = zone_id+"_child"; - blog_tree_menu_folder_list[menu_id][blog_tree_menu_folder_list[menu_id].length] = child_zone_id; - - // html을 받아옴 - child_output = drawNode(node, menu_id); - var chtml = child_output.html; - var cexpand = child_output.expand; - if(cexpand == "Y") expand = "Y"; - - // 무조건 펼침이 아닐 경우 - if(expand!="Y") { - if(!hasNextSibling) child_html += ''; - else child_html += ''; - // 무조건 펼침일 경우 - } else { - if(!hasNextSibling) child_html += '
'+chtml+'
'; - else child_html += '
'+chtml+'
'; - } - } - - // 자식 노드가 있는지 확인하여 있으면 아이콘을 바꿈 - if(hasChild) { - // 무조건 펼침이 아닐 경우 - if(expand != "Y") { - if(!hasNextSibling) { - line_icon = "minus"; - folder_icon = "page"; - } else { - line_icon = "minusbottom"; - folder_icon = "page"; - } - // 무조건 펼침일 경우 - } else { - if(!hasNextSibling) { - line_icon = "plus"; - folder_icon = "page"; - } else { - line_icon = "plusbottom"; - folder_icon = "page"; - } - } - - // 자식 노드가 없을 경우 - } else { - if(hasNextSibling) { - line_icon = "joinbottom"; - folder_icon = "page"; - } else { - line_icon = "join"; - folder_icon = "page"; - } - } - - - // html 작성 - html += '
'; - - if(hasChild) html+= ''; - else html+= ''; - - html += 'linefolder'; - - var chk_enable = xGetElementById(menu_id+"_enable_move"); - if(chk_enable) { - html += ''; - } else { - html += ''; - } - - html += text+''; - - html += child_html; - - html += '
'; - - output.html += html; - - if(expand=="Y") output.expand = "Y"; - } - return output; -} - -// 관리자 모드일 경우 *_enable_move 의 값에 따라 메뉴 이동을 시키거나 정보를 보여주도록 변경 -function doNodeFunc(obj, menu_id, node_srl, zone_id) { - var chk_enable = xGetElementById(menu_id+"_enable_move"); - if(!chk_enable || chk_enable.checked!=true || !obj) { - selectNode(menu_id,node_srl,zone_id); - return; - } - - deSelectNode(); - tree_drag_enable(obj,tree_drag_start,tree_drag,tree_drag_end); -} - -// 수동으로 메뉴를 선택하도록 함 -function manualSelectNode(menu_id, node_srl) { - var zone_id = "menu_"+menu_id+"_"+node_srl; - selectNode(menu_id,node_srl,zone_id,false); - return; -} - -// 노드의 폴더 아이콘 클릭시 -function toggleFolder(zone_id) { - // 아이콘을 클릭한 대상을 찾아봄 - var child_zone = xGetElementById(zone_id+"_child"); - if(!child_zone) return; - - // 대상의 아이콘들 찾음 - var line_icon = xGetElementById(zone_id+'_line_icon'); - var folder_icon = xGetElementById(zone_id+'_folder_icon'); - - // 대상의 자식 노드들이 숨겨져 있다면 열고 아니면 닫기 - if(child_zone.style.display == "block") { - child_zone.style.display = "none"; - if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_minus_bottom_icon.src; - else line_icon.src = tree_minus_icon.src; - - folder_icon.src = tree_folder_icon.src; - } else { - if(line_icon.src.indexOf('bottom')>0) line_icon.src = tree_plus_bottom_icon.src; - else line_icon.src = tree_plus_icon.src; - folder_icon.src = tree_open_folder_icon.src; - child_zone.style.display = "block"; - } -} - -// 노드의 글자 선택시 -var prev_selected_node = null; -function selectNode(menu_id, node_srl, zone_id, move_url) { - // 선택된 노드를 찾아봄 - var node_zone = xGetElementById(zone_id+'_node'); - if(!node_zone) return; - - // 이전에 선택된 노드가 있었다면 원래데로 돌림 - if(prev_selected_node) { - var prev_zone = xGetElementById(prev_selected_node.id); - if(prev_zone) { - prev_zone.style.backgroundColor = "#ffffff"; - prev_zone.style.fontWeight = "normal"; - prev_zone.style.color = "#000000"; - } - } - - // 선택된 노드의 글자를 변경 - prev_selected_node = node_zone; - node_zone.style.backgroundColor = "#0e078f"; - node_zone.style.fontWeight = "bold"; - node_zone.style.color = "#FFFFFF"; - - // 함수 실행 - if(typeof(move_url)=="undefined"||move_url==true) { - var func = node_callback_func[menu_id]; - func(menu_id, blog_node_info_list[menu_id][node_srl]); - //toggleFolder(zone_id); - } -} - -// 선택된 노드의 표시를 없앰 -function deSelectNode() { - // 이전에 선택된 노드가 있었다면 원래데로 돌림 - if(!prev_selected_node) return; - prev_selected_node.style.backgroundColor = "#ffffff"; - prev_selected_node.style.fontWeight = "normal"; - prev_selected_node.style.color = "#000000"; -} - - -// 모두 닫기 -function closeAllTreeMenu(menu_id) { - for(var i in blog_tree_menu_folder_list[menu_id]) { - var zone_id = blog_tree_menu_folder_list[menu_id][i]; - var zone = xGetElementById(zone_id); - if(!zone) continue; - var child_zone = xGetElementById(zone_id+"_child"); - if(!child_zone) continue; - - child_zone.style.display = "block"; - toggleFolder(zone_id); - } -} - -// 모두 열기 -function openAllTreeMenu(menu_id) { - for(var i in blog_tree_menu_folder_list[menu_id]) { - var zone_id = blog_tree_menu_folder_list[menu_id][i]; - var zone = xGetElementById(zone_id); - if(!zone) continue; - var child_zone = xGetElementById(zone_id+"_child"); - if(!child_zone) continue; - - child_zone.style.display = "none"; - toggleFolder(zone_id); - } -} - -// 메뉴 클릭시 기본으로 동작할 함수 (사용자 임의 함수로 대체될 수 있음) -function moveTreeMenu(menu_id, node) { - // url과 open_window값을 구함 - var node_srl = node.getAttribute("node_srl"); - var url = node.getAttribute("url"); - var open_window = node.getAttribute("open_window"); - var hasChild = false; - if(node.hasChildNodes()) hasChild = true; - - // url이 없고 child가 있으면 해당 폴더 토글한다 - if(!url && hasChild) { - var zone_id = "menu_"+menu_id+"_"+node_srl; - toggleFolder(zone_id); - return; - } - - // url이 있으면 url을 분석한다 (제로보드 특화된 부분. url이 http나 ftp등으로 시작하면 그냥 해당 url 열기) - if(url) { - // http, ftp등의 연결이 아닌 경우 제로보드용으로 처리 - if(url.indexOf('://')==-1) url = "./?"+url; - - // open_window에 따라서 처리 - if(open_window != "Y") location.href=url; - else { - var win = window.open(url); - win.focus(); - } - } -} - -// 메뉴 드래그 중이라는 상황을 간직할 변수 -var tree_drag_manager = {obj:null, isDrag:false} -var tree_tmp_object = new Array(); -var tree_disappear = 0; - -/** - * 메뉴 드래깅을 위한 함수들 - **/ -// 드래깅시 보여줄 임시 object를 생성하는 함수 -function tree_create_tmp_object(obj) { - var tmp_obj = tree_tmp_object[obj.id]; - if(tmp_obj) return tmp_obj; - - tmp_obj = xCreateElement('DIV'); - tmp_obj.id = obj.id + '_tmp'; - tmp_obj.style.display = 'none'; - tmp_obj.style.position = 'absolute'; - tmp_obj.style.backgroundColor = obj.style.backgroundColor; - tmp_obj.style.fontSize = obj.style.fontSize; - tmp_obj.style.fontFamlily = obj.style.fontFamlily; - tmp_obj.style.color = "#5277ff"; - tmp_obj.style.opacity = 1; - tmp_obj.style.filter = 'alpha(opacity=100)'; - - document.body.appendChild(tmp_obj); - tree_tmp_object[obj.id] = tmp_obj; - return tmp_obj; -} - -// 기생성된 임시 object를 찾아서 return, 없으면 만들어서 return -function tree_get_tmp_object(obj) { - var tmp_obj = tree_tmp_object[obj.id]; - if(!tmp_obj) tmp_obj = tree_create_tmp_object(obj); - return tmp_obj; -} - -// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정) -function tree_drag_enable(child_obj, funcDragStart, funcDrag, funcDragEnd) { - // 클릭이 일어난 메뉴의 상위 object를 찾음 - var obj = child_obj.parentNode.parentNode; - - // 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정 - obj.draggable = true; - obj.drag_start = funcDragStart; - obj.drag = funcDrag; - obj.drag_end = funcDragEnd; - obj.target_id = null; - - // 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록 - if (!tree_drag_manager.isDrag) { - tree_drag_manager.isDrag = true; - xAddEventListener(document, 'mousemove', tree_drag_mouse_move, false); - } - - // mousedown이벤트 값을 지정 - xAddEventListener(obj, 'mousedown', tree_mouse_down, false); -} - -// 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함) -function tree_drag_start(tobj, px, py) { - var obj = tree_get_tmp_object(tobj); - - xInnerHtml(obj, xInnerHtml(tobj)); - - tobj.source_color = tobj.style.color; - tobj.style.color = "#BBBBBB"; - - xLeft(obj, xPageX(tobj)); - xTop(obj, xPageY(tobj)); - xWidth(obj, xWidth(tobj)); - xHeight(obj, xHeight(tobj)); - - xDisplay(obj, 'block'); -} - -// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수 -function tree_drag(tobj, dx, dy) { - var obj = tree_get_tmp_object(tobj); - xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10)); - xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10)); - - var menu_id = tobj.id.replace(/menu_/,''); - menu_id = menu_id.replace(/_([0-9]+)$/,''); - if(!menu_id) return; - - for(var node_srl in blog_node_info_list[menu_id]) { - var zone_id = "menu_"+menu_id+"_"+node_srl; - var target_obj = xGetElementById(zone_id); - - var hh = parseInt(xHeight(target_obj),10); - var h = parseInt(parseInt(xHeight(target_obj),10)/2,10); - - var l = xPageX(target_obj); - var t = xPageY(target_obj); - var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); - var tt = parseInt(t,10) + hh; - - if( tobj != target_obj && tobj.xDPX >= l && tobj.xDPX <= ll) { - if(tobj.xDPY >= t && tobj.xDPY < tt-h) { - try { - target_obj.parentNode.insertBefore(tobj, target_obj); - tobj.target_id = target_obj.id; - } catch(e) { - } - } - } - } -} - -// 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과) -function tree_drag_end(tobj, px, py) { - var obj = tree_get_tmp_object(tobj); - tree_disappear = tree_disapear_object(obj, tobj); - tree_drag_disable(tobj.id); -} - -// 스르르 사라지게 함;; -function tree_disapear_object(obj, tobj) { - var it = 150; - var ib = 15; - - var x = parseInt(xPageX(obj),10); - var y = parseInt(xPageY(obj),10); - var ldt = (x - parseInt(xPageX(tobj),10)) / ib; - var tdt = (y - parseInt(xPageY(tobj),10)) / ib; - - return setInterval(function() { - if(ib < 1) { - clearInterval(tree_disappear); - xInnerHtml(tobj,xInnerHtml(obj)); - xInnerHtml(obj,''); - xDisplay(obj, 'none'); - return; - } - ib -= 5; - x-=ldt; - y-=tdt; - xLeft(obj, x); - xTop(obj, y); - }, it/ib); -} - -// 마우스다운 이벤트 발생시 호출됨 -function tree_mouse_down(e) { - var evt = new xEvent(e); - var obj = evt.target; - - while(obj && !obj.draggable) { - obj = xParent(obj, true); - } - - if(obj) { - xPreventDefault(e); - obj.xDPX = evt.pageX; - obj.xDPY = evt.pageY; - tree_drag_manager.obj = obj; - xAddEventListener(document, 'mouseup', tree_mouse_up, false); - if (obj.drag_start) obj.drag_start(obj, evt.pageX, evt.pageY); - } -} - -// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화) -function tree_mouse_up(e) { - if (tree_drag_manager.obj) { - xPreventDefault(e); - xRemoveEventListener(document, 'mouseup', tree_mouse_up, false); - - if (tree_drag_manager.obj.drag_end) { - var evt = new xEvent(e); - tree_drag_manager.obj.drag_end(tree_drag_manager.obj, evt.pageX, evt.pageY); - } - - tree_drag_manager.obj = null; - tree_drag_manager.isDrag = false; - } -} - -// 드래그할때의 object이동등을 담당 -function tree_drag_mouse_move(e) { - var evt = new xEvent(e); - - if (tree_drag_manager.obj) { - xPreventDefault(e); - - var obj = tree_drag_manager.obj; - var dx = evt.pageX - obj.xDPX; - var dy = evt.pageY - obj.xDPY; - - obj.xDPX = evt.pageX; - obj.xDPY = evt.pageY; - - if (obj.drag) { - obj.drag(obj, dx, dy); - } else { - xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy); - } - } -} - -// 해당 object 에 더 이상 drag가 되지 않도록 설정 -function tree_drag_disable(id) { - if (!tree_drag_manager) return; - var obj = xGetElementById(id); - obj.draggable = false; - obj.drag_start = null; - obj.drag = null; - obj.drag_end = null; - obj.style.color = obj.source_color; - - xRemoveEventListener(obj, 'mousedown', tree_mouse_down, false); - - if(obj.id && obj.target_id && obj.id!=obj.target_id) { - var menu_id = obj.id.replace(/menu_/,''); - menu_id = menu_id.replace(/_([0-9]+)$/,''); - if(menu_id) { - var callback_move_func = node_move_callback_func[menu_id]; - if(callback_move_func) callback_move_func(menu_id, obj.id, obj.target_id); - } - } - obj.target_id = null; -} diff --git a/modules/blog/tpl/layout_setup.html b/modules/blog/tpl/layout_setup.html deleted file mode 100644 index 6c38dd166..000000000 --- a/modules/blog/tpl/layout_setup.html +++ /dev/null @@ -1,12 +0,0 @@ - - -
- - - - -
- {$lang->about_layout_setup} -
- -
diff --git a/modules/blog/tpl/skin_info.html b/modules/blog/tpl/skin_info.html deleted file mode 100644 index 850769d9d..000000000 --- a/modules/blog/tpl/skin_info.html +++ /dev/null @@ -1,135 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->skin_default_info}
{$lang->skin}{$skin_info->title}
{$lang->skin_maker}{$skin_info->maker->name} ({$skin_info->maker->email_address})
{$lang->skin_maker_homepage}{$skin_info->maker->homepage}
{$lang->date}{$skin_info->maker->date}
{$lang->description}{nl2br(trim($skin_info->maker->description))}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->extra_vars}
{$lang->colorset} - - - {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } - - {@ $_width = 200; $_height = 20; $_talign = "left"; } - -
- colorset==$val->name)-->checked="checked"/> - - -
- {$val->title} - -
- -
{$menu_info->title}
({$menu_name})
- -
{$val->title} - - - - - - - - - - - - - value))-->checked="checked" class="checkbox" /> - - - - - - - - value)-->checked="checked"/> - - - - - - - -
-
- - -
- - - - - - -

{nl2br($val->description)}

- -
- -
- - diff --git a/modules/blog/tpl/top_refresh.html b/modules/blog/tpl/top_refresh.html deleted file mode 100644 index 1c4d1632d..000000000 --- a/modules/blog/tpl/top_refresh.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/modules/board/board.admin.controller.php b/modules/board/board.admin.controller.php index 6cb5415a7..52bb285e2 100644 --- a/modules/board/board.admin.controller.php +++ b/modules/board/board.admin.controller.php @@ -84,7 +84,7 @@ } // 이미지 파일이 아니어도 무시 - if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { unset($obj->{$vars->name}); continue; } @@ -125,6 +125,47 @@ * @brief 게시판 추가 **/ function procBoardAdminInsertBoard($args = null) { + // module 모듈의 model/controller 객체 생성 + $oModuleController = &getController('module'); + $oModuleModel = &getModel('module'); + + // 만약 module_srl이 , 로 연결되어 있다면 일괄 정보 수정으로 처리 + if(strpos(Context::get('module_srl'),',')!==false) { + // 대상 모듈들을 구해옴 + $modules = $oModuleModel->getModulesInfo(Context::get('module_srl')); + $args = Context::getRequestVars(); + + for($i=0;$iextra_vars); + + $obj->module = 'board'; + $obj->module_category_srl = $args->module_category_srl; + $obj->layout_srl = $args->layout_srl; + $obj->skin = $args->skin; + $obj->description = $args->description; + $obj->header_text = $args->header_text; + $obj->footer_text = $args->footer_text; + $obj->admin_id = $args->admin_id; + + $extra_vars->use_category = $args->use_category=='Y'?'Y':'N'; + $extra_vars->list_count = $args->list_count; + $extra_vars->search_list_count = $args->search_list_count; + $extra_vars->except_notice = $args->except_notice!='Y'?'N':'Y'; + $extra_vars->consultation = $args->consultation!='Y'?'N':'Y'; + $extra_vars->page_count = $args->page_count; + + $obj->extra_vars = serialize($extra_vars); + + $output = $oModuleController->updateModule($obj); + if(!$output->toBool()) return $output; + } + + return new Object(0,'success_updated'); + } + // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 if(!$args) { $args = Context::gets('module_srl','module_category_srl','board_name','layout_srl','skin','browser_title','description','is_default','header_text','footer_text','admin_id'); @@ -138,6 +179,8 @@ // 기본 값외의 것들을 정리 $extra_var = delObjectVars(Context::getRequestVars(), $args); if($extra_var->use_category!='Y') $extra_var->use_category = 'N'; + if($extra_var->except_notice!='Y') $extra_var->except_notice = 'N'; + if($extra_var->consultation!='Y') $extra_var->consultation = 'N'; unset($extra_var->act); unset($extra_var->page); unset($extra_var->board_name); @@ -158,7 +201,6 @@ // module_srl이 넘어오면 원 모듈이 있는지 확인 if($args->module_srl) { - $oModuleModel = &getModel('module'); $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리 @@ -168,9 +210,6 @@ // $extra_var를 serialize $args->extra_vars = serialize($extra_var); - // module 모듈의 controller 객체 생성 - $oModuleController = &getController('module'); - // is_default=='Y' 이면 if($args->is_default=='Y') $oModuleController->clearDefaultModule(); @@ -186,7 +225,7 @@ $admin_group_srl = $admin_group->group_srl; $module_srl = $output->get('module_srl'); - $grants = serialize(array('fileupload'=>array($admin_group_srl), 'comment_fileupload'=>array($admin_group_srl), 'manager'=>array($admin_group_srl))); + $grants = serialize(array('manager'=>array($admin_group_srl))); $oModuleController->updateModuleGrant($module_srl, $grants); } @@ -221,59 +260,140 @@ /** * @brief 카테고리 추가 **/ - function procBoardAdminInsertCategory() { - // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 - $module_srl = Context::get('module_srl'); - $category_title = Context::get('category_title'); + function procBoardAdminInsertCategory($args = null) { + // 입력할 변수 정리 + if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','title','expand','group_srls'); + + if($args->expand !="Y") $args->expand = "N"; + $args->group_srls = str_replace('|@|',',',$args->group_srls); + $args->parent_srl = (int)$args->parent_srl; - // module_srl이 있으면 원본을 구해온다 $oDocumentController = &getController('document'); - $args->module_srl = $module_srl; - $args->title = $category_title; - $output = $oDocumentController->insertCategory($args); - if(!$output->toBool()) return $output; + $oDocumentModel = &getModel('document'); - $this->add('page',Context::get('page')); - $this->add('module_srl',$module_srl); - $this->setMessage('success_registed'); + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 이미 존재하는지를 확인 + if($args->category_srl) { + $category_info = $oDocumentModel->getCategory($args->category_srl); + if($category_info->category_srl != $args->category_srl) $args->category_srl = null; + } + + // 존재하게 되면 update를 해준다 + if($args->category_srl) { + $output = $oDocumentController->updateCategory($args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 존재하지 않으면 insert를 해준다 + } else { + $output = $oDocumentController->insertCategory($args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $oDocumentController->makeCategoryFile($args->module_srl); + + $oDB->commit(); + + $this->add('xml_file', $xml_file); + $this->add('module_srl', $args->module_srl); + $this->add('category_srl', $args->category_srl); + $this->add('parent_srl', $args->parent_srl); + } + + + /** + * @brief 카테고리 삭제 + **/ + function procBoardAdminDeleteCategory() { + // 변수 정리 + $args = Context::gets('module_srl','category_srl'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $oDocumentModel = &getModel('document'); + + // 원정보를 가져옴 + $category_info = $oDocumentModel->getCategory($args->category_srl); + if($category_info->parent_srl) $parent_srl = $category_info->parent_srl; + + // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 + if($oDocumentModel->getCategoryChlidCount($args->category_srl)) return new Object(-1, 'msg_cannot_delete_for_child'); + + // DB에서 삭제 + $oDocumentController = &getController('document'); + $output = $oDocumentController->deleteCategory($args->category_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $oDocumentController->makeCategoryFile($args->module_srl); + + $oDB->commit(); + + $this->add('xml_file', $xml_file); + $this->add('category_srl', $parent_srl); + $this->setMessage('success_deleted'); } /** - * @brief 카테고리의 내용 수정 + * @brief 카테고리 이동 **/ - function procBoardAdminUpdateCategory() { - $module_srl = Context::get('module_srl'); - $category_srl = Context::get('category_srl'); - $mode = Context::get('mode'); - $title = Context::get('category_title'); + function procBoardAdminMoveCategory() { + $source_category_srl = Context::get('source_category_srl'); + $target_category_srl = Context::get('target_category_srl'); $oDocumentModel = &getModel('document'); $oDocumentController = &getController('document'); - switch($mode) { - case 'up' : - $output = $oDocumentController->moveCategoryUp($category_srl); - $msg_code = 'success_moved'; - break; - case 'down' : - $output = $oDocumentController->moveCategoryDown($category_srl); - $msg_code = 'success_moved'; - break; - case 'delete' : - $output = $oDocumentController->deleteCategory($category_srl); - $msg_code = 'success_deleted'; - break; - case 'update' : - $selected_category = $oDocumentModel->getCategory($category_srl); - $selected_category->title = $title; - $output = $oDocumentController->updateCategory($selected_category); - $msg_code = 'success_updated'; - break; - } + $target_category = $oDocumentModel->getCategory($target_category_srl); + $source_category = $oDocumentModel->getCategory($source_category_srl); + + // target_category의 list_order값을 +1해 준다 + $output = $oDocumentController->updateCategoryListOrder($target_category->module_srl, $target_category->list_order); if(!$output->toBool()) return $output; - $this->add('module_srl', $module_srl); - $this->setMessage($msg_code); + // source_category에 target_category_srl의 parent_srl, list_order 값을 입력 + $source_args->category_srl = $source_category_srl; + $source_args->parent_srl = $target_category->parent_srl; + $source_args->list_order = $target_category->list_order; + $output = $oDocumentController->updateCategory($source_args); + if(!$output->toBool()) return $output; + + // xml파일 재생성 + $xml_file = $oDocumentController->makeCategoryFile($source_category->module_srl); + + // return 변수 설정 + $this->add('xml_file', $xml_file); + $this->add('source_category_srl', $source_category_srl); + } + + /** + * @brief xml 파일을 갱신 + * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n + * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n + * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 + **/ + function procBoardAdminMakeXmlFile() { + // 입력값을 체크 + $module_srl = Context::get('module_srl'); + + // xml파일 재생성 + $oDocumentController = &getController('document'); + $xml_file = $oDocumentController->makeCategoryFile($module_srl); + + // return 값 설정 + $this->add('xml_file',$xml_file); } } ?> diff --git a/modules/blog/blog.admin.model.php b/modules/board/board.admin.model.php similarity index 93% rename from modules/blog/blog.admin.model.php rename to modules/board/board.admin.model.php index 791a7bcb8..39e17ba37 100644 --- a/modules/blog/blog.admin.model.php +++ b/modules/board/board.admin.model.php @@ -1,12 +1,12 @@ module_info->module_srl; - // 카테고리의 목록을 구해옴 + // 카테고리 정보를 가져옴 $oDocumentModel = &getModel('document'); - $category_list = $oDocumentModel->getCategoryList($module_srl); - Context::set('category_list', $category_list); + $category_xml_file = $oDocumentModel->getCategoryXmlFile($module_srl); - // 수정하려는 카테고리가 있다면해당 카테고리의 정보를 가져옴 - $category_srl = Context::get('category_srl'); + Context::set('category_xml_file', $category_xml_file); + Context::addJsFile('./common/js/tree_menu.js'); - if($category_srl) { - - $selected_category = $oDocumentModel->getCategory($category_srl); - - if(!$selected_category) Context::set('category_srl',''); - else Context::set('selected_category',$selected_category); - - $this->setTemplateFile('category_update_form'); - - } else { - - $this->setTemplateFile('category_list'); - - } + Context::set('layout','none'); + $this->setTemplateFile('category_list'); } /** diff --git a/modules/board/board.controller.php b/modules/board/board.controller.php index 74f51b0f1..8cae944ed 100644 --- a/modules/board/board.controller.php +++ b/modules/board/board.controller.php @@ -25,6 +25,8 @@ $obj->module_srl = $this->module_srl; if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N'; + if(!$obj->title) $obj->title = cut_str(strip_tags($obj->content),20,'...'); + // 관리자가 아니라면 게시글 색상/굵기 제거 if(!$this->grant->manager) { unset($obj->title_color); diff --git a/modules/board/board.view.php b/modules/board/board.view.php index 62caab547..8aea4d2f4 100644 --- a/modules/board/board.view.php +++ b/modules/board/board.view.php @@ -13,24 +13,45 @@ * board 모듈은 일반 사용과 관리자용으로 나누어진다.\n **/ function init() { - // 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅 - if($this->module_info->use_category=='Y') { - $oDocumentModel = &getModel('document'); - $this->category_list = $oDocumentModel->getCategoryList($this->module_srl); - Context::set('category_list', $this->category_list); - } - + /** + * 스킨등에서 사용될 module_srl이나 module_info등을 context set + **/ // 템플릿에서 사용할 변수를 Context::set() if($this->module_srl) Context::set('module_srl',$this->module_srl); + // 현재 호출된 게시판의 모듈 정보를 module_info 라는 이름으로 context setting Context::set('module_info',$this->module_info); - // 기본 모듈 정보들 설정 - $this->list_count = $this->module_info->list_count?$this->module_info->list_count:20; - $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10; + // 기본 모듈 정보들 설정 (list_count, page_count는 게시판 모듈 전용 정보이고 기본 값에 대한 처리를 함) + if($this->module_info->list_count) $this->list_count = $this->module_info->list_count; + if($this->module_info->search_list_count) $this->search_list_count = $this->module_info->search_list_count; + if($this->module_info->page_count) $this->page_count = $this->module_info->page_count; - // 스킨 템플릿 경로 지정 + // 일반 목록에서 공지사항을 제외하는 기능의 체크 + if($this->module_info->except_notice == 'N') $this->except_notice = false; + else $this->except_notice = true; + + // 상담 기능 체크. 현재 게시판의 관리자이면 상담기능을 off시킴 + if($this->module_info->consultation == 'Y' && !$this->grant->manager) { + $this->consultation = true; + + // 현재 사용자가 비로그인 사용자라면 글쓰기/댓글쓰기/목록보기/글보기 권한을 제거함 + if(!Context::get('is_logged')) $this->grant->list = $this->grant->write_document = $this->grant->write_comment = $this->grant->view = false; + } else { + $this->consultation = false; + } + + /** + * 스킨 경로를 미리 template_path 라는 변수로 설정함 + **/ $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); + + // 만약 스킨 경로가 없다면 xe_board로 변경 + if(!is_dir($template_path)) { + $this->module_info->skin = 'xe_board'; + $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); + } + $this->setTemplatePath($template_path); } @@ -38,43 +59,61 @@ * @brief 목록 및 선택된 글 출력 **/ function dispBoardContent() { - // 권한 체크 + /** + * 목록보기 권한 체크 (모든 권한은 ModuleObject에서 xml 정보와 module_info의 grant 값을 비교하여 미리 설정하여 놓음) + **/ if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted'); - // 템플릿에서 사용할 검색옵션 세팅 - $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에 세팅 + **/ + if($this->module_info->use_category=='Y') { + $oDocumentModel = &getModel('document'); + Context::set('category_list', $oDocumentModel->getCategoryList($this->module_srl)); } + /** + * 목록이 노출될때 같이 나오는 검색 옵션을 정리하여 스킨에서 쓸 수 있도록 context set + **/ + // 템플릿에서 사용할 검색옵션 세팅 (검색옵션 key값은 미리 선언되어 있는데 이에 대한 언어별 변경을 함) + foreach($this->search_option as $opt) $search_option[$opt] = Context::getLang($opt); + // 모듈정보를 확인하여 확장변수에서도 검색이 설정되어 있는지 확인 for($i=1;$i<=20;$i++) { - $ex_name = $this->module_info->extra_vars[$i]->name; - $ex_search = $this->module_info->extra_vars[$i]->search; - if($ex_name && $ex_search == 'Y') { - $search_option['extra_vars'.$i] = $ex_name; - } + $ex_name = trim($this->module_info->extra_vars[$i]->name); + if(!$ex_name) continue; + + if($this->module_info->extra_vars[$i]->search == 'Y') $search_option['extra_vars'.$i] = $ex_name; } Context::set('search_option', $search_option); + /** + * 게시글 목록을 추출함 + **/ + // 목록 구현에 필요한 변수들을 가져온다 $document_srl = Context::get('document_srl'); $page = Context::get('page'); - // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-; + // document model 객체를 생성 $oDocumentModel = &getModel('document'); - // 선택된 문서 표시를 위한 객체 생성 - $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + // 혹시 선택된 문서가 있다면 해당 문서에 대한 객체를 생성함 (일단 빈객체를 만드는 것은 선택된 글이 없을때 스킨에서 object 오류발생하는 것을 막기 위함) + $oDocument = $oDocumentModel->getDocument(0); // document_srl이 있다면 해당 글을 구해와서 $oDocument로 세팅 if($document_srl) { - // 글을 구함 + // 글에 대한 정보를 구함 $oDocument->setDocument($document_srl); - if($this->grant->manager) $oDocument->setGrant(); - // 글이 존재하지 않으면 그냥 무시하고 글이 존재 하지 않는다는 오류 메세지 출력 + // 상담 기능이 열려 있을 경우 현재 사용자의 글이 아니면 무시 + if($oDocument->isExists() && $this->consultation) { + $logged_info = Context::get('logged_info'); + if($oDocument->get('member_srl')!=$logged_info->member_srl) $oDocument = new DocumentItem(); + } + + // 글이 존재하지 않으면 글이 존재 하지 않는다는 오류 메세지 출력 if(!$oDocument->isExists()) { unset($document_srl); @@ -83,21 +122,22 @@ $this->alertMessage('msg_not_founded'); + // 글이 존재하면 글 보기 권한에 대한 확인과 조회수증가/ 브라우저 타이틀의 설정을 함 } else { + // 관리 권한이 있다면 권한을 부여 + if($this->grant->manager) $oDocument->setGrant(); + // 글 보기 권한을 체크해서 권한이 없으면 오류 메세지 출력하도록 처리 if(!$this->grant->view && !$oDocument->isGranted()) { - $oDocument = null; - $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); + $oDocument = $oDocumentModel->getDocument(0); Context::set('document_srl','',true); $this->alertMessage('msg_not_permitted'); - - } else { - // 브라우저 타이틀 설정 + // 브라우저 타이틀에 글의 제목을 추가 Context::addBrowserTitle($oDocument->getTitleText()); // 조회수 증가 @@ -105,49 +145,57 @@ } } } + + // 스킨에서 사용하기 위해 context set Context::set('oDocument', $oDocument); - // 댓글에디터 설정 - $this->setCommentEditor(0, 100); - - // 목록을 구하기 위한 옵션 + // 공지사항 목록을 구해서 context set (공지사항을 매페이지 제일 상단에 위치하기 위해서) $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl + + $notice_output = $oDocumentModel->getNoticeList($args); + Context::set('notice_list', $notice_output->data); + + // 목록을 구하기 위한 대상 모듈/ 페이지 수/ 목록 수/ 페이지 목록 수에 대한 옵션 설정 $args->page = $page; ///< 페이지 $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수 $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수 - // 검색 옵션 + // 검색과 정렬을 위한 변수 설정 $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...) $args->search_keyword = Context::get('search_keyword'); ///< 검색어 if($this->module_info->use_category=='Y') $args->category_srl = Context::get('category'); ///< 카테고리 사용시 선택된 카테고리 $args->sort_index = Context::get('sort_index'); $args->order_type = Context::get('order_type'); - // 스킨에서 설정한 기본 정렬 대상을 구함 + // 지정된 정렬값이 없다면 스킨에서 설정한 정렬 값을 이용함 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 == 'list_order' && $args->order_type == 'asc') { - $page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count); + // 특정 문서의 permalink로 직접 접속할 경우 page값을 직접 구함 + if(count($_GET)==1 && isset($_GET['document_srl']) && $oDocument->isExists() && !$oDocument->isNotice()) { + $page = $oDocumentModel->getDocumentPage($oDocument->document_srl, $this->module_srl, $this->list_count); Context::set('page', $page); $args->page = $page; } - // 먼저 공지사항을 구해옴 - $notice_output = $oDocumentModel->getNoticeList($args); - Context::set('notice_list', $notice_output->data); + // 만약 카테고리가 있거나 검색어가 있으면list_count를 search_list_count 로 이용 + if($args->category_srl || $args->search_keyword) $args->list_count = $this->search_list_count; - // 목록 구함 - $output = $oDocumentModel->getDocumentList($args, true); + // 상담 기능이 on되어 있으면 현재 로그인 사용자의 글만 나타나도록 옵션 변경 + if($this->consultation) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } - // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + // 일반 글을 구해서 context set + $output = $oDocumentModel->getDocumentList($args, $this->except_notice); + Context::set('document_list', $output->data); 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); + // template_file을 list.html로 지정 $this->setTemplateFile('list'); } @@ -155,7 +203,7 @@ * @brief 태그 목록 모두 보기 **/ function dispBoardTagList() { - // 권한 체크 + // 만약 목록 보기 권한조치 없을 경우 태그 목록도 보여주지 않음 if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted'); // 태그 모델 객체에서 태그 목록을 구해옴 @@ -165,7 +213,7 @@ $obj->list_count = 10000; $output = $oTagModel->getTagList($obj); - // 내용을 랜던으로 정렬 + // 내용을 랜덤으로 정렬 if(count($output->data)) { $numbers = array_keys($output->data); shuffle($numbers); @@ -189,12 +237,42 @@ // 권한 체크 if(!$this->grant->write_document) return $this->dispBoardMessage('msg_not_permitted'); + $oDocumentModel = &getModel('document'); + + /** + * 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅, 권한도 함께 체크 + **/ + if($this->module_info->use_category=='Y') { + + // 로그인한 사용자의 그룹 정보를 구함 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $group_srls = array_keys($logged_info->group_list); + } else { + $group_srls = array(); + } + $group_srls_count = count($group_srls); + + // 카테고리 목록을 구하고 권한을 체크 + $normal_category_list = $oDocumentModel->getCategoryList($this->module_srl); + if(count($normal_category_list)) { + foreach($normal_category_list as $category_srl => $category) { + $is_granted = true; + if($category->group_srls) { + $category_group_srls = explode(',',$category->group_srls); + $is_granted = false; + if(count(array_intersect($group_srls, $category_group_srls))) $is_granted = true; + + } + if($is_granted) $category_list[$category_srl] = $category; + } + } + Context::set('category_list', $category_list); + } + // GET parameter에서 document_srl을 가져옴 $document_srl = Context::get('document_srl'); - // document 모듈 객체 생성 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); $oDocument->setDocument($document_srl); @@ -209,19 +287,6 @@ Context::set('document_srl',$document_srl); Context::set('oDocument', $oDocument); - // 에디터 모듈의 getEditor를 호출하여 세팅 - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'document_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = $this->grant->fileupload; - $option->enable_autosave = true; - $option->enable_default_component = true; - $option->enable_component = true; - $option->resizable = true; - $option->height = 400; - $editor = $oEditorModel->getEditor($document_srl, $option); - Context::set('editor', $editor); - // 확장변수처리를 위해 xml_js_filter를 직접 header에 적용 $oDocumentController = &getController('document'); $oDocumentController->addXmlJsFilter($this->module_info); @@ -256,6 +321,34 @@ $this->setTemplateFile('delete_form'); } + /** + * @brief 댓글의 답글 화면 출력 + **/ + function dispBoardWriteComment() { + $document_srl = Context::get('document_srl'); + + // 권한 체크 + if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted'); + + // 원본글을 구함 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return $this->dispBoardMessage('msg_invalid_request'); + + // 해당 댓글를 찾아본다 (comment_form을 같이 쓰기 위해서 빈 객체 생성) + $oCommentModel = &getModel('comment'); + $oSourceComment = $oComment = $oCommentModel->getComment(0); + $oComment->add('document_srl', $document_srl); + $oComment->add('module_srl', $this->module_srl); + + // 필요한 정보들 세팅 + Context::set('oDocument',$oDocument); + Context::set('oSourceComment',$oSourceComment); + Context::set('oComment',$oComment); + + $this->setTemplateFile('comment_form'); + } + /** * @brief 댓글의 답글 화면 출력 **/ @@ -285,9 +378,6 @@ Context::set('oSourceComment',$oSourceComment); Context::set('oComment',$oComment); - // 댓글 에디터 세팅 - $this->setCommentEditor(0, 400); - $this->setTemplateFile('comment_form'); } @@ -319,9 +409,6 @@ Context::set('oSourceComment', $oCommentModel->getComment()); Context::set('oComment', $oComment); - // 댓글 에디터 세팅 - $this->setCommentEditor($comment_srl, 301); - $this->setTemplateFile('comment_form'); } @@ -382,28 +469,6 @@ $this->setTemplateFile('message'); } - /** - * @brief 댓글의 editor 를 세팅 - * 댓글의 경우 수정하는 경우가 아니라면 고유값이 없음.\n - * 따라서 고유값이 없을 경우 고유값을 가져와서 지정해 주어야 함 - **/ - function setCommentEditor($comment_srl = 0, $height = 100) { - Context::set('comment_srl', $comment_srl); - - // 에디터 모듈의 getEditor를 호출하여 세팅 - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'comment_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = $this->grant->comment_fileupload; - $option->enable_autosave = false; - $option->enable_default_component = true; - $option->enable_component = true; - $option->resizable = true; - $option->height = $height; - $comment_editor = $oEditorModel->getEditor($comment_srl, $option); - Context::set('comment_editor', $comment_editor); - } - /** * @brief 오류메세지를 system alert로 출력하는 method * 특별한 오류를 알려주어야 하는데 별도의 디자인까지는 필요 없을 경우 페이지를 모두 그린후에 diff --git a/modules/board/conf/module.xml b/modules/board/conf/module.xml index 176b3b80b..6a1039956 100644 --- a/modules/board/conf/module.xml +++ b/modules/board/conf/module.xml @@ -25,18 +25,6 @@ コメント作成 write comment - - 파일 첨부 - 附件 - ファイル添付 - file upload - - - 댓글 파일 첨부 - 评论附件 - コメントファイル添付 - comment file upload - 관리 管理 @@ -49,6 +37,7 @@ + @@ -64,6 +53,8 @@ + + @@ -74,12 +65,16 @@ + + + + @@ -97,6 +92,8 @@ + + @@ -112,5 +109,8 @@ + + + diff --git a/modules/board/lang/en.lang.php b/modules/board/lang/en.lang.php index 9ea2195f6..b47a5cd38 100644 --- a/modules/board/lang/en.lang.php +++ b/modules/board/lang/en.lang.php @@ -7,10 +7,32 @@ $lang->board = "Board"; + $lang->except_notice = "Exclude Notices"; + + $lang->cmd_manage_menu = 'Menu management'; + $lang->cmd_make_child = 'Add child category'; + $lang->cmd_enable_move_category = "Change category position (Drag the top menu after selection)"; + + // Item + $lang->parent_category_title = 'Parent category'; + $lang->category_title = 'Category'; + $lang->expand = 'Expand'; + $lang->category_group_srls = 'Accessable Group'; + $lang->search_result = 'Search result'; + $lang->consultation = 'Consultation'; + // words used in button $lang->cmd_board_list = 'Board list'; $lang->cmd_module_config = 'Common board setting'; $lang->cmd_view_info = 'Board info'; + // blah blah.. + $lang->about_category_title = 'Please input category name'; + $lang->about_expand = 'By selecting this option, it will be always expanded'; + $lang->about_category_group_srls = 'Only the selected group will be able to see current categories. (Manually open xml file to expose)'; + $lang->about_layout_setup = 'You can manually modify board layout code. Insert or manage the widget code anywhere you want'; + $lang->about_board_category = 'You can make board categories.
When board category is broken, try rebuilding the cache file manually.'; + $lang->about_except_notice = "Notice articles will not be displayed on normal list."; $lang->about_board = "This module is for creating and managing boards.\nYou may select the module name from the list after creating one to configure specifically.\nPlease be careful with board's module name, since it will be the url. (ex : http://domain/zb/?mid=modulename)"; + $lang->about_consultation = "Non-administrator members would see their own artocles.\nNon-members would not be able to write articles when using consultation."; ?> diff --git a/modules/board/lang/es.lang.php b/modules/board/lang/es.lang.php index 5615a0be2..621e2b384 100644 --- a/modules/board/lang/es.lang.php +++ b/modules/board/lang/es.lang.php @@ -7,10 +7,34 @@ $lang->board = "Tablero"; + $lang->except_notice = "Excluir Avisos"; + $lang->cmd_manage_menu = 'Manejo del menú'; + $lang->cmd_make_child = 'Agregar sub categoría'; + $lang->cmd_enable_move_category = "Cambiar la posición de la categoría. (arrastrar y soltar luego de haber selecionado)"; + $lang->cmd_remake_cache = 'Rehacer archivo caché'; + $lang->cmd_layout_setup = 'Configuración del diseño'; + $lang->cmd_layout_edit = 'Editar el diseño'; + + // Artículos + $lang->parent_category_title = 'Categoría Superior'; + $lang->category_title = 'Nombre de la categoría'; + $lang->expand = 'Expandir'; + $lang->category_group_srls = 'Limitar el grupo'; + $lang->search_result = 'Resultado de la búsqueda'; + $lang->consultation = '상담 기능'; + // Palabras utilizadas en los botones $lang->cmd_board_list = 'Lista del tableros'; $lang->cmd_module_config = 'Configuración común del Tablero'; $lang->cmd_view_info = 'Información del Tablero'; + // bla bla... + $lang->about_category_title = 'Ingresar el nombre de la categoría.'; + $lang->about_expand = 'Si seleccionas esta opción, siempre estará expandido.'; + $lang->about_category_group_srls = 'Solo se verán los grupos seleccionados en la actual categoría. (Abrir manualmente en archivo xml para la exposición)'; + $lang->about_layout_setup = 'Puede modificar manualmente el código del diseño de tableros. Insertar o modificar el código de widget.'; + $lang->about_board_category = 'Puede crear las categorias de tableros.
Cuando no funciona la categoría de tableros, rehacer el archivo caché manualmente para solucionar.'; + $lang->about_except_notice = "Aviso de los artículos no se mostrará en la lista normal."; $lang->about_board = "Este módulo es para crear y manejar los tableros.\nLuego de crear un Tablero, seleciona el nombre del módulo para la configuración más detallada.\nSea cuidadoso con el nombre del módulo, ya que ese nombre va a ser la dirección URL. (ej : http://dominio/zb/?mid=nombre del módulo)"; + $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; ?> diff --git a/modules/board/lang/jp.lang.php b/modules/board/lang/jp.lang.php index 8e8349c38..496874e03 100644 --- a/modules/board/lang/jp.lang.php +++ b/modules/board/lang/jp.lang.php @@ -7,10 +7,35 @@ $lang->board = "掲示板"; + $lang->except_notice = "공지사항 제외"; + + $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 = '検索結果'; + $lang->consultation = '상담 기능'; + // ボタンに使用する用語 $lang->cmd_board_list = '掲示板リスト'; $lang->cmd_module_config = '掲示板共通設定'; $lang->cmd_view_info = '掲示板情報'; + // その他 + $lang->about_category_title = 'カテゴリ名を入力して下さい。'; + $lang->about_expand = 'チェックすると常に展開された状態になります。'; + $lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになります(XMLファイルを直接閲覧すると表示されます)。'; + $lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。'; + $lang->about_board_category = 'ブログのカテゴリを作成します。
ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。'; + $lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다."; $lang->about_board = "掲示板の生成、および管理する掲示板モジュールです。\n生成後、リストからモジュール名を選択すると詳細な設定ができます。\n掲示板のモジュール名はURLになりますので注意してください。 (ex : http://ドメイン/zb/?mid=モジュール名)"; + $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; ?> diff --git a/modules/board/lang/ko.lang.php b/modules/board/lang/ko.lang.php index caca25682..3781467e7 100644 --- a/modules/board/lang/ko.lang.php +++ b/modules/board/lang/ko.lang.php @@ -7,10 +7,32 @@ $lang->board = "게시판"; + $lang->except_notice = "공지사항 제외"; + + $lang->cmd_manage_menu = '메뉴관리'; + $lang->cmd_make_child = '하위 카테고리 추가'; + $lang->cmd_enable_move_category = "카테고리 위치 변경 (선택후 위 메뉴를 드래그하세요)"; + + // 항목 + $lang->parent_category_title = '상위 카테고리명'; + $lang->category_title = '분류명'; + $lang->expand = '펼침'; + $lang->category_group_srls = '그룹제한'; + $lang->search_result = '검색결과'; + $lang->consultation = '상담 기능'; + // 버튼에 사용되는 언어 $lang->cmd_board_list = '게시판 목록'; $lang->cmd_module_config = '게시판 공통 설정'; $lang->cmd_view_info = '게시판 정보'; + // 주절 주절.. + $lang->about_category_title = '카테고리 이름을 입력해주세요'; + $lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다'; + $lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)'; + $lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요'; + $lang->about_board_category = '분류를 만드실 수 있습니다.
분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.'; + $lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다."; $lang->about_board = "게시판을 생성하고 관리할 수 있는 게시판 모듈입니다.\n생성하신 후 목록에서 모듈이름을 선택하시면 자세한 설정이 가능합니다.\n게시판의 모듈이름은 접속 url이 되므로 신중하게 입력해주세요. (ex : http://도메인/zb/?mid=모듈이름)"; + $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; ?> diff --git a/modules/board/lang/ru.lang.php b/modules/board/lang/ru.lang.php index 13961d296..461c9ac65 100644 --- a/modules/board/lang/ru.lang.php +++ b/modules/board/lang/ru.lang.php @@ -7,10 +7,35 @@ $lang->board = "Форум"; + $lang->except_notice = "공지사항 제외"; + + $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 = 'Результат поиска'; + $lang->consultation = '상담 기능'; + // слова, использованные в кнопке $lang->cmd_board_list = 'Список форумов'; $lang->cmd_module_config = 'Общие настройки форума'; $lang->cmd_view_info = 'Информация форума'; + // blah blah.. или чушь всякая... ;) + $lang->about_category_title = 'Пожалуйста, введите название категории'; + $lang->about_expand = 'Если эта опция выбрана, расширение будут применено всегда'; + $lang->about_category_group_srls = 'Только выбранная группа будет способна видеть ткущие категории. (Вручную откройте xml файл, чтобы сделать видимыми)'; + $lang->about_layout_setup = 'Вы можете вручную изменять лейаут код блога. Вставляйте или управляйте кодом виджетов везде, где хотите'; + $lang->about_board_category = 'Вы можете сделать категории блога.
Когда категория блога испорчена, попробуйте перепостроить файл кеша вручную.'; + $lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다."; $lang->about_board = "Этот модуль служит для создания и управления форумами.\nВы можете выбрать имя модуля из списка после создания для дополнительного конифигурирования.\nПожалуйста, будте осторожны с именем модуля форума, поскольку оно будет URL. (например : http://domain/zb/?mid=имя_модуля)"; + $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; ?> diff --git a/modules/board/lang/zh-CN.lang.php b/modules/board/lang/zh-CN.lang.php index e7df41dc9..c8a60da37 100644 --- a/modules/board/lang/zh-CN.lang.php +++ b/modules/board/lang/zh-CN.lang.php @@ -7,10 +7,36 @@ $lang->board = "版面"; + $lang->except_notice = "公告"; + + $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 = '搜索结果'; + $lang->consultation = '상담 기능'; + // 按钮语言 $lang->cmd_board_list = '版面目录'; $lang->cmd_module_config = '版面共同设置'; $lang->cmd_view_info = '版面信息'; + + // 信息、提示.. + $lang->about_category_title = '请输入分类名。'; + $lang->about_expand = '选择此项将维持展开状态。'; + $lang->about_category_group_srls = '被选的用户组才可以查看此分类。'; + $lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。'; + $lang->about_board_category = '可以添加/删除博客分类
博客分类有异常情况时,可以尝试重新生成缓冲文件。'; + $lang->about_except_notice = "设置一般目录下不显示公告。"; $lang->about_board = "可生成,管理版面的模块。\n生成版面后,点击模块名即可对其详细设置。"; + $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; ?> diff --git a/modules/board/queries/getBoardList.xml b/modules/board/queries/getBoardList.xml index efc53c312..df9a3f7d5 100644 --- a/modules/board/queries/getBoardList.xml +++ b/modules/board/queries/getBoardList.xml @@ -6,7 +6,7 @@ - + diff --git a/modules/board/skins/cozy_board/comment.html b/modules/board/skins/cozy_board/comment.html index 4ff1eb9a1..f454e4645 100644 --- a/modules/board/skins/cozy_board/comment.html +++ b/modules/board/skins/cozy_board/comment.html @@ -30,7 +30,7 @@ ({$comment->get('ipaddress')}) - + {$lang->cmd_delete} {$lang->cmd_modify} @@ -53,6 +53,9 @@ + + profile + {$comment->getContent(true)} diff --git a/modules/board/skins/cozy_board/comment_form.html b/modules/board/skins/cozy_board/comment_form.html index 51a746261..94e3c8355 100644 --- a/modules/board/skins/cozy_board/comment_form.html +++ b/modules/board/skins/cozy_board/comment_form.html @@ -25,7 +25,7 @@
-
fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
@@ -55,7 +55,7 @@
-
{$comment_editor}
+
{$oComment->getEditor()}
diff --git a/modules/board/skins/cozy_board/css/common.css b/modules/board/skins/cozy_board/css/common.css index 7166bc193..f8fd5e7d6 100644 --- a/modules/board/skins/cozy_board/css/common.css +++ b/modules/board/skins/cozy_board/css/common.css @@ -62,7 +62,7 @@ Jeong, Chan Myeong 070601~070630 .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.title .title_wrap { width:100%; overflow:hidden; } .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;} @@ -243,6 +243,7 @@ Jeong, Chan Myeong 070601~070630 .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 dl.option { margin:0; padding:5px; } .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;} @@ -585,3 +586,8 @@ Jeong, Chan Myeong 070601~070630 .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; } + +/* 회원 서명 및 프로필 이미지 출력 */ +.memberSignature { border:1px solid #e0e1db; padding:10px; margin-top:20px;} +.memberSignature .profile { float:left; margin-right:20px; } +img.commentProfileImage { margin:5px 10px 5px 0; } diff --git a/modules/board/skins/cozy_board/extra_var_value.html b/modules/board/skins/cozy_board/extra_var_value.html index fd889bab2..7a0ae8d24 100644 --- a/modules/board/skins/cozy_board/extra_var_value.html +++ b/modules/board/skins/cozy_board/extra_var_value.html @@ -5,6 +5,7 @@ {@ $val->value = $oDocument->getExtraValue($key)} +{@ $_tmp_value = array(); } diff --git a/modules/board/skins/cozy_board/list.html b/modules/board/skins/cozy_board/list.html index 8e999ec57..5f517e227 100644 --- a/modules/board/skins/cozy_board/list.html +++ b/modules/board/skins/cozy_board/list.html @@ -37,9 +37,7 @@
{$lang->cmd_list} - {$lang->cmd_write} - {$lang->cmd_manage_document} diff --git a/modules/board/skins/cozy_board/skin.xml b/modules/board/skins/cozy_board/skin.xml index cc9af9fd3..1927d2e18 100644 --- a/modules/board/skins/cozy_board/skin.xml +++ b/modules/board/skins/cozy_board/skin.xml @@ -3,12 +3,14 @@ cozy Cozy cozy + cozy Cozy (주)NHN (株)NHN (株)NHN NHN Corp + NHN Corp cozy simple 스킨의 목록형입니다. 디자인 : 서기정 (http://blog.naver.com/addcozy) @@ -23,6 +25,11 @@ This is list style board of cozy simple skin. Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) HTML/CSS : Ji-Hun So + + + Esta es la lista de estilo acogedor simple junta de la piel. + Diseño: Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML / CSS: Ji-Hun So Cozy样式皮肤。 @@ -35,30 +42,35 @@ 빨간색(기본) Red (default) + Roja (por defecto) 红色(默认) 녹색 Green + Verde 绿色 파란색 Blue + Azul 蓝色 분홍색 ピンク Pink + Pink 粉红色 청록색 青緑 Cyan + Cian 青绿色 @@ -67,6 +79,7 @@ 기본 형태 默认样式 Default Form + Formulario por defecto 목록형, 웹진형, 갤러리형의 기본 스타일을 지정할 수 있습니다. 포럼형 스타일은 정렬대상을 updated로 하셔야 합니다. @@ -82,6 +95,10 @@ You may select default styles such as list style, webzine style or gallery style. Align Target for forum style is required to be selected as 'updated'. + + + Usted puede seleccionar por defecto los estilos como el estilo de lista, estilo o webzine Galería de estilo. + Alinear Meta para el foro estilo es necesaria para ser seleccionado como 'actualización'. list webzine diff --git a/modules/board/skins/cozy_board/style.gallery.html b/modules/board/skins/cozy_board/style.gallery.html index 52c464722..c1da2b373 100644 --- a/modules/board/skins/cozy_board/style.gallery.html +++ b/modules/board/skins/cozy_board/style.gallery.html @@ -11,7 +11,7 @@ @@ -98,7 +98,7 @@
- + diff --git a/modules/board/skins/cozy_board/style.list.html b/modules/board/skins/cozy_board/style.list.html index 14c42069b..3a7b99499 100644 --- a/modules/board/skins/cozy_board/style.list.html +++ b/modules/board/skins/cozy_board/style.list.html @@ -19,12 +19,14 @@   - - + - + + {$lang->title} {$lang->nick_name} diff --git a/modules/board/skins/cozy_board/style.webzine.html b/modules/board/skins/cozy_board/style.webzine.html index 9e8d637ff..889039f65 100644 --- a/modules/board/skins/cozy_board/style.webzine.html +++ b/modules/board/skins/cozy_board/style.webzine.html @@ -19,12 +19,14 @@   - + - + - + + {$lang->title} {$lang->nick_name} @@ -85,7 +87,7 @@ {$category_list[$document->get('category_srl')]->title} - + @@ -120,7 +122,7 @@ - {$document->getSummary(120)} + {$document->getSummary(120)}   diff --git a/modules/board/skins/cozy_board/view_document.html b/modules/board/skins/cozy_board/view_document.html index 8e9b8222b..33085160c 100644 --- a/modules/board/skins/cozy_board/view_document.html +++ b/modules/board/skins/cozy_board/view_document.html @@ -22,8 +22,8 @@ {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} - {$lang->cmd_modify} - {$lang->cmd_delete} + {$lang->cmd_modify} + {$lang->cmd_delete}
@@ -79,6 +79,19 @@ {$oDocument->getContent()} + + + +
+ +
profile
+ + +
{$oDocument->getSignature()}
+ +
+
+ @@ -143,11 +156,11 @@ - +
- fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_comment_write" > +
@@ -176,7 +189,7 @@
-
{$comment_editor}
+
{$oDocument->getCommentEditor()}
diff --git a/modules/board/skins/cozy_board/write_form.html b/modules/board/skins/cozy_board/write_form.html index 42a9b3177..17b06ba32 100644 --- a/modules/board/skins/cozy_board/write_form.html +++ b/modules/board/skins/cozy_board/write_form.html @@ -2,7 +2,7 @@
- fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> +
@@ -31,7 +31,9 @@ @@ -82,7 +84,7 @@ -
{$editor}
+
{$oDocument->getEditor()}
diff --git a/modules/board/skins/xe_board/comment.html b/modules/board/skins/xe_board/comment.html index c7bec5bfb..9650390cb 100644 --- a/modules/board/skins/xe_board/comment.html +++ b/modules/board/skins/xe_board/comment.html @@ -12,7 +12,7 @@
- + {$lang->cmd_delete} {$lang->cmd_modify} @@ -52,19 +52,23 @@
- {$lang->msg_is_secret} - - - - - -
- +
+ + + + + +
{$lang->msg_is_secret}
+
+
- + + profile + {$comment->getContent(true)} +
@@ -75,6 +79,7 @@
  • {$file->source_filename} ({FileHandler::filesize($file->file_size)})({number_format($file->download_count)})
  • +
    diff --git a/modules/board/skins/xe_board/comment_form.html b/modules/board/skins/xe_board/comment_form.html index efa5344b1..ec92137e1 100644 --- a/modules/board/skins/xe_board/comment_form.html +++ b/modules/board/skins/xe_board/comment_form.html @@ -22,47 +22,45 @@ -
    +
    + + + + + - fileupload)-->enctype="multipart/form-data" class="boardEditor" > -
    - - - - - +
    -
    - - - +
    + + + - - + + - - + + - - - - useNotify())-->checked="checked" id="notify_message" /> - - + + + + useNotify())-->checked="checked" id="notify_message" /> + + - isSecret())-->checked="checked" id="is_secret" /> - -
    + isSecret())-->checked="checked" id="is_secret" /> + +
    -
    class="borderTop">{$comment_editor}
    - -
    - -
    - - -
    -
    +
    {$oComment->getEditor()}
    +
    + + +
    + + + diff --git a/modules/board/skins/xe_board/css/common.css b/modules/board/skins/xe_board/css/common.css index eadd3469a..6b9b65136 100644 --- a/modules/board/skins/xe_board/css/common.css +++ b/modules/board/skins/xe_board/css/common.css @@ -10,25 +10,126 @@ Jeong, Chan Myeong 070601~070630 **/ /* board Title */ -.boardHeader { border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden; _width:100%;} -.boardHeader h3 { float:left; font-size:1.2em; padding:1em 2em .7em 1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} +.boardHeader { border:1px solid #e1e1dd; border-bottom:0; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} +.boardHeader .boardHeaderBorder { width:100%;} +.boardHeader h3 { float:left; padding:15px 15px 12px 15px; font-size:1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} /* board Description */ -.boardDescription { color:#AEAEAE; border:1px solid #DDDDDD; overflow:hidden; padding:1em; margin-top:1em;} +.boardDescription { color:#AEAEAE; border:1px solid #DDDDDD; overflow:hidden; padding:10px; margin-top:5px; background-color:#FFFFFF;} /* board Information */ -.boardInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} +.boardInformation { width:100%; clear:both; margin:10px 0 2px 0; overflow:hidden; color:#666666;} .articleNum { float:left; padding:0 0 0 15px; } /* account Navigation */ .accountNavigation { float:right; } -.accountNavigation li { float:left; margin-left:7px; list-style:none; padding-top:3px;} -.accountNavigation li a { font-size:12px; white-space:nowrap; color:#666666; text-decoration:none;} +.accountNavigation li { float:left; margin-left:7px; list-style:none; } +.accountNavigation li a { white-space:nowrap; color:#666666; text-decoration:none;} .accountNavigation li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } .accountNavigation li.admin a { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; } .accountNavigation li.listType { margin-left:5px; } -.accountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; _padding-top:5px;} -*:first-child+html li.loginAndLogout { padding-top:5px; } +.accountNavigation li.loginAndLogout a { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 2px; padding-left:8px; } + +/* secret Content */ +.secretContent { margin:20px auto; text-align:center; border:1px solid #EFEFEF; width:240px; } +.secretContent .title { padding:10px 0 10px 0; background-color:#EFEFEF; display:block; font-weight:bold; } +.secretContent .content { padding:10px 0 10px 0; background-color:#FFFFFF; display:block; } + +/* blog Style Notice */ +.blogNotice { margin-bottom:10px; padding:5px; border:1px solid #e0e1db;} +.blogNotice .item { background:url("../images/common/notice.gif") no-repeat -2px 3px; padding:3px 0 3px 18px; } +.blogNotice .item .date { font-family:verdana; font-size:.9em;color:#AAAAAA; } +.blogNotice .item a { text-decoration:none; color:#444444; } +.blogNotice .item a:hover { text-decoration:underline} +.blogNotice .item .replyAndTrackback { color:#AAAAAA; font-size:.9em; } + +/* boardRead */ +.viewDocument { border-bottom:2px solid #AAAAAA; margin-bottom:20px; } +.boardRead { margin:10px 0 10px 0; } + +.boardRead .titleAndUser { overflow:hidden; border-bottom:1px solid #e0e1db; } + +.boardRead .titleAndUser .title { float:left; margin:10px 0 5px 0; } +.boardRead .titleAndUser h4 { font-size:1.5em; margin-left:3px;} +.boardRead .titleAndUser h4 a { color:#000000; text-decoration:none; } +.boardRead .titleAndUser h4 a:hover { text-decoration:underline; } + +.boardRead .titleAndUser .userInfo { float:right; white-space:nowrap; margin-top:11px; } +.boardRead .titleAndUser .userInfo .author { color:#3074a5; } +.boardRead .titleAndUser .userInfo .author a { font-size:.9em; color:#3074a5; text-decoration:none; } + +.boardRead .dateAndCount { clear:both; white-space:nowrap; color:#444444; margin:5px 0 0 0; float:left; font-size:.9em; font-family:tahoma; line-height:17px; padding-bottom:10px; } +.boardRead .dateAndCount .date { float:right; background:url("../images/common/calendar.gif") no-repeat left top; padding-left:18px; margin-left:10px; } +.boardRead .dateAndCount .readedCount { float:right; color:#AAAAAA; margin-left:10px; background:url("../images/common/read.gif") no-repeat left top; padding-left:18px; color:#4A3FD7;} +.boardRead .dateAndCount .votedCount { float:right; color:#AAAAAA; margin-left:10px; background:url("../images/common/vote.gif") no-repeat left top; padding-left:18px; color:#D76A3F;} +.boardRead .dateAndCount .replyAndTrackback { float:right; } +.boardRead .dateAndCount .replyAndTrackback .replyCount { margin-left:10px; float:left; background:#FFFFFF url(../images/common/iconReply.gif) no-repeat left 1px; padding-left:15px; } +.boardRead .dateAndCount .replyAndTrackback .trackbackCount { margin-left:10px; float:left; background:#FFFFFF url(../images/common/iconTrackback.gif) no-repeat left 1px; padding-left:15px; } +.boardRead .dateAndCount .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none; } +.boardRead .dateAndCount .replyAndTrackback a:hover { text-decoration:underline; } +.boardRead .dateAndCount .category { float:left; margin-right:10px; } +.boardRead .dateAndCount .category a { color:#555555; text-decoration:none; background:url("../images/common/category.gif") no-repeat left -1px; padding-left:18px; font-weight:bold;} +.boardRead .dateAndCount .category a:hover { text-decoration:underline; } +.boardRead .dateAndCount .uri { float:left; } +.boardRead .dateAndCount .uri a { text-decoration:none; margin-left:4px; color:#BBBBBB; } + +/* extraVars list */ +.boardRead .extraVarsList { width:100%; border:1px solid #e0e1db; border-bottom:none; margin:0 0 30px 0; table-layout:fixed;} +.boardRead .extraVarsList th { font-weight:normal; color:#555555; text-align:left; padding:4px 0 4px 10px; border-bottom:1px solid #e0e1db; border-right:1px solid #e0e1db;} +.boardRead .extraVarsList td { color:#555555; border-bottom:1px solid #e0e1db; padding:4px 0 4px 10px; } +.boardRead .extraVarsList td a { color:#555555; } + +.boardRead .readBody { color:#555555; margin-top:20px; } +.boardRead .readBody .contentBody .ipaddress { text-align:right; margin-top:10px; color:#bbbbbb; font-family:tahoma;} + +.boardRead .tag { background:#FFFFFF url(../images/common/iconTag.gif) no-repeat 3px 2px; padding-left:25px; margin:10px 0 0 0; } +.boardRead .tag li { display:inline; list-style:none; } +.boardRead .tag li a { color:#444444;} + +.boardRead .fileAttached { border:1px solid #EFEFEF; background-color:#F4F4F4; padding:5px; margin-top:10px; overflow:hidden;} +.boardRead .fileAttached h5 { font-weight:normal; color:#999999; font-size:1em; line-height:22px; } +.boardRead .fileAttached li { padding-left:15px; display:block; float:left; white-space:nowrap; list-style:none; margin-right:10px; height:18px;} +.boardRead .fileAttached li a { text-decoration:none; font-size:.9em; white-space:nowrap; color:#444444; } +.boardRead .fileAttached li a:visited { color:#777777;} + +.boardRead .contentButton { text-align:right;margin:10px 0 5px 0; border-top:1px solid #DDDDDD; padding-top:10px;} + + +.trackbackBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em; } +.trackbackBox .trackbackUrl { color:#1F3DAE; font-size:.9em; background:url("../images/common/iconTrackback.gif") no-repeat left top; padding-left:18px; margin:0 0 3px 10px; height:18px;} +.trackbackBox .trackbackItem { background-color:#F3F3F3; padding:.6em .8em .6em .6em; line-height:1.25em; border-top:1px dotted #EEEEEE; list-style:none;} +.trackbackBox p { display:inline; margin-bottom:1em;} +.trackbackBox a { color:#666666; text-decoration:none;} +.trackbackBox div { clear:both; } +.trackbackBox address { display:block; padding:0 .3em 0 0; } +.trackbackBox address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} +.trackbackBox address .date { font:.8em Tahoma; color:#cccccc; float:right;} + +.replyBox { padding:10px; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} +.replyBox .replyItem { background-color:#FFFFFF; padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} +.replyBox p { display:inline; margin-bottom:1em;} +.replyBox .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +.replyBox .author a { color:#3074a5; margin-right:.3em; text-decoration:none; } +.replyBox .voted { float:left; font-size:.9em; color:#AAAAAA; margin:0 .3em .5em 1em;} +.replyBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +.replyBox .replyOption { height:20px; float:right; white-space:nowrap; margin-left:.2em;} +.replyBox .replyOption img { vertical-align:middle;} + +.replyBox .replyContent { clear:left; } +.replyBox .replyContent p { display:block; } +.replyBox .replyContent ul li { padding:0; border:none; line-height:1.25em; list-style:disc;} +.replyBox .replyContent ol li { padding:0; border:none; line-height:1.25em; list-style:decimal;} +.replyBox .reply { background-color:#F4F4F4; border-bottom:1px dotted #DDDDDD;} +.replyBox .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + +.replyBox .fileAttached { border:1px solid #EFEFEF; background-color:#F4F4F4; padding:5px; margin-top:10px; overflow:hidden;} +.replyBox .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; line-height:22px;} +.replyBox .fileAttached li { padding-left:15px; display:block; float:left; white-space:nowrap; list-style:none; margin-right:10px; height:18px;} +.replyBox .fileAttached li a { text-decoration:none; font-size:.9em; white-space:nowrap; color:#444444; } +.replyBox .fileAttached li a:visited { color:#777777;} + +.commentButton { margin-top:.5em; } /* gallery sub menu */ .boardSubMenu { margin:0 0 .5em 0; padding:1em 0 .5em .5em; border-bottom:1px solid #e0e1db;} @@ -38,7 +139,8 @@ Jeong, Chan Myeong 070601~070630 /* list */ .boardList { width:100%; border:1px solid #e0e1db; border-top:none; table-layout:fixed;} .boardListNoTopBorder { border:none; } -.boardList th { color:#3e3f3e; font-weight:normal; border-top:1px solid #e0e1db; border-bottom:1px solid #ffffff; padding-top:5px; white-space:nowrap; height:33px; overflow:hidden;} +.boardList th { color:#3e3f3e; font-weight:normal; border-top:1px solid #e0e1db; border-bottom:1px solid #ffffff; white-space:nowrap; padding-top:5px; height:28px; overflow:hidden;} +html:not([lang*=""]) .boardList th { height:33px; } .boardList th.no_line { background-position:-3px bottom; } .boardList th a { color:#3e3f3e; text-decoration:none; } .boardList th.num { border-left:1px solid #ffffff; } @@ -126,162 +228,56 @@ Jeong, Chan Myeong 070601~070630 .thumbnailBox div.readAndRecommend .vr { color:#dddddd;} .thumbnailBox div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#ff6600;} +/* board Bottom */ +.boardBottom { margin-top:10px; } + /* list button */ -.leftButtonBox { float: left; margin-top:1em;} -.rightButtonBox { float: right; margin-top:1em;} +.leftButtonBox { float: left; } +.rightButtonBox { float: right; } /* pageNavigation */ -.pageNavigation { display:block; margin-top:1em; text-align:center; font:bold 11px Tahoma; margin-top:1.5em;} -.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } -.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; text-decoration:none; line-height:1em; } +.pageNavigation { text-align:center; font:bold 11px Tahoma; margin-top:5px;} +.pageNavigation a { font:bold 1em Tahoma; color:#666666; text-decoration:none; margin:0 10px 0 0; } +.pageNavigation .current { font:bold 1em Tahoma; text-decoration:none; margin:0 10px 0 0; } .pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } .pageNavigation a:visited { color:#999999; } -.pageNavigation a.goToFirst, .pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} -.pageNavigation a.goToFirst img, .pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} +.pageNavigation a.goToFirst img, .pageNavigation a.goToLast img { margin-bottom:2px;} /* Search Form */ -.boardSearch { margin-left:auto; margin-right:auto; clear:both; text-align:center;} +.boardSearch { margin-top:30px; margin-left:auto; margin-right:auto; clear:both; text-align:center;} .boardSearch select { height:20px; } .boardSearch input { height:18px; } -/* boardRead */ -.boardRead { padding:0; margin:0; border:1px solid #e0e1db; border-bottom:2px solid #666760; } -.boardRead .originalContent { padding:2em 1.2em 2em 1.2em;} -.boardRead .readHeader { padding:0 0 .5em 0; margin-bottom:1em; border-bottom:1px solid #eff0ed; overflow:hidden;} - -.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 .dateAndCount { float:right; white-space:nowrap; font-size:.8em; color:#999999; padding-top:5px; } -.boardRead .dateAndCount strong { font-size:1em; font-family:Tahoma;} - -.boardRead ul.uri { overflow:hidden; margin:0 0 2em .3em; float:right; clear:left; } -.boardRead ul.uri li { font-size:8pt; color:#c5c7c0; } - -.boardRead .userInfo { float:left; white-space:nowrap; } -.boardRead .userInfo .author { color:#3074a5; } -.boardRead .userInfo .author a { font-size:.9em; color:#3074a5; text-decoration:none; } -.boardRead .userInfo .ipaddress { font-size:.9em; color:#AAAAAA; margin-top:.3em;} - -.boardRead .contentBody { width:100%; overflow:hidden; } -.boardRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em; clear:both; margin-top:2em;} -.boardRead .readBody p { margin:1em 0; line-height:1.5em;} -.boardRead .readBody .alignLeft { float:left; margin:0 1em 1em 0; } -.boardRead .readBody .alignRight { float:right; margin:0 0 1em 1em; } -.boardRead .readBody .valignCenter { vertical-align:middle;} -.boardRead .readBody .clearBoth { display:block; margin:0 0 1em 0;} -.boardRead .readFooter { padding:0 .3em;} -.boardRead .readFooter .tag { margin-bottom:1em;} -.boardRead .readFooter .tag h5 { display:inline; font-size:1em; margin-right:.5em;} -.boardRead .readFooter .tag ul, -.boardRead .readFooter .tag li { display:inline;} -.boardRead .readFooter .tag a { color:#444444;} -.boardRead .readFooter .tag .tagIcon { vertical-align:middle;} -.boardRead .readFooter .fileAttached { border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb;} -.boardRead .readFooter .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; margin:.5em .5em 0 .5em; line-height:1.5em;} -.boardRead .readFooter .fileAttached ul { float:left; margin-top:.5em; padding-bottom:1em; } -.boardRead .readFooter .fileAttached li { display:inline; margin-right:.75em; line-height:1.5em;} -.boardRead .readFooter .fileAttached li a { text-decoration:none; font-size:.9em; padding:.1em 0 .1em 1.5em; white-space:nowrap; color:#444444; } -.boardRead .readFooter .fileAttached li a:visited { color:#777777;} -.boardRead .buttonBox { float:right; height:40px; margin-right:1em;} - -.boardRead .replyAndTrackbackBox { overflow:hidden; height:40px; float:left;} -.boardRead .replyAndTrackback li { margin-top:10px; _margin-top:8px; margin-left:1em; padding-left:1.4em; float:left; list-style:none;} -.boardRead .replyAndTrackback li.reply { background:url(../images/common/iconReply.gif) no-repeat left top;} -.boardRead .replyAndTrackback li.reply a { _position:relative; _top:-.6em;} -.boardRead .replyAndTrackback li.trackback { background:url(../images/common/iconTrackback.gif) no-repeat left top;} -.boardRead .replyAndTrackback li.trackback a { _position:relative; _top:0em;} -.boardRead .replyAndTrackback a { color:#333333; white-space:nowrap; text-decoration:none;} -.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 .replyAndTrackback .listButton { position:relative; right: 10px; top:-7px; _top:-6px; float:right;} - -/* extraVars list */ -.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em; margin-top:1em; border-bottom:none; table-layout:fixed;} -.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 #e0e1db; border-right:1px solid #e0e1db;} -.extraVarsList td { border-bottom:1px solid #e0e1db; padding:.5em .5em .5em 1em; overflow:hidden;} - -.trackbackBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em;} -.trackbackBox .trackbackItem { padding:.6em .8em .6em .6em; line-height:1.25em; border-bottom:1px dotted #EEEEEE; list-style:none;} -.trackbackBox p { display:inline; margin-bottom:1em;} -.trackbackBox a { color:#666666; text-decoration:none;} -.trackbackBox div { clear:both; } -.trackbackBox address { display:block; padding:0 .3em 0 0; } -.trackbackBox address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} -.trackbackBox address .date { font:.8em Tahoma; color:#cccccc; float:right;} - -.replyBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} -.replyBox .replyItem { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} -.replyBox p { display:inline; margin-bottom:1em;} -.replyBox .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} -.replyBox .author a { color:#3074a5; margin-right:.3em; text-decoration:none; } -.replyBox .voted { float:left; font-size:.9em; color:#AAAAAA; margin:0 .3em .5em 1em;} -.replyBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} - -.replyBox .replyOption { float:right; white-space:nowrap; margin-left:.2em;} -.replyBox .replyOption img { vertical-align:middle;} - -.replyBox .replyContent { clear:left; } -.replyBox .replyContent p { display:block; } -.replyBox .replyContent ul li { padding:0; border:none; line-height:1.25em; list-style:disc;} -.replyBox .replyContent ol li { padding:0; border:none; line-height:1.25em; list-style:decimal;} -.replyBox .reply { background-color:#FAFAFA;} -.replyBox .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} - -.replyBox .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} -.replyBox .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} -.replyBox .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } -.replyBox .fileAttached li a:visited { color:#777777;} - -.commentButton { margin-top:.5em; } - -/* 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:1px 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;} -.boardEditor .borderTop { border-top:1px solid #eaeae7; } - /* boardWrite */ -.boardWrite { width:100%; position:relative;} -.boardWrite .userNameAndPw { margin-bottom:-1px;} -.boardWrite .boardEditor fieldset { width:auto; position:relative;} -.boardWrite div.title { border-bottom:1px solid #eff0ed; border-top:1px solid #eff0ed; padding:.5em 0; white-space:nowrap;} -.boardWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:8em; white-space:nowrap;} -.boardWrite div.title input#title { width:60%;} -.boardWrite .option { border-bottom:1px solid #e1e1e1; padding:.5em 0; overflow:hidden; width:100%;} -.boardWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:8em; white-space:nowrap;} -.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} -.boardWrite .option dd * { vertical-align:middle;} -.boardWrite .option dd select { width:7em; font-size:.95em;height:20px;} -.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%;} +.boardEditor { margin-bottom:10px; } +.commentEditor { margin-top:10px; } +.boardWrite { border:1px solid #e0e1db; padding-bottom:10px;} +.boardWrite fieldset { border:none; } +.boardWrite .userNameAndPw { margin:10px 10px 0 10px; } +.boardWrite .userNameAndPw .userName {width:60px; margin-right:10px; } +.boardWrite .userNameAndPw .userPw {width:60px; margin-right:10px; } +.boardWrite .userNameAndPw .emailAddress {width:60px; margin-right:10px; } +.boardWrite .userNameAndPw .homePage {width:60px; margin-right:10px; } + +.boardWrite .title { margin-top:5px; } +.boardWrite .title .category { margin-left:10px; } +.boardWrite .title label.title { margin:0 10px 0 10px; } +.boardWrite .title input.title { width:60%;} + +.boardWrite dl.option { margin:10px 0 3px 10px; padding:0;} +.boardWrite dl.option dd { display:inline; margin-right:5px; } +.boardWrite dl.option dd * { vertical-align:middle;} +.boardWrite dl.option dd select { width:8em; font-size:.95em; } + +.boardWrite .tag { margin-top:10px; margin-left:10px; } +.boardWrite .tag .inputTypeText { width:90%; background:#FFFFFF url(../images/common/iconTag.gif) no-repeat 5px 5px; padding-left:30px;} .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; } +.boardWrite .tag .info { font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center; margin-top:5px;} + +.boardWrite .extraVarsList { width:100%; border-top:1px solid #e0e1db; border-bottom:none; margin:10px 0 10px 0; table-layout:fixed;} +.boardWrite .extraVarsList th { font-weight:normal; color:#555555; text-align:left; padding:4px 0 4px 10px; border-bottom:1px solid #e0e1db; border-right:1px solid #e0e1db;} +.boardWrite .extraVarsList td { color:#555555; border-bottom:1px solid #e0e1db; padding:4px 0 4px 10px; } +.boardWrite .extraVarsList td a { color:#555555; } .smallBox { border:1px solid #e0e1db; margin-left:auto; margin-right:auto; } .smallBox.w268 { width:268px;} @@ -295,11 +291,12 @@ 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; } +.comment_popup_menu, .document_popup_menu { text-align:right; background:none; background:url(../images/common/document_menu.gif) no-repeat right top; padding:0 15px; 0 0; } +.comment_popup_menu span, .document_popup_menu span { cursor:pointer; display:inline; } /* tag list */ .tagsBox { border:1px solid #EEEEEE; padding:10px; overflow:hidden;} +h5 { padding:2px; } .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%;} @@ -310,3 +307,8 @@ Jeong, Chan Myeong 070601~070630 .tags .tagTypeD a { font-weight:bold; margin:0; background-color:#EFEFEF;} .tags .tagTypeE a { font-weight:normal; margin:0;} + +/* 회원 서명 및 프로필 이미지 출력 */ +.memberSignature { border:1px solid #e0e1db; padding:10px; margin-top:20px;} +.memberSignature .profile { float:left; margin-right:20px; } +img.commentProfileImage { margin:5px 10px 5px 0; } diff --git a/modules/board/skins/xe_board/css/cyan.css b/modules/board/skins/xe_board/css/cyan.css index 2c675b93a..684534d9e 100644 --- a/modules/board/skins/xe_board/css/cyan.css +++ b/modules/board/skins/xe_board/css/cyan.css @@ -18,12 +18,12 @@ .buttonTypeGo { background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; } /* pageNavigation */ -.pageNavigation .current { color:#2895c0; border-right:1px solid #CCCCCC; } +.pageNavigation .current { color:#2895c0; } /* boardRead */ -boardRead .readFooter .fileAttached li a { background:url(../images/cyan/iconFile.gif) no-repeat left top;} +.boardRead .fileAttached li { background:url(../images/cyan/iconFile.gif) no-repeat left top;} /* replyAndTrackback */ -.replyAndTrackback { background:url(../images/cyan/bgBoardListTh.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;} +.buttonBox .replyAndTrackback a strong { color:#2895c0;} + +.replyBox .fileAttached li { background:url(../images/cyan/iconFile.gif) no-repeat left top;} diff --git a/modules/board/skins/xe_board/css/green.css b/modules/board/skins/xe_board/css/green.css index 566c1600c..eb0b34992 100644 --- a/modules/board/skins/xe_board/css/green.css +++ b/modules/board/skins/xe_board/css/green.css @@ -18,12 +18,12 @@ .buttonTypeGo { background:url(../images/green/buttonTypeInput24.gif) no-repeat; } /* pageNavigation */ -.pageNavigation .current { color:#38b549; border-right:1px solid #CCCCCC; } +.pageNavigation .current { color:#38b549; } /* boardRead */ -.boardRead .readFooter .fileAttached li a { background:url(../images/green/iconFile.gif) no-repeat left top;} +.boardRead .fileAttached li { background:url(../images/green/iconFile.gif) no-repeat left top;} /* replyAndTrackback */ -.replyAndTrackback { background:url(../images/green/bgBoardListTh.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;} +.buttonBox .replyAndTrackback a strong { color:#38b549;} + +.replyBox .fileAttached li { background:url(../images/green/iconFile.gif) no-repeat left top;} diff --git a/modules/board/skins/xe_board/css/purple.css b/modules/board/skins/xe_board/css/purple.css index b873712d0..ff5f45cb9 100644 --- a/modules/board/skins/xe_board/css/purple.css +++ b/modules/board/skins/xe_board/css/purple.css @@ -18,12 +18,12 @@ .buttonTypeGo { background:url(../images/purple/buttonTypeInput24.gif) no-repeat; } /* pageNavigation */ -.pageNavigation .current { color:#b1ae00; border-right:1px solid #CCCCCC; } +.pageNavigation .current { color:#b1ae00; } /* boardRead */ -.boardRead .readFooter .fileAttached li a { background:url(../images/purple/iconFile.gif) no-repeat left top;} +.boardRead .fileAttached li { background:url(../images/purple/iconFile.gif) no-repeat left top;} /* replyAndTrackback */ -.replyAndTrackback { background:url(../images/purple/bgBoardListTh.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;} +.buttonBox .replyAndTrackback a strong { color:#b1ae00;} + +.replyBox .fileAttached li { background:url(../images/purple/iconFile.gif) no-repeat left top;} diff --git a/modules/board/skins/xe_board/css/red.css b/modules/board/skins/xe_board/css/red.css index 5e4243528..5e67302af 100644 --- a/modules/board/skins/xe_board/css/red.css +++ b/modules/board/skins/xe_board/css/red.css @@ -18,12 +18,12 @@ .buttonTypeGo { background:url(../images/red/buttonTypeInput24.gif) no-repeat; } /* pageNavigation */ -.pageNavigation .current { color:#ff6600; border-right:1px solid #CCCCCC; } +.pageNavigation .current { color:#ff6600; } /* boardRead */ -.boardRead .readFooter .fileAttached li a { background:url(../images/red/iconFile.gif) no-repeat left top;} +.boardRead .fileAttached li { background:url(../images/red/iconFile.gif) no-repeat left top;} /* replyAndTrackback */ -.replyAndTrackback { background:url(../images/red/bgBoardListTh.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;} +.buttonBox .replyAndTrackback a strong { color:#ff6600;} + +.replyBox .fileAttached li { background:url(../images/red/iconFile.gif) no-repeat left top;} diff --git a/modules/board/skins/xe_board/css/white.css b/modules/board/skins/xe_board/css/white.css index 13b077f5b..9705e7d4d 100644 --- a/modules/board/skins/xe_board/css/white.css +++ b/modules/board/skins/xe_board/css/white.css @@ -11,6 +11,9 @@ .accountNavigation li.join a { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } .accountNavigation li.myInfo a { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +/* boardRead */ +.boardRead .fileAttached li { background:url(../images/white/iconFile.gif) no-repeat left top;} + /* style.list */ .boardList th { background:#ffffff url(../images/white/lineBoardListTh.gif) no-repeat left bottom; } .boardList td.recommend { color:#ff6600; } @@ -18,12 +21,9 @@ .buttonTypeGo { background:url(../images/white/buttonTypeInput24.gif) no-repeat; } /* pageNavigation */ -.pageNavigation .current { color:#ff6600; border-right:1px solid #CCCCCC; } - -/* boardRead */ -.boardRead .readFooter .fileAttached li a { background:url(../images/white/iconFile.gif) no-repeat left top;} +.pageNavigation .current { color:#ff6600; } /* replyAndTrackback */ -.replyAndTrackback { background:url(../images/white/bgBoardListTh.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;} +.buttonBox .replyAndTrackback a strong { color:#ff6600;} + +.replyBox .fileAttached li { background:url(../images/white/iconFile.gif) no-repeat left top;} diff --git a/modules/board/skins/xe_board/extra_var_value.html b/modules/board/skins/xe_board/extra_var_value.html index fd889bab2..7a0ae8d24 100644 --- a/modules/board/skins/xe_board/extra_var_value.html +++ b/modules/board/skins/xe_board/extra_var_value.html @@ -5,6 +5,7 @@ {@ $val->value = $oDocument->getExtraValue($key)} +{@ $_tmp_value = array(); } diff --git a/modules/board/skins/xe_board/header.html b/modules/board/skins/xe_board/header.html index a4ff2f3a5..7cd745c00 100644 --- a/modules/board/skins/xe_board/header.html +++ b/modules/board/skins/xe_board/header.html @@ -5,7 +5,6 @@ {@$module_info->colorset = "white"} - @@ -36,7 +35,7 @@ - + {@ $module_info->default_style = 'gallery'} @@ -49,10 +48,12 @@ {$module_info->header_text} - +
    -

    {$module_info->title} - {$module_info->sub_title}

    +
    +

    {$module_info->title} - {$module_info->sub_title}

    +
    @@ -62,10 +63,11 @@ +
    - +
    {$lang->document_count} {number_format($total_count)}
    @@ -76,23 +78,23 @@ - +
  • {$lang->cmd_setup}
  • - +
  • {$lang->cmd_management}
  • - - + +
  • {$lang->cmd_view_member_info}
  • {$lang->cmd_logout}
  • - +
  • {$lang->cmd_signup}
  • {$lang->cmd_login}
  • @@ -105,11 +107,13 @@
  • Tag list
  • - - -
  • List
  • -
  • Webzine
  • -
  • Gallery
  • + + +
  • List
  • +
  • Webzine
  • +
  • Gallery
  • +
    + diff --git a/modules/board/skins/xe_board/images/common/calendar.gif b/modules/board/skins/xe_board/images/common/calendar.gif new file mode 100644 index 000000000..ebd5966f3 Binary files /dev/null and b/modules/board/skins/xe_board/images/common/calendar.gif differ diff --git a/modules/board/skins/xe_board/images/common/category.gif b/modules/board/skins/xe_board/images/common/category.gif new file mode 100644 index 000000000..f1ff86882 Binary files /dev/null and b/modules/board/skins/xe_board/images/common/category.gif differ diff --git a/modules/board/skins/xe_board/images/common/notice.gif b/modules/board/skins/xe_board/images/common/notice.gif new file mode 100644 index 000000000..2c31e2035 Binary files /dev/null and b/modules/board/skins/xe_board/images/common/notice.gif differ diff --git a/modules/board/skins/xe_board/images/common/read.gif b/modules/board/skins/xe_board/images/common/read.gif new file mode 100644 index 000000000..ce751f43a Binary files /dev/null and b/modules/board/skins/xe_board/images/common/read.gif differ diff --git a/modules/board/skins/xe_board/images/common/typeBlog.gif b/modules/board/skins/xe_board/images/common/typeBlog.gif new file mode 100644 index 000000000..5b9cb9f96 Binary files /dev/null and b/modules/board/skins/xe_board/images/common/typeBlog.gif differ diff --git a/modules/board/skins/xe_board/images/common/vote.gif b/modules/board/skins/xe_board/images/common/vote.gif new file mode 100644 index 000000000..2af526f23 Binary files /dev/null and b/modules/board/skins/xe_board/images/common/vote.gif differ diff --git a/modules/board/skins/xe_board/js/board.js b/modules/board/skins/xe_board/js/board.js index 81c8d2099..5b32f7d9c 100644 --- a/modules/board/skins/xe_board/js/board.js +++ b/modules/board/skins/xe_board/js/board.js @@ -39,12 +39,6 @@ function completeSearch(fo_obj, params) { fo_obj.submit(); } -/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */ -function doVote() { - var fo_obj = document.getElementById('fo_document_info'); - procFilter(fo_obj, vote); -} - function completeVote(ret_obj) { var error = ret_obj['error']; var message = ret_obj['message']; diff --git a/modules/board/skins/xe_board/list.html b/modules/board/skins/xe_board/list.html index 65bfa990f..072f98099 100644 --- a/modules/board/skins/xe_board/list.html +++ b/modules/board/skins/xe_board/list.html @@ -5,8 +5,10 @@ - + +
    +
    @@ -16,59 +18,64 @@ + + - - +
    - - - - - + + - - -
    - + {$lang->last_page} +
    + + + + +
    + +
    +
    - diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index 3da938cfd..0f15c7fbe 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -87,6 +87,7 @@ list webzine gallery + blog forum @@ -115,6 +116,26 @@ asc desc + + 로그인 정보 출력 + 登陆表单 + ログイン情報表示 + Display Login Info + Muestra la información de la conección + Y + N + + + + 설정 표시 + 设置表单 + ログイン設定 + Display Setup + Muestra la información de la Configuración + Y + N + + 게시판 제목 掲示板タイトル diff --git a/modules/board/skins/xe_board/style.blog.html b/modules/board/skins/xe_board/style.blog.html new file mode 100644 index 000000000..35c1d3544 --- /dev/null +++ b/modules/board/skins/xe_board/style.blog.html @@ -0,0 +1,54 @@ + + + + + + +
    + +
    + + + + + + + +
    + +
    + + + + + +
    + +
    + [{$document->getRegdate("Y-m-d")}] + {$document->getTitle()} + + + {$document->getCommentCount()} + + + + {$document->getTrackbackCount()} + + + {$document->printExtraImages(60*60*$module_info->duration_new)} +
    + +
    + + + + +
    + +
    + + + + + diff --git a/modules/board/skins/xe_board/style.forum.html b/modules/board/skins/xe_board/style.forum.html index 1d21b5117..36959a100 100644 --- a/modules/board/skins/xe_board/style.forum.html +++ b/modules/board/skins/xe_board/style.forum.html @@ -25,7 +25,7 @@ diff --git a/modules/board/skins/xe_board/style.gallery.html b/modules/board/skins/xe_board/style.gallery.html index 19e8b1d38..7b29c1dd2 100644 --- a/modules/board/skins/xe_board/style.gallery.html +++ b/modules/board/skins/xe_board/style.gallery.html @@ -11,7 +11,7 @@ @@ -96,7 +96,7 @@
    - + diff --git a/modules/board/skins/xe_board/style.list.html b/modules/board/skins/xe_board/style.list.html index 861e091cc..d6d1212db 100644 --- a/modules/board/skins/xe_board/style.list.html +++ b/modules/board/skins/xe_board/style.list.html @@ -27,7 +27,7 @@ diff --git a/modules/board/skins/xe_board/style.webzine.html b/modules/board/skins/xe_board/style.webzine.html index cb61c88b1..14f1c9170 100644 --- a/modules/board/skins/xe_board/style.webzine.html +++ b/modules/board/skins/xe_board/style.webzine.html @@ -26,7 +26,7 @@ @@ -96,7 +96,7 @@ isCarted())-->checked="checked" /> - + @@ -118,7 +118,7 @@
    {$document->getNickName()}
    {$document->get('readed_count')>0?$document->get('readed_count'):' '} - {$document->get('voted_count')>0?$document->get('voted_count'):' '} + {$document->get('voted_count')!=0?$document->get('voted_count'):' '} {$document->getRegdate('Y-m-d')} {zdate($document->get('last_update'),'Y-m-d H:i')} @@ -132,7 +132,7 @@ - {$document->getSummary(120)} + {$document->getSummary(120)}   diff --git a/modules/board/skins/xe_board/tag_list.html b/modules/board/skins/xe_board/tag_list.html index 19498f8f1..3f8df1795 100644 --- a/modules/board/skins/xe_board/tag_list.html +++ b/modules/board/skins/xe_board/tag_list.html @@ -4,6 +4,7 @@
    +
    {$lang->tag} {$lang->tag} ({count($tag_list)})
    @@ -32,7 +33,7 @@
    -
    + diff --git a/modules/board/skins/xe_board/trackback.html b/modules/board/skins/xe_board/trackback.html index df8d25cfb..3e82e3d52 100644 --- a/modules/board/skins/xe_board/trackback.html +++ b/modules/board/skins/xe_board/trackback.html @@ -1,24 +1,26 @@ -
    - -
    - -
    - {htmlspecialchars($val->title)} - {htmlspecialchars($val->blog_name)} - delete - - {zdate($val->regdate, "Y.m.d H:i")} - ({$val->ipaddress}) - -
    - +
    - diff --git a/modules/board/skins/xe_board/view_document.html b/modules/board/skins/xe_board/view_document.html index c83195c6d..8deaf2c25 100644 --- a/modules/board/skins/xe_board/view_document.html +++ b/modules/board/skins/xe_board/view_document.html @@ -1,70 +1,76 @@ - - - -
    - - -
    -
    -
    +
    -

    {$oDocument->getTitle()}

    + - - |{$category_list[$oDocument->get('category_srl')]->title} + +
    + +
    + + {$oDocument->getNickName()} + + {$oDocument->getNickName()} + +
    + +
    {$oDocument->getNickName()}
    + +
    + +
    +
    - {$lang->readed_count}: - {$oDocument->get('readed_count')}, +
    + {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} +
    + +
    {$oDocument->get('readed_count')}
    - {$lang->voted_count}: - {$oDocument->get('voted_count')}, +
    + {$oDocument->get('voted_count')} +
    - {$oDocument->getRegdate('Y.m.d')} {$oDocument->getRegdate('H:i:s')} + + + + + + + + +
    +
    - -
      -
    • {$lang->document_url} : {$oDocument->getPermanentUrl()}
    • - -
    • {$lang->trackback_url} : {$oDocument->getTrackbackUrl()}
    • - -
    -
    - -
    - - {$oDocument->getNickName()} - - {$oDocument->getNickName()} - -
    - -
    {$oDocument->getNickName()}
    - +
    - -
    {$oDocument->get('ipaddress')}
    - -
    - - + - + + + + + + + + + + + + + diff --git a/modules/board/tpl/board_insert.html b/modules/board/tpl/board_insert.html index ca4ba177a..345aa77d7 100644 --- a/modules/board/tpl/board_insert.html +++ b/modules/board/tpl/board_insert.html @@ -4,7 +4,7 @@ - + @@ -13,21 +13,23 @@ - - - - - - - - - + + + + + + + + + + + @@ -42,6 +44,7 @@ + + + + + + + - + + + + + + + +
    {$val->name} @@ -78,133 +84,127 @@
    + - {$lang->msg_is_secret} -
    - - - +
    + + + + -
    - -
    +
    {$lang->msg_is_secret}
    +
    - + +
    {$oDocument->getContent()} + + +
    ipaddress : {$oDocument->get('ipaddress')}
    + + + + +
    + +
    profile
    + + +
    {$oDocument->getSignature()}
    + +
    + +
    -
    - {@ $tag_list = $oDocument->get('tag_list') } - -
    -
    {$lang->tag}
    - -
    - - - -
    -
    {$lang->uploaded_file} :
    - -
    -
    - + {@ $tag_list = $oDocument->get('tag_list') } + +
    +
    -
    + - - - - + + + -
    - - - - - + + + - - + + - - - -
    + + + +
    + + + + +
    +
    + + + - fileupload)-->enctype="multipart/form-data" class="boardEditor" > -
    - - - - + + -
    - - - + + - - + + + + + + - - + + - - - - - - +
    - - - -
    - -
    class="borderTop">{$comment_editor}
    - - - -
    - -
    - +
    {$oDocument->getCommentEditor()}
    - + +
    + +
    + + diff --git a/modules/board/skins/xe_board/write_form.html b/modules/board/skins/xe_board/write_form.html index 0dd71ccf9..c31a46744 100644 --- a/modules/board/skins/xe_board/write_form.html +++ b/modules/board/skins/xe_board/write_form.html @@ -1,106 +1,108 @@ +
    + + + +
    - fileupload)-->enctype="multipart/form-data" class="boardEditor" id="fo_write"> -
    - - - + +
    + + - -
    - - + + - - + + - - + + +
    + - - -
    +
    + + + + + + +
    -
    - - - - +
    + + {@ $_color = array('555555','222288','226622','2266EE','8866CC','88AA66','EE2222','EE6622','EEAA22','EEEE22') } +
    +
    + get('title_bold')=='Y')-->checked="checked" /> + +
    +
    + isNotice())-->checked="checked" id="is_notice" /> + +
    +
    + isLocked())-->checked="checked" id="lock_comment" /> + +
    + +
    + isSecret())-->checked="checked" id="is_secret" /> + +
    +
    + allowComment())-->checked="checked" id="allow_comment" /> + +
    +
    + allowTrackback())-->checked="checked" id="allow_trackback" /> + +
    + +
    + useNotify())-->checked="checked" id="notify_message" /> + +
    + +
    - -
    + + + + + + + + + + + + +
    {$val->name} *
    + -
    -
    {$lang->cmd_option}
    - - {@ $_color = array('555555','222288','226622','2266EE','8866CC','88AA66','EE2222','EE6622','EEAA22','EEEE22') } -
    -
    - get('title_bold')=='Y')-->checked="checked" /> - -
    -
    - isNotice())-->checked="checked" id="is_notice" /> - -
    -
    - isLocked())-->checked="checked" id="lock_comment" /> - -
    - -
    - isSecret())-->checked="checked" id="is_secret" /> - -
    -
    - allowComment())-->checked="checked" id="allow_comment" /> - -
    -
    - allowTrackback())-->checked="checked" id="allow_trackback" /> - -
    - -
    - useNotify())-->checked="checked" id="notify_message" /> - -
    - -
    +
    {$oDocument->getEditor()}
    -
    {$editor}
    - -
    - - -

    {$lang->about_tag}

    -
    - - - -
    - - - -
    - - - -
    +
    + +

    {$lang->about_tag}

    +
    +
    @@ -117,5 +119,4 @@
    -
    diff --git a/modules/blog/skins/xe_blog/comment.html b/modules/board/skins/xe_guestbook/comment.html similarity index 62% rename from modules/blog/skins/xe_blog/comment.html rename to modules/board/skins/xe_guestbook/comment.html index 2f05b39ca..b1113298d 100644 --- a/modules/blog/skins/xe_blog/comment.html +++ b/modules/board/skins/xe_guestbook/comment.html @@ -12,11 +12,11 @@
    - - {$lang->cmd_delete} - {$lang->cmd_modify} + + {$lang->cmd_delete} + {$lang->cmd_modify} - {$lang->cmd_reply} + {$lang->cmd_reply}
    @@ -52,18 +52,18 @@
    - {$lang->msg_is_secret} -
    - - - - -
    - +
    + + + + + +
    {$lang->msg_is_secret}
    +
    +
    - - {$comment->getContent(true)} + {$comment->getContent(false,false)}
    diff --git a/modules/board/skins/xe_guestbook/comment_form.html b/modules/board/skins/xe_guestbook/comment_form.html new file mode 100644 index 000000000..ececd1007 --- /dev/null +++ b/modules/board/skins/xe_guestbook/comment_form.html @@ -0,0 +1,66 @@ + + + + +
    +
    +
    {$oSourceComment->getNickName()}
    +
    + {$oSourceComment->getRegdate("Y.m.d H:i")} + + ({$oSourceComment->get('ipaddress')}) + +
    +
    + +
    + {$oSourceComment->getContent(false)} +
    +
    +
    + + + + +
    + + + + + + +
    + +
    + + + + + + + + + + + + + + useNotify())-->checked="checked" id="notify_message" /> + + + + isSecret())-->checked="checked" id="is_secret" /> + +
    + +
    {$oComment->getEditor()}
    +
    + +
    + + +
    + +
    + + diff --git a/modules/board/skins/xe_guestbook/css/common.css b/modules/board/skins/xe_guestbook/css/common.css new file mode 100644 index 000000000..75353aead --- /dev/null +++ b/modules/board/skins/xe_guestbook/css/common.css @@ -0,0 +1,283 @@ +@charset "utf-8"; + +/* +NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/) +Jeong, Chan Myeong 070601~070630 +*/ + +/** + * Header + **/ + +/* board Title */ +.boardHeader { border:1px solid #e1e1dd; border-bottom:0; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;} +.boardHeader .boardHeaderBorder { width:100%;} +.boardHeader h3 { float:left; padding:15px 15px 12px 15px; font-size:1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;} + +/* board Description */ +.boardDescription { color:#AEAEAE; border:1px solid #DDDDDD; overflow:hidden; padding:10px; margin-top:5px; background-color:#FFFFFF;} + +/* board Information */ +.boardInformation { width:100%; clear:both; margin:10px 0 2px 0; overflow:hidden; color:#666666;} +.articleNum { float:left; padding:0 0 0 15px; } + +/* account Navigation */ +.accountNavigation { float:right; } +.accountNavigation li { float:left; margin-left:7px; list-style:none; } +.accountNavigation li a { white-space:nowrap; color:#666666; text-decoration:none;} +.accountNavigation li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.admin a { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; } +.accountNavigation li.listType { margin-left:5px; } +.accountNavigation li.loginAndLogout a { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 2px; padding-left:8px; } + +/* secret Content */ +.secretContent { margin:20px auto; text-align:center; border:1px solid #EFEFEF; width:240px; } +.secretContent .title { padding:10px 0 10px 0; background-color:#EFEFEF; display:block; font-weight:bold; } +.secretContent .content { padding:10px 0 10px 0; background-color:#FFFFFF; display:block; } + +/* blog Style Notice */ +.blogNotice { margin-bottom:10px; padding:5px; border:1px solid #e0e1db;} +.blogNotice .item { background:url("../images/common/notice.gif") no-repeat -2px 3px; padding:3px 0 3px 18px; } +.blogNotice .item .date { font-family:verdana; font-size:.9em;color:#AAAAAA; } +.blogNotice .item a { text-decoration:none; color:#444444; } +.blogNotice .item a:hover { text-decoration:underline} +.blogNotice .item .replyAndTrackback { color:#AAAAAA; font-size:.9em; } + +/* boardRead */ +.viewDocument { border:1px solid #e0e1db; padding:10px; border-bottom:2px solid #AAAAAA; margin-bottom:20px; } + +.boardRead .contentInfo .userInfo { float:left; white-space:nowrap; } +.boardRead .contentInfo .userInfo .author { color:#3074a5; } +.boardRead .contentInfo .userInfo .author a { color:#3074a5; text-decoration:none; } + +.boardRead .contentInfo { clear:both; white-space:nowrap; color:#444444; float:left; font-size:.9em; font-family:tahoma; line-height:17px; padding-bottom:10px; width:100%;} +.boardRead .contentInfo .date { float:right; background:url("../images/common/calendar.gif") no-repeat left top; padding-left:18px; margin-left:10px; } + +/* extraVars list */ +.boardRead .extraVarsList { width:100%; border:1px solid #e0e1db; border-bottom:none; margin:0 0 5px 0; table-layout:fixed;} +.boardRead .extraVarsList th { font-weight:normal; color:#555555; text-align:left; padding:4px 0 4px 10px; border-bottom:1px solid #e0e1db; border-right:1px solid #e0e1db;} +.boardRead .extraVarsList td { color:#555555; border-bottom:1px solid #e0e1db; padding:4px 0 4px 10px; } +.boardRead .extraVarsList td a { color:#555555; } + +.boardRead .readBody { color:#555555; } +.boardRead .readBody .contentBody .ipaddress { text-align:right; margin-top:10px; color:#bbbbbb; font-family:tahoma;} + +.boardRead .fileAttached { border:1px solid #EFEFEF; background-color:#F4F4F4; padding:5px; margin-top:10px;} +.boardRead .fileAttached h5 { font-weight:normal; color:#999999; font-size:1em; line-height:22px;} +.boardRead .fileAttached li { display:inline; white-space:nowrap margin:3px 5px 0 3px; list-style:none; } +.boardRead .fileAttached li a { text-decoration:none; font-size:.9em; padding:0 0 2px 17px; white-space:nowrap; color:#444444; } +.boardRead .fileAttached li a:visited { color:#777777;} + +.boardRead .contentButton { text-align:right;padding-top:10px;} + +.trackbackBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em; } +.trackbackBox .trackbackUrl { color:#1F3DAE; font-size:.9em; background:url("../images/common/iconTrackback.gif") no-repeat left top; padding-left:18px; margin:0 0 3px 10px; } +.trackbackBox .trackbackItem { background-color:#F3F3F3; padding:.6em .8em .6em .6em; line-height:1.25em; border-top:1px dotted #EEEEEE; list-style:none;} +.trackbackBox p { display:inline; margin-bottom:1em;} +.trackbackBox a { color:#666666; text-decoration:none;} +.trackbackBox div { clear:both; } +.trackbackBox address { display:block; padding:0 .3em 0 0; } +.trackbackBox address a { font-size:.9em; color:#3074a5; margin-right:.3em; float:left;} +.trackbackBox address .date { font:.8em Tahoma; color:#cccccc; float:right;} + +.replyBox { color:#666666; border-top:1px solid #e0e1db; margin-top:.5em;} +.replyBox .replyItem { background-color:#FFFFFF; padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; border-bottom:1px dotted #EEEEEE; list-style:none;} +.replyBox p { display:inline; margin-bottom:1em;} +.replyBox .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} +.replyBox .author a { color:#3074a5; margin-right:.3em; text-decoration:none; } +.replyBox .voted { float:left; font-size:.9em; color:#AAAAAA; margin:0 .3em .5em 1em;} +.replyBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} + +.replyBox .replyOption { height:20px; float:right; white-space:nowrap; margin-left:.2em;} +.replyBox .replyOption img { vertical-align:middle;} + +.replyBox .replyContent { clear:left; } +.replyBox .replyContent p { display:block; } +.replyBox .replyContent ul li { padding:0; border:none; line-height:1.25em; list-style:disc;} +.replyBox .replyContent ol li { padding:0; border:none; line-height:1.25em; list-style:decimal;} +.replyBox .reply { background-color:#F4F4F4; border-bottom:1px dotted #DDDDDD;} +.replyBox .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} + +.replyBox .fileAttached { border:1px solid #EFEFEF; background-color:#F4F4F4; padding:5px; margin-top:10px;} +.replyBox .fileAttached h5 { font-weight:normal; color:#999999; float:left; font-size:1em; line-height:22px;} +.replyBox .fileAttached li { display:inline; white-space:nowrap margin:3px 5px 0 3px; list-style:none; } +.replyBox .fileAttached li a { text-decoration:none; font-size:.9em; white-space:nowrap; color:#444444; } +.replyBox .fileAttached li a:visited { color:#777777;} + +.commentButton { margin-top:.5em; } + +/* 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; } + +/* list */ +.boardList { width:100%; border:1px solid #e0e1db; border-top:none; table-layout:fixed;} +.boardListNoTopBorder { border:none; } +.boardList th { color:#3e3f3e; font-weight:normal; border-top:1px solid #e0e1db; border-bottom:1px solid #ffffff; padding-top:5px; white-space:nowrap; height:33px; overflow:hidden;} +.boardList th.no_line { background-position:-3px bottom; } +.boardList th a { color:#3e3f3e; text-decoration:none; } +.boardList th.num { border-left:1px solid #ffffff; } +.boardList th.checkbox { text-align:center; } +.boardList th.title { text-align:center; padding-left:1em; } +.boardList th.topic { text-align:left; padding-left:1em; } +.boardList th.category { text-align:left; padding-left:1em; } +.boardList th.category select { vertical-align:middle; width:200px; height:20px;} +.boardList th.reading, th.recommend , th.date { white-space:nowrap;} +.boardList th .sort { padding:0 .2em; vertical-align:middle;} + +.boardList tr.notice { background:#f8f8f8; } +.boardList tr.notice .num { font-weight:bold;} +.boardList tr.bg1 { background:#ffffff} +.boardList tr.bg2 { background:#fbfbfb;} +.boardList td { border-top:1px solid #eff0ed; padding:.5em;} +.boardList td.num { font:.8em tahoma; color:#999999; padding:.5em 1em; text-align:center;} +.boardList td.checkbox { font:.8em tahoma; color:#999999; text-align:center;} +.boardList tr.notice td.num { padding:.5em; white-space:nowrap;} +.boardList tr.notice td.notice { font-size:.9em; color:#999999; font-weight:bold; text-align:center;} +.boardList td.thumb img { border:1px solid #E0E1DB; padding:3px; } + +.boardList td.title {padding-left:1em; } +.boardList td.title strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} +.boardList td.title.bold { font-size:1.2em; 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.topic { padding-left:1em; color:#888888; } +.boardList td.topic strong a { font-size:1em; font-weight:normal; text-decoration:none; color:#222222; } +.boardList td.topic strong a:visited { color:#777777; } +.boardList td.topic .category { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 3px; padding-left:.5em; margin-left:.5em; color:#AAAAAA; } +.boardList td.topic div.author { margin-top:.5em; color:#BBBBBB; font-size:0.8em; } +.boardList td.topic div.author strong { font-size:1.2em; font-weight:normal; color:#666666; } +.boardList td.commentCount { font:bold .8em Tahoma; color:#888888; text-align:center; } + +.boardList td.latestPost { color:#888888; } +.boardList td.latestPost div.author { margin-top:.5em; color:#BBBBBB; font-size:0.8em; } +.boardList td.latestPost div.author strong { font-size:1.2em; font-weight:normal; color:#666666; } +.boardList td.latestPost div.date { font-size:0.8em; margin-top:.5em; } +.boardList td.latestPost div.date strong { font-family:Tahoma; font-weight:normal; color:#666666; } + +.boardListNoTopBorder td { border-top:none; border-bottom:1px solid #eff0ed; padding:.5em;} + +.boardList td.webzineTitle { padding-left:1em; color:#777777;} +.boardList td.webzineTitle strong.category { font-size:1em; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat right 3px; padding-right:.5em; margin-right:.5em;} +.boardList td.webzineTitle.bold { font-size:1.2em; font-weight:bold;} +.boardList td.webzineTitle * { vertical-align:middle;} +.boardList td.webzineTitle, +.boardList td.webzineTitle a { color:#444444; text-decoration:none;} +.boardList td.webzineTitle a:visited { color:#777777;} + +.boardList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em; padding-left:1em;} +.boardList td.summary a { color:#666666; text-decoration:none; line-height:inherit;} +.boardList td.summary a:visited { color:#999999;} + +.boardList td .replyAndTrackback img.trackback { margin-bottom:-.1em;} +.boardList td .replyAndTrackback strong { font:bold 1em Tahoma;} +.boardList td .replyAndTrackback { font:.8em Tahoma; } +.boardList td.author { color:#333333; font-size:.95em; padding-left:1em;} +.boardList td.author a { font-size:1em; color:#333333;} +.boardList td.reading { font:.8em Tahoma; color:#999999; text-align:center;} +.boardList td.recommend { font:bold .8em Tahoma; text-align:center;} +.boardList td.date { font:.8em Tahoma; color:#999999; text-align:center; white-space:nowrap;} +.boardList td input { _margin:-3px;} + +.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; _position:relative; _top:3px; font:.75em Tahoma; text-align:center;} +*:first-child+html .buttonTypeGo { position:relative; top:3px; } + +.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;} + +/* board Bottom */ +.boardBottom { margin-top:10px; } + +/* list button */ +.leftButtonBox { float: left; } +.rightButtonBox { float: right; } + +/* pageNavigation */ +.pageNavigation { text-align:center; font:bold 11px Tahoma; margin-top:5px;} +.pageNavigation a { font:bold 1em Tahoma; color:#666666; text-decoration:none; margin:0 10px 0 0; } +.pageNavigation .current { font:bold 1em Tahoma; text-decoration:none; margin:0 10px 0 0; } +.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } +.pageNavigation a:visited { color:#999999; } +.pageNavigation a.goToFirst img, .pageNavigation a.goToLast img { margin-bottom:2px;} + +/* Search Form */ +.boardSearch { margin-top:30px; margin-left:auto; margin-right:auto; clear:both; text-align:center;} +.boardSearch select { height:20px; } +.boardSearch input { height:18px; } + +/* boardWrite */ +.boardEditor { margin-bottom:10px; } +.commentEditor { margin-top:10px; } +.boardWrite { border:1px solid #e0e1db; padding-bottom:10px;} +.boardWrite fieldset { border:none; } +.boardWrite .userNameAndPw { margin:10px 10px 0 10px; } +.boardWrite .userNameAndPw .userName {width:60px; margin-right:10px; } +.boardWrite .userNameAndPw .userPw {width:60px; margin-right:10px; } +.boardWrite .userNameAndPw .emailAddress {width:60px; margin-right:10px; } +.boardWrite .userNameAndPw .homePage {width:60px; margin-right:10px; } + +.boardWrite .title { margin-top:5px; } +.boardWrite .title .category { margin-left:10px; } +.boardWrite .title label.title { margin:0 10px 0 10px; } +.boardWrite .title input.title { width:60%;} + +.boardWrite dl.option { margin:10px 0 3px 10px; padding:0;} +.boardWrite dl.option dd { display:inline; margin-right:5px; } +.boardWrite dl.option dd * { vertical-align:middle;} +.boardWrite dl.option dd select { width:8em; font-size:.95em; } + +.boardWrite .tag { margin-top:10px; margin-left:10px; } +.boardWrite .tag .inputTypeText { width:90%; background:#FFFFFF url(../images/common/iconTag.gif) no-repeat 5px 5px; padding-left:30px;} +.boardWrite .tag .help { vertical-align:middle;} +.boardWrite .tag .info { font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center; margin-top:5px;} + +.boardWrite .extraVarsList { width:100%; border-top:1px solid #e0e1db; border-bottom:none; margin:10px 0 10px 0; table-layout:fixed;} +.boardWrite .extraVarsList th { font-weight:normal; color:#555555; text-align:left; padding:4px 0 4px 10px; border-bottom:1px solid #e0e1db; border-right:1px solid #e0e1db;} +.boardWrite .extraVarsList td { color:#555555; border-bottom:1px solid #e0e1db; padding:4px 0 4px 10px; } +.boardWrite .extraVarsList td a { color:#555555; } + +.smallBox { border:1px solid #e0e1db; margin-left:auto; margin-right:auto; } +.smallBox.w268 { width:268px;} +.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} +.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } +.smallBox .complex { padding:1.5em 2em 2em 2em;} +.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;} +.smallBox .messageBox { background-color:#F3F3F3; padding:20px; border-bottom:1px solid #EEEEEE;} + + +/* 게시물의 팝업 메뉴 */ +.comment_popup_menu, .document_popup_menu { text-align:right; background:url(../images/common/document_menu.gif) no-repeat right top; padding-right:16px; } +.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;} +h5 { padding:2px; } +.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;} + diff --git a/modules/board/skins/xe_guestbook/css/cyan.css b/modules/board/skins/xe_guestbook/css/cyan.css new file mode 100644 index 000000000..02b399c26 --- /dev/null +++ b/modules/board/skins/xe_guestbook/css/cyan.css @@ -0,0 +1,29 @@ +@charset "utf-8"; + +/* board Title */ +.boardHeader h3 { border-bottom:3px solid #2895c0; } + +/* board Information */ +.articleNum { float:left; background:url(../images/cyan/iconArticle.gif) no-repeat left top; } +.articleNum strong { font:bold 11px Tahoma; color:#2895c0;} + +/* account Navigation */ +.accountNavigation li.join a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.myInfo a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* style.list */ +.boardList th { background:#ffffff url(../images/cyan/lineBoardListTh.gif) no-repeat left bottom; } +.boardList td.recommend { color:#2895c0; } +.boardList td .replyAndTrackback { color:#2895c0; } +.buttonTypeGo { background:url(../images/cyan/buttonTypeInput24.gif) no-repeat; } + +/* pageNavigation */ +.pageNavigation .current { color:#2895c0; } + +/* boardRead */ +boardRead .fileAttached li a { background:url(../images/cyan/iconFile.gif) no-repeat left top;} + +/* replyAndTrackback */ +.buttonBox .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;} diff --git a/modules/board/skins/xe_guestbook/css/green.css b/modules/board/skins/xe_guestbook/css/green.css new file mode 100644 index 000000000..5852383bf --- /dev/null +++ b/modules/board/skins/xe_guestbook/css/green.css @@ -0,0 +1,29 @@ +@charset "utf-8"; + +/* board Title */ +.boardHeader h3 { border-bottom:3px solid #38b549; } + +/* board Information */ +.articleNum { float:left; background:url(../images/green/iconArticle.gif) no-repeat left top; } +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +/* account Navigation */ +.accountNavigation li.join a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.myInfo a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* style.list */ +.boardList th { background:#ffffff url(../images/green/lineBoardListTh.gif) no-repeat left bottom; } +.boardList td.recommend { color:#38b549; } +.boardList td .replyAndTrackback { color:#38b549; } +.buttonTypeGo { background:url(../images/green/buttonTypeInput24.gif) no-repeat; } + +/* pageNavigation */ +.pageNavigation .current { color:#38b549; } + +/* boardRead */ +.boardRead .fileAttached li a { background:url(../images/green/iconFile.gif) no-repeat left top;} + +/* replyAndTrackback */ +.buttonBox .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;} diff --git a/modules/board/skins/xe_guestbook/css/purple.css b/modules/board/skins/xe_guestbook/css/purple.css new file mode 100644 index 000000000..932d1e880 --- /dev/null +++ b/modules/board/skins/xe_guestbook/css/purple.css @@ -0,0 +1,29 @@ +@charset "utf-8"; + +/* board Title */ +.boardHeader h3 { border-bottom:3px solid #ac19a9; } + +/* board Information */ +.articleNum { float:left; background:url(../images/purple/iconArticle.gif) no-repeat left top; } +.articleNum strong { font:bold 11px Tahoma; color:#b1ae00;} + +/* account Navigation */ +.accountNavigation li.join a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.myInfo a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* style.list */ +.boardList th { background:#ffffff url(../images/purple/lineBoardListTh.gif) no-repeat left bottom; } +.boardList td.recommend { color:#b1ae00; } +.boardList td .replyAndTrackback { color:#b1ae00; } +.buttonTypeGo { background:url(../images/purple/buttonTypeInput24.gif) no-repeat; } + +/* pageNavigation */ +.pageNavigation .current { color:#b1ae00; } + +/* boardRead */ +.boardRead .fileAttached li a { background:url(../images/purple/iconFile.gif) no-repeat left top;} + +/* replyAndTrackback */ +.buttonBox .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;} diff --git a/modules/board/skins/xe_guestbook/css/red.css b/modules/board/skins/xe_guestbook/css/red.css new file mode 100644 index 000000000..79cfcbd4a --- /dev/null +++ b/modules/board/skins/xe_guestbook/css/red.css @@ -0,0 +1,29 @@ +@charset "utf-8"; + +/* board Title */ +.boardHeader h3 { border-bottom:3px solid #ed135a; } + +/* board Information */ +.articleNum { float:left; background:url(../images/red/iconArticle.gif) no-repeat left top; } +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +/* account Navigation */ +.accountNavigation li.join a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.myInfo a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* style.list */ +.boardList th { background:#ffffff url(../images/red/lineBoardListTh.gif) no-repeat left bottom; } +.boardList td.recommend { color:#ff6600; } +.boardList td .replyAndTrackback { color:#ff6600; } +.buttonTypeGo { background:url(../images/red/buttonTypeInput24.gif) no-repeat; } + +/* pageNavigation */ +.pageNavigation .current { color:#ff6600; } + +/* boardRead */ +.boardRead .fileAttached li a { background:url(../images/red/iconFile.gif) no-repeat left top;} + +/* replyAndTrackback */ +.buttonBox .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;} diff --git a/modules/board/skins/xe_guestbook/css/white.css b/modules/board/skins/xe_guestbook/css/white.css new file mode 100644 index 000000000..6294be325 --- /dev/null +++ b/modules/board/skins/xe_guestbook/css/white.css @@ -0,0 +1,29 @@ +@charset "utf-8"; + +/* board Title */ +.boardHeader h3 { border-bottom:3px solid #fe3614; } + +/* board Information */ +.articleNum { float:left; background:url(../images/white/iconArticle.gif) no-repeat left top; } +.articleNum strong { font:bold 11px Tahoma; color:#ff6600;} + +/* account Navigation */ +.accountNavigation li.join a { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.myInfo a { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; } + +/* boardRead */ +.boardRead .fileAttached li a { background:url(../images/white/iconFile.gif) no-repeat left top;} + +/* style.list */ +.boardList th { background:#ffffff url(../images/white/lineBoardListTh.gif) no-repeat left bottom; } +.boardList td.recommend { color:#ff6600; } +.boardList td .replyAndTrackback { color:#ff6600; } +.buttonTypeGo { background:url(../images/white/buttonTypeInput24.gif) no-repeat; } + +/* pageNavigation */ +.pageNavigation .current { color:#ff6600; } + +/* replyAndTrackback */ +.buttonBox .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;} diff --git a/modules/blog/skins/xe_blog/delete_comment_form.html b/modules/board/skins/xe_guestbook/delete_comment_form.html similarity index 100% rename from modules/blog/skins/xe_blog/delete_comment_form.html rename to modules/board/skins/xe_guestbook/delete_comment_form.html diff --git a/modules/blog/skins/xe_blog/delete_form.html b/modules/board/skins/xe_guestbook/delete_form.html similarity index 100% rename from modules/blog/skins/xe_blog/delete_form.html rename to modules/board/skins/xe_guestbook/delete_form.html diff --git a/modules/blog/skins/xe_blog/delete_trackback_form.html b/modules/board/skins/xe_guestbook/delete_trackback_form.html similarity index 100% rename from modules/blog/skins/xe_blog/delete_trackback_form.html rename to modules/board/skins/xe_guestbook/delete_trackback_form.html diff --git a/modules/blog/skins/xe_blog/extra_var_form.html b/modules/board/skins/xe_guestbook/extra_var_form.html similarity index 100% rename from modules/blog/skins/xe_blog/extra_var_form.html rename to modules/board/skins/xe_guestbook/extra_var_form.html diff --git a/modules/blog/skins/xe_blog/extra_var_value.html b/modules/board/skins/xe_guestbook/extra_var_value.html similarity index 98% rename from modules/blog/skins/xe_blog/extra_var_value.html rename to modules/board/skins/xe_guestbook/extra_var_value.html index fd889bab2..7a0ae8d24 100644 --- a/modules/blog/skins/xe_blog/extra_var_value.html +++ b/modules/board/skins/xe_guestbook/extra_var_value.html @@ -5,6 +5,7 @@ {@ $val->value = $oDocument->getExtraValue($key)} +{@ $_tmp_value = array(); } diff --git a/modules/blog/skins/xe_blog/filter/delete_comment.xml b/modules/board/skins/xe_guestbook/filter/delete_comment.xml similarity index 86% rename from modules/blog/skins/xe_blog/filter/delete_comment.xml rename to modules/board/skins/xe_guestbook/filter/delete_comment.xml index 86ca3fb71..115ea00d9 100644 --- a/modules/blog/skins/xe_blog/filter/delete_comment.xml +++ b/modules/board/skins/xe_guestbook/filter/delete_comment.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/blog/skins/xe_blog/filter/delete_document.xml b/modules/board/skins/xe_guestbook/filter/delete_document.xml similarity index 84% rename from modules/blog/skins/xe_blog/filter/delete_document.xml rename to modules/board/skins/xe_guestbook/filter/delete_document.xml index 263ca7e86..7627f5a63 100644 --- a/modules/blog/skins/xe_blog/filter/delete_document.xml +++ b/modules/board/skins/xe_guestbook/filter/delete_document.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/blog/skins/xe_blog/filter/delete_trackback.xml b/modules/board/skins/xe_guestbook/filter/delete_trackback.xml similarity index 86% rename from modules/blog/skins/xe_blog/filter/delete_trackback.xml rename to modules/board/skins/xe_guestbook/filter/delete_trackback.xml index 1d8841ba3..2140675f8 100644 --- a/modules/blog/skins/xe_blog/filter/delete_trackback.xml +++ b/modules/board/skins/xe_guestbook/filter/delete_trackback.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/blog/skins/xe_blog/filter/input_password.xml b/modules/board/skins/xe_guestbook/filter/input_password.xml similarity index 83% rename from modules/blog/skins/xe_blog/filter/input_password.xml rename to modules/board/skins/xe_guestbook/filter/input_password.xml index f2d1c0c42..55cb6d8e0 100644 --- a/modules/blog/skins/xe_blog/filter/input_password.xml +++ b/modules/board/skins/xe_guestbook/filter/input_password.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/guestbook/skins/default/filter/insert.xml b/modules/board/skins/xe_guestbook/filter/insert.xml similarity index 79% rename from modules/guestbook/skins/default/filter/insert.xml rename to modules/board/skins/xe_guestbook/filter/insert.xml index debca08a7..9a9d0ffa2 100644 --- a/modules/guestbook/skins/default/filter/insert.xml +++ b/modules/board/skins/xe_guestbook/filter/insert.xml @@ -1,4 +1,4 @@ - + @@ -6,7 +6,6 @@ - diff --git a/modules/blog/skins/xe_blog/filter/insert_comment.xml b/modules/board/skins/xe_guestbook/filter/insert_comment.xml similarity index 91% rename from modules/blog/skins/xe_blog/filter/insert_comment.xml rename to modules/board/skins/xe_guestbook/filter/insert_comment.xml index 7dd555f50..7bbdc3610 100644 --- a/modules/blog/skins/xe_blog/filter/insert_comment.xml +++ b/modules/board/skins/xe_guestbook/filter/insert_comment.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/board/skins/xe_guestbook/filter/search.xml b/modules/board/skins/xe_guestbook/filter/search.xml new file mode 100644 index 000000000..6c85e1254 --- /dev/null +++ b/modules/board/skins/xe_guestbook/filter/search.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/modules/guestbook/skins/default/filter/delete_document.xml b/modules/board/skins/xe_guestbook/filter/vote.xml similarity index 54% rename from modules/guestbook/skins/default/filter/delete_document.xml rename to modules/board/skins/xe_guestbook/filter/vote.xml index 8750f03ad..0870a7551 100644 --- a/modules/guestbook/skins/default/filter/delete_document.xml +++ b/modules/board/skins/xe_guestbook/filter/vote.xml @@ -1,16 +1,13 @@ - +
    - - + - -
    diff --git a/modules/board/skins/xe_guestbook/footer.html b/modules/board/skins/xe_guestbook/footer.html new file mode 100644 index 000000000..c6171637a --- /dev/null +++ b/modules/board/skins/xe_guestbook/footer.html @@ -0,0 +1,2 @@ + +{$module_info->footer_text} diff --git a/modules/board/skins/xe_guestbook/header.html b/modules/board/skins/xe_guestbook/header.html new file mode 100644 index 000000000..335b73520 --- /dev/null +++ b/modules/board/skins/xe_guestbook/header.html @@ -0,0 +1,76 @@ + + + + + + {@$module_info->colorset = "white"} + + + + + + + + + + + + + + {$module_info->header_text} + + + +
    +
    +

    {$module_info->title} - {$module_info->sub_title}

    +
    +
    + + + + +
    {$module_info->comment}
    + + + +
    + + + +
    {$lang->document_count} {number_format($total_count)}
    + + + + + +
    diff --git a/modules/blog/skins/xe_blog/images/common/bgH3.gif b/modules/board/skins/xe_guestbook/images/common/bgH3.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/bgH3.gif rename to modules/board/skins/xe_guestbook/images/common/bgH3.gif diff --git a/widgets/newest_document/skins/news_ticker/images/none/left.gif b/modules/board/skins/xe_guestbook/images/common/blank.gif similarity index 100% rename from widgets/newest_document/skins/news_ticker/images/none/left.gif rename to modules/board/skins/xe_guestbook/images/common/blank.gif diff --git a/modules/blog/skins/xe_blog/images/common/bottomGotoFirst.gif b/modules/board/skins/xe_guestbook/images/common/bottomGotoFirst.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/bottomGotoFirst.gif rename to modules/board/skins/xe_guestbook/images/common/bottomGotoFirst.gif diff --git a/modules/blog/skins/xe_blog/images/common/bottomGotoLast.gif b/modules/board/skins/xe_guestbook/images/common/bottomGotoLast.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/bottomGotoLast.gif rename to modules/board/skins/xe_guestbook/images/common/bottomGotoLast.gif diff --git a/modules/blog/skins/xe_blog/images/common/bullet_3x3_d8d8d8.gif b/modules/board/skins/xe_guestbook/images/common/bullet_3x3_d8d8d8.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/bullet_3x3_d8d8d8.gif rename to modules/board/skins/xe_guestbook/images/common/bullet_3x3_d8d8d8.gif diff --git a/modules/blog/skins/xe_blog/images/common/buttonClose.gif b/modules/board/skins/xe_guestbook/images/common/buttonClose.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/buttonClose.gif rename to modules/board/skins/xe_guestbook/images/common/buttonClose.gif diff --git a/modules/blog/skins/xe_blog/images/common/buttonDeleteX.gif b/modules/board/skins/xe_guestbook/images/common/buttonDeleteX.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/buttonDeleteX.gif rename to modules/board/skins/xe_guestbook/images/common/buttonDeleteX.gif diff --git a/modules/guestbook/skins/default/images/buttonHelp.gif b/modules/board/skins/xe_guestbook/images/common/buttonHelp.gif similarity index 100% rename from modules/guestbook/skins/default/images/buttonHelp.gif rename to modules/board/skins/xe_guestbook/images/common/buttonHelp.gif diff --git a/modules/blog/skins/xe_blog/images/common/buttonToggleReply.gif b/modules/board/skins/xe_guestbook/images/common/buttonToggleReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/buttonToggleReply.gif rename to modules/board/skins/xe_guestbook/images/common/buttonToggleReply.gif diff --git a/modules/board/skins/xe_guestbook/images/common/calendar.gif b/modules/board/skins/xe_guestbook/images/common/calendar.gif new file mode 100644 index 000000000..ebd5966f3 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/common/calendar.gif differ diff --git a/modules/board/skins/xe_guestbook/images/common/category.gif b/modules/board/skins/xe_guestbook/images/common/category.gif new file mode 100644 index 000000000..f1ff86882 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/common/category.gif differ diff --git a/modules/blog/skins/xe_blog/images/common/document_menu.gif b/modules/board/skins/xe_guestbook/images/common/document_menu.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/document_menu.gif rename to modules/board/skins/xe_guestbook/images/common/document_menu.gif diff --git a/modules/guestbook/skins/default/images/iconAdmin.gif b/modules/board/skins/xe_guestbook/images/common/iconAdmin.gif similarity index 100% rename from modules/guestbook/skins/default/images/iconAdmin.gif rename to modules/board/skins/xe_guestbook/images/common/iconAdmin.gif diff --git a/modules/guestbook/skins/default/images/iconArrowD8.gif b/modules/board/skins/xe_guestbook/images/common/iconArrowD8.gif similarity index 100% rename from modules/guestbook/skins/default/images/iconArrowD8.gif rename to modules/board/skins/xe_guestbook/images/common/iconArrowD8.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconCheck.gif b/modules/board/skins/xe_guestbook/images/common/iconCheck.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconCheck.gif rename to modules/board/skins/xe_guestbook/images/common/iconCheck.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconNotice.gif b/modules/board/skins/xe_guestbook/images/common/iconNotice.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconNotice.gif rename to modules/board/skins/xe_guestbook/images/common/iconNotice.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconReply.gif b/modules/board/skins/xe_guestbook/images/common/iconReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconReply.gif rename to modules/board/skins/xe_guestbook/images/common/iconReply.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconReplyArrow.gif b/modules/board/skins/xe_guestbook/images/common/iconReplyArrow.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconReplyArrow.gif rename to modules/board/skins/xe_guestbook/images/common/iconReplyArrow.gif diff --git a/modules/guestbook/skins/default/images/iconRss.gif b/modules/board/skins/xe_guestbook/images/common/iconRss.gif similarity index 100% rename from modules/guestbook/skins/default/images/iconRss.gif rename to modules/board/skins/xe_guestbook/images/common/iconRss.gif diff --git a/modules/guestbook/skins/default/images/iconSetup.gif b/modules/board/skins/xe_guestbook/images/common/iconSetup.gif similarity index 100% rename from modules/guestbook/skins/default/images/iconSetup.gif rename to modules/board/skins/xe_guestbook/images/common/iconSetup.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconTrackback.gif b/modules/board/skins/xe_guestbook/images/common/iconTrackback.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconTrackback.gif rename to modules/board/skins/xe_guestbook/images/common/iconTrackback.gif diff --git a/modules/blog/skins/xe_blog/images/common/lineH3.gif b/modules/board/skins/xe_guestbook/images/common/lineH3.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/lineH3.gif rename to modules/board/skins/xe_guestbook/images/common/lineH3.gif diff --git a/modules/guestbook/skins/default/images/line_1x10_e0e0e0.gif b/modules/board/skins/xe_guestbook/images/common/line_1x10_e0e0e0.gif similarity index 100% rename from modules/guestbook/skins/default/images/line_1x10_e0e0e0.gif rename to modules/board/skins/xe_guestbook/images/common/line_1x10_e0e0e0.gif diff --git a/modules/board/skins/xe_guestbook/images/common/notice.gif b/modules/board/skins/xe_guestbook/images/common/notice.gif new file mode 100644 index 000000000..2c31e2035 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/common/notice.gif differ diff --git a/modules/board/skins/xe_guestbook/images/common/read.gif b/modules/board/skins/xe_guestbook/images/common/read.gif new file mode 100644 index 000000000..ce751f43a Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/common/read.gif differ diff --git a/modules/board/skins/xe_guestbook/images/common/vote.gif b/modules/board/skins/xe_guestbook/images/common/vote.gif new file mode 100644 index 000000000..2af526f23 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/common/vote.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/bgBlogListTh.gif b/modules/board/skins/xe_guestbook/images/cyan/bgBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/bgBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/cyan/bgBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/buttonModifyE.gif b/modules/board/skins/xe_guestbook/images/cyan/buttonModifyE.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/buttonModifyE.gif rename to modules/board/skins/xe_guestbook/images/cyan/buttonModifyE.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/buttonReply.gif b/modules/board/skins/xe_guestbook/images/cyan/buttonReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/buttonReply.gif rename to modules/board/skins/xe_guestbook/images/cyan/buttonReply.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/buttonTypeInput24.gif b/modules/board/skins/xe_guestbook/images/cyan/buttonTypeInput24.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/buttonTypeInput24.gif rename to modules/board/skins/xe_guestbook/images/cyan/buttonTypeInput24.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/iconArticle.gif b/modules/board/skins/xe_guestbook/images/cyan/iconArticle.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/iconArticle.gif rename to modules/board/skins/xe_guestbook/images/cyan/iconArticle.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/iconFile.gif b/modules/board/skins/xe_guestbook/images/cyan/iconFile.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/iconFile.gif rename to modules/board/skins/xe_guestbook/images/cyan/iconFile.gif diff --git a/modules/blog/skins/xe_blog/images/cyan/iconList.gif b/modules/board/skins/xe_guestbook/images/cyan/iconList.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/iconList.gif rename to modules/board/skins/xe_guestbook/images/cyan/iconList.gif diff --git a/modules/board/skins/xe_guestbook/images/cyan/iconMyInfo.gif b/modules/board/skins/xe_guestbook/images/cyan/iconMyInfo.gif new file mode 100644 index 000000000..1ba5a947e Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/cyan/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_guestbook/images/cyan/iconWrite.gif b/modules/board/skins/xe_guestbook/images/cyan/iconWrite.gif new file mode 100644 index 000000000..9319f7e9b Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/cyan/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/cyan/lineBlogListTh.gif b/modules/board/skins/xe_guestbook/images/cyan/lineBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/cyan/lineBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/cyan/lineBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/green/bgBlogListTh.gif b/modules/board/skins/xe_guestbook/images/green/bgBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/bgBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/green/bgBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/green/buttonModifyE.gif b/modules/board/skins/xe_guestbook/images/green/buttonModifyE.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/buttonModifyE.gif rename to modules/board/skins/xe_guestbook/images/green/buttonModifyE.gif diff --git a/modules/blog/skins/xe_blog/images/green/buttonReply.gif b/modules/board/skins/xe_guestbook/images/green/buttonReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/buttonReply.gif rename to modules/board/skins/xe_guestbook/images/green/buttonReply.gif diff --git a/modules/blog/skins/xe_blog/images/green/buttonTypeInput24.gif b/modules/board/skins/xe_guestbook/images/green/buttonTypeInput24.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/buttonTypeInput24.gif rename to modules/board/skins/xe_guestbook/images/green/buttonTypeInput24.gif diff --git a/modules/blog/skins/xe_blog/images/green/iconArticle.gif b/modules/board/skins/xe_guestbook/images/green/iconArticle.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/iconArticle.gif rename to modules/board/skins/xe_guestbook/images/green/iconArticle.gif diff --git a/modules/blog/skins/xe_blog/images/green/iconFile.gif b/modules/board/skins/xe_guestbook/images/green/iconFile.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/iconFile.gif rename to modules/board/skins/xe_guestbook/images/green/iconFile.gif diff --git a/modules/blog/skins/xe_blog/images/common/iconList.gif b/modules/board/skins/xe_guestbook/images/green/iconList.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/iconList.gif rename to modules/board/skins/xe_guestbook/images/green/iconList.gif diff --git a/modules/board/skins/xe_guestbook/images/green/iconMyInfo.gif b/modules/board/skins/xe_guestbook/images/green/iconMyInfo.gif new file mode 100644 index 000000000..b67f29733 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/green/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_guestbook/images/green/iconWrite.gif b/modules/board/skins/xe_guestbook/images/green/iconWrite.gif new file mode 100644 index 000000000..2c9832e36 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/green/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/green/lineBlogListTh.gif b/modules/board/skins/xe_guestbook/images/green/lineBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/lineBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/green/lineBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/purple/bgBlogListTh.gif b/modules/board/skins/xe_guestbook/images/purple/bgBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/bgBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/purple/bgBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/purple/buttonModifyE.gif b/modules/board/skins/xe_guestbook/images/purple/buttonModifyE.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/buttonModifyE.gif rename to modules/board/skins/xe_guestbook/images/purple/buttonModifyE.gif diff --git a/modules/blog/skins/xe_blog/images/purple/buttonReply.gif b/modules/board/skins/xe_guestbook/images/purple/buttonReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/buttonReply.gif rename to modules/board/skins/xe_guestbook/images/purple/buttonReply.gif diff --git a/modules/blog/skins/xe_blog/images/common/buttonTypeInput24.gif b/modules/board/skins/xe_guestbook/images/purple/buttonTypeInput24.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/common/buttonTypeInput24.gif rename to modules/board/skins/xe_guestbook/images/purple/buttonTypeInput24.gif diff --git a/modules/blog/skins/xe_blog/images/purple/iconArticle.gif b/modules/board/skins/xe_guestbook/images/purple/iconArticle.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/iconArticle.gif rename to modules/board/skins/xe_guestbook/images/purple/iconArticle.gif diff --git a/modules/blog/skins/xe_blog/images/purple/iconFile.gif b/modules/board/skins/xe_guestbook/images/purple/iconFile.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/iconFile.gif rename to modules/board/skins/xe_guestbook/images/purple/iconFile.gif diff --git a/modules/blog/skins/xe_blog/images/green/iconList.gif b/modules/board/skins/xe_guestbook/images/purple/iconList.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/green/iconList.gif rename to modules/board/skins/xe_guestbook/images/purple/iconList.gif diff --git a/modules/board/skins/xe_guestbook/images/purple/iconMyInfo.gif b/modules/board/skins/xe_guestbook/images/purple/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/purple/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_guestbook/images/purple/iconWrite.gif b/modules/board/skins/xe_guestbook/images/purple/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/purple/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/purple/lineBlogListTh.gif b/modules/board/skins/xe_guestbook/images/purple/lineBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/lineBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/purple/lineBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/red/bgBlogListTh.gif b/modules/board/skins/xe_guestbook/images/red/bgBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/bgBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/red/bgBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/red/buttonModifyE.gif b/modules/board/skins/xe_guestbook/images/red/buttonModifyE.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/buttonModifyE.gif rename to modules/board/skins/xe_guestbook/images/red/buttonModifyE.gif diff --git a/modules/blog/skins/xe_blog/images/red/buttonReply.gif b/modules/board/skins/xe_guestbook/images/red/buttonReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/buttonReply.gif rename to modules/board/skins/xe_guestbook/images/red/buttonReply.gif diff --git a/modules/blog/skins/xe_blog/images/red/buttonTypeInput24.gif b/modules/board/skins/xe_guestbook/images/red/buttonTypeInput24.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/buttonTypeInput24.gif rename to modules/board/skins/xe_guestbook/images/red/buttonTypeInput24.gif diff --git a/modules/blog/skins/xe_blog/images/red/iconArticle.gif b/modules/board/skins/xe_guestbook/images/red/iconArticle.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/iconArticle.gif rename to modules/board/skins/xe_guestbook/images/red/iconArticle.gif diff --git a/modules/blog/skins/xe_blog/images/red/iconFile.gif b/modules/board/skins/xe_guestbook/images/red/iconFile.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/iconFile.gif rename to modules/board/skins/xe_guestbook/images/red/iconFile.gif diff --git a/modules/blog/skins/xe_blog/images/purple/iconList.gif b/modules/board/skins/xe_guestbook/images/red/iconList.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/iconList.gif rename to modules/board/skins/xe_guestbook/images/red/iconList.gif diff --git a/modules/board/skins/xe_guestbook/images/red/iconMyInfo.gif b/modules/board/skins/xe_guestbook/images/red/iconMyInfo.gif new file mode 100644 index 000000000..b48e1fcd2 Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/red/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_guestbook/images/red/iconWrite.gif b/modules/board/skins/xe_guestbook/images/red/iconWrite.gif new file mode 100644 index 000000000..2caff746f Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/red/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/red/lineBlogListTh.gif b/modules/board/skins/xe_guestbook/images/red/lineBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/red/lineBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/red/lineBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/white/bgBlogListTh.gif b/modules/board/skins/xe_guestbook/images/white/bgBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/bgBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/white/bgBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/images/white/buttonModifyE.gif b/modules/board/skins/xe_guestbook/images/white/buttonModifyE.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/buttonModifyE.gif rename to modules/board/skins/xe_guestbook/images/white/buttonModifyE.gif diff --git a/modules/blog/skins/xe_blog/images/white/buttonReply.gif b/modules/board/skins/xe_guestbook/images/white/buttonReply.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/buttonReply.gif rename to modules/board/skins/xe_guestbook/images/white/buttonReply.gif diff --git a/modules/blog/skins/xe_blog/images/purple/buttonTypeInput24.gif b/modules/board/skins/xe_guestbook/images/white/buttonTypeInput24.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/purple/buttonTypeInput24.gif rename to modules/board/skins/xe_guestbook/images/white/buttonTypeInput24.gif diff --git a/modules/blog/skins/xe_blog/images/white/iconArticle.gif b/modules/board/skins/xe_guestbook/images/white/iconArticle.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/iconArticle.gif rename to modules/board/skins/xe_guestbook/images/white/iconArticle.gif diff --git a/modules/blog/skins/xe_blog/images/white/iconFile.gif b/modules/board/skins/xe_guestbook/images/white/iconFile.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/iconFile.gif rename to modules/board/skins/xe_guestbook/images/white/iconFile.gif diff --git a/modules/blog/skins/xe_blog/images/white/iconList.gif b/modules/board/skins/xe_guestbook/images/white/iconList.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/iconList.gif rename to modules/board/skins/xe_guestbook/images/white/iconList.gif diff --git a/modules/board/skins/xe_guestbook/images/white/iconMyInfo.gif b/modules/board/skins/xe_guestbook/images/white/iconMyInfo.gif new file mode 100644 index 000000000..af4545bfa Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/white/iconMyInfo.gif differ diff --git a/modules/board/skins/xe_guestbook/images/white/iconWrite.gif b/modules/board/skins/xe_guestbook/images/white/iconWrite.gif new file mode 100644 index 000000000..f18cb5e9e Binary files /dev/null and b/modules/board/skins/xe_guestbook/images/white/iconWrite.gif differ diff --git a/modules/blog/skins/xe_blog/images/white/lineBlogListTh.gif b/modules/board/skins/xe_guestbook/images/white/lineBoardListTh.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/white/lineBlogListTh.gif rename to modules/board/skins/xe_guestbook/images/white/lineBoardListTh.gif diff --git a/modules/blog/skins/xe_blog/input_password_form.html b/modules/board/skins/xe_guestbook/input_password_form.html similarity index 100% rename from modules/blog/skins/xe_blog/input_password_form.html rename to modules/board/skins/xe_guestbook/input_password_form.html diff --git a/modules/blog/skins/xe_blog/js/blog.js b/modules/board/skins/xe_guestbook/js/board.js similarity index 65% rename from modules/blog/skins/xe_blog/js/blog.js rename to modules/board/skins/xe_guestbook/js/board.js index 2fd8db522..f23633952 100644 --- a/modules/blog/skins/xe_blog/js/blog.js +++ b/modules/board/skins/xe_guestbook/js/board.js @@ -1,7 +1,7 @@ /** - * @file modules/blog/js/blog.js + * @file modules/board/js/board.js * @author zero (zero@nzeo.com) - * @brief blog 모듈의 javascript + * @brief board 모듈의 javascript **/ /* 글쓰기 작성후 */ @@ -12,9 +12,9 @@ function completeDocumentInserted(ret_obj) { var document_srl = ret_obj['document_srl']; var category_srl = ret_obj['category_srl']; - alert(message); + //alert(message); - var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + var url = current_url.setQuery('mid',mid).setQuery('act',''); if(category_srl) url = url.setQuery('category',category_srl); location.href = url; } @@ -29,7 +29,7 @@ function completeDeleteDocument(ret_obj) { var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('document_srl',''); if(page) url = url.setQuery('page',page); - alert(message); + //alert(message); location.href = url; } @@ -39,6 +39,13 @@ function completeSearch(fo_obj, params) { fo_obj.submit(); } +function completeVote(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + alert(message); + location.href = location.href; +} + // 현재 페이지 reload function completeReload(ret_obj) { var error = ret_obj['error']; @@ -47,21 +54,19 @@ function completeReload(ret_obj) { location.href = location.href; } -/* 댓글쓰기 submit */ -function doCommentSubmit() { - var fo_obj = xGetElementById('fo_comment_write'); - procFilter(fo_obj, insert); -} - /* 댓글 글쓰기 작성후 */ function completeInsertComment(ret_obj) { var error = ret_obj['error']; var message = ret_obj['message']; + var mid = ret_obj['mid']; + var document_srl = ret_obj['document_srl']; var comment_srl = ret_obj['comment_srl']; - alert(message); - var url = current_url.setQuery('comment_srl','').setQuery('act','').setQuery('rnd',comment_srl); - if(comment_srl) url += '#comment_'+comment_srl; + var url = current_url.setQuery('mid',mid).setQuery('act',''); + if(comment_srl) url = url.setQuery('rnd',comment_srl)+"#comment_"+comment_srl; + + //alert(message); + location.href = url; } @@ -76,7 +81,7 @@ function completeDeleteComment(ret_obj) { var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); if(page) url = url.setQuery('page',page); - alert(message); + //alert(message); location.href = url; } @@ -89,17 +94,25 @@ function completeDeleteTrackback(ret_obj) { var document_srl = ret_obj['document_srl']; var page = ret_obj['page']; - var url = "./?mid="+mid+'&document_srl='+document_srl; - if(page) url += "&page="+page; + var url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + if(page) url = url.setQuery('page',page); - alert(message); + //alert(message); location.href = url; } /* 카테고리 이동 */ -function doChangeCategory(sel_obj, url) { - var category_srl = sel_obj.options[sel_obj.selectedIndex].value; - if(!category_srl) location.href=url; - else location.href=url+'&category='+category_srl; +function doChangeCategory() { + var sel_obj = xGetElementById("board_category"); + var sel_idx = sel_obj.selectedIndex; + var category_srl = sel_obj.options[sel_idx].value; + location.href = current_url.setQuery('category',category_srl); +} + +/* 스크랩 */ +function doScrap(document_srl) { + var params = new Array(); + params["document_srl"] = document_srl; + exec_xml("member","procMemberScrapDocument", params, null); } diff --git a/modules/board/skins/xe_guestbook/list.html b/modules/board/skins/xe_guestbook/list.html new file mode 100644 index 000000000..f4165bf06 --- /dev/null +++ b/modules/board/skins/xe_guestbook/list.html @@ -0,0 +1,98 @@ + + + + + + + + + + + +
    + +
    + [{$document->getRegdate("Y-m-d")}] + {$document->getContentText(20)} + + + {$document->getCommentCount()} + + + + {$document->getTrackbackCount()} + + + {$document->printExtraImages(60*60*$module_info->duration_new)} +
    + +
    + + + +
    + +
    + + + + + +
    + +
    + + + + +
    + + + + + + + + + + + + +
    + +
    +
    + + diff --git a/modules/board/skins/xe_guestbook/message.html b/modules/board/skins/xe_guestbook/message.html new file mode 100644 index 000000000..3fcd79b35 --- /dev/null +++ b/modules/board/skins/xe_guestbook/message.html @@ -0,0 +1,16 @@ + + +
    + +
    {$message}
    + + + +
    + + diff --git a/modules/board/skins/xe_guestbook/skin.xml b/modules/board/skins/xe_guestbook/skin.xml new file mode 100644 index 000000000..7680113b4 --- /dev/null +++ b/modules/board/skins/xe_guestbook/skin.xml @@ -0,0 +1,71 @@ + + + 방명록 기본 스킨 + 留言本默认皮肤 + ゲストブックのデフォルトスキン + Zeroboard XE Basic Guestbook Skin + + 제로 + Zero + Zero + Zero + board모듈의 default스킨 + 留言本模块的默认皮肤。 + ボード(board)モジュールのデフォルトスキンです。 + This is the basic guestbook skin of Zeroboard XE. + + + + 하얀색(기본) + 白(デフォルト) + 白色(基本) + White (default) + + + 청록색 + 青緑 + 青绿色 + Cyan + + + 초록색 + + 绿色 + Green + + + 빨간색 + + 红色 + Red + + + 보라색 + + 紫色 + Purple + + + + + 제목 + 标题 + タイトル + Title + 방명록의 제목을 적어주세요. + 请输入留言本标题。 + ゲストブックのタイトルを入力してください。 + Please input the title of guestbook. + + + 방명록 설명 + 留言本说明 + ゲストブックの説明 + Description + 내용의 기본값 + 内容默认值 + 内容のデフォルト値 + Default value of content + + + diff --git a/modules/board/skins/xe_guestbook/tag_list.html b/modules/board/skins/xe_guestbook/tag_list.html new file mode 100644 index 000000000..3f8df1795 --- /dev/null +++ b/modules/board/skins/xe_guestbook/tag_list.html @@ -0,0 +1,40 @@ + + + + + +
    +
    {$lang->tag} {$lang->tag} ({count($tag_list)})
    +
    + + + + {@ $tag_class = "tagTypeA" } + + {@ $tag_class = "tagTypeB" } + + {@ $tag_class = "tagTypeC" } + + {@ $tag_class = "tagTypeD" } + + {@ $tag_class = "tagTypeE" } + + + + +
    +
    +
    +
    + + + + diff --git a/modules/board/skins/xe_guestbook/trackback.html b/modules/board/skins/xe_guestbook/trackback.html new file mode 100644 index 000000000..3e82e3d52 --- /dev/null +++ b/modules/board/skins/xe_guestbook/trackback.html @@ -0,0 +1,26 @@ + + +
    + + + + + +
    + +
    + {htmlspecialchars($val->title)} - {htmlspecialchars($val->blog_name)} + delete + + {zdate($val->regdate, "Y.m.d H:i")} + ({$val->ipaddress}) + +
    + +
    + + + +
    diff --git a/modules/board/skins/xe_guestbook/view_document.html b/modules/board/skins/xe_guestbook/view_document.html new file mode 100644 index 000000000..d073ff0b9 --- /dev/null +++ b/modules/board/skins/xe_guestbook/view_document.html @@ -0,0 +1,105 @@ + +
    +
    +
    + + +
    +
    + +
    + + + + + + + + + + + + + +
    {$val->name} + + +
    + + +
    +
    + + + +
    +
    + + + + +
    {$lang->msg_is_secret}
    +
    + +
    +
    + + {$oDocument->getContent(false,false)} + + + +
    ipaddress : {$oDocument->get('ipaddress')}
    + +
    +
    + + + + +
    + + + + + + + + +
    diff --git a/modules/board/skins/xe_guestbook/write_form.html b/modules/board/skins/xe_guestbook/write_form.html new file mode 100644 index 000000000..c7a66a096 --- /dev/null +++ b/modules/board/skins/xe_guestbook/write_form.html @@ -0,0 +1,102 @@ + + + +
    + + + + +
    + +
    + + + + + + + + + + + +
    + + +
    + + {@ $_color = array('555555','222288','226622','2266EE','8866CC','88AA66','EE2222','EE6622','EEAA22','EEEE22') } +
    +
    + get('title_bold')=='Y')-->checked="checked" /> + +
    +
    + isNotice())-->checked="checked" id="is_notice" /> + +
    +
    + isLocked())-->checked="checked" id="lock_comment" /> + +
    + +
    + isSecret())-->checked="checked" id="is_secret" /> + +
    +
    + allowComment())-->checked="checked" id="allow_comment" /> + +
    +
    + allowTrackback())-->checked="checked" id="allow_trackback" /> + +
    + +
    + useNotify())-->checked="checked" id="notify_message" /> + +
    + +
    + + + + + + + + + + + + + +
    {$val->name} *
    + + +
    {$oDocument->getEditor()}
    + +
    + +
    + + + + +
    + +
    + + + +
    + +
    +
    + diff --git a/modules/board/tpl/board_info.html b/modules/board/tpl/board_info.html index 59cd23493..1ea2fef2e 100644 --- a/modules/board/tpl/board_info.html +++ b/modules/board/tpl/board_info.html @@ -39,10 +39,22 @@
    {$lang->list_count} {$module_info->list_count?$module_info->list_count:20}
    {$lang->search_list_count}{$module_info->search_list_count?$module_info->search_list_count:20}
    {$lang->page_count} {$module_info->page_count?$module_info->page_count:10}
    {$lang->except_notice}{$module_info->except_notice=='N'?$lang->notuse:$lang->use}
    {$lang->consultation}{$module_info->consultation=='Y'?$lang->use:$lang->notuse}
    {$lang->description} {nl2br(htmlspecialchars($module_info->description))} 
    {$lang->mid} - -

    {$lang->about_mid}

    -
    {$lang->is_default} - is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> - -
    {$lang->mid} + +

    {$lang->about_mid}

    +
    {$lang->is_default} + is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> + +
    {$lang->module_category}
    {$lang->browser_title} @@ -49,6 +52,8 @@

    {$lang->about_browser_title}

    {$lang->layout} @@ -86,6 +91,13 @@

    {$lang->about_list_count}

    {$lang->search_list_count} + +

    {$lang->about_search_list_count}

    +
    {$lang->page_count} @@ -93,7 +105,20 @@

    {$lang->about_page_count}

    {$lang->except_notice} + except_notice!='N')-->checked="checked" /> +

    {$lang->about_except_notice}

    +
    {$lang->consultation} + consultation=='Y')-->checked="checked" /> +

    {nl2br($lang->about_consultation)}

    +
    {$lang->description} @@ -125,65 +150,68 @@
    +
    - -
    - {@ $extra_vars_name = ''} - {@ $extra_vars_type = ''} - {@ $extra_vars_is_required = ''} - {@ $extra_vars_default_value = ''} - {@ $extra_vars_desc = ''} - {@ $extra_vars_search = ''} - - {@ $extra_vars_name = $module_info->extra_vars[$i]->name} - {@ $extra_vars_type = $module_info->extra_vars[$i]->type} - {@ $extra_vars_is_required = $module_info->extra_vars[$i]->is_required} - {@ $extra_vars_default_value = $module_info->extra_vars[$i]->default} - {@ $extra_vars_desc = $module_info->extra_vars[$i]->desc} - {@ $extra_vars_search = $module_info->extra_vars[$i]->search} - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
    {$lang->extra_vars} {$i}
    {$lang->column_name}
    {$lang->column_type} - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - -
    {$lang->extra_vars} {$i}
    {$lang->column_name}
    {$lang->column_type} + -
    {$lang->is_required}checked="checked" />
    {$lang->default_value}

    {$lang->about_extra_vars_default_value}

    {$lang->description}
    {$lang->cmd_search}checked="checked" />
    + +
    {$lang->is_required}checked="checked" />
    {$lang->default_value}

    {$lang->about_extra_vars_default_value}

    {$lang->description}
    {$lang->cmd_search}checked="checked" />
    + diff --git a/modules/blog/tpl/category_info.html b/modules/board/tpl/category_info.html similarity index 100% rename from modules/blog/tpl/category_info.html rename to modules/board/tpl/category_info.html diff --git a/modules/board/tpl/category_list.html b/modules/board/tpl/category_list.html index 4206091be..1cffd2efb 100644 --- a/modules/board/tpl/category_list.html +++ b/modules/board/tpl/category_list.html @@ -1,70 +1,46 @@ - + + + + - + - - - - - - +

    {$lang->board} {$lang->cmd_management}

    +
    {nl2br($lang->about_board_category)}
    - ------ - - - - - - - - - - - - - - + - - - - - - - - - - -
    {$lang->category_title}{$lang->last_update}{$lang->cmd_modify}{$lang->cmd_move}{$lang->cmd_delete}
    {$lang->msg_category_is_null}
    {htmlspecialchars($category_info->title)}{zdate($category_info->last_update,"Y-m-d H:i:s")}{$lang->cmd_modify} - {$lang->cmd_move_up} - {$lang->cmd_move_down} - {$lang->cmd_delete}
    +

    - -
    - - - + + + + + +
    - - - - - - - - - -
    {$lang->category_title} - -
    +
    +
    + + -
    +
    +
    +
    +
    + + + +
    diff --git a/modules/blog/tpl/css/blog.css b/modules/board/tpl/css/board.css similarity index 100% rename from modules/blog/tpl/css/blog.css rename to modules/board/tpl/css/board.css diff --git a/modules/blog/tpl/filter/delete_category.xml b/modules/board/tpl/filter/delete_category.xml similarity index 71% rename from modules/blog/tpl/filter/delete_category.xml rename to modules/board/tpl/filter/delete_category.xml index 05093325a..81863350c 100644 --- a/modules/blog/tpl/filter/delete_category.xml +++ b/modules/board/tpl/filter/delete_category.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/board/tpl/filter/insert_board.xml b/modules/board/tpl/filter/insert_board.xml index 7005f97db..6863a4cf1 100644 --- a/modules/board/tpl/filter/insert_board.xml +++ b/modules/board/tpl/filter/insert_board.xml @@ -3,6 +3,7 @@ + @@ -14,6 +15,9 @@ + + + diff --git a/modules/board/tpl/filter/insert_category.xml b/modules/board/tpl/filter/insert_category.xml index 9aed519d1..1dae396c9 100644 --- a/modules/board/tpl/filter/insert_category.xml +++ b/modules/board/tpl/filter/insert_category.xml @@ -1,12 +1,23 @@
    + - + + + + + + + + + - + + +
    diff --git a/modules/board/tpl/filter/insert_grant.xml b/modules/board/tpl/filter/insert_grant.xml index 8ac809f0b..7d95b83a6 100644 --- a/modules/board/tpl/filter/insert_grant.xml +++ b/modules/board/tpl/filter/insert_grant.xml @@ -1,6 +1,6 @@
    - + diff --git a/modules/blog/tpl/filter/move_category.xml b/modules/board/tpl/filter/move_category.xml similarity index 68% rename from modules/blog/tpl/filter/move_category.xml rename to modules/board/tpl/filter/move_category.xml index d324a1a59..e229cc64e 100644 --- a/modules/blog/tpl/filter/move_category.xml +++ b/modules/board/tpl/filter/move_category.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/board/tpl/grant_list.html b/modules/board/tpl/grant_list.html index 4bdc834f1..d521c8e03 100644 --- a/modules/board/tpl/grant_list.html +++ b/modules/board/tpl/grant_list.html @@ -3,7 +3,7 @@ - + @@ -37,6 +37,7 @@ diff --git a/modules/board/tpl/header.html b/modules/board/tpl/header.html index 530ca7d9e..cb781a1d5 100644 --- a/modules/board/tpl/header.html +++ b/modules/board/tpl/header.html @@ -18,7 +18,7 @@
  • class="on">{$lang->cmd_view_info}
  • class="on">{$lang->cmd_addition_setup}
  • -
  • class="on">{$lang->cmd_manage_category}
  • +
  • class="on">{$lang->cmd_manage_category}
  • class="on">{$lang->cmd_manage_grant}
  • class="on">{$lang->cmd_manage_skin}
  • diff --git a/modules/board/tpl/index.html b/modules/board/tpl/index.html index ba68b57d5..f1bb2552f 100644 --- a/modules/board/tpl/index.html +++ b/modules/board/tpl/index.html @@ -6,9 +6,11 @@ +
    +
    +@@ -18,6 +20,7 @@ +@@ -27,6 +30,7 @@ +@@ -36,6 +40,7 @@ +@@ -45,6 +50,7 @@ +@@ -54,6 +60,7 @@ +@@ -64,8 +71,8 @@ + @@ -90,6 +96,7 @@ +
    {$lang->no} - - {$lang->mid} / {$lang->browser_title} {$lang->regdate}
    {$no} {$lang->not_exists} @@ -109,8 +116,14 @@
    + + diff --git a/modules/board/tpl/js/board_admin.js b/modules/board/tpl/js/board_admin.js index 3251dcdb6..5a379af6a 100644 --- a/modules/board/tpl/js/board_admin.js +++ b/modules/board/tpl/js/board_admin.js @@ -51,7 +51,9 @@ function completeUpdateCategory(ret_obj) { var page = ret_obj['page']; alert(message); - location.href = current_url.setQuery('category_srl',''); + var url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispBoardAdminCategoryInfo'); + if(page) url.setQuery('page',page); + location.href = url; } /* 권한 관련 */ @@ -86,8 +88,6 @@ function completeInsertGrant(ret_obj) { var module_srl = ret_obj['module_srl']; alert(message); - - location.href = location.href; } /* 카테고리 이동 */ @@ -100,3 +100,172 @@ function doChangeCategory(fo_obj) { return true; } + +/* 일괄 설정 */ +function doCartSetup(act_type) { + var fo_obj = xGetElementById('fo_list'); + var module_srl = new Array(); + if(typeof(fo_obj.cart.length)=='undefined') { + if(fo_obj.cart.checked) module_srl[module_srl.length] = fo_obj.cart.value; + } else { + for(var i=0;i200) { + obj.style.marginTop = ( xScrollTop() - 210 )+'px'; + } else { + obj.style.marginTop = '0px'; + } + + var tpl = ret_obj['tpl']; + xInnerHtml(obj, tpl); + obj.style.display = 'block'; + + var fo_obj = xGetElementById("fo_category"); + fo_obj.category_title.focus(); +} + +/* 카테고리 아이템 입력후 */ +function completeInsertCategory(ret_obj) { + var xml_file = ret_obj['xml_file']; + var category_srl = ret_obj['category_srl']; + var module_srl = ret_obj['module_srl']; + var parent_srl = ret_obj['parent_srl']; + + if(!xml_file) return; + + loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '',doGetCategoryInfo, category_srl, doMoveTree); + + if(!category_srl) { + xInnerHtml("category_info", ""); + } else { + var params = {node_srl:category_srl, parent_srl:parent_srl} + doGetCategoryInfo(null, params) + } + + if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter(); +} + + +/* 카테고리를 드래그하여 이동한 후 실행할 함수 , 이동하는 category_srl과 대상 category_srl을 받음 */ +function doMoveTree(category_id, source_category_srl, target_category_srl) { + source_category_srl = source_category_srl.replace(/menu_category_/,''); + target_category_srl = target_category_srl.replace(/menu_category_/,''); + var p_fo_obj = xGetElementById("fo_category"); + + var fo_obj = xGetElementById("fo_move_category"); + fo_obj.source_category_srl.value = source_category_srl; + fo_obj.target_category_srl.value = target_category_srl; + fo_obj.module_srl.value = p_fo_obj.module_srl.value; + + // 이동 취소를 선택하였을 경우 다시 그림;; + if(!procFilter(fo_obj, move_category)) { + var params = new Array(); + params["xml_file"] = xGetElementById('fo_category').xml_file.value; + params["source_category_srl"] = source_category_srl; + completeMoveCategory(params); + } +} + +function completeMoveCategory(ret_obj) { + var source_category_srl = ret_obj['source_category_srl']; + var xml_file = ret_obj['xml_file']; + + loadTreeMenu(xml_file, 'category', "zone_category", category_title, '', doGetCategoryInfo, source_category_srl, doMoveTree); +} + +/* 카테고리 목록 갱신 */ +function doReloadTreeCategory(module_srl) { + var params = new Array(); + params["module_srl"] = module_srl; + + // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. + var response_tags = new Array('error','message', 'xml_file'); + exec_xml('board', 'procBoardAdminMakeXmlFile', params, completeInsertCategory, response_tags, params); +} + +/* 카테고리 삭제 */ +function doDeleteCategory(category_srl) { + var fo_obj = xGetElementById("fo_category"); + if(!fo_obj) return; + + procFilter(fo_obj, delete_category); +} + +/* 카테고리 아이템 삭제 후 */ +function completeDeleteCategory(ret_obj) { + var module_srl = ret_obj['module_srl']; + var category_srl = ret_obj['category_srl']; + var xml_file = ret_obj['xml_file']; + alert(ret_obj['message']); + + loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '', doGetCategoryInfo, category_srl, doMoveTree); + + var obj = xGetElementById('category_info'); + xInnerHtml(obj, ""); + obj.style.display = 'none'; +} + diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index b58492750..e9c6bf4ca 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -97,7 +97,7 @@ if($oDocument->isLocked()) return new Object(-1,'msg_invalid_request'); if($obj->password) $obj->password = md5($obj->password); - if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; // 로그인 된 회원일 경우 회원의 정보를 입력 if(Context::get('is_logged')) { @@ -209,7 +209,7 @@ if(!$is_admin && !$source_obj->isGranted()) return new Object(-1, 'msg_not_permitted'); if($obj->password) $obj->password = md5($obj->password); - if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; // 로그인 되어 있고 작성자와 수정자가 동일하면 수정자의 정보를 세팅 if(Context::get('is_logged')) { @@ -338,7 +338,8 @@ $oDocumentModel = &getModel('document'); // 권한이 있는지 확인 - if(!$oDocumentModel->isGranted($document_srl)) return new Object(-1, 'msg_not_permitted'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists() || !$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted'); // 삭제 $args->document_srl = $document_srl; diff --git a/modules/comment/comment.item.php b/modules/comment/comment.item.php index 49b3da73a..fbca8d828 100644 --- a/modules/comment/comment.item.php +++ b/modules/comment/comment.item.php @@ -63,6 +63,10 @@ $this->is_granted = true; } + function setAccessible() { + $_SESSION['accessibled_comment'][$this->comment_srl] = true; + } + function isEditable() { if($this->isGranted() || !$this->get('member_srl')) return true; return false; @@ -73,12 +77,19 @@ } function isAccessible() { - if($this->isGranted()) return true; - if(!$this->isSecret()) return true; + if($_SESSION['accessibled_comment'][$this->comment_srl]) return true; + + if($this->isGranted() || !$this->isSecret()) { + $this->setAccessible(); + return true; + } $oDocumentModel = &getModel('document'); $oDocument = $oDocumentModel->getDocument($this->get('document_srl')); - if($oDocument->isGranted()) return true; + if($oDocument->isGranted()) { + $this->setAccessible(); + return true; + } return false; } @@ -123,7 +134,7 @@ $url = trim($this->get('homepage')); if(!$url) return; - if(!eregi("^http:\/\/",$url)) $url = "http://".$url; + if(!preg_match("/^http:\/\//i",$url)) $url = "http://".$url; return $url; } @@ -154,46 +165,52 @@ return htmlspecialchars($content); } - function getContent($add_comment_info = true) { + function getContent($add_popup_menu = true, $add_content_info = true) { if($this->isSecret() && !$this->isAccessible()) return Context::getLang('msg_is_secret'); $content = $this->get('content'); - // OL/LI 태그를 위한 치환 처리 - $content = preg_replace('!<(ol|ul|blockquote)>!is','<\\1 style="margin-left:40px;">',$content); - // url에 대해서 정규표현식으로 치환 $content = preg_replace('!([^>^"^\'^=])(http|https|ftp|mms):\/\/([^ ^<^"^\']*)!is','$1$2://$3',' '.$content); - // 추가 정보 출력을 하지 않는 경우 - if(!$add_comment_info) { + // 이 댓글을... 팝업메뉴를 출력할 경우 + if($add_popup_menu) { $content = sprintf( - '
    %s
    ', + '%s
    %s
    ', + $content, + $this->comment_srl, Context::getLang('cmd_comment_do') + ); + } + + // 컨텐츠에 대한 조작이 가능한 추가 정보를 설정하였을 경우 + if($add_content_info) { + $content = sprintf( + '
    %s
    ', $this->comment_srl, $this->get('member_srl'), $this->comment_srl, $this->get('member_srl'), $content, - $this->comment_srl, $this->get('member_srl'), $this->comment_srl, $this->get('member_srl') ); - // 추가 정보 출력을 하지 않는 경우 "이 댓글을.." 메뉴 추가 + // 컨텐츠에 대한 조작이 필요하지 않더라도 xe_content라는 클래스명을 꼭 부여 } else { - $content = sprintf( - '
    %s
    %s
    ', - $this->comment_srl, $this->get('member_srl'), - $this->comment_srl, $this->get('member_srl'), - $content, - $this->comment_srl, Context::getLang('cmd_comment_do'), - $this->comment_srl, $this->get('member_srl'), - $this->comment_srl, $this->get('member_srl') - ); + $content = sprintf('
    %s
    ', $content); } return $content; } function getSummary($str_size = 50) { - $content = htmlspecialchars(strip_tags(str_replace(" "," ",$this->getContent(false)))); - return cut_str($content, $str_size, '...'); + // 먼저 태그들을 제거함 + $content = preg_replace('!<([^>]*?)>!is','', $this->getContent(false,false)); + + // < , > , " 를 치환 + $content = str_replace(array('<','>','"',' '), array('<','>','"',' '), $content); + + // 문자열을 자름 + $content = cut_str($content, $str_size, '...'); + + // >, <, "를 다시 복구 + return str_replace(array('<','>','"',' '),array('<','>','"',' '), $content); } function getRegdate($format = 'Y.m.d H:i:s') { @@ -246,5 +263,50 @@ $file_list = $oFileModel->getFiles($this->comment_srl, $is_admin); return $file_list; } + + /** + * @brief 에디터 html을 구해서 return + **/ + function getEditor() { + $module_srl = $this->get('module_srl'); + if(!$module_srl) $module_srl = Context::get('module_srl'); + $oEditorModel = &getModel('editor'); + return $oEditorModel->getModuleEditor('comment', $module_srl, $this->comment_srl, 'comment_srl', 'content'); + } + + /** + * @brief 작성자의 프로필 이미지를 return + **/ + function getProfileImage() { + if(!$this->isExists() || !$this->get('member_srl')) return; + $oMemberModel = &getModel('member'); + $profile_info = $oMemberModel->getProfileImage($this->get('member_srl')); + if(!$profile_info) return; + + return $profile_info->src; + } + + /** + * @brief 작성자의 서명을 return + **/ + function getSignature() { + // 존재하지 않는 글이면 패스~ + if(!$this->isExists() || !$this->get('member_srl')) return; + + // 서명정보를 구함 + $oMemberModel = &getModel('member'); + $signature = $oMemberModel->getSignature($this->get('member_srl')); + + // 회원모듈에서 서명 최고 높이 지정되었는지 검사 + if(!isset($GLOBALS['__member_signature_max_height'])) { + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + $GLOBALS['__member_signature_max_height'] = $member_config->signature_max_height; + } + $max_signature_height = $GLOBALS['__member_signature_max_height']; + if($max_signature_height) $signature = sprintf('
    %s
    ',$max_signature_height, $signature); + + return $signature; + } } ?> diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index 6826ff30d..c831920e4 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -183,7 +183,7 @@ $member_srl = $source_list[$i]->member_srl; // OL/LI 태그를 위한 치환 처리 - $source_list[$i]->content = preg_replace('!<(ol|ul|blockquote)>!is','<\\1 style="margin-left:40px;">',$source_list[$i]->content); + //$source_list[$i]->content = preg_replace('!<(ol|ul|blockquote)>!is','<\\1 style="margin-left:40px;">',$source_list[$i]->content); // url에 대해서 정규표현식으로 치환 $source_list[$i]->content = preg_replace('!([^>^"^\'^=])(http|https|ftp|mms):\/\/([^ ^<^"^\']*)!is','$1$2://$3',' '.$source_list[$i]->content); @@ -208,7 +208,7 @@ /** * @brief 댓글을 계층형으로 재배치 **/ - function _arrangeComment(&$comment_list, $list, $depth) { + function _arrangeComment(&$comment_list, $list, $depth, $set_grant = false) { if(!count($list)) return; foreach($list as $key => $val) { $oCommentItem = new commentItem(); @@ -219,13 +219,17 @@ $oCommentItem->setAttribute($tmp); $comment_list[$tmp->comment_srl] = $oCommentItem; - $this->_arrangeComment($comment_list,$val->child,$depth+1); + if($set_grant) $oCommentItem->setAccessible(); + + $this->_arrangeComment($comment_list,$val->child,$depth+1, $oCommentItem->isGranted()); } else { $val->depth = $depth; $oCommentItem->setAttribute($val); + if($set_grant) $oCommentItem->setAccessible(); $comment_list[$val->comment_srl] = $oCommentItem; } + } } diff --git a/modules/comment/lang/es.lang.php b/modules/comment/lang/es.lang.php index 9fbbe25af..95b01c425 100644 --- a/modules/comment/lang/es.lang.php +++ b/modules/comment/lang/es.lang.php @@ -5,9 +5,9 @@ * @sumario Paquete del idioma español para el módulo de comentarios. **/ - $lang->cmd_comment_do = '이 댓글을..'; + $lang->cmd_comment_do = 'Usted ...'; - $lang->comment_list = '댓글 목록'; + $lang->comment_list = 'Comentarios Lista'; $lang->cmd_delete_checked_comment = 'Eliminar lo seleccionado' ; $lang->msg_cart_is_null = 'Selecciona el commentario que desea eliminar'; diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 5e0a5125d..56c93d851 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -89,6 +89,10 @@ } } + // 스팸 처리가 되지 않도록 스팸필터 설정 + $oSpamController = &getController('spamfilter'); + $oSpamController->setAvoidLog(); + if($type == 'move') { if(!$module_srl) return new Object(-1, 'fail_to_move'); @@ -142,13 +146,44 @@ $source_category_srl = $oDocument->get('category_srl'); - unset($document_args); - $document_args->module_srl = $module_srl; - $document_args->category_srl = $category_srl; - $document_args->document_srl = $document_srl; + unset($obj); + $obj = $oDocument->getObjectVars(); + + // 첨부파일 이동 + if($oDocument->hasUploadedFiles()) { + $oFileController = &getController('file'); + + $files = $oDocument->getUploadedFiles(); + foreach($files as $key => $val) { + $file_info = array(); + $file_info['tmp_name'] = $val->uploaded_filename; + $file_info['name'] = $val->source_filename; + $inserted_file = $oFileController->insertFile($file_info, $module_srl, $obj->document_srl, $val->download_count, true); + + // 이미지/동영상등일 경우 + if($val->direct_download == 'Y') { + $source_filename = substr($val->uploaded_filename,2); + $target_filename = substr($inserted_file->get('uploaded_filename'),2); + $obj->content = str_replace($source_filename, $target_filename, $obj->content); + + // binary 파일일 경우 + } else { + $obj->content = str_replace('file_srl='.$val->file_srl, 'file_srl='.$inserted_file->get('file_srl'), $obj->content); + $obj->content = str_replace('sid='.$val->sid, 'sid='.$inserted_file->get('sid'), $obj->content); + } + + // 기존 파일 삭제 + $oFileController->deleteFile($val->file_srl); + } + + // 등록된 모든 파일을 유효로 변경 + $oFileController->setFilesValid($obj->document_srl); + } // 게시물의 모듈 이동 - $output = executeQuery('document.updateDocumentModule', $document_args); + $obj->module_srl = $module_srl; + $obj->category_srl = $category_srl; + $output = executeQuery('document.updateDocumentModule', $obj); if(!$output->toBool()) { $oDB->rollback(); return $output; @@ -159,6 +194,7 @@ if($source_category_srl) $oDocumentController->updateCategoryCount($oDocument->get('module_srl'), $source_category_srl); if($category_srl) $oDocumentController->updateCategoryCount($module_srl, $category_srl); } + } $args->document_srls = implode(',',$document_srl_list); @@ -198,6 +234,8 @@ $oDocumentModel = &getModel('document'); $oDocumentController = &getController('document'); + $oFileModel = &getModel('file'); + $oDB = &DB::getInstance(); $oDB->begin(); @@ -223,7 +261,19 @@ $file_info['tmp_name'] = $val->uploaded_filename; $file_info['name'] = $val->source_filename; $oFileController = &getController('file'); - $oFileController->insertFile($file_info, $module_srl, $obj->document_srl, 0, true); + $inserted_file = $oFileController->insertFile($file_info, $module_srl, $obj->document_srl, 0, true); + + // 이미지/동영상등일 경우 + if($val->direct_download == 'Y') { + $source_filename = substr($val->uploaded_filename,2); + $target_filename = substr($inserted_file->get('uploaded_filename'),2); + $obj->content = str_replace($source_filename, $target_filename, $obj->content); + + // binary 파일일 경우 + } else { + $obj->content = str_replace('file_srl='.$val->file_srl, 'file_srl='.$inserted_file->get('file_srl'), $obj->content); + $obj->content = str_replace('sid='.$val->sid, 'sid='.$inserted_file->get('sid'), $obj->content); + } } } @@ -233,6 +283,52 @@ $oDB->rollback(); return $output; } + + // 댓글 이전 + if($oDocument->getCommentCount()) { + $oCommentModel = &getModel('comment'); + $comments = $oCommentModel->getCommentList($document_srl, true); + if(count($comments)) { + $oCommentController = &getController('comment'); + $success_count = 0; + $p_comment_srl = array(); + foreach($comments as $comment_obj) { + $comment_srl = getNextSequence(); + $p_comment_srl[$comment_obj->comment_srl] = $comment_srl; + + $comment_obj->module_srl = $obj->module_srl; + $comment_obj->document_srl = $obj->document_srl; + $comment_obj->comment_srl = $comment_srl; + + if($comment_obj->parent_srl) $comment_obj->parent_srl = $p_comment_srl[$comment_obj->parent_srl]; + + $output = $oCommentController->insertComment($comment_obj, true); + if($output->toBool()) $success_count ++; + } + $oDocumentController->updateCommentCount($obj->document_srl, $success_count, $comment_obj->nick_name, true); + + } + + } + + // 엮인글 이전 + if($oDocument->getTrackbackCount()) { + $oTrackbackModel = &getModel('trackback'); + $trackbacks = $oTrackbackModel->getTrackbackList($oDocument->document_srl); + if(count($trackbacks)) { + $success_count = 0; + foreach($trackbacks as $trackback_obj) { + $trackback_obj->trackback_srl = getNextSequence(); + $trackback_obj->module_srl = $obj->module_srl; + $trackback_obj->document_srl = $obj->document_srl; + $output = executeQuery('trackback.insertTrackback', $trackback_obj); + if($output->toBool()) $success_count++; + } + + // 엮인글 수 업데이트 + $oDocumentController->updateTrackbackCount($obj->document_srl, $success_count); + } + } } $oDB->commit(); @@ -292,7 +388,7 @@ if (is_dir($path."/".$entry)) { $this->deleteThumbnailFile($path."/".$entry); } else { - if(!eregi('^thumbnail_([^\.]*)\.jpg$',$entry)) continue; + if(!preg_match('/^thumbnail_([^\.]*)\.jpg$/i',$entry)) continue; @unlink($path.'/'.$entry); } } diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php index 976fa0fca..94d413331 100644 --- a/modules/document/document.admin.view.php +++ b/modules/document/document.admin.view.php @@ -111,11 +111,35 @@ } // 모듈의 목록을 가져옴 - //$args->select_module = "'board','blog'"; - $output = executeQuery('document.getAllModules', $args); - $module_list = $output->data; + $oModuleModel = &getModel('module'); + $module_list = ($oModuleModel->getMidList()); - if($module_list && !is_array($module_list)) $module_list = array($module_list); + // 최고 관리자가 아닌 경우 자신의 관리 대상 모듈만 구해옴 + $logged_info = Context::get('logged_info'); + $user_id = $logged_info->user_id; + $group_list = $logged_info->group_list; + + if($logged_info->is_admin != 'Y') { + foreach($module_list as $key => $val) { + $info = $oModuleModel->arrangeModuleInfo($val); + + // 직접 최고 관리자로 지정이 안되어 있으면 그룹을 체크 + if(!in_array($user_id, $info->admin_id)) { + + $is_granted = false; + $manager_group = $info->grants['manager']; + if(count($group_list) && count($manager_group)) { + foreach($group_list as $group_srl => $group_info) { + if(in_array($group_srl, $manager_group)) { + $is_granted = true; + break; + } + } + } + if(!$is_granted) unset($module_list[$key]); + } + } + } Context::set('module_list', $module_list); // 팝업 레이아웃 선택 diff --git a/modules/document/document.class.php b/modules/document/document.class.php index bfdf55fb8..548badba3 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -30,6 +30,7 @@ $oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); $oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); $oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); + $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 $oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); @@ -83,6 +84,9 @@ // 2007. 11. 20 게시글에 module_srl + is_notice 복합인덱스 만들기 if(!$oDB->isIndexExists("documents","idx_module_notice")) return true; + + // 2008. 02. 18 게시글에 module_srl + document_srl 복합인덱스 만들기 (manian님 확인) + if(!$oDB->isIndexExists("documents","idx_module_document_srl")) return true; /** * 2007. 12. 03 : 확장변수(extra_vars) 컬럼이 없을 경우 추가 @@ -168,6 +172,11 @@ **/ if(!$oDB->isColumnExists("documents","extra_vars")) $oDB->addColumn('documents','extra_vars','text'); + /** + * 2008. 02. 18 게시글에 module_srl + document_srl 복합인덱스 만들기 (manian님 확인) + **/ + if(!$oDB->isIndexExists("documents","idx_module_document_srl")) $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); + return new Object(0,'success_updated'); } @@ -175,6 +184,75 @@ * @brief 캐시 파일 재생성 **/ function recompileCache() { + // 게시글 분류 캐시 파일 삭제 + FileHandler::removeFilesInDir("./files/cache/document_category"); + } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + // 게시글 목록에서 글을 체크하는 경우 해당 글의 모듈 정보를 구해서 관리자 여부를 체크 + case 'procDocumentAdminAddCart' : + if(!$args->srl) return false; + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByDocumentSrl($args->srl); + if(!$module_info) return false; + + if($oModuleModel->isModuleAdmin($module_info, $logged_info)) return true; + break; + + // 체크된 게시글을 관리하는 action + case 'dispDocumentAdminManageDocument' : + // 세션 정보에 게시글이 담겨 있으면 return true 해줌 + $flag_list = $_SESSION['document_management']; + if(count($flag_list)) return true; + break; + + // 체크된 게시글을 다른 모듈로 이동 또는 복사, 삭제 할때 + case 'procDocumentAdminManageCheckedDocument' : + switch($args->type) { + // 이동과 복사의 경우에는 대상 모듈의 정보를 체크 + case 'move' : + case 'copy' : + if($args->target_module) { + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->target_module); + if(!$module_info) return false; + + if($oModuleModel->isModuleAdmin($module_info, $logged_info)) return true; + } + break; + + + // 삭제일 경우는 세션에 저장된 글이 있으면 return true + case 'delete' : + $flag_list = $_SESSION['document_management']; + if(count($flag_list)) return true; + break; + } + break; + + } + return false; } } ?> diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 007dfb120..b28c6d20e 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -90,7 +90,7 @@ if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; - if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; if($obj->notify_message != 'Y') $obj->notify_message = 'N'; // $extra_vars를 serialize @@ -182,7 +182,7 @@ if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; - if($obj->homepage && !eregi('^http:\/\/',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; if($obj->notify_message != 'Y') $obj->notify_message = 'N'; // $extra_vars를 serialize @@ -324,6 +324,9 @@ $member_srl = $oDocument->get('member_srl'); $logged_info = Context::get('logged_info'); + // 조회수 업데이트가 되면 trigger 호출 (after) + $output = ModuleHandler::triggerCall('document.updateReadedCount', 'after', $oDocument); + if(!$output->toBool()) return $output; // session에 정보로 조회수를 증가하였다고 생각하면 패스 if($_SESSION['readed_document'][$document_srl]) return false; @@ -333,36 +336,18 @@ return false; } - // document의 작성자가 회원일때 조사 - if($member_srl) { - - // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 - if($member_srl && $logged_info->member_srl == $member_srl) { - $_SESSION['readed_document'][$document_srl] = true; - return false; - } + // document의 작성자가 회원일때 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 판단후 세션 등록하고 패스 + if($member_srl && $logged_info->member_srl == $member_srl) { + $_SESSION['readed_document'][$document_srl] = true; + return false; } - // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 - if($logged_info->member_srl) { - $args->member_srl = $logged_info->member_srl; - } else { - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - $args->document_srl = $document_srl; - $output = executeQuery('document.getDocumentReadedLogInfo', $args); - - // 로그 정보에 조회 로그가 있으면 세션 등록후 패스 - if($output->data->count) return $_SESSION['readed_document'][$document_srl] = true; - // 조회수 업데이트 + $args->document_srl = $document_srl; $output = executeQuery('document.updateReadedCount', $args); - // 로그 남기기 - $output = executeQuery('document.insertDocumentReadedLog', $args); - - // 세션 정보에 남김 - return $_SESSION['readed_document'][$document_srl] = true; + // 세션 등록 + $_SESSION['readed_document'][$document_srl] = true; } /** @@ -518,14 +503,36 @@ * @brief 카테고리 추가 **/ function insertCategory($obj) { - $obj->list_order = $obj->category_srl = getNextSequence(); + // 특정 카테고리의 하단으로 추가시 정렬순서 재정렬 + if($obj->parent_srl) { + // 부모 카테고리 구함 + $oDocumentModel = &getModel('document'); + $parent_category = $oDocumentModel->getCategory($obj->parent_srl); + $obj->list_order = $parent_category->list_order; + $this->updateCategoryListOrder($parent_category->module_srl, $parent_category->list_order+1); + if(!$obj->category_srl) $obj->category_srl = getNextSequence(); + } else { + $obj->list_order = $obj->category_srl = getNextSequence(); + } $output = executeQuery('document.insertCategory', $obj); - if($output->toBool()) $output->add('category_srl', $obj->category_srl); + if($output->toBool()) { + $output->add('category_srl', $obj->category_srl); + $this->makeCategoryFile($obj->module_srl); + } return $output; } + /** + * @brief 특정 카테고리 부터 list_count 증가 + **/ + function updateCategoryListOrder($module_srl, $list_order) { + $args->module_srl = $module_srl; + $args->list_order = $list_order; + return executeQuery('document.updateCategoryOrder', $args); + } + /** * @brief 카테고리에 문서의 숫자를 변경 **/ @@ -537,7 +544,7 @@ $args->category_srl = $category_srl; $args->document_count = $document_count; $output = executeQuery('document.updateCategoryCount', $args); - if($output->toBool()) $this->makeCategoryXmlFile($module_srl); + if($output->toBool()) $this->makeCategoryFile($module_srl); return $output; } @@ -546,7 +553,9 @@ * @brief 카테고리의 정보를 수정 **/ function updateCategory($obj) { - return executeQuery('document.updateCategory', $obj); + $output = executeQuery('document.updateCategory', $obj); + if($output->toBool()) $this->makeCategoryFile($obj->module_srl); + return $output; } /** @@ -555,17 +564,27 @@ **/ function deleteCategory($category_srl) { $args->category_srl = $category_srl; + $oDocumentModel = &getModel('document'); + $category_info = $oDocumentModel->getCategory($category_srl); + + // 자식 카테고리가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 + $output = executeQuery('document.getChildCategoryCount', $args); + if(!$output->toBool()) return $output; + if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child'); // 카테고리 정보를 삭제 $output = executeQuery('document.deleteCategory', $args); if(!$output->toBool()) return $output; + $this->makeCategoryFile($category_info->module_srl); + // 현 카테고리 값을 가지는 문서들의 category_srl을 0 으로 세팅 unset($args); $args->target_category_srl = 0; $args->source_category_srl = $category_srl; $output = executeQuery('document.updateDocumentCategory', $args); + return $output; } @@ -688,11 +707,11 @@ } /** - * @brief 카테고리를 xml파일로 저장 + * @brief 카테고리를 캐시 파일로 저장 **/ - function makeCategoryXmlFile($module_srl) { - // xml파일 생성시 필요한 정보가 없으면 그냥 return - if(!$module_srl) return; + function makeCategoryFile($module_srl) { + // 캐시 파일 생성시 필요한 정보가 없으면 그냥 return + if(!$module_srl) return false; // 모듈 정보를 가져옴 (mid를 구하기 위해) $oModuleModel = &getModel('module'); @@ -703,15 +722,30 @@ // 캐시 파일의 이름을 지정 $xml_file = sprintf("./files/cache/document_category/%s.xml.php", $module_srl); + $php_file = sprintf("./files/cache/document_category/%s.php", $module_srl); - // DB에서 module_srl 에 해당하는 카테고리 목록을 listorder순으로 구해옴 - $oDocumentModel = &getModel('document'); - $list = $oDocumentModel->getCategoryList($module_srl); + // 카테고리 목록을 구함 + $args->module_srl = $module_srl; + $args->sort_index = 'list_order'; + $output = executeQuery('document.getCategoryList', $args); + + $category_list = $output->data; + + if(!$category_list) return false; + if(!is_array($category_list)) $category_list = array($category_list); + + $category_count = count($category_list); + for($i=0;$i<$category_count;$i++) { + $category_srl = $category_list[$i]->category_srl; + if(!preg_match('/^[0-9,]+$/', $category_list[$i]->group_srls)) $category_list[$i]->group_srls = ''; + $list[$category_srl] = $category_list[$i]; + } // 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성 if(!$list) { $xml_buff = ""; FileHandler::writeFile($xml_file, $xml_buff); + FileHandler::writeFile($php_file, ''); return $xml_file; } @@ -739,8 +773,13 @@ // xml 캐시 파일 생성 $xml_buff = sprintf('%s', $php_script, $this->getXmlTree($tree[0], $tree)); + // php 캐시 파일 생성 + $php_output = $this->getPhpCacheCode($tree[0], $tree, 0); + $php_buff = sprintf('list = array(%s); ?>', $php_output['category_title_str'], $php_output['buff']); + // 파일 저장 FileHandler::writeFile($xml_file, $xml_buff); + FileHandler::writeFile($php_file, $php_buff); return $xml_file; } @@ -762,13 +801,18 @@ $title = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->title); $expand = $node->expand; $group_srls = $node->group_srls; + $mid = $node->mid; + $module_srl = $node->module_srl; // node->group_srls값이 있으면 if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); else $group_check_code = "true"; $attribute = sprintf( - 'node_srl="%s" text="" url="%s" expand="%s" document_count="%d" ', + 'mid="%s" module_srl="%d" node_srl="%d" category_srl = "%d" text="" url="%s" expand="%s" document_count="%d" ', + $mid, + $module_srl, + $category_srl, $category_srl, $group_check_code, $title, @@ -782,5 +826,62 @@ } return $buff; } + + /** + * @brief array로 정렬된 노드들을 php code로 변경하여 return + * 메뉴에서 메뉴를 tpl에 사용시 xml데이터를 사용할 수도 있지만 별도의 javascript 사용이 필요하기에 + * php로 된 캐시파일을 만들어서 db이용없이 바로 메뉴 정보를 구할 수 있도록 한다 + * 이 캐시는 ModuleHandler::displayContent() 에서 include하여 Context::set() 한다 + **/ + function getPhpCacheCode($source_node, $tree) { + $output = array("buff"=>"", "category_srl_list"=>array()); + if(!$source_node) return $output; + + // 루프를 돌면서 1차 배열로 정리하고 include할 수 있는 php script 코드를 생성 + foreach($source_node as $category_srl => $node) { + + // 자식 노드가 있으면 자식 노드의 데이터를 먼저 얻어옴 + if($category_srl&&$tree[$category_srl]) $child_output = $this->getPhpCacheCode($tree[$category_srl], $tree); + else $child_output = array("buff"=>"", "category_srl_list"=>array()); + + // 변수 정리 + $category_title_str = sprintf('$_category_title[%d] = "%s"; %s', $node->category_srl, $node->title, $child_output['category_title_str']); + + // 현재 노드의 url값이 공란이 아니라면 category_srl_list 배열값에 입력 + $child_output['category_srl_list'][] = $node->category_srl; + $output['category_srl_list'] = array_merge($output['category_srl_list'], $child_output['category_srl_list']); + + // node->group_srls값이 있으면 + if($node->group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls); + else $group_check_code = "true"; + + // 변수 정리 + $selected = '"'.implode('","',$child_output['category_srl_list']).'"'; + $child_buff = $child_output['buff']; + $expand = $node->expand; + + // 속성을 생성한다 ( category_srl_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) + $attribute = sprintf( + '"mid" => "%s", "module_srl" => "%d","node_srl"=>"%s","category_srl"=>"%s","parent_srl"=>"%s","text"=>$_category_title[%d],"selected"=>(in_array(Context::get("category"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s),"document_count"=>"%d","grant"=>%s?true:false', + $node->mid, + $node->module_srl, + $node->category_srl, + $node->category_srl, + $node->parent_srl, + $node->category_srl, + $selected, + $expand, + $child_buff, + $node->document_count, + $group_check_code + ); + + // buff 데이터를 생성한다 + $output['buff'] .= sprintf('%s=>array(%s),', $node->category_srl, $attribute); + $output['category_title_str'] .= $category_title_str; + } + return $output; + } + } ?> diff --git a/modules/document/document.item.php b/modules/document/document.item.php index 186f0386e..ae8098e9a 100644 --- a/modules/document/document.item.php +++ b/modules/document/document.item.php @@ -9,6 +9,8 @@ var $document_srl = 0; + var $allow_trackback_status = null; + function documentItem($document_srl = 0) { $this->document_srl = $document_srl; $this->_loadFromDB(); @@ -72,13 +74,39 @@ } function allowComment() { - return $this->get('allow_comment') == 'Y' || !$this->isExists() ? true : false; + if(!$this->isExists()) return true; + + return $this->get('allow_comment') == 'Y' ? true : false; } function allowTrackback() { - return $this->get('allow_trackback') == 'Y' || !$this->isExists() ? true : false; + if(!$this->isExists()) return false; + + // allowTrackback()의 경우 여러번 호출됨으로 자체 변수 설정후 사용 + if(!isset($this->allow_trackback_status)) { + + // 글쓴이가 허용하였으면 사용으로 체크 + if($this->get('allow_trackback')=='Y') $this->allow_trackback_status = true; + + // 글쓴이가 허용하였더라도 모듈 설정에서 허용이 아니라면 금지로 설정 + if($this->allow_trackback_status) { + $oModuleModel = &getModel('module'); + $trackback_config = $oModuleModel->getModuleConfig('trackback'); + + // 전체 설정에서 엮인글 사용금지이면 모든 엮인글의 사용을 금지함 + if($trackback_config->enable_trackback != 'Y') $this->allow_trackback_status = false; + + // 전체 설정에서 허용시 모듈별 설정을 체크 + else { + $module_config = $trackback_config->module_config[$this->get('module_srl')]; + if(!$module_config || $module_config->enable_trackback != 'Y') $this->allow_trackback_status = false; + } + } + } + + return $this->allow_trackback_status; } - + function isLocked() { return $this->get('lock_comment') == 'Y' ? true : false; } @@ -152,7 +180,7 @@ $url = trim($this->get('homepage')); if(!$url) return; - if(!eregi("^http:\/\/",$url)) $url = "http://".$url; + if(!preg_match("/^http:\/\//i",$url)) $url = "http://".$url; return $url; } @@ -209,7 +237,7 @@ return htmlspecialchars($content); } - function getContent($add_document_info = true) { + function getContent($add_popup_menu = true, $add_content_info = true) { if(!$this->document_srl) return; if($this->isSecret() && !$this->isGranted()) return Context::getLang('msg_is_secret'); @@ -218,43 +246,48 @@ $content = $this->get('content'); - - // OL/LI 태그를 위한 치환 처리 - $content = preg_replace('!<(ol|ul|blockquote)>!is','<\\1 style="margin-left:40px;">',$content); - // url에 대해서 정규표현식으로 치환 $content = preg_replace('!([^>^"^\'^=])(http|https|ftp|mms):\/\/([^ ^<^"^\']*)!is','$1$2://$3',' '.$content); - // 추가 정보 출력을 하지 않는 경우 - if(!$add_document_info) { + // 이 게시글을... 팝업메뉴를 출력할 경우 + if($add_popup_menu) { $content = sprintf( - '
    %s
    ', - $this->document_srl, $this->get('member_srl'), - $this->document_srl, $this->get('member_srl'), + '%s
    %s
    ', $content, - $this->document_srl, $this->get('member_srl'), - $this->document_srl, $this->get('member_srl') - ); - // 추가 정보를 출력시 "이 게시물을..'이라는 메뉴 추가 - } else { - $content = sprintf( - '
    %s
    %s
    ', - $this->document_srl, $this->get('member_srl'), - $this->document_srl, $this->get('member_srl'), - $content, - $this->document_srl, Context::getLang('cmd_document_do'), - $this->document_srl, $this->get('member_srl'), - $this->document_srl, $this->get('member_srl') + $this->document_srl, Context::getLang('cmd_document_do') ); } + + // 컨텐츠에 대한 조작이 가능한 추가 정보를 설정하였을 경우 + if($add_content_info) { + $content = sprintf( + '
    %s
    ', + $this->document_srl, $this->get('member_srl'), + $this->document_srl, $this->get('member_srl'), + $content, + $this->document_srl, $this->get('member_srl'), + $this->document_srl, $this->get('member_srl') + ); + // 컨텐츠에 대한 조작이 필요하지 않더라도 xe_content라는 클래스명을 꼭 부여 + } else { + $content = sprintf('
    %s
    ', $content); + } + return $content; } function getSummary($str_size = 50) { - if(!$this->document_srl) return; + // 먼저 태그들을 제거함 + $content = preg_replace('!<([^>]*?)>!is','', $this->getContent(false,false)); - $content = htmlspecialchars(strip_tags(str_replace(" "," ",$this->getContent(false)))); - return cut_str($content, $str_size, '...'); + // < , > , " 를 치환 + $content = str_replace(array('<','>','"',' '), array('<','>','"',' '), $content); + + // 문자열을 자름 + $content = cut_str($content, $str_size, '...'); + + // >, <, "를 다시 복구 + return str_replace(array('<','>','"',' '),array('<','>','"',' '), $content); } function getRegdate($format = 'Y.m.d H:i:s') { @@ -335,12 +368,11 @@ } function getCommentCount() { - if(!$this->isGranted() && $this->isSecret()) return 0; return $this->get('comment_count'); } function getComments() { - if(!$this->allowComment() || !$this->get('comment_count')) return; + if(!$this->allowComment() || !$this->getCommentCount()) return; if(!$this->isGranted() && $this->isSecret()) return; $oCommentModel = &getModel('comment'); @@ -412,7 +444,7 @@ if(count($file_list)) { foreach($file_list as $file) { if($file->direct_download!='Y') continue; - if(!eregi("(jpg|png|jpeg|gif)$",$file->source_filename)) continue; + if(!preg_match("/(jpg|png|jpeg|gif)$/i",$file->source_filename)) continue; $filename = $file->uploaded_filename; if(!file_exists($filename)) continue; @@ -429,7 +461,7 @@ preg_match_all("!http:\/\/([^ ^\"^']*?)\.(jpg|png|gif|jpeg)!is", $content, $matches, PREG_SET_ORDER); for($i=0;$igetFiles($this->document_srl, $is_admin); return $file_list; } + + /** + * @brief 에디터 html을 구해서 return + **/ + function getEditor() { + $module_srl = $this->get('module_srl'); + if(!$module_srl) $module_srl = Context::get('module_srl'); + + $oEditorModel = &getModel('editor'); + return $oEditorModel->getModuleEditor('document', $module_srl, $this->document_srl, 'document_srl', 'content'); + } + + /** + * @brief 댓글을 달 수 있는지에 대한 권한 체크 + * 게시글의 댓글 권한과 또 다른 부분 + **/ + function isEnableComment() { + // 권한이 없고 비밀글 or 댓글금지 or 댓글허용금지이면 return false + if(!$this->isGranted() && ( $this->isSecret() || $this->isLocked() || !$this->allowComment() ) ) return false; + + return true; + } + + /** + * @brief 댓글 에디터 html을 구해서 return + **/ + function getCommentEditor() { + if(!$this->isEnableComment()) return; + + $oEditorModel = &getModel('editor'); + return $oEditorModel->getModuleEditor('comment', $this->get('module_srl'), $comment_srl, 'comment_srl', 'content'); + } + + /** + * @brief 작성자의 프로필 이미지를 return + **/ + function getProfileImage() { + if(!$this->isExists() || !$this->get('member_srl')) return; + $oMemberModel = &getModel('member'); + $profile_info = $oMemberModel->getProfileImage($this->get('member_srl')); + if(!$profile_info) return; + + return $profile_info->src; + } + + /** + * @brief 작성자의 서명을 return + **/ + function getSignature() { + // 존재하지 않는 글이면 패스~ + if(!$this->isExists() || !$this->get('member_srl')) return; + + // 서명정보를 구함 + $oMemberModel = &getModel('member'); + $signature = $oMemberModel->getSignature($this->get('member_srl')); + + // 회원모듈에서 서명 최고 높이 지정되었는지 검사 + if(!isset($GLOBALS['__member_signature_max_height'])) { + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + $GLOBALS['__member_signature_max_height'] = $member_config->signature_max_height; + } + if($signature) { + $max_signature_height = $GLOBALS['__member_signature_max_height']; + if($max_signature_height) $signature = sprintf('
    %s
    ',$max_signature_height, $signature); + } + + return $signature; + } } ?> diff --git a/modules/document/document.model.php b/modules/document/document.model.php index ddb7a4b7c..6a255c3df 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -24,10 +24,15 @@ * @brief 문서 가져오기 **/ function getDocument($document_srl=0, $is_admin = false) { - $oDocument = new documentItem($document_srl); - if($is_admin) $oDocument->setGrant(); + if(!$document_srl) return new documentItem(); - return $oDocument; + if(!$GLOBALS['__DocumentItem__'][$document_srl]) { + $oDocument = new documentItem($document_srl); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['__DocumentItem__'][$document_srl] = $oDocument; + } + + return $GLOBALS['__DocumentItem__'][$document_srl]; } /** @@ -116,7 +121,7 @@ **/ function getDocumentList($obj, $except_notice = false) { // 정렬 대상과 순서 체크 - if(!in_array($obj->sort_index, array('list_order','regdate','last_update','update_order','readed_count','voted_count'))) $obj->sort_index = 'list_order'; + if(!in_array($obj->sort_index, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count'))) $obj->sort_index = 'list_order'; if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 @@ -139,6 +144,15 @@ $args->page_count = $obj->page_count?$obj->page_count:10; $args->start_date = $obj->start_date?$obj->start_date:null; $args->end_date = $obj->end_date?$obj->end_date:null; + $args->member_srl = $obj->member_srl; + + // 카테고리가 선택되어 있으면 하부 카테고리까지 모두 조건에 추가 + if($args->category_srl) { + $category_list = $this->getCategoryList($args->module_srl); + $category_info = $category_list[$args->category_srl]; + $category_info->childs[] = $args->category_srl; + $args->category_srl = implode(',',$category_info->childs); + } // 기본으로 사용할 query id 지정 (몇가지 검색 옵션에 따라 query id가 변경됨) $query_id = 'document.getDocumentList'; @@ -152,13 +166,9 @@ if($search_target && $search_keyword) { switch($search_target) { case 'title' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_title = $search_keyword; - $use_division = true; - break; case 'content' : if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_content = $search_keyword; + $args->{"s_".$search_target} = $search_keyword; $use_division = true; break; case 'title_content' : @@ -172,60 +182,30 @@ $args->s_user_id = $search_keyword; $args->sort_index = 'documents.'.$args->sort_index; break; - case 'member_srl' : - $args->s_member_srl = (int)$search_keyword; - break; case 'user_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_name = $search_keyword; - break; case 'nick_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_nick_name = $search_keyword; - break; case 'email_address' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_email_address = $search_keyword; - break; case 'homepage' : if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_homepage = $search_keyword; + $args->{"s_".$search_target} = $search_keyword; break; case 'is_notice' : - if($search_keyword=='Y') $args->s_is_notice = 'Y'; - else $args->s_is_notice = ''; - break; case 'is_secret' : - if($search_keyword=='Y') $args->s_is_secret = 'Y'; - else $args->s_is_secret = ''; - break; - case 'tag' : - $args->s_tags = str_replace(' ','%',$search_keyword); - $query_id = 'document.getDocumentListWithinTag'; + if($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; + else $args->{"s_".$search_target} = ''; break; + case 'member_srl' : case 'readed_count' : - $args->s_readed_count = (int)$search_keyword; - break; case 'voted_count' : - $args->s_voted_count = (int)$search_keyword; - break; case 'comment_count' : - $args->s_comment_count = (int)$search_keyword; - break; case 'trackback_count' : - $args->s_trackback_count = (int)$search_keyword; - break; case 'uploaded_count' : - $args->s_uploaded_count = (int)$search_keyword; + $args->{"s_".$search_target} = (int)$search_keyword; break; case 'regdate' : - $args->s_regdate = $search_keyword; - break; case 'last_update' : - $args->s_last_upate = $search_keyword; - break; case 'ipaddress' : - $args->s_ipaddress= $search_keyword; + $args->{"s_".$search_target} = $search_keyword; break; case 'comment' : $args->s_comment = $search_keyword; @@ -233,6 +213,10 @@ $query_id = 'document.getDocumentListWithinComment'; $use_division = true; break; + case 'tag' : + $args->s_tags = str_replace(' ','%',$search_keyword); + $query_id = 'document.getDocumentListWithinTag'; + break; default : preg_match('/^extra_vars([0-9]+)$/',$search_target,$matches); if($matches[1]) { @@ -243,6 +227,11 @@ } } + /** + * division은 list_order의 asc 정렬일때만 사용할 수 있음 + **/ + if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; + /** * 만약 use_division이 true일 경우 document division을 이용하도록 변경 **/ @@ -407,7 +396,7 @@ if($node->group_srls) { $group_srls = explode(',',$node->group_srls); unset($node->group_srls); - $node->group_srls = explode(',',$node->group_srls); + $node->group_srls = $group_srls; } else { unset($node->group_srls); $node->group_srls = array(); @@ -426,23 +415,84 @@ /** * @brief 특정 모듈의 카테고리 목록을 가져옴 + * 속도나 여러가지 상황을 고려해서 카테고리 목록은 php로 생성된 script를 include하여 사용하는 것을 원칙으로 함 **/ function getCategoryList($module_srl) { - $args->module_srl = $module_srl; - $args->sort_index = 'list_order'; - $output = executeQuery('document.getCategoryList', $args); + // 한 페이지에서 여러번 호출될 경우를 대비해서 static var로 보관 (php4때문에 다른 방법으로 구현) + if(!isset($this->category_list[$module_srl])) { - $category_list = $output->data; + // 대상 모듈의 카테고리 파일을 불러옴 + $filename = sprintf("./files/cache/document_category/%s.php", $module_srl); - if(!$category_list) return NULL; - if(!is_array($category_list)) $category_list = array($category_list); + // 대상 파일이 없으면 카테고리 캐시 파일을 재생성 + if(!file_exists($filename)) { + $oDocumentController = &getController('document'); + if(!$oDocumentController->makeCategoryFile($module_srl)) return array(); + } - $category_count = count($category_list); - for($i=0;$i<$category_count;$i++) { - $category_srl = $category_list[$i]->category_srl; - $list[$category_srl] = $category_list[$i]; + @include($filename); + + // 카테고리의 정리 + $document_category = array(); + $this->_arrangeCategory($document_category, $menu->list, 0); + $this->category_list[$module_srl] = $document_category; } - return $list; + + return $this->category_list[$module_srl]; + } + + /** + * @brief 카테고리를 1차 배열 형식으로 변경하는 내부 method + **/ + function _arrangeCategory(&$document_category, $list, $depth) { + if(!count($list)) return; + $idx = 0; + $list_order = array(); + foreach($list as $key => $val) { + $obj = null; + $obj->mid = $val['mid']; + $obj->module_srl = $val['module_srl']; + $obj->category_srl = $val['category_srl']; + $obj->parent_srl = $val['parent_srl']; + $obj->title = $obj->text = $val['text']; + $obj->expand = $val['expand']=='Y'?true:false; + $obj->document_count = $val['document_count']; + $obj->depth = $depth; + $obj->child_count = 0; + $obj->childs = array(); + $obj->grant = $val['grant']; + + if(Context::get('mid') == $obj->mid && Context::get('category') == $obj->category_srl) $selected = true; + else $selected = false; + + $obj->selected = $selected; + + $list_order[$idx++] = $obj->category_srl; + + // 부모 카테고리가 있으면 자식노드들의 데이터를 적용 + if($obj->parent_srl) { + + $parent_srl = $obj->parent_srl; + $document_count = $obj->document_count; + $expand = $obj->expand; + if($selected) $expand = true; + + while($parent_srl) { + $document_category[$parent_srl]->document_count += $document_count; + $document_category[$parent_srl]->childs[] = $obj->category_srl; + $document_category[$parent_srl]->child_count = count($document_category[$parent_srl]->childs); + if($expand) $document_category[$parent_srl]->expand = $expand; + + $parent_srl = $document_category[$parent_srl]->parent_srl; + } + } + + $document_category[$key] = $obj; + + if(count($val['list'])) $this->_arrangeCategory($document_category, $val['list'], $depth+1); + } + $document_category[$list_order[0]]->first = true; + $document_category[$list_order[count($list_order)-1]]->last = true; } /** @@ -461,11 +511,23 @@ $xml_file = sprintf('files/cache/document_category/%s.xml.php',$module_srl); if(!file_exists($xml_file)) { $oDocumentController = &getController('document'); - $oDocumentController->makeCategoryXmlFile($module_srl); + $oDocumentController->makeCategoryFile($module_srl); } return $xml_file; } + /** + * @brief 문서 category정보의 php 캐시 파일을 return + **/ + function getCategoryPhpFile($module_srl) { + $php_file = sprintf('files/cache/document_category/%s.php',$module_srl); + if(!file_exists($php_file)) { + $oDocumentController = &getController('document'); + $oDocumentController->makeCategoryFile($module_srl); + } + return $php_file; + } + /** * @brief 월별 글 보관현황을 가져옴 **/ @@ -521,7 +583,7 @@ $output = ''; foreach($categories as $category_srl => $category) { - $output .= sprintf("%d,%s\n",$category_srl, $category->title); + $output .= sprintf("%d,%d,%s\n",$category_srl, $category->depth,$category->title); } $this->add('categories', $output); } diff --git a/modules/document/lang/en.lang.php b/modules/document/lang/en.lang.php index fa0cea306..d9e2c7a0b 100644 --- a/modules/document/lang/en.lang.php +++ b/modules/document/lang/en.lang.php @@ -14,7 +14,7 @@ $lang->title_bold = 'Bold'; $lang->title_color = 'Color'; - $lang->cmd_search_next = '계속 검색'; + $lang->cmd_search_next = 'Search Next'; $lang->cmd_temp_save = 'Temporary Save'; diff --git a/modules/document/queries/getChildCategory.xml b/modules/document/queries/getChildCategory.xml new file mode 100644 index 000000000..d60cf92a4 --- /dev/null +++ b/modules/document/queries/getChildCategory.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/modules/document/queries/getDocumentList.xml b/modules/document/queries/getDocumentList.xml index 179afd594..f2dc839a1 100644 --- a/modules/document/queries/getDocumentList.xml +++ b/modules/document/queries/getDocumentList.xml @@ -7,8 +7,9 @@ - + + diff --git a/modules/document/queries/getDocumentListWithinComment.xml b/modules/document/queries/getDocumentListWithinComment.xml index bb39eb0f3..866c85e55 100644 --- a/modules/document/queries/getDocumentListWithinComment.xml +++ b/modules/document/queries/getDocumentListWithinComment.xml @@ -10,6 +10,7 @@ + diff --git a/modules/document/queries/getDocumentListWithinTag.xml b/modules/document/queries/getDocumentListWithinTag.xml index 3564a9122..48dee7639 100644 --- a/modules/document/queries/getDocumentListWithinTag.xml +++ b/modules/document/queries/getDocumentListWithinTag.xml @@ -9,6 +9,7 @@ + diff --git a/modules/document/queries/updateCategoryOrder.xml b/modules/document/queries/updateCategoryOrder.xml new file mode 100644 index 000000000..f9f05e50f --- /dev/null +++ b/modules/document/queries/updateCategoryOrder.xml @@ -0,0 +1,12 @@ + + +
    + + + + + + + + + diff --git a/modules/document/queries/updateDocumentModule.xml b/modules/document/queries/updateDocumentModule.xml index 8c8dafd50..f3dfa097f 100644 --- a/modules/document/queries/updateDocumentModule.xml +++ b/modules/document/queries/updateDocumentModule.xml @@ -5,6 +5,7 @@ + diff --git a/modules/document/tpl/css/document.css b/modules/document/tpl/css/document.css index fec819620..3397e16ee 100644 --- a/modules/document/tpl/css/document.css +++ b/modules/document/tpl/css/document.css @@ -3,3 +3,5 @@ .document_list input { float:left; margin-right:10px; } .document_list address { float:left; width:100px; margin-right:10px; overflow:hidden; white-space:nowrap;} .document_list .document_title { } + +div.printContent { padding:20px; } diff --git a/modules/document/tpl/icons/file.gif b/modules/document/tpl/icons/file.gif index c39a49aa0..b9c426983 100644 Binary files a/modules/document/tpl/icons/file.gif and b/modules/document/tpl/icons/file.gif differ diff --git a/modules/document/tpl/icons/image.gif b/modules/document/tpl/icons/image.gif index 128454cb7..3f77a6944 100644 Binary files a/modules/document/tpl/icons/image.gif and b/modules/document/tpl/icons/image.gif differ diff --git a/modules/document/tpl/icons/movie.gif b/modules/document/tpl/icons/movie.gif index 104abed57..63d2ae6cf 100644 Binary files a/modules/document/tpl/icons/movie.gif and b/modules/document/tpl/icons/movie.gif differ diff --git a/modules/document/tpl/icons/new.gif b/modules/document/tpl/icons/new.gif index 1ecd96d99..b446b7207 100644 Binary files a/modules/document/tpl/icons/new.gif and b/modules/document/tpl/icons/new.gif differ diff --git a/modules/document/tpl/icons/secret.gif b/modules/document/tpl/icons/secret.gif index 61bdcaef1..786d64d12 100644 Binary files a/modules/document/tpl/icons/secret.gif and b/modules/document/tpl/icons/secret.gif differ diff --git a/modules/document/tpl/icons/update.gif b/modules/document/tpl/icons/update.gif index c17ae083d..a5b34ee5e 100644 Binary files a/modules/document/tpl/icons/update.gif and b/modules/document/tpl/icons/update.gif differ diff --git a/modules/document/tpl/js/document_admin.js b/modules/document/tpl/js/document_admin.js index 7ceb63770..d341c26d9 100644 --- a/modules/document/tpl/js/document_admin.js +++ b/modules/document/tpl/js/document_admin.js @@ -60,12 +60,19 @@ function completeGetCategoryFromModules(ret_obj, response_tags) { var category_list = categories.split("\n"); for(var i=0;i0) opt.style.paddingLeft = (depth*15)+'px'; obj.options[obj.options.length] = opt; } } diff --git a/modules/document/tpl/print_page.html b/modules/document/tpl/print_page.html index 60a495e73..27b100108 100644 --- a/modules/document/tpl/print_page.html +++ b/modules/document/tpl/print_page.html @@ -1,15 +1,18 @@ -

    {$oDocument->getTitleText()}

    +
    -
    {$oDocument->get('nick_name')}
    -
    {$oDocument->getRegdate()}
    +

    {$oDocument->getTitleText()}

    -
    +
    {$oDocument->get('nick_name')}
    +
    {$oDocument->getRegdate()}
    -
    {$oDocument->getContent(false)}
    +
    +
    {$oDocument->getContent(false, false)}
    + +
    - +
    + + + + + + +
    preview
    + +
    + +
    + +
    {$upload_status}
    +
    diff --git a/modules/editor/skins/msword2007/css/editor.css b/modules/editor/skins/msword2007/css/editor.css index c34e0a9a9..d23101e75 100644 --- a/modules/editor/skins/msword2007/css/editor.css +++ b/modules/editor/skins/msword2007/css/editor.css @@ -26,33 +26,33 @@ .xeEditor .optionDE img { float:left; display:block; margin-right:.5em; cursor:pointer;} .xeEditor .optionD { padding:.5em 0 .5em .8em; overflow:hidden; float:left; border-right:1px solid #e0e0e0;} -.xeEditor .editorInfo { background:#fbfbfb; padding:.5em; border:1px solid #e1e1dd; color:#999999; position:relative; margin:5px 20px 0 20px;} +.xeEditor .editorInfo { background:#fbfbfb; padding:.5em; border:1px solid #e1e1dd; color:#999999; position:relative; margin:5px 10px 0 10px;} .xeEditor .close { cursor:pointer; position:absolute; top:3px; right:3px; _top:3px; _right:25px;} -.xeEditor .editor_iframe_box { background:#ffffff; clear:both; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:10px; margin:0 20px 0 20px; } -.xeEditor .editor_iframe_textarea { background:#ffffff; clear:both; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:.5em; margin:0 20px 0 20px; width:100%; font-size:1em; display:none;} +.xeEditor .editor_iframe_box { background:#ffffff; clear:both; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:0; margin:0 10px 0 10px; } +.xeEditor .editor_iframe_textarea { background:#ffffff; clear:both; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:0; margin:0 10px 0 10px; width:100%; font-size:1em; display:none;} .xeEditor .textAreaDragIndicator { text-align:center; background:url(../images/lineTextAreaDrag.gif) repeat-x left center; padding:5px 0 5px 0; } .xeEditor .textAreaDragIndicatorBar { background:url(../images/buttonTextAreaDrag.gif) no-repeat center; cursor:move;height:14px;} -.xeEditor .editor_info { clear:both; padding:5px 20px 5px 20px; overflow:hidden;} +.xeEditor .editor_info { clear:both; padding:5px 10px 5px 10px; overflow:hidden;} .xeEditor .editor_info .editor_option { float:left; color:#888888; } -.xeEditor .editor_info .editor_autosaved_message { color:#888888; float:right; } +.xeEditor .editor_info .editor_autosaved_message { color:#888888; float:right; display:none;} -.xeEditor .inputTypeTextArea { background:#fbfbfb; padding:1em; width:94%;} -.xeEditor #textAreaDrag {} -.xeEditor .fileAttach { padding:0 1em .5em 1em;} -.xeEditor .fileAttach .preview { padding:5px; width:110px; height:110px; border:1px solid #e1e1dd; background:#fbfbfb; float:left; margin-right:.5em;} -.xeEditor .fileAttach .preview img { width:110px; height:110px; float:left; display:block;} -.xeEditor .fileAttach .fileListArea { float:left; width:50%; margin-right:.7em; padding-bottom:.5em; margin-bottom:1em} -.xeEditor .fileAttach .fileListArea .fileList { background:url(../images/select_dot.gif); overflow:auto; width:100%; height:auto; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; margin-bottom:.3em; font-size:11px;} + +.xeEditor .fileAttach { border:none; table-layout:fixed; margin:10px 10px 0 10px; } + +.xeEditor .fileAttach .preview { padding:5px; border:1px solid #e1e1dd; width:100px; height:100px; margin-right:10px;} +.xeEditor .fileAttach .preview img { width:100px; height:100px; } + +.xeEditor .fileAttach .fileListArea .fileList { background:url(../images/select_dot.gif); overflow:auto; width:100%; height:auto; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; margin-bottom:10px; font-size:11px;} .xeEditor .fileAttach .fileListArea .fileList option { line-height:100%; padding-left:.5em;} -.xeEditor .fileAttach .fileListArea span.file_attach_info { color:#3f4040; font-size:11px; text-align:left;} -.xeEditor .fileAttach .fileListArea span.file_attach_info strong { color:#ff6600; font-size:11px; font-weight:bold; } -.xeEditor .fileAttach .fileUploadControl { margin-bottom:5px; } +.xeEditor .fileAttach .fileUploadControl { float:left; } +.xeEditor .fileAttach .file_attach_info { color:#AAAAAA; font-size:.9em; _font-size:8pt; text-align:right;} +*:first-child+html .xeEditor .fileAttach .file_attach_info { font-size:8pt; } .xeEditor .fileAttach .fileUploadControl .uploaderButton { display:block; cursor:pointer; background:url(../images/buttonTypeBCenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; font-size:.9em; white-space:nowrap;} .xeEditor .fileAttach .fileUploadControl .uploaderButton:hover { text-decoration:none;} .xeEditor .fileAttach .fileUploadControl .uploaderButton img { vertical-align:middle;} -.xeEditor .fileAttach .fileUploadControl .uploaderButton .leftCap { width:2px; height:22px; background:url(../images/buttonTypeBLeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;} -.xeEditor .fileAttach .fileUploadControl .uploaderButton .rightCap { width:2px; height:22px; background:url(../images/buttonTypeBRight.gif) no-repeat; margin:0 -1px 0 .4em;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton .leftCap { width:2px; height:21px; background:url(../images/buttonTypeBLeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton .rightCap { width:2px; height:21px; background:url(../images/buttonTypeBRight.gif) no-repeat; margin:0 -1px 0 .4em;} .xeEditor .fileAttach .fileUploadControl .uploaderButton .icon { margin:0 .2em;} diff --git a/modules/editor/skins/msword2007/editor.html b/modules/editor/skins/msword2007/editor.html index 89681296f..233d3443c 100644 --- a/modules/editor/skins/msword2007/editor.html +++ b/modules/editor/skins/msword2007/editor.html @@ -121,19 +121,27 @@ +
    +
    + +
     
    +
    +
    +
    + @@ -144,22 +152,24 @@ editor_upload_init("{$editor_sequence}"); //]]> - + + + + + + + +
    preview
    + +
    + +
    + +
    {$upload_status}
    +
    diff --git a/modules/editor/skins/msword2007/js/editor.js b/modules/editor/skins/msword2007/js/editor.js index 3fcc091c9..128b4a9b1 100644 --- a/modules/editor/skins/msword2007/js/editor.js +++ b/modules/editor/skins/msword2007/js/editor.js @@ -7,4 +7,4 @@ function eOptionOver2(obj) { function eOptionClick2(obj) { obj.style.marginTop='-44px'; obj.style.zIndex='99'; -} \ No newline at end of file +} diff --git a/modules/editor/skins/textarea/css/editor.css b/modules/editor/skins/textarea/css/editor.css new file mode 100644 index 000000000..e29fa20c8 --- /dev/null +++ b/modules/editor/skins/textarea/css/editor.css @@ -0,0 +1,4 @@ +@charset "utf-8"; + +.xeTextareaEditor {width:100%; } +.xeTextareaEditor textarea { display:block; margin:10px 10px 0 10px; width:90%;} diff --git a/modules/editor/skins/textarea/editor.html b/modules/editor/skins/textarea/editor.html new file mode 100644 index 000000000..ee11e631d --- /dev/null +++ b/modules/editor/skins/textarea/editor.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + +
    + +
    + + diff --git a/modules/editor/skins/textarea/js/xe_interface.js b/modules/editor/skins/textarea/js/xe_interface.js new file mode 100644 index 000000000..8c3b9fc21 --- /dev/null +++ b/modules/editor/skins/textarea/js/xe_interface.js @@ -0,0 +1,22 @@ +function editorStartTextarea(editor_sequence, content_key, primary_key) { + var obj = xGetElementById('editor_'+editor_sequence); + obj.form.setAttribute('editor_sequence', editor_sequence); + + xWidth(obj,xWidth(obj.parentNode)-24); + + editorRelKeys[editor_sequence] = new Array(); + editorRelKeys[editor_sequence]["primary"] = obj.form[primary_key]; + editorRelKeys[editor_sequence]["content"] = obj.form[content_key]; + editorRelKeys[editor_sequence]["func"] = editorGetContentTextarea; + + var content = obj.form[content_key].value; + content = content.replace(/]+)>/ig,""); + obj.value = content; +} + +function editorGetContentTextarea(editor_sequence) { + var obj = xGetElementById('editor_'+editor_sequence); + var content = obj.value.trim(); + content = content.replace(/(\r\n|\n)/g, "
    $1"); + return content; +} diff --git a/modules/editor/skins/textarea/skin.xml b/modules/editor/skins/textarea/skin.xml new file mode 100644 index 000000000..7a3d79e20 --- /dev/null +++ b/modules/editor/skins/textarea/skin.xml @@ -0,0 +1,19 @@ + + + 제로보드XE textarea 에디터 스킨 + zeroboard XE textarea 编辑器皮肤 + + zero + zero + + 위지윅에디터가 아닌 가벼운 글 편집을 원할 경우 사용되는 스킨입니다. + 에디터컴포넌트나 파일첨부등의 기능이 모두 되지 않고 단순히 글로 된 컨텐츠만 사용할 수 있습니다. + 개발 : zero (http://www.zeroboard.com) + + + 适用于纯文本形式输入内容时使用的皮肤。 + 不支持编辑器组件和上传文件的功能,可使用在纯文本形式的内容。 + 开发 : zero (http://www.zeroboard.com) + + + diff --git a/modules/editor/skins/xquared/css/default.css b/modules/editor/skins/xquared/css/default.css index 1b9545fad..421cf8168 100644 --- a/modules/editor/skins/xquared/css/default.css +++ b/modules/editor/skins/xquared/css/default.css @@ -1,26 +1,28 @@ @charset "utf-8"; -.xeEditor .editor_info .editor_autosaved_message { color:#888888; text-align:right; } -.xeEditor .optionDE { width:100%; clear:both; overflow:hidden; background:#f8f8f8; border-bottom:1px solid #e1e1e1; height:29px;} -.xeEditor .optionDE .buttonGroup { white-space:nowrap; position:relative; display:block; float:left; height:21px; overflow:hidden; padding-left:2px;} +.xeEditor { padding:0 10px 0 10px; } +.xeEditor .editor_info .editor_autosaved_message { display:none; color:#888888; text-align:right; } +.xeEditor .optionDE { width:100%; clear:both; overflow:hidden; background:#f8f8f8; height:29px;} +.xeEditor .optionDE .buttonGroup { white-space:nowrap; display:block; float:left; height:21px; overflow:hidden; padding-left:2px;} .xeEditor .optionDE img { float:left; display:block; margin-right:.5em; cursor:pointer;} -.xeEditor .optionD { padding:.5em 0 .5em .8em; overflow:hidden; float:left; border-right:1px solid #e0e0e0;} -.xeEditor .optionE { padding:4px 0 0 8px; overflow:hidden; border-left:1px solid #ffffff; float:left;} +.xeEditor .optionD { overflow:hidden; float:left; border-right:1px solid #e0e0e0;} +.xeEditor .optionE { overflow:hidden; border-left:1px solid #ffffff; float:left;} .xeEditor .textAreaDragIndicator { text-align:center; background:url(../images/lineTextAreaDrag.gif) repeat-x left center; padding:5px 0 5px 0; } .xeEditor .textAreaDragIndicatorBar { background:url(../images/buttonTextAreaDrag.gif) no-repeat center; cursor:move;height:14px;} -.xeEditor .fileAttach { position:relative; top:20px; padding:0 1em .5em 1em;} -.xeEditor .fileAttach .preview { padding:5px; width:110px; height:110px; border:1px solid #e1e1dd; background:#fbfbfb; float:left; margin-right:.5em;} -.xeEditor .fileAttach .preview img { width:110px; height:110px; float:left; display:block;} -.xeEditor .fileAttach .fileListArea { float:left; width:50%; margin-right:.7em; padding-bottom:.5em; margin-bottom:1em} -.xeEditor .fileAttach .fileListArea .fileList { overflow:auto; width:100%; height:auto; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; margin-bottom:.3em; font-size:11px;} +.xeEditor .fileAttach { border:none; table-layout:fixed; margin-top:10px; } + +.xeEditor .fileAttach .preview { padding:5px; border:1px solid #e1e1dd; width:100px; height:100px; margin-right:10px;} +.xeEditor .fileAttach .preview img { width:100px; height:100px; } + +.xeEditor .fileAttach .fileListArea .fileList { overflow:auto; width:100%; height:auto; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; margin-bottom:10px; font-size:11px;} .xeEditor .fileAttach .fileListArea .fileList option { line-height:100%; padding-left:.5em;} -.xeEditor .fileAttach .fileListArea span.file_attach_info { color:#3f4040; font-size:11px; text-align:left;} -.xeEditor .fileAttach .fileListArea span.file_attach_info strong { color:#ff6600; font-size:11px; font-weight:bold; } -.xeEditor .fileAttach .fileUploadControl { margin-bottom:5px; } +.xeEditor .fileAttach .fileUploadControl { float:left; } +.xeEditor .fileAttach .file_attach_info { color:#AAAAAA; font-size:.9em; _font-size:8pt; text-align:right;} +*:first-child+html .xeEditor .fileAttach .file_attach_info { font-size:8pt; } .xeEditor .fileAttach .fileUploadControl .uploaderButton { display:block; cursor:pointer; background:url(../images/buttonTypeBCenter.gif) repeat-x left center; line-height:100%; overflow:visible; color:#3f4040; margin:0 1px; font-size:.9em; white-space:nowrap;} .xeEditor .fileAttach .fileUploadControl .uploaderButton:hover { text-decoration:none;} .xeEditor .fileAttach .fileUploadControl .uploaderButton img { vertical-align:middle;} -.xeEditor .fileAttach .fileUploadControl .uploaderButton .leftCap { width:2px; height:21px; background:url(../images/buttonTypeBLeft.gif) no-repeat; margin:0 .3em 0 0; position:relative; left:-1px;} +.xeEditor .fileAttach .fileUploadControl .uploaderButton .leftCap { width:2px; height:21px; background:url(../images/buttonTypeBLeft.gif) no-repeat; margin:0 .3em 0 0; left:-1px;} .xeEditor .fileAttach .fileUploadControl .uploaderButton .rightCap { width:2px; height:21px; background:url(../images/buttonTypeBRight.gif) no-repeat; margin:0 -1px 0 .4em;} .xeEditor .fileAttach .fileUploadControl .uploaderButton .icon { margin:0 .2em;} diff --git a/modules/editor/skins/xquared/css/xq_contents.css b/modules/editor/skins/xquared/css/xq_contents.css index 887f8e673..65e68904a 100644 --- a/modules/editor/skins/xquared/css/xq_contents.css +++ b/modules/editor/skins/xquared/css/xq_contents.css @@ -119,4 +119,4 @@ .xed table.datatable td { border-bottom: 1px solid #000; border-right: 1px solid #000; -} \ No newline at end of file +} diff --git a/modules/editor/skins/xquared/css/xq_ui.css b/modules/editor/skins/xquared/css/xq_ui.css index 4b7012974..abcc1f373 100644 --- a/modules/editor/skins/xquared/css/xq_ui.css +++ b/modules/editor/skins/xquared/css/xq_ui.css @@ -230,4 +230,4 @@ .xqQuickSearch li.selected { background-color: #ffd; -} \ No newline at end of file +} diff --git a/modules/editor/skins/xquared/editor.html b/modules/editor/skins/xquared/editor.html index 97205fdc3..af43d14ee 100644 --- a/modules/editor/skins/xquared/editor.html +++ b/modules/editor/skins/xquared/editor.html @@ -44,18 +44,19 @@
    -
     
    -
    +
    +
    + @@ -68,21 +69,25 @@ //]]> - + + + + + + + +
    preview
    + +
    + +
    + +
    {$upload_status}
    +
    diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html index fb39500f0..4204e4c51 100644 --- a/modules/editor/tpl/admin_index.html +++ b/modules/editor/tpl/admin_index.html @@ -75,13 +75,7 @@ {$xml_info->version} {$xml_info->author->name} {$xml_info->author->date} - - - {$lang->cmd_setup} - -   - - + {$lang->cmd_setup} {$lang->cmd_enable} diff --git a/modules/editor/tpl/editor_module_config.html b/modules/editor/tpl/editor_module_config.html index 41e9eaa71..b57106423 100644 --- a/modules/editor/tpl/editor_module_config.html +++ b/modules/editor/tpl/editor_module_config.html @@ -1,23 +1,135 @@
    - + - + - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/editor/tpl/js/editor.js b/modules/editor/tpl/js/editor.js index 1bdc45875..abb5cdb9e 100755 --- a/modules/editor/tpl/js/editor.js +++ b/modules/editor/tpl/js/editor.js @@ -43,7 +43,6 @@ function editorGetContent_xe(editor_sequence) { return html; } - // 에디터 내의 선택된 부분의 NODE를 return function editorGetSelectedNode(editor_sequence) { var iframe_obj = editorGetIFrame(editor_sequence); @@ -69,7 +68,7 @@ function editorStart(editor_sequence, primary_key, content_key, editor_height) { var iframe_obj = editorGetIFrame(editor_sequence); if(!iframe_obj) return; xWidth(iframe_obj.parentNode, '100%'); - xWidth(iframe_obj, xWidth(iframe_obj.parentNode)-20); + xWidth(iframe_obj, xWidth(iframe_obj.parentNode)-2); // 현 에디터를 감싸고 있는 form문을 찾음 var fo_obj = editorGetForm(editor_sequence); @@ -119,11 +118,10 @@ function editorStart(editor_sequence, primary_key, content_key, editor_height) { ''+ ''+ //''+ - ''+ - ''+ - ''+ ''+ content+ diff --git a/modules/editor/tpl/js/editor_common.js b/modules/editor/tpl/js/editor_common.js index 690a9164c..5dd8d6c93 100644 --- a/modules/editor/tpl/js/editor_common.js +++ b/modules/editor/tpl/js/editor_common.js @@ -66,6 +66,7 @@ function _editorAutoSave() { editorAutoSaveObj.content = content; var obj = xGetElementById("editor_autosaved_message_"+editor_sequence); + obj.style.display = 'block'; var oDate = new Date(); html = oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg; xInnerHtml(obj, html); diff --git a/modules/editor/tpl/setup_component.html b/modules/editor/tpl/setup_component.html index 0191d5b7a..bbd8a0016 100644 --- a/modules/editor/tpl/setup_component.html +++ b/modules/editor/tpl/setup_component.html @@ -34,6 +34,16 @@ + + + + + +
    {$lang->editor}
    {$lang->editor} {$lang->document}{$lang->comment}
    {$lang->editor_skin} + + +
    {$lang->about_editor_skin}
    {$lang->enable_html_grant} + + enable_html_grant))-->checked="checked"/>
    + +
    + + enable_comment_html_grant))-->checked="checked"/>
    + +
    {$lang->about_enable_html_grant}
    {$lang->upload_file_grant} + + upload_file_grant))-->checked="checked"/>
    + +
    + + comment_upload_file_grant))-->checked="checked"/>
    + +
    {$lang->about_upload_file_grant}
    {$lang->enable_default_component_grant} + + enable_default_component_grant))-->checked="checked"/>
    + +
    + + enable_comment_default_component_grant))-->checked="checked"/>
    + +
    {$lang->about_default_component_grant}
    {$lang->enable_component_grant} + + enable_component_grant))-->checked="checked"/>
    + +
    + + enable_comment_component_grant))-->checked="checked"/>
    + +
    {$lang->about_component_grant}
    {$lang->editor_height} + px + + px +
    {$lang->about_editor_height}
    {$lang->height_resizable} + enable_height_resizable=='Y')-->checked="checked"/> + + enable_comment_height_resizable=='Y')-->checked="checked"/> +
    {$lang->about_editor_height_resizable}
    {$lang->enable_autosave}enable_autosave=='Y')-->checked="checked"/>
    {$lang->about_enable_autosave}
    {$lang->grant} + +
    target_group))-->checked="checked" id="group_{$key}">  
    + +
    diff --git a/modules/file/file.admin.controller.php b/modules/file/file.admin.controller.php index 3fe4b00a9..48c1709e9 100644 --- a/modules/file/file.admin.controller.php +++ b/modules/file/file.admin.controller.php @@ -77,6 +77,11 @@ function procFileAdminInsertModuleConfig() { // 필요한 변수를 받아옴 $module_srl = Context::get('target_module_srl'); + + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + $download_grant = trim(Context::get('download_grant')); // 설정 정보를 받아옴 (module model 객체를 이용) @@ -89,12 +94,19 @@ $module_file_config->allowed_filetypes = Context::get('allowed_filetypes'); if($download_grant) $module_file_config->download_grant = explode('|@|',$download_grant); else $module_file_config->download_grant = array(); - $config->module_config[$module_srl] = $module_file_config; + + for($i=0;$imodule_config[$srl] = $module_file_config; + } // module Controller 객체 생성하여 입력 $oModuleController = &getController('module'); $output = $oModuleController->insertModuleConfig('file',$config); - return $output; + + $this->setError(-1); + $this->setMessage('success_updated'); } } ?> diff --git a/modules/file/file.class.php b/modules/file/file.class.php index e2796aa50..580046c0c 100644 --- a/modules/file/file.class.php +++ b/modules/file/file.class.php @@ -131,5 +131,39 @@ **/ function recompileCache() { } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + case 'procFileAdminInsertModuleConfig' : + if(!$args->target_module_srl) return false; + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->target_module_srl); + if(!$module_info) return false; + + if($oModuleModel->isModuleAdmin($module_info, $logged_info)) return true; + break; + } + + return false; + } } ?> diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index 2251ef339..516b0fc0c 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -198,9 +198,7 @@ if(!$_SESSION['upload_info'][$editor_sequence]->enabled) exit(); $upload_target_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; - if(!$upload_target_srl) return; - - if($file_srl) $output = $this->deleteFile($file_srl); + if($upload_target_srl && $file_srl) $output = $this->deleteFile($file_srl); // 첨부파일의 목록을 java script로 출력 $this->printUploadedFileList($editor_sequence, $upload_target_srl); @@ -339,7 +337,7 @@ } // 이미지인지 기타 파일인지 체크하여 upload path 지정 - if(eregi("\.(jpg|jpeg|gif|png|wmv|mpg|mpeg|avi|swf|flv|mp3|asaf|wav|asx|midi)$", $file_info['name'])) { + if(preg_match("/\.(jpg|jpeg|gif|png|wmv|wma|mpg|mpeg|avi|swf|flv|mp3|asaf|wav|asx|midi)$/i", $file_info['name'])) { $path = sprintf("./files/attach/images/%s/%s/", $module_srl,$upload_target_srl); $filename = $path.$file_info['name']; $direct_download = 'Y'; @@ -386,6 +384,7 @@ $output->add('direct_download', $args->direct_download); $output->add('source_filename', $args->source_filename); $output->add('upload_target_srl', $upload_target_srl); + $output->add('uploaded_filename', $args->uploaded_filename); return $output; } @@ -473,7 +472,7 @@ $old_file = $file_info->uploaded_filename; // 이미지인지 기타 파일인지 체크하여 이동할 위치 정함 - if(eregi("\.(jpg|jpeg|gif|png|wmv|mpg|mpeg|avi|swf|flv|mp3|asaf|wav|asx|midi)$", $file_info->source_filename)) { + if(preg_match("/\.(jpg|jpeg|gif|png|wmv|wma|mpg|mpeg|avi|swf|flv|mp3|asaf|wav|asx|midi)$/i", $file_info->source_filename)) { $path = sprintf("./files/attach/images/%s/%s/", $target_module_srl,$target_srl); $new_file = $path.$file_info->source_filename; } else { @@ -504,21 +503,24 @@ * @brief upload_target_srl을 키로 하는 첨부파일을 찾아서 java script 코드로 return **/ function printUploadedFileList($editor_sequence, $upload_target_srl) { - // file의 Model객체 생성 $oFileModel = &getModel('file'); - // 첨부파일 목록을 구함 - $tmp_file_list = $oFileModel->getFiles($upload_target_srl); - $file_count = count($tmp_file_list); + if($upload_target_srl) { + // file의 Model객체 생성 - // 루프를 돌면서 $buff 변수에 java script 코드를 생성 - $buff = ""; - for($i=0;$i<$file_count;$i++) { - $file_info = $tmp_file_list[$i]; - if(!$file_info->file_srl) continue; - if($file_info->direct_download == 'Y') $file_info->uploaded_filename = sprintf('%s%s', Context::getRequestUri(), str_replace('./', '', $file_info->uploaded_filename)); - $file_list[] = $file_info; - $attached_size += $file_info->file_size; + // 첨부파일 목록을 구함 + $tmp_file_list = $oFileModel->getFiles($upload_target_srl); + $file_count = count($tmp_file_list); + + // 루프를 돌면서 $buff 변수에 java script 코드를 생성 + $buff = ""; + for($i=0;$i<$file_count;$i++) { + $file_info = $tmp_file_list[$i]; + if(!$file_info->file_srl) continue; + if($file_info->direct_download == 'Y') $file_info->uploaded_filename = sprintf('%s%s', Context::getRequestUri(), str_replace('./', '', $file_info->uploaded_filename)); + $file_list[] = $file_info; + $attached_size += $file_info->file_size; + } } // 업로드 상태 표시 작성 @@ -530,6 +532,7 @@ Context::set('upload_status', $upload_status); // 업로드 현황을 브라우저로 알리기 위한 javascript 코드 출력하는 템플릿 호출 + Context::set('layout','none'); $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('print_uploaded_file_list'); } diff --git a/modules/file/file.view.php b/modules/file/file.view.php index 1408a2be0..7a4cb88f6 100644 --- a/modules/file/file.view.php +++ b/modules/file/file.view.php @@ -22,15 +22,15 @@ **/ function triggerDispFileAdditionSetup(&$obj) { $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); - if(!$current_module_srl) { + if(!$current_module_srl && !$current_module_srls) { // 선택된 모듈의 정보를 가져옴 $current_module_info = Context::get('current_module_info'); $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); } - if(!$current_module_srl) return new Object(); - // 선택된 모듈의 file설정을 가져옴 $oFileModel = &getModel('file'); $file_config = $oFileModel->getFileModuleConfig($current_module_srl); diff --git a/modules/file/lang/es.lang.php b/modules/file/lang/es.lang.php index 0d341a5bb..49a931386 100644 --- a/modules/file/lang/es.lang.php +++ b/modules/file/lang/es.lang.php @@ -16,7 +16,7 @@ $lang->allowed_filesize = 'Límite del tamaño del archivo adjunto'; $lang->allowed_attach_size = 'Límite del tamaño total de los archivos adjuntos por documento'; $lang->allowed_filetypes = 'Tipos de archivos permitidos'; - $lang->enable_download_group = '다운로드 가능 그룹'; + $lang->enable_download_group = 'Descargar permitió grupos'; $lang->about_allowed_filesize = 'Puede definir el límite del tamaño del archivo adjunto. (exceptuando el administrador)'; $lang->about_allowed_attach_size = 'Puede definir el límite del tamaño total de los archivos adjuntos por documento. (exceptuando el administrador)'; @@ -26,7 +26,7 @@ $lang->cmd_move_to_document = 'Mover hacia el doncumento'; $lang->cmd_download = 'Descargar'; - $lang->msg_not_permitted_download = '다운로드 할 수 있는 권한이 없습니다'; + $lang->msg_not_permitted_download = 'Usted no tiene ningún permiso para descargar'; $lang->msg_cart_is_null = 'Seleccione el archivo a eliminar'; $lang->msg_checked_file_is_deleted = 'Total de %d archivos eliminados'; $lang->msg_exceeds_limit_size = 'Ha excedido el límite del tamaño total de los archivos adjuntos'; diff --git a/modules/file/queries/getOneFileInDocument.xml b/modules/file/queries/getOneFileInDocument.xml index 566a7ed57..0ac54ba1b 100644 --- a/modules/file/queries/getOneFileInDocument.xml +++ b/modules/file/queries/getOneFileInDocument.xml @@ -4,7 +4,7 @@ - + diff --git a/modules/file/tpl/file_module_config.html b/modules/file/tpl/file_module_config.html index 56b84429c..be3d14b05 100644 --- a/modules/file/tpl/file_module_config.html +++ b/modules/file/tpl/file_module_config.html @@ -1,7 +1,6 @@ - - +
    diff --git a/modules/guestbook/conf/info.xml b/modules/guestbook/conf/info.xml deleted file mode 100644 index 0c5b3f87d..000000000 --- a/modules/guestbook/conf/info.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 방명록 - ゲストブック - Guest Book - Tablero de visitas - 留言本 - Гостевая книга - - 제로 - Zero - zero - zero - zero - 모듈 제작을 위해 sample로 제작된 모듈입니다. - モジュール作成のためのサンプルで作成されたモジュールです。 - This is a sample module for creating modules. - Este is un módulo de muestra para crear módulos. - 留言本sample模块。 - Это модуль-пример для создания модулей. - - diff --git a/modules/guestbook/conf/module.xml b/modules/guestbook/conf/module.xml deleted file mode 100644 index d37266566..000000000 --- a/modules/guestbook/conf/module.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - 글 작성 - 留言 - 書き込み作成 - - - 댓글 작성 - 发表评论 - コメント作成 - - - 관리 - 管理 - 管理 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/guestbook/guestbook.admin.controller.php b/modules/guestbook/guestbook.admin.controller.php deleted file mode 100644 index 780558fc7..000000000 --- a/modules/guestbook/guestbook.admin.controller.php +++ /dev/null @@ -1,247 +0,0 @@ -module = 'guestbook'; - - // mid값을 직접 받지 않고 guestbook_name으로 받는 이유는 mid는 특별히 약속된 변수명이라 오동작이 발생할 수 있어서 다른 이름으로 전달을 받은후 다시 바꾸어준다. - $args->mid = $args->guestbook_name; - unset($args->guestbook_name); - - // is_default일 경우 별다른 요청이 없는 index페이지의 경우 바로 호출이 되는데 이 값을 설정을 하게 된다. - if($args->is_default!='Y') $args->is_default = 'N'; - - // 기본 값외의 것들을 정리 - $extra_var = delObjectVars(Context::getRequestVars(), $args); - unset($extra_var->act); - unset($extra_var->page); - unset($extra_var->guestbook_name); - - // module_srl이 넘어오면 원 모듈이 있는지 확인 - if($args->module_srl) { - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); - - // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리 - if($module_info->module_srl != $args->module_srl) unset($args->module_srl); - } - - // $extra_var를 serialize - $args->extra_vars = serialize($extra_var); - - // module 모듈의 controller 객체 생성 - $oModuleController = &getController('module'); - - // is_default=='Y' 이면 - if($args->is_default=='Y') $oModuleController->clearDefaultModule(); - - /** - * module_srl값이 없다면 신규 등록으로 처리를 한다. - **/ - if(!$args->module_srl) { - // module controller를 이용하여 모듈을 생성한다. - $output = $oModuleController->insertModule($args); - $msg_code = 'success_registed'; - - // 권한의 경우 기본으로 설정을 해주는 것이 좋으며 방명록 모듈의 경우 manager권한을 관리 그룹으로 설정을 한다. - if($output->toBool()) { - // 관리그룹을 member model객체에서 구할 수 있다. - $oMemberModel = &getModel('member'); - $admin_group = $oMemberModel->getAdminGroup(); - $admin_group_srl = $admin_group->group_srl; - - $module_srl = $output->get('module_srl'); - $grants = serialize(array('manager'=>array($admin_group_srl))); - - // module controller의 module 권한 설정 method를 이용하여 기본 권한을 적용한다. - $oModuleController->updateModuleGrant($module_srl, $grants); - } - /** - * module_srl이 있다면 모듈의 정보를 수정한다 - **/ - } else { - $output = $oModuleController->updateModule($args); - $msg_code = 'success_updated'; - } - - // 결과값에 오류가 있을 경우 그대로 객체 리턴. - if(!$output->toBool()) return $output; - - // 등록후 페이지 이동을 위해 변수 설정 및 메세지를 설정한다. - $this->add('page',Context::get('page')); - $this->add('module_srl',$output->get('module_srl')); - $this->setMessage($msg_code); - } - - /** - * @brief 방명록 삭제 - **/ - function procGuestbookAdminDeleteGuestbook() { - // 삭제할 대상 방명록의 module_srl을 구한다. - $module_srl = Context::get('module_srl'); - - // 원본을 구해온다 - $oModuleController = &getController('module'); - $output = $oModuleController->deleteModule($module_srl); - - // 삭제 처리시 오류가 발생하면 결과 객체를 바로 리턴한다. - if(!$output->toBool()) return $output; - - // 등록후 페이지 이동을 위해 변수 설정 및 메세지를 설정한다. - $this->add('module','guestbook'); - $this->add('page',Context::get('page')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 권한 설정 - * 생성된 방명록에 ./conf/module.xml에 정의된 권한과 관리자가 선택한 그룹의 값을 연동하여 권한을 설정하게 된다. - **/ - function procGuestbookAdminInsertGrant() { - // 대상 방명록(모듈)의 고유값인 module_srl을 체크한다. - $module_srl = Context::get('module_srl'); - - /** - * 현 모듈의 권한 목록을 가져옴 - * xml_info 는 guestbook모듈이 요청되었다고 판단될때 ModuleObject에서 이미 세팅해 놓은 상태이다. - **/ - $grant_list = $this->xml_info->grant; - - /** - * 권한의 목록을 loop로 돌면서 권한 설정을 한다. - * zbxe의 경우 가능한 간단한 xmlrpc사용을 위해서 배열의 경우 |@|를 pipe로 하여 하나의 string으로 전달한다. - * 요청받은 권한의 대상 그룹과 권한을 배열로 한 후 serialize하여 modules테이블에 module_srl을 키로 한 rows에 데이터를 적용한다. - **/ - if(count($grant_list)) { - foreach($grant_list as $key => $val) { - $group_srls = Context::get($key); - if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls); - } - $grants = serialize($arr_grant); - } - - // 권한 설정은 모듈 공통이라 module 모듈의 controller을 생성하여 저장하도록 한다. - $oModuleController = &getController('module'); - $oModuleController->updateModuleGrant($module_srl, $grants); - - // 권한 설정후 돌아갈 페이지를 위하여 module_srl값을 세팅하고 성공 메세지 역시 세팅한다. - $this->add('module_srl',Context::get('module_srl')); - $this->setMessage('success_registed'); - } - - /** - * @brief 스킨 정보 업데이트 - * 스킨 정보는 skin.xml파일의 extra_vars와 입력된 변수값을 조합하여 serialize하여 modules 테이블에 module_srl을 키로 하여 저장을 하게 된다. - **/ - function procGuestbookAdminUpdateSkinInfo() { - // module_srl에 해당하는 정보들을 가져오기 - $module_srl = Context::get('module_srl'); - - // 어떤 스킨이 사용중인지 확인하기 위해서 module_srl을 이용하여 모듈의 정보를 구하고 스킨을 구한다. - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - $skin = $module_info->skin; - - // 스킨의 정보르 구해옴 (extra_vars를 체크하기 위해서) - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - - // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) - $obj = Context::getRequestVars(); - unset($obj->act); - unset($obj->module_srl); - unset($obj->page); - - // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 - if($skin_info->extra_vars) { - foreach($skin_info->extra_vars as $vars) { - if($vars->type!='image') continue; - - $image_obj = $obj->{$vars->name}; - - // 삭제 요청에 대한 변수를 구함 - $del_var = $obj->{"del_".$vars->name}; - unset($obj->{"del_".$vars->name}); - if($del_var == 'Y') { - @unlink($module_info->{$vars->name}); - continue; - } - - // 업로드 되지 않았다면 이전 데이터를 그대로 사용 - if(!$image_obj['tmp_name']) { - $obj->{$vars->name} = $module_info->{$vars->name}; - continue; - } - - // 정상적으로 업로드된 파일이 아니면 무시 - if(!is_uploaded_file($image_obj['tmp_name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 이미지 파일이 아니어도 무시 - if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 경로를 정해서 업로드 - $path = sprintf("./files/attach/images/%s/", $module_srl); - - // 디렉토리 생성 - if(!FileHandler::makeDir($path)) return false; - - $filename = $path.$image_obj['name']; - - // 파일 이동 - if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { - unset($obj->{$vars->name}); - continue; - } - - // 변수를 바꿈 - unset($obj->{$vars->name}); - $obj->{$vars->name} = $filename; - } - } - - // serialize하여 저장 - $skin_vars = serialize($obj); - - // module controller객체를 생성하여 module_srl을 키로 한 rows에 serialize한 스킨 정보를 적용한다. - $oModuleController = &getController('module'); - $oModuleController->updateModuleSkinVars($module_srl, $skin_vars); - - /** - * 스킨 정보는 첨부파일때문에 xml로 전달이 되지 않고 POST로 전송이 되어 왔으므로 템플릿을 이용하여 프레임을 refresh시키도록 한다. - * 스킨 정보를 수정할때 숨어 있는 iframe을 target으로 삼기에 기본 레이아웃을 이용하면 되므로 직접 레이아웃 경로와 파일을 기본으로 지정한다. - **/ - $this->setLayoutPath('./common/tpl'); - $this->setLayoutFile('default_layout.html'); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile("top_refresh.html"); - } - } -?> diff --git a/modules/guestbook/guestbook.admin.view.php b/modules/guestbook/guestbook.admin.view.php deleted file mode 100644 index 3b8d899ce..000000000 --- a/modules/guestbook/guestbook.admin.view.php +++ /dev/null @@ -1,189 +0,0 @@ -module_srl) { - $module_srl = $this->module_srl; - Context::set('module_srl', $module_srl); - } - - // module info를 구하기 위해 module model 객체 생성 - $oModuleModel = &getModel('module'); - - // 모듈 카테고리 목록을 구함 - $module_category = $oModuleModel->getModuleCategories(); - Context::set('module_category', $module_category); - - // module_srl이 있다면 요청된 모듈의 정보를 미리 구해 놓음 - if($module_srl) { - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if(!$module_info) { - Context::set('module_srl',''); - $this->act = 'list'; - } else { - $this->module_info = $module_info; - Context::set('module_info',$module_info); - } - } - - // 템플릿 경로 지정, 관리자 페이지를 위한 템플릿은 별도의 스킨 기능이 없이 ./modules/모듈/tpl/ 에 위치해 놓기에 바로 지정을 해 놓는다. - $template_path = sprintf("%stpl/",$this->module_path); - $this->setTemplatePath($template_path); - } - - /** - * @brief 생성된 방명록들의 목록을 보여줌 - * guestbook이라는 module명으로 등록된 모듈을 구하기 위해서 몇가지 설정을 한 후에 쿼리를 수행한다. - * 쿼리수행은 executeQuery(모듈명.쿼리아이디, 인자변수) 로 하게 되며 이 쿼리아이디에 해당하는 xml파일은 모듈의 queries디렉토리에 지정이 되어 있다. - * - * 이 특정 module의 목록은 module model객체에서 구할 수 있지만 검색등의 각 모듈마다 다른 조건 때문에 각 모듈별로 쿼리를 생성해 놓는다. - * 모든 모듈의 결과물(mid)는 modules 테이블에 저장이 된다. - **/ - function dispGuestbookAdminContent() { - $args->sort_index = "module_srl"; ///< 정렬 순서는 모듈의 sequence값으로 하고 정렬은 역순. 즉 생성된 순으로 한다. - $args->page = Context::get('page'); ///< 현재 페이지를 설정 - $args->list_count = 40; ///< 한페이지에 40개씩 보여주기로 고정. - $args->page_count = 10; ///< 페이지의 수는 10개로 제한. - $args->s_module_category_srl = Context::get('module_category_srl'); ///< 모듈분류값을 인자로 추가 - $output = executeQuery('guestbook.getGuestbookList', $args); ///< guestbook.getGuesbookList 쿼리 실행 (./modules/guestbook/query/getGuestbookList.xml) - - /** - * 템플릿에 쓰기 위해서 context::set - * xml query에 navigation이 있고 list_count가 정의되어 있으면 결과 변수에 아래 5가지의 값이 세팅이 된다. - **/ - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('guestbook_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 파일 지정 (./modules/guestbook/tpl/index.html파일이 지정이 됨) - $this->setTemplateFile('index'); - } - - /** - * @brief 선택된 방명록의 정보 출력 - **/ - function dispGuestbookAdminGuestbookInfo() { - // module_srl 값이 없다면 그냥 index 페이지를 보여줌 - if(!Context::get('module_srl')) return $this->dispGuestbookAdminContent(); - - // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) - if($this->module_info->layout_srl) { - $oLayoutModel = &getModel('layout'); - $layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl); - $this->module_info->layout = $layout_info->layout; - $this->module_info->layout_title = $layout_info->layout_title; - } - - // 정해진 스킨이 있으면 해당 스킨의 정보를 구함 - if($this->module_info->skin) { - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin); - $this->module_info->skin_title = $skin_info->title; - } - - // 템플릿 파일 지정 - $this->setTemplateFile('guestbook_info'); - } - - /** - * @brief 방명록 설정 폼 출력 - **/ - function dispGuestbookAdminInsertGuestbook() { - // 스킨 목록을 구해옴 - $oModuleModel = &getModel('module'); - $skin_list = $oModuleModel->getSkins($this->module_path); - Context::set('skin_list',$skin_list); - - // 레이아웃 목록을 구해옴 - $oLayoutMode = &getModel('layout'); - $layout_list = $oLayoutMode->getLayoutList(); - Context::set('layout_list', $layout_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('guestbook_insert'); - } - - /** - * @brief 방명록 삭제 화면 출력 - **/ - function dispGuestbookAdminDeleteGuestbook() { - if(!Context::get('module_srl')) return $this->dispGuestbookAdminContent(); - - $module_info = Context::get('module_info'); - - // 해당 방명록에 입력된 전체 글의 갯수를 보여줌 (혹시 삭제 실수를 방지하기 위해서) - $oDocumentModel = &getModel('document'); - $document_count = $oDocumentModel->getDocumentCount($module_info->module_srl); - $module_info->document_count = $document_count; - - Context::set('module_info',$module_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('guestbook_delete'); - } - - /** - * @brief 스킨 정보 보여줌 - **/ - function dispGuestbookAdminSkinInfo() { - - // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 - $module_info = Context::get('module_info'); - $skin = $module_info->skin; - - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - - // skin_info에 extra_vars 값을 지정 - if(count($skin_info->extra_vars)) { - foreach($skin_info->extra_vars as $key => $val) { - $name = $val->name; - $type = $val->type; - $value = $module_info->{$name}; - if($type=="checkbox"&&!$value) $value = array(); - $skin_info->extra_vars[$key]->value= $value; - } - } - - Context::set('skin_info', $skin_info); - $this->setTemplateFile('skin_info'); - } - - /** - * @brief 권한 목록 출력 - **/ - function dispGuestbookAdminGrantInfo() { - // module_srl을 구함 - $module_srl = Context::get('module_srl'); - - // module.xml에서 권한 관련 목록을 구해옴 - $grant_list = $this->xml_info->grant; - Context::set('grant_list', $grant_list); - - // 권한 그룹의 목록을 가져온다 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - Context::set('group_list', $group_list); - - $this->setTemplateFile('grant_list'); - } - } -?> diff --git a/modules/guestbook/guestbook.class.php b/modules/guestbook/guestbook.class.php deleted file mode 100644 index 211eb5613..000000000 --- a/modules/guestbook/guestbook.class.php +++ /dev/null @@ -1,64 +0,0 @@ -insertActionForward('guestbook', 'view', 'dispGuestbookAdminContent'); - $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminGuestbookInfo'); - $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminInsertGuestbook'); - $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminDeleteGuestbook'); - $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminSkinInfo'); - $oModuleController->insertActionForward('guestbook', 'view', 'dispGuestbookAdminGrantInfo'); - $oModuleController->insertActionForward('guestbook', 'controller', 'procGuestbookAdminUpdateSkinInfo'); - - - // Object 클래스의 객체는 기본적으로 성공(error=0)으로 되어 있고 이 값을 return함으로써 ModuleHandler등에서 오류 유무를 파악할 수 있다. - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - * 설치시 필수 체크 부분이 있다면 검토하는 코드를 추가할 수 있다. - **/ - function checkUpdate() { - return false; - } - - /** - * @brief 업데이트 실행 - * 설치시 이상이 있으면 이 moduleUpdate() 메쏘드를 이용하여 업데이트 구문을 실행할수 있다. - **/ - function moduleUpdate() { - return new Object(); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } -?> diff --git a/modules/guestbook/guestbook.controller.php b/modules/guestbook/guestbook.controller.php deleted file mode 100644 index 18b5897ae..000000000 --- a/modules/guestbook/guestbook.controller.php +++ /dev/null @@ -1,246 +0,0 @@ -grant->write_document) return new Object(-1, 'msg_not_permitted'); - - /** - * 글작성시 필요한 변수를 세팅한다. - * 일단 Context::getReuqestVars()를 통해 모든 입력된 변수값을 가져온다. - * 글 작성은 document controller를 이용하여 정리된 변수를 넘겨줌으로서 동작이 된다. - **/ - $obj = Context::getRequestVars(); - - // 현재 방명록의 module_srl값을 구해와서 세팅한다. - $obj->module_srl = $this->module_srl; - - // 공지사항 지정 변수값인 is_notice가 Y가 아니거나 관리자가 아니라면 공지사항은 무조건 N로 세팅한다. - if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N'; - - /** - * 문서의 신규 입력인지 수정인지에 대한 체크를 하기 위해서 document model을 통해 원본 문서가 있는지 확인하는 절차를 거쳐야 한다. - **/ - $oDocumentModel = &getModel('document'); - - // document module의 controller 객체 생성 - $oDocumentController = &getController('document'); - - // 문서객체를 구해온다. - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - - /** - * 제목은 document모델에서는 필수 요건이다. - * 방명록에서는 제목이 필요 없어서 본문의 내용중 앞 10자리의 글자를 잘라서 제목으로 강제 적용한다. - **/ - $obj->title = cut_str($obj->content,10,'...'); - - /** - * 이미 존재하는 글일 경우 수정을 한다. - * 글 수정은 document controller의 updateDocument() method를 이용한다. - * 결과메세지를 일단 강제로 정의 해 놓는다. - **/ - if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { - $output = $oDocumentController->updateDocument($oDocument, $obj); - $msg_code = 'success_updated'; - - /** - * 존재하지 않는다고 판단이 되면 신규글 입력을 한다. - * 신규글 입력은 document controller의 inesrtDocument() method를 이용한다. - * 결과메세지를 일단 강제로 정의 해 놓는다. - **/ - } else { - $obj->document_srl = getNextSequence(); - $output = $oDocumentController->insertDocument($obj); - $msg_code = 'success_registed'; - } - - /** - * updateDocument(), insertDocument()에서 오류가 발생하였으면 리턴받은 객체 자체를 바로 돌려준다. - * 이 object객체는 error, message등의 내부 변수를 이용하여 에러 발생 유무와 에러 메세지를 가지고 있다. - **/ - if(!$output->toBool()) return $output; - - /** - * 결과를 리턴하기 위해서 mid, document_srl값을 세팅을 한다. - * controller의 경우 대부분 xml로 요청을 받고 xml로 return을 하게 된다. - * $this->add(key, value)로 세팅된 값들은 결과 xml에서 사용이 된다. - * 이 값들은 javascript에서 xml handler를 통해서 사용이 가능하게 되고 보통 url조합을 할때 사용이 된다. - **/ - $this->add('mid', Context::get('mid')); - $this->add('document_srl', $output->get('document_srl')); - - /** - * 성공 메세지 등록 - * setMessage($message)는 xml에 지정이 되고 이 message는 javascript에서 alert()를 시키게 된다. - **/ - $this->setMessage($msg_code); - } - - /** - * @brief 문서 삭제 - **/ - function procGuestbookDeleteDocument() { - // 문서 번호 확인 - $document_srl = Context::get('document_srl'); - - // 문서 번호가 없다면 오류 발생 - if(!$document_srl) return $this->doError('msg_invalid_document'); - - // document module model 객체 생성 - $oDocumentController = &getController('document'); - - // 삭제 시도 - $output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager); - - // 삭제시 실패하였을 경우 리턴받은 객체를 그대로 리턴. - if(!$output->toBool()) return $output; - - // 성공 메세지 등록 - $this->add('mid', Context::get('mid')); - $this->add('page', Context::get('page')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 댓글 추가 - **/ - function procGuestbookInsertComment() { - // 권한 체크 - if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted'); - - // 댓글 입력에 필요한 데이터 추출 - $obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage'); - $obj->module_srl = $this->module_srl; - - // comment 모듈의 model 객체 생성 - $oCommentModel = &getModel('comment'); - - // comment 모듈의 controller 객체 생성 - $oCommentController = &getController('comment'); - - /** - * 게시판이나 블로그와 달리 방명록의 댓글은 textarea를 그대로 사용한다. - * 따라서 줄바꾸임나 태그제거등의 작업을 해주어야 함 - **/ - $obj->content = nl2br(strip_tags($obj->content)); - - /** - * 존재하는 댓글인지를 확인하여 존재 하지 않는 댓글이라면 신규로 등록하기 위해서 comment_srl의 sequence값을 받는다 - **/ - if(!$obj->comment_srl) { - $obj->comment_srl = getNextSequence(); - } else { - $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager); - } - - // comment_srl이 없을 경우 신규 입력 - if($comment->comment_srl != $obj->comment_srl) { - - // parent_srl이 있으면 답변으로 - if($obj->parent_srl) { - $parent_comment = $oCommentModel->getComment($obj->parent_srl); - if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request'); - - $output = $oCommentController->insertComment($obj); - - // 없으면 신규 - } else { - $output = $oCommentController->insertComment($obj); - } - - // comment_srl이 있으면 수정으로 - } else { - $obj->parent_srl = $comment->parent_srl; - $output = $oCommentController->updateComment($obj, $this->grant->manager); - $comment_srl = $obj->comment_srl; - } - - // 오류 발생시 객체 그대로 리턴. - if(!$output->toBool()) return $output; - - // 댓글 입력후 페이지 이동을 위한 변수 및 메세지를 설정한다. - $this->add('mid', Context::get('mid')); - $this->add('document_srl', $obj->document_srl); - $this->add('comment_srl', $obj->comment_srl); - - $this->setMessage('success_registed'); - } - - /** - * @brief 댓글 삭제 - **/ - function procGuestbookDeleteComment() { - // 댓글 번호 확인 - $comment_srl = Context::get('comment_srl'); - if(!$comment_srl) return $this->doError('msg_invalid_request'); - - // comment 모듈의 controller 객체 생성 - $oCommentController = &getController('comment'); - $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager); - - // 오류 발생시 객체 그대로 리턴. - if(!$output->toBool()) return $output; - - // 댓글 입력후 페이지 이동을 위한 변수 및 메세지를 설정한다. - $this->setMessage('success_deleted'); - $this->add('mid', Context::get('mid')); - $this->add('page', Context::get('page')); - $this->add('document_srl', $output->get('document_srl')); - } - - /** - * @brief 문서와 댓글의 비밀번호를 확인 - * 비밀번호와 문서 혹은 댓글의 비밀번호를 비교하여 이상이 없다면 해당 문서 또는 댓글에 권한을 부여한다. - * 이 권한은 세션에 저장이 되어 차후 다시 수정등을 할 경우 비밀번호 검사를 하지 않게 된다. - **/ - function procGuestbookVerificationPassword() { - // 비밀번호와 문서 번호를 받음 - $password = Context::get('password'); - $document_srl = Context::get('document_srl'); - $comment_srl = Context::get('comment_srl'); - - $oMemberModel = &getModel('member'); - - // comment_srl이 있을 경우 댓글이 대상 - if($comment_srl) { - // 문서번호에 해당하는 글이 있는지 확인 - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl); - if(!$oComment->isExists()) return new Object(-1, 'msg_invalid_request'); - - // 문서의 비밀번호와 입력한 비밀번호의 비교 - if(!$oMemberModel->isValidPassword($oComment->get('password'),$password)) return new Object(-1, 'msg_invalid_password'); - - $oComment->setGrant(); - } else { - // 문서번호에 해당하는 글이 있는지 확인 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request'); - - // 문서의 비밀번호와 입력한 비밀번호의 비교 - if(!$oMemberModel->isValidPassword($oDocument->get('password'),$password)) return new Object(-1, 'msg_invalid_password'); - - $oDocument->setGrant(); - } - } - - } -?> diff --git a/modules/guestbook/guestbook.view.php b/modules/guestbook/guestbook.view.php deleted file mode 100644 index ad0836358..000000000 --- a/modules/guestbook/guestbook.view.php +++ /dev/null @@ -1,328 +0,0 @@ -module_srl) Context::set('module_srl',$this->module_srl); - - /** - * 현재 방명록 모듈의 정보를 module_info라는 이름으로 템플릿에서 사용할 수 있게 하기 위해 세팅한다 - **/ - Context::set('module_info',$this->module_info); - - /** - * 스킨 정보에서 받는 목록수나 페이지수를 미리 선언해 놓는다 - **/ - $this->list_count = $this->module_info->list_count?$this->module_info->list_count:20; - $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10; - - /** - * 모듈정보에서 넘어오는 skin값을 이용하여 최종 출력할 템플릿의 위치를 출력한다. - * $this->module_path는 ./modules/guestbook/의 값을 가지고 있다 - **/ - $template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin); - $this->setTemplatePath($template_path); - - } - - /** - * @brief 목록 및 입력항목 출력 - **/ - function dispGuestbookContent() { - /** - * 목록 구현에 필요한 변수들을 가져온다 - * 방명록은 기본적으로 page변수만 있으면 된다 - **/ - $page = Context::get('page'); - - $oDocumentModel = &getModel('document'); ///< getModel, getController, getView 함수를 통해서 간단히 원하는 객체를 생성할 수 있다. - - /** - * write_form.html을 목록에서도 include를 하게 되는데 write_form.html의 경우 $oDocument라는 선택된 문서의 객체가 필요하다. - * 목록에서는 수정이 아닌 입력만 있어서 이 $oDocument라는 object를 생성을 해 준다 - **/ - $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); - Context::set('oDocument', $oDocument); - - /** - * 글 작성 권한이 있다면 글쓰기 에디터를 세팅한다 - * write_document는 ./conf/module.xml에 정의되어 있고 관리페이지에서 권한 그룹을 설정한 값이다. - **/ - if($this->grant->write_document) { - /** - * 에디터에서 사용할 고유 문서 번호를 구해 온다. - * ZBXE에서는 모든 고유값을 getNextSequence() 로 구해 올 수 있고 글쓰기(editor) 모듈은 이 고유번호를 바탕으로 동작을 한다. - **/ - $document_srl = getNextSequence(); - - /** - * editor model객체의 getEditor method를 호출하여 세팅한다. - * 이 때 여러가지 옵션을 지정하여 다른 에디터 코드를 받을 수 있다. - **/ - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'document_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = false; ///< 파일 업로드 기능을 제한 - $option->enable_autosave = false; ///< 자동 저장 기능을 활성화 - $option->enable_default_component = false; ///< 기본 에디터 컴포넌트의 활성화 - $option->enable_component = false; ///< 추가 에디터 컴포넌트의 활성화 - $option->resizable = false; ///< 글쓰기 폼의 상하 조절 가능하도록 설정 - $option->disable_html = true; ///< html_mode - $option->height = 200; ///< 에디터의 높이 지정 - $editor = $oEditorModel->getEditor($document_srl, $option); ///< 에디터코드를 받음 - Context::set('editor', $editor); ///< 에디터코드를 editor라는 이름으로 세팅. - } - - /** - * document 모듈을 이용해서 현재 방명록의 module_srl로 목록을 구한다. - * 목록을 구할때 필요한 변수를 $args에 세팅후 document.model객체를 생성하고 getDocumentList() method를 호출한다. - **/ - // 목록을 구하기 위한 옵션 - $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl - $args->page = $page; ///< 페이지 - $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수 - $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수 - $args->sort_index = 'list_order'; ///< 목록의 정렬 대상 (list_order, 즉 날짜의 역순을 정렬 대상으로 한다) - $args->order_type = 'asc'; ///< 정렬 순서 (list_order는 -1부터 -1되어서 저장되는 값이라 asc로 정렬 순서를 정하면 된다) - - /** - * document model객체를 생성하여 목록을 구한다. - **/ - $output = $oDocumentModel->getDocumentList($args); - - /** - * 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 - * ZBXE에서 목록의 경우 5가지의 값으로 결과를 받는다. - * total_count : 대상의 전체 글 수 - * total_page : 대상의 전체 페이지 수 (list_count, page_count로 계산되어진 값) - * page : 현재 페이지 - * data : 목록 배열 - * page_navigation : 페이지 네비게이션을 출력하기 위한 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); - - /** - * 템플릿 파일을 지정한다. - * 이미 template path는 init()에서 정의를 하였다. - **/ - $this->setTemplateFile('list'); - } - - /** - * @brief 글 수정 화면 출력 - **/ - function dispGuestbookModify() { - // 권한 체크 - if(!$this->grant->write_document) return $this->dispGuestbookMessage('msg_not_permitted'); - - // GET parameter에서 document_srl을 가져옴 - $document_srl = Context::get('document_srl'); - - // document 모듈 객체 생성 - $oDocumentModel = &getModel('document'); - - $oDocument = $oDocumentModel->getDocument(0, $this->grant->manager); - $oDocument->setDocument($document_srl); - - if(!$oDocument->isExists()) Context::set('document_srl',''); - - if(!$document_srl) $document_srl = getNextSequence(); - - // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 - if($oDocument->isExists()&&!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); - - Context::set('document_srl',$document_srl); - Context::set('oDocument', $oDocument); - - // 에디터 모듈의 getEditor를 호출하여 세팅 - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'document_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = $this->grant->fileupload; - $option->enable_autosave = true; - $option->enable_default_component = true; - $option->enable_component = true; - $option->resizable = true; - $option->height = 600; - $editor = $oEditorModel->getEditor($document_srl, $option); - Context::set('editor', $editor); - - $this->setTemplateFile('write_form'); - } - - - /** - * @brief 문서 삭제 화면 출력 - **/ - function dispGuestbookDelete() { - /** - * 권한 체크 - * 글쓰기 권한이 없다면 아예 접근이 불가능하도록 해 버린다. - **/ - if(!$this->grant->write_document) return $this->dispGuestbookMessage('msg_not_permitted'); - - /** - * 삭제할 문서번호를 가져온다 - * 이 문서 번호는 get parmameter에 저장되어 있고 Context 클래스에서 미리 세팅을 해 놓은 상태이다. - **/ - $document_srl = Context::get('document_srl'); - - /** - * 문서 번호가 없으면 잘못된 접근으로 에러 메세지를 출력한다. - **/ - if(!$document_srl) return $this->dispGuestbookMessage('msg_invalid_request'); - - /** - * 문서 번호로 문서객체를 구해온다 - **/ - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 대상 문서가 없으면 에러 - if(!$oDocument->isExists()) return $this->dispGuestbookContent(); - - /** - * 권한을 체크한다. - * 권한 체크는 글쓴 사용자와 현재 로그인한 사용자의 정보가 같거나 최고관리자 일 경우 권한이 있다고 판단하고, - * 그렇지 않은 경우는 비밀번호 입력 폼을 출력한다. - **/ - if(!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form'); - - // 구해진 문서를 context setting하고 delete_form.html 파일을 템플릿 파일로 지정하여 삭제 폼을 출력한다. - Context::set('oDocument',$oDocument); - - // delete_from.html 템플릿 파일의 지정 - $this->setTemplateFile('delete_form'); - } - - /** - * @brief 댓글의 답글 화면 출력 - **/ - function dispGuestbookReplyComment() { - // 댓글 작성 권한을 체크한다. - if(!$this->grant->write_comment) return $this->dispGuestbookMessage('msg_not_permitted'); - - // 댓글의 답글을 출력하기 위해서 문서와 원 댓글의 유효성을 검사하기 위해 변수를 가져온다. - $document_srl = Context::get('document_srl'); - $parent_srl = Context::get('comment_srl'); - - // 지정된 원 댓글이 없다면 오류 - if(!$parent_srl) return new Object(-1, 'msg_invalid_request'); - - // 해당 댓글를 찾아본다 - $oCommentModel = &getModel('comment'); - $source_comment = $oCommentModel->getComment($parent_srl, $this->grant->manager); - - // 댓글이 없다면 오류 - if(!$source_comment) return $this->dispGuestbookMessage('msg_invalid_request'); - - // 필요한 정보들 세팅 - Context::set('document_srl',$source_comment->document_srl); - Context::set('parent_srl',$parent_srl); - Context::set('comment_srl',NULL); - Context::set('source_comment',$source_comment); - - /** - * comment_form.html 템플릿 파일을 출력할 파일로 지정 - **/ - $this->setTemplateFile('comment_form'); - } - - /** - * @brief 댓글 수정 폼 출력 - **/ - function dispGuestbookModifyComment() { - // 댓글 작성 권한을 체크한다. - if(!$this->grant->write_comment) return $this->dispGuestbookMessage('msg_not_permitted'); - - // 댓글을 수정하기 위하여 문서와 원 댓글의 유효성을 검사하기 위해 변수를 가져온다. - $document_srl = Context::get('document_srl'); - $comment_srl = Context::get('comment_srl'); - - // 지정된 댓글이 없다면 오류 - if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); - - // 해당 댓글를 찾아본다 - $oCommentModel = &getModel('comment'); - $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); - - // 댓글이 없다면 오류 - if(!$comment) return $this->dispGuestbookMessage('msg_invalid_request'); - - // 문서번호를 context setting한다 - Context::set('document_srl',$comment->document_srl); - - // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로 - if(!$comment->is_granted) return $this->setTemplateFile('input_password_form'); - - // 필요한 정보들 세팅 - Context::set('comment_srl',$comment_srl); - Context::set('comment', $comment); - - // comment_form 파일을 템플릿 출력 파일로 지정 - $this->setTemplateFile('comment_form'); - } - - /** - * @brief 댓글 삭제 화면 출력 - **/ - function dispGuestbookDeleteComment() { - // 댓글 작성 권한을 체크한다. - if(!$this->grant->write_comment) return $this->dispGuestbookMessage('msg_not_permitted'); - - // 삭제할 댓글번호를 가져온다 - $comment_srl = Context::get('comment_srl'); - - // 삭제하려는 댓글이 있는지 확인 - if(!$comment_srl) return $this->dispGuestbookMessage('msg_invalid_request'); - - // 해당 댓글을 가져온다. - $oCommentModel = &getModel('comment'); - $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager); - - // 삭제하려는 댓글이 없으면 에러 - if(!$comment) return $this->dispGuestbookContent('msg_invalid_request'); - - // 문서 번호를 context setting한다. - Context::set('document_srl',$comment->document_srl); - - // 권한이 없는 경우 비밀번호 입력화면으로 - if(!$comment->is_granted) return $this->setTemplateFile('input_password_form'); - - Context::set('comment',$comment); - - // delete_comemnt_form.html파일을 출력 파일로 지정한다. - $this->setTemplateFile('delete_comment_form'); - } - - /** - * @brief 메세지 출력 - **/ - function dispGuestbookMessage($msg_code) { - $msg = Context::getLang($msg_code); - if(!$msg) $msg = $msg_code; - Context::set('message', $msg); - $this->setTemplateFile('message'); - } - - } -?> diff --git a/modules/guestbook/lang/en.lang.php b/modules/guestbook/lang/en.lang.php deleted file mode 100644 index 2b14f4a9d..000000000 --- a/modules/guestbook/lang/en.lang.php +++ /dev/null @@ -1,16 +0,0 @@ -guestbook = "Guestbook"; - - // Words used in buttons - $lang->cmd_guestbook_list = 'Guestbook List'; - $lang->cmd_module_config = 'Common Guestbook Configuration'; - $lang->cmd_view_info = 'Guestbook Info'; - - $lang->about_board = "This module is used for creating and managing guestbooks.\nSelect the module's name from the list after creating one to configurate specifically.\nBe careful with guestbook's module name, since it will be the url. (ex : http://domain/zb/?mid=modulename)"; -?> diff --git a/modules/guestbook/lang/es.lang.php b/modules/guestbook/lang/es.lang.php deleted file mode 100644 index e56b02c0d..000000000 --- a/modules/guestbook/lang/es.lang.php +++ /dev/null @@ -1,16 +0,0 @@ -board = "Tablero de Visitas"; - - // Palabras utilizadas en los botones - $lang->cmd_board_list = 'Lista de tebleros de visitas'; - $lang->cmd_module_config = 'Configuración común del tablero de visitas'; - $lang->cmd_view_info = 'Información del tablero de visitas'; - - $lang->about_board = "El módulo es usado para crear y manejar los tableros de visitas.\nLuego de crear un Tablero, seleciona el nombre del módulo en la lista para la configuración más detallada.\nSea cuidadoso con el nombre del módulo, ya que ese nombre va a ser la dirección URL. (ej : http://dominio/zb/?mid=nombre del módulo)"; -?> diff --git a/modules/guestbook/lang/jp.lang.php b/modules/guestbook/lang/jp.lang.php deleted file mode 100644 index 5468fab1a..000000000 --- a/modules/guestbook/lang/jp.lang.php +++ /dev/null @@ -1,16 +0,0 @@ -guestbook = "ゲストブック"; - - // ボタンに使用する用語 - $lang->cmd_guestbook_list = 'ゲストブックリスト'; - $lang->cmd_module_config = 'ゲストブック共通設定'; - $lang->cmd_view_info = 'ゲストブック情報'; - - $lang->about_guestbook = "ゲストブックを作成・管理できるモジュールです。作成後、リストからモジュール名を選択すると詳細な設定ができます。ゲストブックのモジュール名は、接続URLになるため、慎重に入力してください。(例:http://ドメイン/zb/?mid=モジュール名)"; -?> diff --git a/modules/guestbook/lang/ko.lang.php b/modules/guestbook/lang/ko.lang.php deleted file mode 100644 index e8bb2da38..000000000 --- a/modules/guestbook/lang/ko.lang.php +++ /dev/null @@ -1,16 +0,0 @@ -guestbook = "방명록"; - - // 버튼에 사용되는 언어 - $lang->cmd_guestbook_list = '방명록 목록'; - $lang->cmd_module_config = '방명록 공통 설정'; - $lang->cmd_view_info = '방명록 정보'; - - $lang->about_guestbook = "방명록을 생성하고 관리할 수 있는 방명록 모듈입니다.\n생성하신 후 목록에서 모듈이름을 선택하시면 자세한 설정이 가능합니다.\n방명록의 모듈이름은 접속 url이 되므로 신중하게 입력해주세요. (ex : http://도메인/zb/?mid=모듈이름)"; -?> diff --git a/modules/guestbook/lang/ru.lang.php b/modules/guestbook/lang/ru.lang.php deleted file mode 100644 index 3c27ab74c..000000000 --- a/modules/guestbook/lang/ru.lang.php +++ /dev/null @@ -1,16 +0,0 @@ - | 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->guestbook = "Гостевая книга"; - - // Слова, использованные в кнопках - $lang->cmd_guestbook_list = 'Список гостевых книг'; - $lang->cmd_module_config = 'Общая конфигурация гостевых книг'; - $lang->cmd_view_info = 'Информация гостевой книги'; - - $lang->about_board = "Этот модуль служит для создания и управления гостевыми книгами.\nВы можете выбрать имя модуля из списка после создания для дополнительного конифигурирования.\nПожалуйста, будте осторожны с именем модуля форума, поскольку оно будет URL. (например : http://domain/zb/?mid=имя_модуля)"; -?> diff --git a/modules/guestbook/lang/zh-CN.lang.php b/modules/guestbook/lang/zh-CN.lang.php deleted file mode 100644 index d88855e7e..000000000 --- a/modules/guestbook/lang/zh-CN.lang.php +++ /dev/null @@ -1,16 +0,0 @@ -guestbook = "留言本"; - - // 按钮语言 - $lang->cmd_guestbook_list = '留言本目录'; - $lang->cmd_module_config = '留言本共同设置'; - $lang->cmd_view_info = '留言本信息'; - - $lang->about_guestbook = "可生成并管理留言本的模块。\n生成留言本后在留言本目录中点击模块名既可设置更详细的相关项目。\n因留言本的模块名将变成其url中的一部分,所以请慎重填写模块名(ex:http://域名/zb/?mid=模块名)。"; -?> diff --git a/modules/guestbook/queries/getGuestbookList.xml b/modules/guestbook/queries/getGuestbookList.xml deleted file mode 100644 index 090dec365..000000000 --- a/modules/guestbook/queries/getGuestbookList.xml +++ /dev/null @@ -1,24 +0,0 @@ - - -
    - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/guestbook/skins/default/comment.html b/modules/guestbook/skins/default/comment.html deleted file mode 100644 index 441f5d69d..000000000 --- a/modules/guestbook/skins/default/comment.html +++ /dev/null @@ -1,66 +0,0 @@ - -
    - - {@ $_comment_list = $document->getComments() } - - -
    -
    - - - -
    - - {$lang->cmd_delete} - {$lang->cmd_modify} - - {$lang->cmd_reply} -
    - -
    - - {$comment->getRegdate('Y.m.d')} {$comment->getRegdate('H:i:s')} - - - ({$comment->get('ipaddress')}) - -
    - -
    - - - {$comment->getNickName()} - - {$comment->getNickName()} - - -
    {$comment->getNickName()}
    - -
    - -
    - -
    - - - {$lang->msg_is_secret} - - - - - -
    - -
    - - - {$comment->getContent(false)} - -
    - -
    -
    - - -
    - diff --git a/modules/guestbook/skins/default/comment_form.html b/modules/guestbook/skins/default/comment_form.html deleted file mode 100644 index 46a55f4da..000000000 --- a/modules/guestbook/skins/default/comment_form.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - -
    -
    -
    - - {$source_comment->getRegdate('Y.m.d')} {$source_comment->getRegdate('H:i:s')} - - - ({$source_comment->get('ipaddress')}) - -
    - -
    - - - {$source_comment->getNickName()} - - {$source_comment->getNickName()} - - -
    {$source_comment->getNickName()}
    - -
    - -
    - -
    - - - {$lang->msg_is_secret} -
    - - - - -
    - -
    - - - {$source_comment->getContent(false)} - -
    -
    -
    - - - -
    -
    - - - - - - -
    - - - - - - - - - - - -
    - -
    -
    - is_secret=='Y')-->checked="checked"/> - -
    - -
    - notify_message == 'Y')-->checked="checked" id="notify_message" /> - -
    - -
    - -
    - -
    - - - - -
    - -
    - - - - diff --git a/modules/guestbook/skins/default/css/guestbook.css b/modules/guestbook/skins/default/css/guestbook.css deleted file mode 100644 index 8ae411843..000000000 --- a/modules/guestbook/skins/default/css/guestbook.css +++ /dev/null @@ -1,105 +0,0 @@ -@charset "utf-8"; - -/* guestbook Title */ -.guestbookHeader { border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/bgH3.gif) repeat-x left bottom; overflow:hidden; _width:100%;} -.guestbookHeader h3 { border-bottom:3px solid #fe3614; } -.guestbookHeader h3 { float:left; font-size:1.2em; padding:1em 2em .7em 1.2em; background:#ffffff url(../images/lineH3.gif) no-repeat right bottom;} - -/* guestbook Description */ -.guestbookDescription { color:#AEAEAE; border:1px solid #DDDDDD; overflow:hidden; padding:1em; margin-top:1em;} - -.guestbookInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;} - -.articleNum { float:left; padding:0 0 0 15px; } - -/* account Navigation */ -.accountNavigation { float:right; } -.accountNavigation li { float:left; margin-left:7px; list-style:none; padding-top:3px;} -.accountNavigation li a { font-size:12px; white-space:nowrap; color:#666666; text-decoration:none;} -.accountNavigation li.setup a { background:url(../images/iconSetup.gif) no-repeat left top; padding-left:14px; } -.accountNavigation li.admin a { background:url(../images/iconAdmin.gif) no-repeat left top; padding-left:12px; } -.accountNavigation li.listType { margin-left:5px; } -.accountNavigation li.loginAndLogout { background:url(../images/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; _padding-top:5px;} -*:first-child+html li.loginAndLogout { padding-top:5px; } - - -/* pageNavigation */ -.pageNavigation { display:block; margin-top:1em; text-align:center; font:bold 11px Tahoma; margin-top:1.5em;} -.pageNavigation a { position:relative; margin-left:-4px; font:bold 1em Tahoma; color:#666666; display:inline-block; padding:1px 7px 2px 6px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; } -.pageNavigation .current { position:relative; margin-left:-4px; font:bold 11px Tahoma; display:inline-block; padding:1px 7px 1px 6px; border-left:1px solid #dedfde; text-decoration:none; line-height:1em; } -.pageNavigation a:hover { background:#F7F7F7; text-decoration:none; } -.pageNavigation a:visited { color:#999999; } -.pageNavigation a.goToFirst, .pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; vertical-align:top; padding:0px 7px 4px 6px;} -.pageNavigation a.goToFirst img, .pageNavigation a.goToLast img { display:inline-block; padding:2px 0; position:relative; top:2px; _top:1px;} - -.boardWrite { border:1px solid #DDDDDD; background-color:#EFEFEF; overflow:hidden; position:relative; margin-bottom:20px; padding:.5em 0; } -.boardWrite .inputTypeText { width:100px; } -.boardWrite .userNameAndPw { margin-bottom:-1px; padding:.5em 0; margin-left:20px;} -.boardWrite .boardEditor fieldset { width:auto; position:relative;} -.boardWrite .option { margin-left:20px; padding:.5em 0; overflow:hidden; width:90%;} -.boardWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} -.boardWrite .option dd * { vertical-align:middle;} -.boardWrite .option dd select { width:7em; font-size:.95em;height:20px;} -.boardWrite .inputTypeText { background:#fbfbfb;} - -.commentWrite { border:1px solid #EFEFEF; overflow:hidden; position:relative; margin-top:10px; margin-bottom:20px; padding:.5em 0; } -.commentWrite .inputTypeText { width:100px; } -.commentWrite .userNameAndPw { margin-bottom:-1px; padding:.5em 0; margin-left:20px;} -.commentWrite .commentEditor fieldset { width:auto; position:relative; border:none;} -.commentWrite .option { margin-left:20px; padding:.5em 0; overflow:hidden; width:90%;} -.commentWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;} -.commentWrite .option dd * { vertical-align:middle;} -.commentWrite .option dd select { width:7em; font-size:.95em;height:20px;} -.commentWrite .inputTypeText { background:#fbfbfb;} -.commentWrite .editorBox { text-align:center; margin-bottom:10px;} -.commentWrite .textarea { width:98%; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:8em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; } - -.documentBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} -.documentBox .documentItem { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; list-style:none;} -.documentBox p { display:inline; margin-bottom:1em;} -.documentBox .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0; cursor:pointer;} -.documentBox .author a { color:#3074a5; margin-right:.3em; text-decoration:none; } -.documentBox .voted { float:left; font-size:.9em; color:#AAAAAA; margin:0 .3em .5em 1em;} -.documentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} - -.documentBox .documentOption { float:right; white-space:nowrap; margin-left:.2em;} -.documentBox .documentOption img { vertical-align:middle;} - -.documentBox .documentContent { clear:left; } -.documentBox .documentContent p { display:block; } -.documentBox .documentContent ul li { padding:0; border:none; line-height:1.25em; list-style:disc;} -.documentBox .documentContent ol li { padding:0; border:none; line-height:1.25em; list-style:decimal;} -.documentBox .document { background-color:#FAFAFA;} - -.smallBox { border:1px solid #e0e1db; margin-left:auto; margin-right:auto; } -.smallBox.w268 { width:268px;} -.smallBox .header { position:relative; _width:100%; background:#ffffff url(../images/normal/bgH3.gif) no-repeat left bottom; overflow:hidden;} -.smallBox .header h3 { clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; } -.smallBox .complex { padding:1.5em 2em 2em 2em;} -.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;} - - -.replyBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db; margin-top:.5em;} -.replyBox .replyItem { padding:.6em .8em .6em .6em; line-height:1.25em; clear:both; list-style:none; border-bottom:1px dotted #e0e1db;} -.replyBox p { display:inline; margin-bottom:1em;} -.replyBox .author { float:left; padding:0 .3em 0 0; font-size:.9em; color:#3074a5; margin:0 .3em .5em 0;} -.replyBox .author a { color:#3074a5; margin-right:.3em; text-decoration:none; } -.replyBox .voted { float:left; font-size:.9em; color:#AAAAAA; margin:0 .3em .5em 1em;} -.replyBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin:.3em 0 .5em 0;} - -.replyBox .replyOption { float:right; white-space:nowrap; margin-left:.2em;} -.replyBox .replyOption img { vertical-align:middle;} - -.replyBox .replyContent { clear:left; } -.replyBox .replyContent p { display:block; } -.replyBox .replyContent ul li { padding:0; border:none; line-height:1.25em; list-style:disc;} -.replyBox .replyContent ol li { padding:0; border:none; line-height:1.25em; list-style:decimal;} -.replyBox .reply { background-color:#FAFAFA;} -.replyBox .replyIndent { background:url(../images/common/iconReplyArrow.gif) no-repeat .0em .3em; padding-left:1.3em;} - -.replyBox .fileAttached { _width:99%; border:1px solid #eaeae7; overflow:hidden; background:#fbfbfb; margin-top:.3em; list-style:none;} -.replyBox .fileAttached ul { float:left; padding:.3em 1em .2em 0; margin-left:.5em; _margin-left:.25em;} -.replyBox .fileAttached li a { font-size:.9em; white-space:nowrap; position:relative; color:#444444; } -.replyBox .fileAttached li a:visited { color:#777777;} diff --git a/modules/guestbook/skins/default/delete_comment_form.html b/modules/guestbook/skins/default/delete_comment_form.html deleted file mode 100644 index a06174f59..000000000 --- a/modules/guestbook/skins/default/delete_comment_form.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -
    - -
    -

    {$lang->confirm_delete}

    -
    - -
    - - - - - - - - -
    - - - diff --git a/modules/guestbook/skins/default/delete_form.html b/modules/guestbook/skins/default/delete_form.html deleted file mode 100644 index 1ca638c93..000000000 --- a/modules/guestbook/skins/default/delete_form.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -
    - -
    -

    {$lang->confirm_delete}

    -
    - -
    - - - - - - - -
    - - diff --git a/modules/guestbook/skins/default/filter/delete_comment.xml b/modules/guestbook/skins/default/filter/delete_comment.xml deleted file mode 100644 index 3780d6a18..000000000 --- a/modules/guestbook/skins/default/filter/delete_comment.xml +++ /dev/null @@ -1,18 +0,0 @@ - -
    - - - - - - - - - - - - - - - -
    diff --git a/modules/guestbook/skins/default/filter/input_password.xml b/modules/guestbook/skins/default/filter/input_password.xml deleted file mode 100644 index 2e26fbde8..000000000 --- a/modules/guestbook/skins/default/filter/input_password.xml +++ /dev/null @@ -1,15 +0,0 @@ - -
    - - - - - - - - - - - - -
    diff --git a/modules/guestbook/skins/default/filter/insert_comment.xml b/modules/guestbook/skins/default/filter/insert_comment.xml deleted file mode 100644 index 674c9501d..000000000 --- a/modules/guestbook/skins/default/filter/insert_comment.xml +++ /dev/null @@ -1,28 +0,0 @@ - -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/modules/guestbook/skins/default/footer.html b/modules/guestbook/skins/default/footer.html deleted file mode 100644 index 9d5404ca8..000000000 --- a/modules/guestbook/skins/default/footer.html +++ /dev/null @@ -1 +0,0 @@ -{$module_info->footer_text} diff --git a/modules/guestbook/skins/default/header.html b/modules/guestbook/skins/default/header.html deleted file mode 100644 index 9543c2827..000000000 --- a/modules/guestbook/skins/default/header.html +++ /dev/null @@ -1,58 +0,0 @@ - - -{$module_info->header_text} - - - -
    -

    {$module_info->title}

    -
    - - - - -
    {$module_info->memo}
    - - - -
    - - - -
    {$lang->document_count} {number_format($total_count)}
    - - - - -
    - - diff --git a/modules/guestbook/skins/default/images/bgH3.gif b/modules/guestbook/skins/default/images/bgH3.gif deleted file mode 100644 index 0d07bb456..000000000 Binary files a/modules/guestbook/skins/default/images/bgH3.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/images/bottomGotoFirst.gif b/modules/guestbook/skins/default/images/bottomGotoFirst.gif deleted file mode 100644 index e0297fecb..000000000 Binary files a/modules/guestbook/skins/default/images/bottomGotoFirst.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/images/bottomGotoLast.gif b/modules/guestbook/skins/default/images/bottomGotoLast.gif deleted file mode 100644 index 0a7141d0d..000000000 Binary files a/modules/guestbook/skins/default/images/bottomGotoLast.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/images/buttonDeleteX.gif b/modules/guestbook/skins/default/images/buttonDeleteX.gif deleted file mode 100644 index c066e49be..000000000 Binary files a/modules/guestbook/skins/default/images/buttonDeleteX.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/images/buttonModifyE.gif b/modules/guestbook/skins/default/images/buttonModifyE.gif deleted file mode 100644 index 1cde1b60f..000000000 Binary files a/modules/guestbook/skins/default/images/buttonModifyE.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/images/buttonReply.gif b/modules/guestbook/skins/default/images/buttonReply.gif deleted file mode 100644 index 600534865..000000000 Binary files a/modules/guestbook/skins/default/images/buttonReply.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/images/lineH3.gif b/modules/guestbook/skins/default/images/lineH3.gif deleted file mode 100644 index fe42fe378..000000000 Binary files a/modules/guestbook/skins/default/images/lineH3.gif and /dev/null differ diff --git a/modules/guestbook/skins/default/input_password_form.html b/modules/guestbook/skins/default/input_password_form.html deleted file mode 100644 index 0a26427de..000000000 --- a/modules/guestbook/skins/default/input_password_form.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - -
    - - - - - - - - - - -
    {$lang->msg_input_password}
    {$lang->password}
    - - -
    - - - diff --git a/modules/guestbook/skins/default/js/guestbook.js b/modules/guestbook/skins/default/js/guestbook.js deleted file mode 100644 index 2af522f3e..000000000 --- a/modules/guestbook/skins/default/js/guestbook.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file modules/guestbook/js/guestbook.js - * @author zero (zero@nzeo.com) - * @brief guestbook 모듈의 javascript - **/ - -/* 글쓰기 작성후 */ -function completeDocumentInserted(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var mid = ret_obj['mid']; - - alert(message); - - var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('page','').setQuery('comment_srl',''); - location.href = url; -} - -/* 글 삭제 */ -function completeDeleteDocument(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var mid = ret_obj['mid']; - var page = ret_obj['page']; - - var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('comment_srl',''); - alert(message); - - location.href = url; -} - -// 현재 페이지 reload -function completeReload(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - location.href = location.href; -} - -/* 댓글 글쓰기 작성후 */ -function completeInsertComment(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var mid = ret_obj['mid']; - var document_srl = ret_obj['document_srl']; - var comment_srl = ret_obj['comment_srl']; - - var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('comment_srl',''); - alert(message); - - location.href = url; -} - -/* 댓글 삭제 */ -function completeDeleteComment(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var mid = ret_obj['mid']; - var document_srl = ret_obj['document_srl']; - var page = ret_obj['page']; - - var url = current_url.setQuery('mid',mid).setQuery('act','').setQuery('comment_srl',''); - alert(message); - - location.href = url; -} - diff --git a/modules/guestbook/skins/default/list.html b/modules/guestbook/skins/default/list.html deleted file mode 100644 index 79b4e1aa7..000000000 --- a/modules/guestbook/skins/default/list.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - -
    - -
    - - - - -
    -
    -
    - - {$lang->cmd_delete} - {$lang->cmd_modify} - -
    - -
    - - {$document->getRegdate('Y.m.d')} {$document->getRegdate('H:i:s')} - - - ({$document->get('ipaddress')}) - -
    - -
    - - - {$document->getNickName()} - - {$document->getNickName()} - - -
    {$document->getNickName()}
    - -
    - -
    - -
    - - - {$lang->msg_is_secret} -
    - - - -
    - -
    -
    - - {$document->getContent(false)} - -
    -
    - - - - - -
    - -
    -
    - - - - - -
    - - - - - - - - - - - -
    - -
    -
    - - -
    - -
    - - -
    - -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - - - - - - diff --git a/modules/guestbook/skins/default/message.html b/modules/guestbook/skins/default/message.html deleted file mode 100644 index 00bf01814..000000000 --- a/modules/guestbook/skins/default/message.html +++ /dev/null @@ -1,11 +0,0 @@ - - -
    - {$message} -
    - - - {$lang->cmd_login} - - - diff --git a/modules/guestbook/skins/default/skin.xml b/modules/guestbook/skins/default/skin.xml deleted file mode 100644 index d79ba9b40..000000000 --- a/modules/guestbook/skins/default/skin.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 방명록 기본 스킨 - 留言本默认皮肤 - ゲストブックのデフォルトスキン - - 제로 - Zero - Zero - board모듈의 default스킨 - 留言本模块的默认皮肤。 - ボード(board)モジュールのデフォルトスキンです。 - - - - 기본 - 默认 - デフォルト - - - - - 제목 - 标题 - タイトル - 방명록의 제목을 적어주세요. - 请输入留言本标题。 - ゲストブックのタイトルを入力してください。 - - - 방명록 설명 - 留言本说明 - ゲストブックの説明 - 내용의 기본값 - 内容默认值 - 内容のデフォルト値 - - - diff --git a/modules/guestbook/skins/default/write_form.html b/modules/guestbook/skins/default/write_form.html deleted file mode 100644 index 466c93728..000000000 --- a/modules/guestbook/skins/default/write_form.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - -
    -
    - - - - - - -
    - - - - - - - - - - - -
    - - -
    - -
    - isLocked())-->checked="checked" id="lock_comment" /> - -
    - -
    - isSecret())-->checked="checked" id="is_secret" /> - -
    -
    - allowComment())-->checked="checked" id="allow_comment" /> - -
    - -
    - useNotify())-->checked="checked" id="notify_message" /> - -
    - -
    - -
    {$editor}
    - -
    - -
    - -
    - -
    -
    - - - - diff --git a/modules/guestbook/tpl/filter/delete_guestbook.xml b/modules/guestbook/tpl/filter/delete_guestbook.xml deleted file mode 100644 index 21817e5d3..000000000 --- a/modules/guestbook/tpl/filter/delete_guestbook.xml +++ /dev/null @@ -1,10 +0,0 @@ - -
    - - - - - - - -
    diff --git a/modules/guestbook/tpl/filter/insert_grant.xml b/modules/guestbook/tpl/filter/insert_grant.xml deleted file mode 100644 index c8e4c8600..000000000 --- a/modules/guestbook/tpl/filter/insert_grant.xml +++ /dev/null @@ -1,11 +0,0 @@ - -
    - - - - - - - - -
    diff --git a/modules/guestbook/tpl/filter/insert_guestbook.xml b/modules/guestbook/tpl/filter/insert_guestbook.xml deleted file mode 100644 index 4b6450fa3..000000000 --- a/modules/guestbook/tpl/filter/insert_guestbook.xml +++ /dev/null @@ -1,33 +0,0 @@ - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/modules/guestbook/tpl/grant_list.html b/modules/guestbook/tpl/grant_list.html deleted file mode 100644 index dde86a6f5..000000000 --- a/modules/guestbook/tpl/grant_list.html +++ /dev/null @@ -1,38 +0,0 @@ - - - -
    {nl2br($lang->about_grant)}
    - -
    - - - - ----- - - - - - - - - - - - - - -
    {$lang->target}
    {$val->title} - - grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"/> - - - {$lang->cmd_select_all}{$lang->cmd_unselect_all}
    - -
    - -
    diff --git a/modules/guestbook/tpl/guestbook_delete.html b/modules/guestbook/tpl/guestbook_delete.html deleted file mode 100644 index d83d9ea6e..000000000 --- a/modules/guestbook/tpl/guestbook_delete.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->confirm_delete}
    {$lang->module_name}{$module_info->mid}
    {$lang->module}{$module_info->module}
    {$lang->document_count}{$module_info->document_count}
    - {$lang->cmd_back} - -
    - -
    diff --git a/modules/guestbook/tpl/guestbook_info.html b/modules/guestbook/tpl/guestbook_info.html deleted file mode 100644 index 5c4ef95ab..000000000 --- a/modules/guestbook/tpl/guestbook_info.html +++ /dev/null @@ -1,70 +0,0 @@ - - - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->module_category} - - {$lang->not_exists} - - {$module_category[$module_info->module_category_srl]->title} - -
    {$lang->layout} - - {$module_info->layout_title} ({$module_info->layout}) - - {$lang->not_exists} - -
    {$lang->skin}{$module_info->skin_title} ({$module_info->skin})
    {$lang->browser_title}{htmlspecialchars($module_info->browser_title)}
    {$lang->use_category}{$lang->use}{$lang->notuse}
    {$lang->list_count}{$module_info->list_count?$module_info->list_count:20}
    {$lang->page_count}{$module_info->page_count?$module_info->page_count:10}
    {$lang->description}{nl2br(htmlspecialchars($module_info->description))} 
    {$lang->header_text}{htmlspecialchars($module_info->header_text)} 
    {$lang->footer_text}{htmlspecialchars($module_info->footer_text)} 
    {$lang->admin_id}{implode(",",$module_info->admin_id)} 
    - {$lang->cmd_modify} - - {$lang->cmd_guestbook_list} - -
    diff --git a/modules/guestbook/tpl/guestbook_insert.html b/modules/guestbook/tpl/guestbook_insert.html deleted file mode 100644 index 9a8538403..000000000 --- a/modules/guestbook/tpl/guestbook_insert.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->mid} - -

    {$lang->about_mid}

    -
    {$lang->is_default} - is_default=='Y')-->checked="checked" id="fld_for_default" class="checkbox" /> - -
    {$lang->module_category} - -

    {$lang->about_module_category}

    -
    {$lang->browser_title} - -

    {$lang->about_browser_title}

    -
    {$lang->layout} - -

    {$lang->about_layout}

    -
    {$lang->skin} - -

    {$lang->about_skin}

    -
    {$lang->list_count} - -

    {$lang->about_list_count}

    -
    {$lang->page_count} - -

    {$lang->about_page_count}

    -
    {$lang->description} - -

    {$lang->about_description}

    -
    {$lang->header_text} - -

    {$lang->about_header_text}

    -
    {$lang->footer_text} - -

    {$lang->about_footer_text}

    -
    {$lang->admin_id} - -

    {$lang->about_admin_id}

    -
    - -
    - -
    diff --git a/modules/guestbook/tpl/header.html b/modules/guestbook/tpl/header.html deleted file mode 100644 index 817b3327c..000000000 --- a/modules/guestbook/tpl/header.html +++ /dev/null @@ -1,25 +0,0 @@ - - -

    {$lang->guestbook} {$lang->cmd_management}

    - -
    {nl2br($lang->about_guestbook)}
    - - -
    - -

    {$module_info->mid} ({$lang->is_default}) | View

    - - - -
    - - diff --git a/modules/guestbook/tpl/index.html b/modules/guestbook/tpl/index.html deleted file mode 100644 index 494a6d253..000000000 --- a/modules/guestbook/tpl/index.html +++ /dev/null @@ -1,129 +0,0 @@ - - - -
    - Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} -
    - - - - -------- - -------- - -------- - -------- - -------- - -------- - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->no} -
    - - - - -
    -
    {$lang->mid} / {$lang->browser_title}{$lang->regdate}{$lang->cmd_view}{$lang->cmd_copy}{$lang->cmd_delete}
    {$no} - - {$lang->not_exists} - - {$module_category[$val->module_category_srl]->title} - - - {$val->mid} - - {htmlspecialchars($val->browser_title)} - {zdate($val->regdate,"Y-m-d")}{$lang->cmd_view}{$lang->cmd_copy}{$lang->cmd_delete}
    - - - - - - diff --git a/modules/guestbook/tpl/js/guestbook_admin.js b/modules/guestbook/tpl/js/guestbook_admin.js deleted file mode 100644 index f641d1724..000000000 --- a/modules/guestbook/tpl/js/guestbook_admin.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file modules/guestbook/js/guestbook_admin.js - * @author zero (zero@nzeo.com) - * @brief guestbook 모듈의 관리자용 javascript - **/ - -/* 모듈 생성 후 */ -function completeInsertGuestbook(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - var page = ret_obj['page']; - var module_srl = ret_obj['module_srl']; - - alert(message); - - var url = current_url.setQuery('act','dispGuestbookAdminGuestbookInfo'); - if(module_srl) url = url.setQuery('module_srl',module_srl); - if(page) url.setQuery('page',page); - location.href = url; -} - -/* 모듈 삭제 후 */ -function completeDeleteGuestbook(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var page = ret_obj['page']; - alert(message); - - var url = current_url.setQuery('act','dispGuestbookAdminContent').setQuery('module_srl',''); - if(page) url = url.setQuery('page',page); - location.href = url; -} - -/* 권한 관련 */ -function doSelectAll(obj, key) { - var fo_obj = obj.parentNode; - while(fo_obj.nodeName != 'FORM') { - fo_obj = fo_obj.parentNode; - } - - for(var i=0;i - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->skin_default_info}
    {$lang->skin}{$skin_info->title}
    {$lang->skin_maker}{$skin_info->maker->name} ({$skin_info->maker->email_address})
    {$lang->skin_maker_homepage}{$skin_info->maker->homepage}
    {$lang->date}{$skin_info->maker->date}
    {$lang->description}{nl2br($skin_info->maker->description)}
    - - - - - - - - - - - - - - - - - - - -
    {$lang->extra_vars}
    {$lang->colorset} - -
    - - {$val->title} - - - colorset==$val->name)-->checked="checked"/> - -
    - -
    {$val->title} - - - - - - - - - - - - - value))-->checked="checked" class="checkbox" /> - - - - - - - - value)-->checked="checked"/> - - - - - - - -
    -
    - - -
    - - - - - - -

    {nl2br($val->description)}

    - -
    - -
    -
    - - diff --git a/modules/guestbook/tpl/top_refresh.html b/modules/guestbook/tpl/top_refresh.html deleted file mode 100644 index 2f4983d1d..000000000 --- a/modules/guestbook/tpl/top_refresh.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/modules/importer/importer.admin.controller.php b/modules/importer/importer.admin.controller.php index f2267357f..a67d1a2ae 100644 --- a/modules/importer/importer.admin.controller.php +++ b/modules/importer/importer.admin.controller.php @@ -55,7 +55,7 @@ if(!$xml_file) return new Object(-1, 'msg_no_xml_file'); // local 파일 지정인데 파일이 없으면 역시 에러~ - if(!eregi('^http:',$xml_file) && (!eregi("\.xml$", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); + if(!preg_match('/^http:/i',$xml_file) && (!preg_match("/\.xml$/i", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); // 이제부터 데이터를 가져오면서 처리 $fp = $this->getFilePoint($xml_file); @@ -163,8 +163,8 @@ **/ function importMember($obj) { // homepage, blog의 url을 정확히 만듬 - if($obj->homepage && !eregi("^http:\/\/",$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; - if($obj->blog && !eregi("^http:\/\/",$obj->blog)) $obj->blog = 'http://'.$obj->blog; + if($obj->homepage && !preg_match("/^http:\/\//i",$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->blog && !preg_match("/^http:\/\//i",$obj->blog)) $obj->blog = 'http://'.$obj->blog; $obj->email_address = $obj->email; list($obj->email_id, $obj->email_host) = explode('@', $obj->email); @@ -257,7 +257,7 @@ if(!$xml_file) return new Object(-1, 'msg_no_xml_file'); // local 파일 지정인데 파일이 없으면 역시 에러~ - if(!eregi('^http:',$xml_file) && (!eregi("\.xml$", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); + if(!preg_match('/^http:/i',$xml_file) && (!preg_match("/\.xml$/i", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); // 이제부터 데이터를 가져오면서 처리 $fp = $this->getFilePoint($xml_file); @@ -398,7 +398,7 @@ if(!$xml_file) return new Object(-1, 'msg_no_xml_file'); // local 파일 지정인데 파일이 없으면 역시 에러~ - if(!eregi('^http:',$xml_file) && (!eregi("\.xml$", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); + if(!preg_match('/^http:/i',$xml_file) && (!preg_match("/\.xml$/i", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); // 필요한 객체 미리 생성 $this->oDocumentController = &getController('document'); @@ -813,7 +813,7 @@ **/ function getFilePoint($filename) { $fp = null; - if(eregi('^http:', $filename)) { + if(preg_match('/^http:/i', $filename)) { $url_info = parse_url($filename); if(!$url_info['port']) $url_info['port'] = 80; if(!$url_info['path']) $url_info['path'] = '/'; @@ -902,7 +902,7 @@ if(!$xml_file) return new Object(-1, 'msg_no_xml_file'); // local 파일 지정인데 파일이 없으면 역시 에러~ - if(!eregi('^http:',$xml_file) && (!eregi("\.xml$", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); + if(!preg_match('/^http:/i',$xml_file) && (!preg_match("/\.xml$/i", $xml_file) || !file_exists($xml_file)) ) return new Object(-1,'msg_no_xml_file'); // 필요한 객체 미리 생성 $this->oDocumentController = &getController('document'); @@ -934,13 +934,16 @@ $inserted_count = 0; + ob_start(); + $this->oXmlParser = new XmlParser(); // 본문 데이터부터 처리 시작 $i=0; $started = $category_started = $post_started = false; $category_buff = ''; - while(!feof($fp)) { + $manual_break = false; + while(!$manual_break && !feof($fp)) { $str = fgets($fp, 1024); if(substr($str,0,7)=='') $str = substr($str,7); @@ -964,116 +967,136 @@ $xml_doc = $this->oXmlParser->parse($post_buff); $post = $xml_doc->post; - $obj = null; - $obj->module_srl = $module_srl; - $obj->document_srl = getNextSequence(); - $obj->title = $post->title->body; - $obj->content = str_replace('[##_ATTACH_PATH_##]/','',$post->content->body); - $obj->password = md5($post->password->body); - $obj->allow_comment = $post->acceptcomment->body==1?'Y':'N'; - $obj->allow_trackback= $post->accepttrackback->body==1?'Y':'N'; - $obj->regdate = date("YmdHis",$post->created->body); - $obj->last_update = date("YmdHis",$post->modified->body); + if($post->visibility->body=='public') { + $obj = null; + $obj->module_srl = $module_srl; + $obj->document_srl = getNextSequence(); + $obj->title = $post->title->body; + $obj->content = str_replace('[##_ATTACH_PATH_##]/','',$post->content->body); + $obj->content = preg_replace_callback('!\[##_1C\|([^\|]*)\|([^\|]*)\|(.*?)_##\]!is', array($this, '_replaceTTImgTag'), $obj->content); + $obj->content = nl2br($obj->content); + $obj->password = md5($post->password->body); + $obj->allow_comment = $post->acceptcomment->body==1?'Y':'N'; + $obj->allow_trackback= $post->accepttrackback->body==1?'Y':'N'; + $obj->regdate = date("YmdHis",$post->created->body); + $obj->last_update = date("YmdHis",$post->modified->body); - $category = trim($post->category->body); - if($category) { - $tmp_category = explode('/',$category); - if(count($tmp_category)>1) $category = $tmp_category[1]; - $obj->category_srl = (int)$category_titles[$category]; - if(!$obj->category_srl) { - $tmp = array_values($category_titles); - $obj->category_srl = (int)$tmp[0]; - } - } - $obj->user_id = $member_info->user_id; - $obj->nick_name = $member_info->nick_name; - $obj->user_name = $member_info->user_name; - $obj->member_srl = $member_info->member_srl; - - // 댓글 - $obj->comments = $this->importTTComment($post->comment); - - // 꼬리표 - $tags = $post->tag; - if(!is_array($tags)) $tags = array($tags); - if(count($tags)) { - $tag_list = array(); - foreach($tags as $key => $val) { - $tag = trim($val->body); - if(!$tag) continue; - $tag_list[] = $tag; - } - if(count($tag_list)) $obj->tags = implode(',',$tag_list); - } - - // 엮인글 - if($post->trackback) { - $trackbacks = $post->trackback; - if(!is_array($trackbacks)) $trackbacks = array($trackbacks); - if(count($trackbacks)) { - foreach($trackbacks as $key => $val) { - $tobj = null; - $tobj->url = $val->url->body; - $tobj->title = $val->title->body; - $tobj->blog_name = $val->site->body; - $tobj->excerpt = $val->excerpt->body; - $tobj->regdate = date("YmdHis",$val->received->body); - $tobj->ipaddress = $val->ip->body; - $obj->trackbacks[] = $tobj; + $category = trim($post->category->body); + if($category) { + $tmp_category = explode('/',$category); + if(count($tmp_category)>1) $category = $tmp_category[1]; + $obj->category_srl = (int)$category_titles[$category]; + if(!$obj->category_srl) { + $tmp = array_values($category_titles); + $obj->category_srl = (int)$tmp[0]; } } + $obj->user_id = $member_info->user_id; + $obj->nick_name = $member_info->nick_name; + $obj->user_name = $member_info->user_name; + $obj->member_srl = $member_info->member_srl; + + // 댓글 + $obj->comments = $this->importTTComment($post->comment); + + // 꼬리표 + $tags = $post->tag; + if(!is_array($tags)) $tags = array($tags); + if(count($tags)) { + $tag_list = array(); + foreach($tags as $key => $val) { + $tag = trim($val->body); + if(!$tag) continue; + $tag_list[] = $tag; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + } + + // 엮인글 + if($post->trackback) { + $trackbacks = $post->trackback; + if(!is_array($trackbacks)) $trackbacks = array($trackbacks); + if(count($trackbacks)) { + foreach($trackbacks as $key => $val) { + $tobj = null; + $tobj->url = $val->url->body; + $tobj->title = $val->title->body; + $tobj->blog_name = $val->site->body; + $tobj->excerpt = $val->excerpt->body; + $tobj->regdate = date("YmdHis",$val->received->body); + $tobj->ipaddress = $val->ip->body; + $obj->trackbacks[] = $tobj; + } + } + } + + // 첨부파일 + $obj->attaches = $attaches; + + $total_count ++; + if($this->importDocument($obj)) $success_count ++; } - // 첨부파일 - $obj->attaches = $attaches; - - $total_count ++; - if($this->importDocument($obj)) $success_count ++; - // 새로운 게시글을 위한 처리 $post_started = false; $obj = null; $post_buff = ''; $attaches = array(); + + // 만약 글입력후 oXmlParser->parse(''.$category_buff.''); - // 객체 변환후 카테고리 입력 - $xml_doc = $this->oXmlParser->parse(''.$category_buff.''); - if($xml_doc->category) { - $this->insertTTCategory($xml_doc, 0, $module_srl, $category_titles); + if($xml_doc->category) { + $this->insertTTCategory($xml_doc, 0, $module_srl, $category_titles); - // 입력완료 후 카테고리 xml파일 재생성 - $this->oDocumentController->makeCategoryXmlFile($module_srl); - $xml_doc = null; + // 입력완료 후 카테고리 xml파일 재생성 + $this->oDocumentController->makeCategoryFile($module_srl); + $xml_doc = null; + } + + $category_buff = null; } - $category_buff = null; + $post_started = true; } - $post_started = true; - } - - // 게시글 버퍼링중일때 처리 - if($post_started) { - // 첨부파일의 경우 별도로 버퍼링을 하지 않고 직접 파일에 기록해야 함 - if(substr($str,0,12)=='importTTAttaches($fp, $str); - else $post_buff .= $str; + // 게시글 버퍼링중일때 처리 + if($post_started) { + // 첨부파일의 경우 별도로 버퍼링을 하지 않고 직접 파일에 기록해야 함 + if(substr($str,0,12)=='importTTAttaches($fp, $str); + else $post_buff .= $str; + } } } - fclose($fp); + $output = ob_get_clean(); + $this->add('is_finished','1'); + $this->add('total_count',$total_count); + $this->add('success_count',$success_count); + $this->add('readed_line',0); $this->setMessage(sprintf(Context::getLang('msg_import_finished'), $success_count, $total_count)); } + /** + * @brief ttxml의 자체 img 태그를 치환 + **/ + function _replaceTTImgTag($matches) { + return sprintf("\"%s\"", $matches[1], str_replace("\"","\\\"",$matches[3])); + } + /** * @brief TTXML에 맞게 category정보 입력 **/ diff --git a/modules/importer/lang/es.lang.php b/modules/importer/lang/es.lang.php index 79d151731..a058759ba 100644 --- a/modules/importer/lang/es.lang.php +++ b/modules/importer/lang/es.lang.php @@ -13,7 +13,7 @@ $lang->importer = 'Transferir los datos de zeroboard'; $lang->source_type = 'Objetivo a transferir'; $lang->type_member = 'Información del usuario'; - $lang->type_message = '쪽지(메세지) 정보'; + $lang->type_message = 'Mensaje de Datos'; $lang->type_ttxml = 'TTXML'; $lang->type_module = 'Información del documento.'; $lang->type_syncmember = 'Sincronizar la información del usuario'; @@ -46,9 +46,9 @@ // bla bla... $lang->about_type_member = 'Seleccione esta opción si estas transferiendo la información del usuario.'; - $lang->about_type_message = '데이터 이전 대상이 쪽지(메세지)일 경우 선택해주세요'; - $lang->about_type_ttxml = '데이터 이전 대상이 TTXML(textcube계열)일 경우 선택해주세요'; - $lang->about_ttxml_user_id = 'TTXML이전시에 글쓴이로 지정할 사용자 아이디를 입력해주세요. (이미 가입된 아이디여야 합니다)'; + $lang->about_type_message = 'Si está transfiriendo la información de mensajes, seleccione esta opción'; + $lang->about_type_ttxml = ' Si está transfiriendo la TTXML (textcube) información, seleccione esta opción'; + $lang->about_ttxml_user_id = 'Por favor, de entrada ID de usuario establecer como autor de la transferencia de TTXML. (Identificación de usuario debe ser firmado ya en marcha)'; $lang->about_type_module = 'Seleccione esta opción si estas transfeririendo información del documento de los tableros'; $lang->about_type_syncmember = 'Seleccione esta opción cuando tenga que sincronizar la información del usuario luego de haber transferido la información del usuario y del artículo.'; $lang->about_importer = "Es posible trasferir los datos de Zeroboard4, zb5beta o de otros programas a ZeroBoardXE.\nPara la transferencia debe utilizar Exportador XML para transformar los datos en archivo XML, y luego subir ese archivo."; diff --git a/modules/importer/tpl/js/importer_admin.js b/modules/importer/tpl/js/importer_admin.js index 4df22c5b5..3da6d22c5 100644 --- a/modules/importer/tpl/js/importer_admin.js +++ b/modules/importer/tpl/js/importer_admin.js @@ -210,36 +210,8 @@ function completeImportTTXML(ret_obj, response_tags) { var readed_line = ret_obj['readed_line']; var is_finished = ret_obj['is_finished']; - if(is_finished == '1') { - var fo_obj = xGetElementById("fo_import"); - fo_obj.target_module.disabled = false; - fo_obj.xml_file.disabled = false; - fo_obj.total_count.value = 0; - fo_obj.success_count.value = 0; - fo_obj.readed_line.value = 0; + xGetElementById("status").style.display = 'block'; + xInnerHtml("status", ret_obj['message']); - xGetElementById("status").style.display = "none"; - xGetElementById("status_button_prev").style.display = "block"; - xGetElementById("status_button").style.display = "none"; - - - xInnerHtml("status", ret_obj['message']); - - alert(ret_obj['message']); - } else { - var fo_obj = xGetElementById("fo_import"); - fo_obj.target_module.disabled = true; - fo_obj.xml_file.disabled = true; - fo_obj.total_count.value = total_count; - fo_obj.success_count.value = success_count; - fo_obj.readed_line.value = readed_line; - - xGetElementById("status").style.display = "block"; - xGetElementById("status_button_prev").style.display = "none"; - xGetElementById("status_button").style.display = "block"; - - xInnerHtml("status", ret_obj['message']); - - doImportTTXML(fo_obj); - } + alert(ret_obj['message']); } diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index 543d2f0c4..97a46d811 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -172,13 +172,13 @@ EndOfLicense; $lang->about_database_file = 'Sqlite saves data in the file. Location of the database file should be unreachable by web
    Data file should be inside the permission of 707.'; - $lang->success_installed = 'Installation Complete'; - $lang->success_updated = 'Update Complete'; + $lang->success_installed = 'Installation has been completed'; + $lang->success_updated = 'Update has been completed'; - $lang->msg_cannot_proc = 'Unabled to execute the request because installation environment is not provided'; + $lang->msg_cannot_proc = 'Installation environment is not proper to proceed.'; $lang->msg_already_installed = 'Zeroboard is already installed'; $lang->msg_dbconnect_failed = "Error has occurred while connecting DB.\nPlease check DB information again"; $lang->msg_table_is_exists = "Table is already created in the DB.\nConfig file is recreated"; - $lang->msg_install_completed = "Installation complete.\nThank you for choosing ZeroboardXE"; - $lang->msg_install_failed = "Error has occurred while creating installation file."; + $lang->msg_install_completed = "Installation has been completed.\nThank you for choosing Zeroboard XE"; + $lang->msg_install_failed = "An error has occurred while creating installation file."; ?> diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index 44b8fd0f2..b7ba77fec 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -259,8 +259,8 @@ EndOfLicense; $lang->admin_title = 'Información del Administrator'; $lang->env_title = 'Configuración'; - $lang->use_optimizer = 'Optimizer 사용'; - $lang->about_optimizer = 'Optimizer를 사용하면 다수의 CSS/ JS파일을 통합/압축 전송하여 매우 빠르게 사이트 접속이 가능하게 합니다.
    다만 CSS나 JS에 따라서 문제가 생길 수 있습니다. 이때는 Optimizer 비활성화 하시면 정상적인 동작은 가능합니다'; + $lang->use_optimizer = 'Habilitar el optimizador'; + $lang->about_optimizer = 'Si optimizador está habilitado, los usuarios pueden acceder rápidamente a este sitio, ya que hay múltiples CSS / JS archivos son comprimidos juntos y antes de la transmisión.
    No obstante, esta optimización podría ser problemáticas de acuerdo con CSS o JS. Si inhabilitarlo, que funciona correctamente a pesar de que sería más lento el trabajo.'; $lang->use_rewrite = 'Usar rewrite mod'; $lang->about_rewrite = "Si el servidor de la web soporte rewrite mod, URL largas como http://bla/?documento_srl=123 puede abreviarse como http://bla/123"; $lang->time_zone = 'La Hora por Zona'; diff --git a/modules/install/tpl/filter/cubrid.xml b/modules/install/tpl/filter/cubrid.xml index 5046e1402..68bd9a7f3 100644 --- a/modules/install/tpl/filter/cubrid.xml +++ b/modules/install/tpl/filter/cubrid.xml @@ -2,7 +2,7 @@
    - + diff --git a/modules/install/tpl/filter/mysql.xml b/modules/install/tpl/filter/mysql.xml index 8be2cdc59..68bd9a7f3 100644 --- a/modules/install/tpl/filter/mysql.xml +++ b/modules/install/tpl/filter/mysql.xml @@ -2,6 +2,7 @@ + @@ -16,6 +17,7 @@ + diff --git a/modules/install/tpl/filter/postgresql.xml b/modules/install/tpl/filter/postgresql.xml index 51868b662..b768e65e0 100644 --- a/modules/install/tpl/filter/postgresql.xml +++ b/modules/install/tpl/filter/postgresql.xml @@ -2,6 +2,7 @@ + @@ -15,6 +16,7 @@ + diff --git a/modules/integration_search/integration_search.admin.controller.php b/modules/integration_search/integration_search.admin.controller.php index c7f074abd..e536ba756 100644 --- a/modules/integration_search/integration_search.admin.controller.php +++ b/modules/integration_search/integration_search.admin.controller.php @@ -78,7 +78,7 @@ } // 이미지 파일이 아니어도 무시 - if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { unset($obj->{$vars->name}); continue; } diff --git a/modules/integration_search/skins/default/css/white.css b/modules/integration_search/skins/default/css/white.css index b50689f96..1bdd0f48a 100644 --- a/modules/integration_search/skins/default/css/white.css +++ b/modules/integration_search/skins/default/css/white.css @@ -1,5 +1,5 @@ @charset "utf-8"; -#spot { border:8px solid #cecece; width:754px; height:64px; position:relative; margin:0 -15px 30px 0;} +#spot { border:8px solid #cecece; height:64px; position:relative; margin-bottom:30px;} #spot h2 { position:absolute; top:24px; left:-8px;} #spot .search { text-align:center; position:relative; top:22px;} #spot .search * { vertical-align:middle;} @@ -8,8 +8,7 @@ #spot .search .submit {} #content { width:100%; overflow:hidden; position:relative;} -#content h3.result { width:100%; height:23px; border-bottom:1px solid #cecece; _margin-top:-2px; margin-bottom:23px; margin-left:15px;} -*:first-child+html #content h3.result { margin-top:-2px;} +#content h3.result { width:100%; height:23px; border-bottom:1px solid #cecece; margin-bottom:23px; margin-left:15px;} #content h3.result strong { color:#ff1a00;} #content .sortBy { position:absolute; top:0; right:0; overflow:hidden;} #content .sortBy li { list-style:none; float:left; padding:0 6px; position:relative; right:-6px; background:url(../images/white/vrType2.gif) no-repeat right 1px;} @@ -19,7 +18,7 @@ .searchResult { margin-left:15px;} .searchResult li { width:100%; margin-bottom:29px; clear:both; overflow:hidden;list-style:none; } .searchResult li .thumb { display:block; float:left; margin-right:14px;} -.searchResult li dl {} +.searchResult li dl { margin:0; } .searchResult li dl dt { color:#d8d8d8; margin-bottom:1px;} .searchResult li dl dt a { color:#1a3588; text-decoration:underline;} .searchResult li dl dt .reply { color:#fe6700; font:.9em Tahoma;} diff --git a/modules/integration_search/skins/default/index.html b/modules/integration_search/skins/default/index.html index 9574d2f7b..3c262aa4e 100644 --- a/modules/integration_search/skins/default/index.html +++ b/modules/integration_search/skins/default/index.html @@ -9,7 +9,7 @@
    -

    검색하기

    +

    {$lang->cmd_search}

    diff --git a/modules/krzip/krzip.model.php b/modules/krzip/krzip.model.php index f119cbbea..50f6ff7d3 100644 --- a/modules/krzip/krzip.model.php +++ b/modules/krzip/krzip.model.php @@ -50,7 +50,7 @@ $address_list = unserialize(base64_decode($buff)); if(!$address_list) return new Object(-1, 'msg_no_result'); - $this->add('address_list', implode("\n",$address_list)); + $this->add('address_list', implode("\n",$address_list)."\n"); } } ?> diff --git a/modules/layout/layout.admin.controller.php b/modules/layout/layout.admin.controller.php index 7c4f5612a..d11bb5201 100644 --- a/modules/layout/layout.admin.controller.php +++ b/modules/layout/layout.admin.controller.php @@ -93,7 +93,7 @@ if(!$image_obj['tmp_name'] || !is_uploaded_file($image_obj['tmp_name'])) continue; // 이미지 파일이 아니어도 무시 (swf는 패스~) - if(!eregi("\.(jpg|jpeg|gif|png|swf)$", $image_obj['name'])) continue; + if(!preg_match("/\.(jpg|jpeg|gif|png|swf)$/i", $image_obj['name'])) continue; // 경로를 정해서 업로드 $path = sprintf("./files/attach/images/%s/", $args->layout_srl); diff --git a/modules/layout/layout.class.php b/modules/layout/layout.class.php index ea84bcf7a..44b160d72 100644 --- a/modules/layout/layout.class.php +++ b/modules/layout/layout.class.php @@ -45,5 +45,52 @@ **/ function recompileCache() { } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + case 'procLayoutAdminUpdate' : + case 'dispLayoutAdminPreview' : + case 'procLayoutAdminCodeReset' : + case 'procLayoutAdminCodeUpdate' : + // 레이아웃 정보에 할당된 srl이 없으면 패스 + if(!$args->layout_srl) return false; + + // 모듈중 레이아웃이 해당 srl에 연결될 것이 있는지 확인 + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModulesInfoByLayout($args->layout_srl); + $module_count = count($module_list); + + $is_granted = false; + for($i=0;$i<$module_count;$i++) { + $module_info = $module_list[$i]; + if($oModuleModel->isModuleAdmin($module_list[$i],$logged_info)) { + $is_granted = true; + break; + } + } + return $is_granted; + break; + } + + return false; + } } ?> diff --git a/modules/layout/tpl/index.html b/modules/layout/tpl/index.html index a09e57c39..501823e0f 100644 --- a/modules/layout/tpl/index.html +++ b/modules/layout/tpl/index.html @@ -96,13 +96,7 @@ {$lang->cmd_layout_edit} - - - {$lang->cmd_delete} - -   - - + {$lang->cmd_delete} diff --git a/modules/lifepod/conf/info.xml b/modules/lifepod/conf/info.xml index 75255bf2c..21de0f711 100644 --- a/modules/lifepod/conf/info.xml +++ b/modules/lifepod/conf/info.xml @@ -1,14 +1,19 @@ - + 라이프팟 연동 Lifepod Lifepod連動 Лайфпод - + Lifepod + Lifepod + + haneul haneul haneul 라이프팟의 calendar를 제로보드XE에서 연동하여 출력하는 기능을 가지고 있는 모듈입니다. + Este módulo muestra calendario de lifepod. + 把Lifepod日历连接到zbXE的模块。 This module displays calendar from lifepod. (Openmaru社提供の)LifepodサービスのカレンダーをゼロボードXEに連動して出力するモジュールです。 Этот модуль отображает календать с lifepod'а. diff --git a/modules/lifepod/conf/module.xml b/modules/lifepod/conf/module.xml index f523c35bb..30bf6adb6 100644 --- a/modules/lifepod/conf/module.xml +++ b/modules/lifepod/conf/module.xml @@ -3,7 +3,9 @@ 열람 - 查看 + Opinión + мнение + 查看 閲覧 view diff --git a/modules/lifepod/lang/es.lang.php b/modules/lifepod/lang/es.lang.php new file mode 100644 index 000000000..93de037a3 --- /dev/null +++ b/modules/lifepod/lang/es.lang.php @@ -0,0 +1,15 @@ +lifepod = "Lifepod"; + + $lang->calendar_address = "Calendario de la Dirección XML"; + $lang->cmd_lifepod_list = 'Lista Lifepod'; + $lang->cmd_view_info = 'Lifepod Información.'; + + $lang->about_lifepod = "Lifepod calendario es un servicio proporcionado por Openmaru Studio.
    Lifepod Zeroboard XE módulo desplays Lifepod específicas de calendarios como documentos internos."; +?> diff --git a/modules/lifepod/lifepod.admin.controller.php b/modules/lifepod/lifepod.admin.controller.php index 1db9b73d7..40b9d2434 100644 --- a/modules/lifepod/lifepod.admin.controller.php +++ b/modules/lifepod/lifepod.admin.controller.php @@ -200,7 +200,7 @@ } // 이미지 파일이 아니어도 무시 - if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { unset($obj->{$vars->name}); continue; } diff --git a/modules/lifepod/lifepod.model.php b/modules/lifepod/lifepod.model.php index 05f169192..179568991 100644 --- a/modules/lifepod/lifepod.model.php +++ b/modules/lifepod/lifepod.model.php @@ -5,7 +5,7 @@ * @brief lifepod모듈의 model 클래스 **/ - set_include_path("./modules/springnote/lib/PEAR"); + set_include_path("./libs/PEAR"); require_once('PEAR.php'); require_once('HTTP/Request.php'); require_once('./classes/xml/GeneralXmlParser.class.php'); @@ -31,15 +31,15 @@ return $oReqeust; } - function getURL($address, $start, $end) { - return sprintf("%s&start=%s&end=%s", $address, $start, $end); + function getURL($address, $start, $end, $pageNumber) { + return sprintf("%s&start=%s&end=%s&page=%d", $address, $start, $end, $pageNumber); } /** * @brief lifepod 페이지 정보 가져오기 * @remarks 한해씩 끊어서 페이지를 가져옵니다. 아직 50개 이상의 calendar info가 있는 경우 앞에 것만 가져오는 문제가 있습니다. **/ - function getPage($address, $year) { + function getPage($address, $year, $pageNumber) { if($year == null) { $year = date("Y"); @@ -48,7 +48,7 @@ $start = sprintf("%s-01-01",$year); $end = sprintf("%s-01-01",$year+1); - $url = $this->getURL($address, $start, $end); + $url = $this->getURL($address, $start, $end, $pageNumber); $oReqeust = $this->getRequest($url); $oResponse = $oReqeust->sendRequest(); @@ -77,6 +77,9 @@ $page->data[] = $data; } $page->color = $xmldoc->childNodes["feed"]->childNodes["color"]->body; + $page->total = intval($xmldoc->childNodes["feed"]->childNodes["opensearch:totalresults"]->body); + $page->start = intval($xmldoc->childNodes["feed"]->childNodes["opensearch:startindex"]->body); + $page->perpage = intval($xmldoc->childNodes["feed"]->childNodes["opensearch:itemsperpage"]->body); return $page; } diff --git a/modules/lifepod/lifepod.view.php b/modules/lifepod/lifepod.view.php index b38da4b75..44edd44c6 100644 --- a/modules/lifepod/lifepod.view.php +++ b/modules/lifepod/lifepod.view.php @@ -50,29 +50,38 @@ $cDay = Context::get('day'); $calendars = array(); - - foreach($caladdresses as $key => $val) + + foreach($caladdresses as $key=>$val) { - $page = $oLifepodModel->getPage($val, $cYear, $cMonth, $cDay); - foreach ($page->data as $key => $val) - { - if($val->childNodes["date-start"]) + $shouldGetMore = false; + $pageNumber = 1; + $page = null; + do { + $page = $oLifepodModel->getPage($val, $cYear, $pageNumber); + if(!$page) break; + for($j=0;$jdata);$j++) { - $val->childNodes["date-start"]->body = $this->dateFormatChange($val->childNodes["date-start"]->body); + $data = &$page->data[$j]; + if($data->childNodes["date-start"]) + { + $data->childNodes["date-start"]->body = $this->dateFormatChange($data->childNodes["date-start"]->body); + } + + if($data->childNodes["date-end"]) + { + $plus = 0; + if($data->childNodes["type"]->body == "daylong") + $plus = -1; + $data->childNodes["date-end"]->body = $this->dateFormatChange($data->childNodes["date-end"]->body, $plus); + } + + $data->childNodes["description"]->body = str_replace("\n", "
    ", $data->childNodes["description"]->body); + $data->childNodes["description"]->body = str_replace("'", "\'", $data->childNodes["description"]->body); + $data->childNodes["title"]->body = str_replace("'", "\'", $data->childNodes["title"]->body); } - - if($val->childNodes["date-end"]) - { - $plus = 0; - if($val->childNodes["type"]->body == "daylong") - $plus = -1; - $val->childNodes["date-end"]->body = $this->dateFormatChange($val->childNodes["date-end"]->body, $plus); - } - - $val->childNodes["description"]->body = str_replace("\n", "
    ", $val->childNodes["description"]->body); - } - $calendars[] = $page; - + $calendars[] = $page; + $pageNumber++; + } while ( $page->start + $page->perpage - 1 < $page->total ); } Context::set('calendars', $calendars); diff --git a/modules/lifepod/skins/xe_official/css/common.css b/modules/lifepod/skins/xe_official/css/common.css index 5b137c90c..f69cc00fc 100644 --- a/modules/lifepod/skins/xe_official/css/common.css +++ b/modules/lifepod/skins/xe_official/css/common.css @@ -11,12 +11,11 @@ /* account Navigation */ .accountNavigation { float:right; } -.accountNavigation li { float:left; margin-left:7px; list-style:none; padding-top:3px;} +.accountNavigation li { float:left; margin-left:7px; list-style:none; } .accountNavigation li a { font-size:12px; white-space:nowrap; color:#666666; text-decoration:none;} .accountNavigation li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } .accountNavigation li.admin a { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; } -.accountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; _padding-top:5px;} -*:first-child+html li.loginAndLogout { padding-top:5px; } +.accountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; } INPUT.CalendarViewMonth { width:44px; diff --git a/modules/member/conf/info.xml b/modules/member/conf/info.xml index 4652122b4..8c7d341e3 100644 --- a/modules/member/conf/info.xml +++ b/modules/member/conf/info.xml @@ -17,7 +17,7 @@ 对会员进行管理及相关设置的模块。 会員管理及び会員関連設定などを行うモジュールです。 This module is for managing or configuring members. - Este módulo es para el manejo y la configuración de los usuarios. + Este módulo es para el manejo y la configuración de los usuarios. Этот модуль служит для управления и конфигурирования пользователей.
    diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index 2c71982b4..8f7aeac52 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -32,6 +32,7 @@ + @@ -79,6 +80,7 @@ + diff --git a/modules/member/lang/en.lang.php b/modules/member/lang/en.lang.php index ce2692649..bee0fb9b6 100644 --- a/modules/member/lang/en.lang.php +++ b/modules/member/lang/en.lang.php @@ -11,6 +11,7 @@ $lang->default_group_1 = "Associate Member"; $lang->default_group_2 = "Regular Member"; $lang->admin_group = "Managing Group"; + $lang->keep_signed = 'Keep me signed in'; $lang->remember_user_id = 'Save ID'; $lang->already_logged = "You're already logged on"; $lang->denied_user_id = 'Entered ID is prohibited.'; @@ -45,6 +46,8 @@ $lang->enable_join = 'Allow Member Join'; $lang->limit_day = 'Temporary Limit Date'; $lang->limit_date = 'Limit Date'; + $lang->after_login_url = '로그인 후 이동할 URL'; + $lang->after_logout_url = '로그아웃 후 이동할 URL'; $lang->redirect_url = 'URL after Join'; $lang->agreement = 'Member Join Agreement'; $lang->accept_agreement = 'Agree'; @@ -59,6 +62,7 @@ $lang->webmaster_name = "Webmaster's Name"; $lang->webmaster_email = "Webmaster's Email"; + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 게속 유지될 수 있습니다.\n\n로그인 유지시 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.\n\n단, 게임방, 학교등 공공장소에서 이용시 개인정보가 유출될수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = "Please input webmaster's name which will be used for authentication mails or other site administration. (default : webmaster)"; $lang->about_webmaster_email = "Please input webmaster's email address."; @@ -143,6 +147,7 @@ $lang->msg_allow_message_to_friend = "Failed to send because receiver only allows friends' messages"; $lang->msg_disallow_message = 'Failed to send because receiver rejects message reception'; $lang->msg_insert_group_name = 'Please input name of group'; + $lang->msg_check_group = 'Please select the group'; $lang->msg_not_uploaded_profile_image = 'Profile image could not be registered'; $lang->msg_not_uploaded_image_name = 'Image name could not be registered'; @@ -180,6 +185,8 @@ $lang->about_enable_join = 'Allow users to sign up'; $lang->about_limit_day = 'You can limit certification date after sign up'; $lang->about_limit_date = 'User cannot login until assigned date'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; $lang->about_redirect_url = 'Please input URL where users will go after sign up. When this is empty, it will be set as the previous page of sign up page.'; $lang->about_agreement = "Sign up agreement will only be displayed when it's not empty"; diff --git a/modules/member/lang/es.lang.php b/modules/member/lang/es.lang.php index a83d5c1d1..072b8eb23 100644 --- a/modules/member/lang/es.lang.php +++ b/modules/member/lang/es.lang.php @@ -1,6 +1,6 @@ default_group_1 = "Usuario registrado"; $lang->default_group_2 = "Usuario regular"; $lang->admin_group = "Manejo del grupo"; + $lang->keep_signed = 'Keep me signed in'; $lang->remember_user_id = 'Guardar ID'; $lang->already_logged = "Ya está conectado"; $lang->denied_user_id = 'Este ID está prohibido.'; @@ -32,9 +33,9 @@ $lang->group_title = 'Nombre del grupo'; $lang->group_srl = 'Número del grupo'; $lang->signature = 'Firma'; - $lang->profile_image = '프로필 사진'; - $lang->profile_image_max_width = '가로 제한 크기'; - $lang->profile_image_max_height = '세로 제한 크기'; + $lang->profile_image = 'Perfil de Imagen'; + $lang->profile_image_max_width = 'Max Anchura'; + $lang->profile_image_max_height = 'Max Altura'; $lang->image_name = 'Nombre de la imagen'; $lang->image_name_max_width = 'Ancho Máximo'; $lang->image_name_max_height = 'Altura Máxima'; @@ -45,6 +46,8 @@ $lang->enable_join = 'Permitir el registro del usuario'; $lang->limit_day = 'Límite de la fecha temporal'; $lang->limit_date = 'Límite de fecha'; + $lang->after_login_url = '로그인 후 이동할 URL'; + $lang->after_logout_url = '로그아웃 후 이동할 URL'; $lang->redirect_url = 'URL luego del registro'; $lang->agreement = 'Acuerdo del registro del usuario'; $lang->accept_agreement = 'Acepto'; @@ -56,11 +59,12 @@ $lang->current_password = 'Contraseña actual'; $lang->openid = 'OpenID'; - $lang->webmaster_name = '웹마스터 이름'; - $lang->webmaster_email = '웹마스터 메일주소'; + $lang->webmaster_name = 'Nombre del Webmaster'; + $lang->webmaster_email = 'Correo electrónico Webmaster'; - $lang->about_webmaster_name = '인증 메일이나 기타 사이트 관리시 사용될 웹마스터의 이름을 입력해주세요. (기본 : webmaster)'; - $lang->about_webmaster_email = '웹마스터의 메일 주소를 입력해주세요.'; + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 게속 유지될 수 있습니다.\n\n로그인 유지시 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.\n\n단, 게임방, 학교등 공공장소에서 이용시 개인정보가 유출될수 있으니 꼭 로그아웃을 해주세요'; + $lang->about_webmaster_name = 'Por favor, webmaster de entrada el nombre que se utilizará para la autenticación de los correos u otros sitio de la administración. (Por defecto: webmaster)'; + $lang->about_webmaster_email = 'Introduzca la dirección de correo electrónico webmaster.'; $lang->search_target_list = array( 'user_id' => 'ID', @@ -97,7 +101,7 @@ $lang->cmd_manage_form = 'Manejo de forma del registro'; $lang->cmd_view_own_document = 'Ver documentos escritos'; $lang->cmd_view_scrapped_document = 'Ver Scraps'; - $lang->cmd_view_saved_document = '저장함 보기'; + $lang->cmd_view_saved_document = 'Ver artículos guardados'; $lang->cmd_send_email = 'Enviar Email'; $lang->cmd_send_message = 'Enviar Mensaje'; $lang->cmd_reply_message = 'Responder el mensaje'; @@ -116,10 +120,10 @@ $lang->msg_checked_file_is_deleted = '%d archivos adjuntos son eliminados'; $lang->msg_find_account_title = 'Account Info'; - $lang->msg_find_account_info = '요청하신 계정 정보는 아래와 같습니다'; - $lang->msg_find_account_comment = '아래 링크를 클릭하시면 위에 적힌 비밀번호로 바뀌게 됩니다.
    로그인 하신 후 비밀번호를 바꾸어주세요.'; - $lang->msg_auth_mail_sended = '%s 메일로 인증 정보를 담은 메일이 발송되었습니다. 메일을 확인하세요.'; - $lang->msg_success_authed = '인증이 정상적으로 되어 로그인 처리가 되었습니다. 꼭 인증 메일에 표시된 비밀번호를 이용하여 원하시는 비밀번호로 변경하세요.'; + $lang->msg_find_account_info = 'Esto se solicita la información de la cuenta'; + $lang->msg_find_account_comment = 'La contraseña se modificará para arriba al hacer clic en un enlace a continuación.
    Por favor, después de modificar la contraseña de acceso.'; + $lang->msg_auth_mail_sended = 'La autenticación de correo ha sido enviado a% s. Por favor, compruebe su correo.'; + $lang->msg_success_authed = 'Esto no es válido solicitud de autenticación.
    Por favor, inténtelo encontrar información de la cuenta o póngase en contacto con el administrador.'; $lang->msg_no_message = 'No hay mensajes'; $lang->message_received = 'Usted ha recibido un mensaje'; @@ -142,6 +146,7 @@ $lang->msg_allow_message_to_friend = "Falló el envío por permitir sólo mensajes de sus amigos"; $lang->msg_disallow_message = 'Falló el envío por ser usuario rechazado para recibir mensajes'; $lang->msg_insert_group_name = 'Por favor ingresar el nombre del grupo'; + $lang->msg_check_group = 'Introduce nombre de grupo'; $lang->msg_not_uploaded_image_name = 'Imagen del nombre no puede ser registrado'; $lang->msg_not_uploaded_image_mark = 'Imagen de marca no puede ser resistrado'; @@ -178,19 +183,21 @@ $lang->about_enable_join = 'Debe seleccionar esta opción para permitir el registro de los usuarios'; $lang->about_limit_day = 'Usted puede limitar la fecha de la certificación luego de registrar'; $lang->about_limit_date = 'Usuario no podra conectarse hasta la fecha indicada'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; $lang->about_redirect_url = 'Ingresar la URL que va a abrir luego de registrar los usuarios. Cuando esto esta vacío, se habrirá la página anterior a la del registro.'; $lang->about_agreement = "Acuerdo del registro no será mostrado si esta vacío"; $lang->about_image_name = "Permitir a los usuarios el uso de imagen del nombre en ves del nombre del usuario"; $lang->about_image_mark = "Permitir a los usuarios el uso de imagen de marca delante de sus nombres"; - $lang->about_profile_image = '사용자의 프로필 이미지를 사용할 수 있게 합니다'; + $lang->about_profile_image = 'Permitir a los usuarios a utilizar nombre de la imagen en lugar de texto nombre'; $lang->about_accept_agreement = "Yo he leído todo el acuerdo y acepto"; $lang->about_member_default = 'Al registrar se configura como grupo predefinido'; $lang->about_openid = 'Cuando tu registra como OpenID, la información básica como ID o la dirección del email sera guardado en este sitio, pero la contraseña y la resolución de la certificación se hará en el servicio ofrecido por openID'; - $lang->about_openid_leave = '오픈아이디의 탈퇴는 현 사이트에서의 회원 정보를 삭제하는 것입니다.
    탈퇴 후 로그인하시면 새로 가입하시는 것으로 되어 작성한 글에 대한 권한을 가질 수 없게 됩니다'; + $lang->about_openid_leave = 'La secesión de OpenID medios eliminación de su información de miembros de este sitio.
    Si se registra después de la secesión, se le reconocerá como un nuevo miembro, de modo que ya no tienen el permiso para que su ex-escrito artículos.'; $lang->about_member = "Esto es un módulo para crear/modificar/eliminar usuarios y manejar grupos o el formato del registro.\n Usted puede manejar usuarios creando nuevos grupos, y obtener información adicional manejando el formato del registro"; - $lang->about_find_member_account = '아이디/ 비밀번호는 가입시 등록한 메일 주소로 알려드립니다
    가입할때 등록하신 메일 주소를 입력하시고 "아이디/ 비밀번호 찾기" 버튼을 클릭해주세요.
    '; + $lang->about_find_member_account = 'Su información de la cuenta será observado por dirección de correo electrónico registrada.
    Introduce la dirección de correo electrónico que usted tiene de entrada en el registro, y pulse "Buscar" Información de la cuenta ".
    '; ?> diff --git a/modules/member/lang/jp.lang.php b/modules/member/lang/jp.lang.php index 6e0229f0c..2dd807796 100644 --- a/modules/member/lang/jp.lang.php +++ b/modules/member/lang/jp.lang.php @@ -1,7 +1,7 @@ default_group_1 = "準会員"; $lang->default_group_2 = "正会員"; $lang->admin_group = "管理グループ"; + $lang->keep_signed = '로그인 유지'; $lang->remember_user_id = 'ID保存'; $lang->already_logged = '既にログインされています。'; $lang->denied_user_id = '使用が禁じられているIDです。'; @@ -41,10 +42,13 @@ $lang->image_mark = 'イメージマーク'; $lang->image_mark_max_width = '横幅制限サイズ'; $lang->image_mark_max_height = '縦幅制限サイズ'; - $lang->enable_openid = 'OpenID使用'; + $lang->signature_max_height = '署名欄の高さの制限'; + $lang->enable_openid = 'OpenID使用'; $lang->enable_join = '会員加入を許可する'; $lang->limit_day = '臨時制限日'; $lang->limit_date = '制限日'; + $lang->after_login_url = '로그인 후 이동할 URL'; + $lang->after_logout_url = '로그아웃 후 이동할 URL'; $lang->redirect_url = '加入後移動ページ'; $lang->agreement = '会員加入規約'; $lang->accept_agreement = '規約に同意する'; @@ -59,6 +63,7 @@ $lang->webmaster_name = 'ウェブマスターの名前'; $lang->webmaster_email = 'ウェブマスターのメール'; + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 게속 유지될 수 있습니다.\n\n로그인 유지시 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.\n\n단, 게임방, 학교등 공공장소에서 이용시 개인정보가 유출될수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = '認証メールまたはサイト管理時に使用されるウェブマスターの名前を入力してください(デフォルト : webmaster)'; $lang->about_webmaster_email = 'ウェブマスターのメールアドレスを入力してください。'; @@ -115,8 +120,8 @@ $lang->msg_cart_is_null = '対象を選択してください。'; $lang->msg_checked_file_is_deleted = '%d個の添付ファイルが削除されました。'; - $lang->msg_find_account_title = 'IDどパスワードの情報'; - $lang->msg_find_account_info = '要求されたアカウント情報は下記の通りです。'; + $lang->msg_find_account_title = '会員IDどパスワードの情報'; + $lang->msg_find_account_info = '登録された会員情報は下記の通りです。'; $lang->msg_find_account_comment = '下のリンクをクリックすると上のパスワードに変更されます。
    ログインしてからパスワードを変更してください。'; $lang->msg_auth_mail_sended = '%s メールでは認証情報を含んだ内容が送信されました。 メールを確認してください。'; $lang->msg_invalid_auth_key = '正しくないアカウントの認証要求です。
    IDとパスワードの検索を行うか、サイト管理者にアカウント情報をお問い合わせください。'; @@ -143,6 +148,7 @@ $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信できるように設定したユーザであるため、送信できませんでした。'; $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信できませんでした。'; $lang->msg_insert_group_name = 'グループ名を入力してください。'; + $lang->msg_check_group = '그룹을 선택해 주세요'; $lang->msg_not_uploaded_profile_image = 'プロフィールイメージを登録することができません。'; $lang->msg_not_uploaded_image_name = 'イメージ名を登録することができません。'; @@ -180,12 +186,15 @@ $lang->about_enable_join = 'チェックを入れないとユーザが会員に加入できません。'; $lang->about_limit_day = '会員加入後一定の期間中、認証制限を行うことができます。'; $lang->about_limit_date = '指定された期間まで該当ユーザはログインできなくします。'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; $lang->about_redirect_url = '会員加入後、移動するURLを入力してください。空の場合は会員加入する前のページに戻ります。'; $lang->about_agreement = '会員加入規約がない場合は表示されません。'; $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることができます。'; $lang->about_image_mark = '使用者の名前の前にマークを付けることができます。'; $lang->about_profile_image = 'ユーザのプロフィールイメージが使用できるようにします。'; + $lang->about_signature_max_height = '署名欄の高さのサイズを制限します。 (0 もしくは空の場合は制限なし。)'; $lang->about_accept_agreement = '加入規約をすべて読んだ上で同意します。'; $lang->about_member_default = '会員加入時に基本グループとして設定されます。'; diff --git a/modules/member/lang/ko.lang.php b/modules/member/lang/ko.lang.php index 02c2f895d..149aa5889 100644 --- a/modules/member/lang/ko.lang.php +++ b/modules/member/lang/ko.lang.php @@ -8,9 +8,10 @@ $lang->member = '회원'; $lang->member_default_info = '기본 정보'; $lang->member_extend_info = '추가 정보'; - $lang->default_group_1 = "준회원"; - $lang->default_group_2 = "정회원"; - $lang->admin_group = "관리그룹"; + $lang->default_group_1 = '준회원'; + $lang->default_group_2 = '정회원'; + $lang->admin_group = '관리그룹'; + $lang->keep_signed = '로그인 유지'; $lang->remember_user_id = '아이디 저장'; $lang->already_logged = '이미 로그인되어 있습니다'; $lang->denied_user_id = '사용금지된 아이디입니다'; @@ -46,6 +47,8 @@ $lang->enable_join = '회원 가입 허가'; $lang->limit_day = '임시 제한 일자'; $lang->limit_date = '제한일'; + $lang->after_login_url = '로그인 후 이동할 URL'; + $lang->after_logout_url = '로그아웃 후 이동할 URL'; $lang->redirect_url = '회원 가입후 이동할 페이지'; $lang->agreement = '회원 가입 약관'; $lang->accept_agreement = '약관동의'; @@ -60,6 +63,7 @@ $lang->webmaster_name = '웹마스터 이름'; $lang->webmaster_email = '웹마스터 메일주소'; + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 게속 유지될 수 있습니다.\n\n로그인 유지시 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.\n\n단, 게임방, 학교등 공공장소에서 이용시 개인정보가 유출될수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = '인증 메일이나 기타 사이트 관리시 사용될 웹마스터의 이름을 입력해주세요. (기본 : webmaster)'; $lang->about_webmaster_email = '웹마스터의 메일 주소를 입력해주세요.'; @@ -144,6 +148,7 @@ $lang->msg_allow_message_to_friend = '친구에게만 쪽지 수신을 허용한 사용자라서 쪽지 발송을 하지 못했습니다'; $lang->msg_disallow_message = '쪽지 수신을 거부한 사용자라서 쪽지 발송을 하지 못했습니다'; $lang->msg_insert_group_name = '그룹명을 입력해 주세요'; + $lang->msg_check_group = '그룹을 선택해 주세요'; $lang->msg_not_uploaded_profile_image = '프로필 이미지를 등록할 수가 없습니다'; $lang->msg_not_uploaded_image_name = '이미지 이름을 등록할 수가 없습니다'; @@ -181,6 +186,8 @@ $lang->about_enable_join = '체크를 하셔야 사용자들이 회원가입을 할 수 있습니다'; $lang->about_limit_day = '회원 가입후 정해진 일자동안 인증 제한을 할 수 있습니다'; $lang->about_limit_date = '지정된 일자까지 해당 사용자는 로그인을 할 수 없습니다'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; $lang->about_redirect_url = '회원 가입후 이동할 url을 입력해 주세요. 비어 있으면 가입 이전 페이지로 돌아갑니다'; $lang->about_agreement = '회원가입약관이 없을 경우 표시되지 않습니다'; diff --git a/modules/member/lang/ru.lang.php b/modules/member/lang/ru.lang.php index fbb03e0e0..256e309fe 100644 --- a/modules/member/lang/ru.lang.php +++ b/modules/member/lang/ru.lang.php @@ -11,6 +11,7 @@ $lang->default_group_1 = "Общая группа"; $lang->default_group_2 = "Особая группа"; $lang->admin_group = "Администативная группа"; + $lang->keep_signed = '로그인 유지'; $lang->remember_user_id = 'Сохранить ID'; $lang->already_logged = "Вы уже вошли"; $lang->denied_user_id = 'Извините. Этот ID запрещен.'; @@ -45,6 +46,8 @@ $lang->enable_join = 'Позволить пользователям регистрироваться'; $lang->limit_day = 'Временный лимит даты'; $lang->limit_date = 'Дата лимита'; + $lang->after_login_url = '로그인 후 이동할 URL'; + $lang->after_logout_url = '로그아웃 후 이동할 URL'; $lang->redirect_url = 'URL после регистрации'; $lang->agreement = 'Пользовательское соглашение о регистрации'; $lang->accept_agreement = 'Согласен'; @@ -59,6 +62,7 @@ $lang->webmaster_name = "Имя веб-мастера"; $lang->webmaster_email = "Email веб-мастера"; + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 게속 유지될 수 있습니다.\n\n로그인 유지시 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.\n\n단, 게임방, 학교등 공공장소에서 이용시 개인정보가 유출될수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = "Пожалуйста, введите имя веб-мастера, которое будет использоваться для аутентификационных писем или другого адиминистрирования сайта. (по умолчанию : webmaster)"; $lang->about_webmaster_email = "Пожалуйста, введите email адрес веб-мастера."; @@ -143,6 +147,7 @@ $lang->msg_allow_message_to_friend = "Отправка провалена, поскольку получатель принимает сообщения только от друзей"; $lang->msg_disallow_message = 'Отправка провалена, поскольку получатель отклоняет прием сообщений'; $lang->msg_insert_group_name = 'Пожалуйста, введите имя группы'; + $lang->msg_check_group = 'Введите имя группы'; $lang->msg_not_uploaded_image_name = 'Имя изображения не может быть зарегистрировано'; $lang->msg_not_uploaded_image_mark = 'Марка не может быть зарегистрирована'; @@ -179,6 +184,8 @@ $lang->about_enable_join = 'Позволить пользователям регистрироваться'; $lang->about_limit_day = 'Вы можете ограничить дату сертификации после регистрации'; $lang->about_limit_date = 'Пользователь не может войти до указанной даты'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; $lang->about_redirect_url = 'Пожалуйста, введите URL, куда пользователи попадут после регистрации. Когда поле пустое, будет установлена страница предшествуящая странице регистрации.'; $lang->about_agreement = "Регистрационное соглашение будет показано, если оно содержит текст"; diff --git a/modules/member/lang/zh-CN.lang.php b/modules/member/lang/zh-CN.lang.php index c3cbaf89a..7b25e2e72 100644 --- a/modules/member/lang/zh-CN.lang.php +++ b/modules/member/lang/zh-CN.lang.php @@ -11,6 +11,7 @@ $lang->default_group_1 = "准会员"; $lang->default_group_2 = "正会员"; $lang->admin_group = "管理组"; + $lang->keep_signed = '로그인 유지'; $lang->remember_user_id = '保存ID'; $lang->already_logged = '您已经登录!'; $lang->denied_user_id = '被禁止的用户名。'; @@ -45,6 +46,8 @@ $lang->enable_join = '允许会员注册'; $lang->limit_day = '认证限制'; $lang->limit_date = '限制日期'; + $lang->after_login_url = '로그인 후 이동할 URL'; + $lang->after_logout_url = '로그아웃 후 이동할 URL'; $lang->redirect_url = '注册会员后页面转向'; $lang->agreement = '会员注册条款'; $lang->accept_agreement = '同意条款'; @@ -59,6 +62,7 @@ $lang->webmaster_name = '管理员名'; $lang->webmaster_email = '管理员电子邮件'; + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 게속 유지될 수 있습니다.\n\n로그인 유지시 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.\n\n단, 게임방, 학교등 공공장소에서 이용시 개인정보가 유출될수 있으니 꼭 로그아웃을 해주세요'; $lang->about_webmaster_name = '请输入认证所需的电子邮件地址或管理其他网站时要使用的网站管理员名称。(默认 : webmaster)'; $lang->about_webmaster_email = '请输入网站管理员的电子邮件地址。'; @@ -142,6 +146,7 @@ $lang->msg_allow_message_to_friend = '因其为只允许接收好友短消息的用户,所以不能发送短消息。'; $lang->msg_disallow_message = '因其为拒绝接收短消息的用户,所以不能发送短消息。'; $lang->msg_insert_group_name = '请输入组名称'; + $lang->msg_check_group = '그룹을 선택해 주세요'; $lang->msg_not_uploaded_image_name = '不能登录昵称图像!'; $lang->msg_not_uploaded_image_mark = '不能登录用户图标!'; @@ -178,6 +183,8 @@ $lang->about_enable_join = '选择此项后用户才可以注册。'; $lang->about_limit_day = '注册会员后的认证有效期限。'; $lang->about_limit_date = '直到指定日期该用户不能登录。'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; $lang->about_redirect_url = '请输入注册会员后的页面转向 url。(留空为返回前页)'; $lang->about_agreement = '没有会员条款时不显示。'; diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 8b81c268d..4aff8b6d4 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -83,7 +83,7 @@ **/ function procMemberAdminInsertConfig() { // 기본 정보를 받음 - $args = Context::gets('webmaster_name','webmaster_email','skin','colorset','enable_openid','enable_join','limit_day','redirect_url','agreement','profile_image','profile_image_max_width','profile_image_max_height','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height','signature_max_height'); + $args = Context::gets('webmaster_name','webmaster_email','skin','colorset','enable_openid','enable_join','limit_day','after_login_url','after_logout_url','redirect_url','agreement','profile_image','profile_image_max_width','profile_image_max_height','image_name','image_mark', 'image_name_max_width', 'image_name_max_height','image_mark_max_width','image_mark_max_height','signature_max_height'); if(!$args->skin) $args->skin = "default"; if(!$args->colorset) $args->colorset = "white"; if($args->enable_join!='Y') $args->enable_join = 'N'; @@ -146,7 +146,7 @@ $args->member_join_form_srl = Context::get('member_join_form_srl'); $args->column_type = Context::get('column_type'); - $args->column_name = Context::get('column_name'); + $args->column_name = strtolower(Context::get('column_name')); $args->column_title = Context::get('column_title'); $args->default_value = explode('|@|', Context::get('default_value')); $args->is_active = Context::get('is_active'); @@ -201,6 +201,55 @@ $this->setMessage($msg_code); } + /** + * @brief 선택된 회원들의 그룹을 일괄 변경 + **/ + function procMemberAdminUpdateMembersGroup() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(-1,'msg_invalid_request'); + $member_srls = explode(',',$member_srl); + + $group_srl = Context::get('group_srl'); + $group_srls = explode('|@|', $group_srl); + if(!$group_srl) return new Object(-1,'msg_check_group'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 선택된 회원들의 그룹을 삭제 + $args->member_srl = $member_srl; + $output = executeQuery('member.deleteMembersGroup', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 선택된 그룹으로 추가 + $group_count = count($group_srls); + $member_count = count($member_srls); + for($j=0;$j<$group_count;$j++) { + $group_srl = (int)trim($group_srls[$j]); + if(!$group_srl) continue; + for($i=0;$i<$member_count;$i++) { + $member_srl = (int)trim($member_srls[$i]); + if(!$member_srl) continue; + + $args = null; + $args->member_srl = $member_srl; + $args->group_srl = $group_srl; + + $output = executeQuery('member.addMemberToGroup', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + $oDB->commit(); + + $this->setMessage('success_updated'); + } + /** * @brief 금지 아이디 추가 **/ diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index f83944cb2..202f0170e 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -203,5 +203,22 @@ $this->setTemplateFile('denied_id_list'); } + /** + * @brief 회원 그룹 일괄 변경 + **/ + function dispMemberAdminManageGroup() { + // 선택된 회원 목록을 구함 + $args->member_srl = trim(Context::get('member_srls')); + $output = executeQueryArray('member.getMembers', $args); + Context::set('member_list', $output->data); + + // 회원 그룹 목록을 구함 + $oMemberModel = &getModel('member'); + Context::set('member_groups', $oMemberModel->getGroups()); + + $this->setLayoutFile('popup_layout'); + $this->setTemplateFile('manage_member_group'); + } + } ?> diff --git a/modules/member/member.class.php b/modules/member/member.class.php index cff79cf04..3a15de02d 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -51,50 +51,61 @@ $oModuleController->insertActionForward('member', 'controller', 'procMemberDeleteImageName'); $oModuleController->insertActionForward('member', 'controller', 'procMemberDeleteImageMark'); + $oModuleModel = &getModel('module'); + $args = $oModuleModel->getModuleConfig('member'); + // 기본 정보를 세팅 $args->enable_join = 'Y'; - $args->enable_openid = 'N'; - $args->image_name = 'Y'; - $args->image_mark = 'Y'; - $args->profile_image = 'Y'; - $args->image_name_max_width = '90'; - $args->image_name_max_height = '20'; - $args->image_mark_max_width = '20'; - $args->image_mark_max_height = '20'; - $args->profile_image_max_width = '80'; - $args->profile_image_max_height = '80'; + if(!$args->enable_openid) $args->enable_openid = 'N'; + if(!$args->image_name) $args->image_name = 'Y'; + if(!$args->image_mark) $args->image_mark = 'Y'; + if(!$args->profile_image) $args->profile_image = 'Y'; + if(!$args->image_name_max_width) $args->image_name_max_width = '90'; + if(!$args->image_name_max_height) $args->image_name_max_height = '20'; + if(!$args->image_mark_max_width) $args->image_mark_max_width = '20'; + if(!$args->image_mark_max_height) $args->image_mark_max_height = '20'; + if(!$args->profile_image_max_width) $args->profile_image_max_width = '80'; + if(!$args->profile_image_max_height) $args->profile_image_max_height = '80'; $oModuleController->insertModuleConfig('member',$args); // 멤버 컨트롤러 객체 생성 + $oMemberModel = &getModel('member'); $oMemberController = &getController('member'); $oMemberAdminController = &getAdminController('member'); - // 관리자, 정회원, 준회원 그룹을 입력 - $group_args->title = Context::getLang('admin_group'); - $group_args->is_default = 'N'; - $group_args->is_admin = 'Y'; - $output = $oMemberAdminController->insertGroup($group_args); + $groups = $oMemberModel->getGroups(); + if(!count($groups)) { + // 관리자, 정회원, 준회원 그룹을 입력 + $group_args->title = Context::getLang('admin_group'); + $group_args->is_default = 'N'; + $group_args->is_admin = 'Y'; + $output = $oMemberAdminController->insertGroup($group_args); - unset($group_args); - $group_args->title = Context::getLang('default_group_1'); - $group_args->is_default = 'Y'; - $group_args->is_admin = 'N'; - $output = $oMemberAdminController->insertGroup($group_args); + unset($group_args); + $group_args->title = Context::getLang('default_group_1'); + $group_args->is_default = 'Y'; + $group_args->is_admin = 'N'; + $output = $oMemberAdminController->insertGroup($group_args); - unset($group_args); - $group_args->title = Context::getLang('default_group_2'); - $group_args->is_default = 'N'; - $group_args->is_admin = 'N'; - $oMemberAdminController->insertGroup($group_args); + unset($group_args); + $group_args->title = Context::getLang('default_group_2'); + $group_args->is_default = 'N'; + $group_args->is_admin = 'N'; + $oMemberAdminController->insertGroup($group_args); + } // 관리자 정보 세팅 - $admin_info = Context::gets('user_id','password','nick_name','user_name', 'email_address'); - if($admin_info->user_id) { - // 관리자 정보 입력 - $oMemberAdminController->insertAdmin($admin_info); + $admin_args->is_admin = 'Y'; + $output = executeQuery('member.getMemberList', $admin_args); + if(!$output->data) { + $admin_info = Context::gets('user_id','password','nick_name','user_name', 'email_address'); + if($admin_info->user_id) { + // 관리자 정보 입력 + $oMemberAdminController->insertAdmin($admin_info); - // 로그인 처리시킴 - $output = $oMemberController->doLogin($admin_info->user_id); + // 로그인 처리시킴 + $output = $oMemberController->doLogin($admin_info->user_id); + } } // 금지 아이디 등록 (기본 + 모듈명) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 64260fc49..b68870db2 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -16,7 +16,7 @@ /** * @brief user_id, password를 체크하여 로그인 시킴 **/ - function procMemberLogin($user_id = null, $password = null, $remember_user_id = null) { + function procMemberLogin($user_id = null, $password = null, $keep_signed = null) { // 변수 정리 if(!$user_id) $user_id = Context::get('user_id'); $user_id = trim($user_id); @@ -24,14 +24,19 @@ if(!$password) $password = Context::get('password'); $password = trim($password); - if($remember_user_id) $remember_user_id = Context::get('remember_user_id'); - if($remember_user_id != 'Y') setcookie('user_id',''); + if(!$keep_signed) $keep_signed = Context::get('keep_signed'); // 아이디나 비밀번호가 없을때 오류 return if(!$user_id) return new Object(-1,'null_user_id'); if(!$password) return new Object(-1,'null_password'); - return $this->doLogin($user_id, $password); + $output = $this->doLogin($user_id, $password, $keep_signed=='Y'?true:false); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->after_login_url) $this->setRedirectUrl($config->after_login_url); + + return $output; } /** @@ -137,8 +142,14 @@ // 로그아웃 이후 trigger 호출 (after) $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'after', $logged_info); if(!$trigger_output->toBool()) return $trigger_output; - - return new Object(); + + $output = new Object(); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->after_logout_url) Context::set('redirect_url', $config->after_logout_url); + + return $output; } /** @@ -167,11 +178,13 @@ $receiver_member_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); if($receiver_member_info->member_srl != $receiver_srl) return new Object(-1, 'msg_not_exists_member'); - // 받을 회원의 쪽지 수신여부 검사 - if($receiver_member_info->allow_message == 'F') { - if(!$oMemberModel->isFriend($receiver_member_info->member_srl)) return new object(-1, 'msg_allow_message_to_friend'); - } elseif($receiver_member_info->allow_messge == 'N') { - return new object(-1, 'msg_disallow_message'); + // 받을 회원의 쪽지 수신여부 검사 (최고관리자이면 패스) + if($logged_info->is_admin != 'Y') { + if($receiver_member_info->allow_message == 'F') { + if(!$oMemberModel->isFriend($receiver_member_info->member_srl)) return new object(-1, 'msg_allow_message_to_friend'); + } elseif($receiver_member_info->allow_messge == 'N') { + return new object(-1, 'msg_disallow_message'); + } } // 쪽지 발송 @@ -895,16 +908,19 @@ if(!$max_height) $max_height = "20"; // 저장할 위치 구함 - $target_path = sprintf('files/member_extra_info/profile_image/%s/', getNumberingPath($member_srl)); + $target_path = sprintf('files/member_extra_info/profile_image/%s', getNumberingPath($member_srl)); FileHandler::makeDir($target_path); - $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); - // 파일 정보 구함 list($width, $height, $type, $attrs) = @getimagesize($target_file); + if($type == 3) $ext = 'png'; + elseif($type == 2) $ext = 'jpg'; + else $ext = 'gif'; + + $target_filename = sprintf('%s%d.%s', $target_path, $member_srl, $ext); // 지정된 사이즈보다 크거나 gif가 아니면 변환 - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); + if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, $ext); else @copy($target_file, $target_filename); } @@ -965,11 +981,14 @@ $member_srl = Context::get('member_srl'); if(!$member_srl) return new Object(0,'success'); - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->profile_image == 'N') return new Object(0,'success'); - $logged_info = Context::get('logged_info'); + + if($logged_info->is_admin != 'Y') { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->profile_image == 'N') return new Object(0,'success'); + } + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { $oMemberModel = &getModel('member'); $profile_image = $oMemberModel->getProfileImage($member_srl); @@ -985,11 +1004,14 @@ $member_srl = Context::get('member_srl'); if(!$member_srl) return new Object(0,'success'); - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->image_name == 'N') return new Object(0,'success'); - $logged_info = Context::get('logged_info'); + + if($logged_info->is_admin != 'Y') { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->image_name == 'N') return new Object(0,'success'); + } + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { $oMemberModel = &getModel('member'); $image_name = $oMemberModel->getImageName($member_srl); @@ -1191,10 +1213,44 @@ return executeQuery('member.addMemberToGroup',$args); } + /** + * @brief 자동 로그인 시킴 + **/ + function doAutologin() { + // 자동 로그인 키 값을 구함 + $args->autologin_key = $_COOKIE['xeak']; + + // 키값에 해당하는 정보 구함 + $output = executeQuery('member.getAutologin', $args); + + // 정보가 없으면 쿠키 삭제 + if(!$output->toBool() || !$output->data) { + setCookie('xeak',null,time()+60*60*24*365, '/'); + return; + } + + $user_id = $output->data->user_id; + $password = $output->data->password; + if(!$user_id || !$password) { + setCookie('xeak',null,time()+60*60*24*365, '/'); + return; + } + + // 정보를 바탕으로 키값 비교 + $key = md5($user_id.$password.$_SERVER['REMOTE_ADDR']); + + if($key == $args->autologin_key) { + $output = $this->doLogin($user_id); + } else { + executeQuery('member.deleteAutologin', $args); + setCookie('xeak',null,time()+60*60*24*365, '/'); + } + } + /** * @brief 로그인 시킴 **/ - function doLogin($user_id, $password = '') { + function doLogin($user_id, $password = '', $keep_signed = false) { // 로그인 이전에 trigger 호출 (before) $trigger_obj->user_id = $user_id; $trigger_obj->password = $password; @@ -1230,6 +1286,18 @@ $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); if(!$trigger_output->toBool()) return $trigger_output; + // 자동 로그인 사용시 정보 처리 + if($keep_signed) { + // 자동 로그인 키 생성 + $autologin_args->autologin_key = md5($user_id.$member_info->password.$_SERVER['REMOTE_ADDR']); + $autologin_args->member_srl = $member_info->member_srl; + executeQuery('member.deleteAutologin', $autologin_args); + $autologin_output = executeQuery('member.insertAutologin', $autologin_args); + if($autologin_output->toBool()) { + setCookie('xeak',$autologin_args->autologin_key, time()+60*60*24*365, '/'); + } + } + $this->setSessionInfo($member_info); return $output; @@ -1255,7 +1323,7 @@ if(!$member_info->member_srl) return; // 오픈아이디인지 체크 (일단 아이디 형식으로만 결정) - if(eregi("^([0-9a-z]+)$", $member_info->user_id)) $member_info->is_openid = false; + if(preg_match("/^([0-9a-z]+)$/is", $member_info->user_id)) $member_info->is_openid = false; else $member_info->is_openid = true; // 로그인 처리를 위한 세션 설정 @@ -1321,8 +1389,8 @@ list($args->email_id, $args->email_host) = explode('@', $args->email_address); // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !eregi("^http:\/\/",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !eregi("^http:\/\/",$args->blog)) $args->blog = 'http://'.$args->blog; + if($args->homepage && !preg_match("/^http:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !preg_match("/^http:\/\//i",$args->blog)) $args->blog = 'http://'.$args->blog; // 모델 객체 생성 $oMemberModel = &getModel('member'); @@ -1408,6 +1476,7 @@ // 수정하려는 대상의 원래 정보 가져오기 $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + if(!$args->user_id) $args->user_id = $member_info->user_id; // 필수 변수들의 조절 if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; @@ -1424,8 +1493,8 @@ list($args->email_id, $args->email_host) = explode('@', $args->email_address); // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !eregi("^http:\/\/",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !eregi("^http:\/\/",$args->blog)) $args->blog = 'http://'.$args->blog; + if($args->homepage && !preg_match("/^http:\/\//is",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !preg_match("/^http:\/\//is",$args->blog)) $args->blog = 'http://'.$args->blog; // 아이디, 닉네임, email address 의 중복 체크 $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); @@ -1559,79 +1628,6 @@ return $output; } - /** - * @brief 최종 출력물에서 이미지 이름을 변경 - * member_extra_info 애드온에서 요청이 됨 - **/ - function transImageName($matches) { - $member_srl = $matches[3]; - if($member_srl<0) return $matches[5]; - - $text = $matches[5]; - if(!$member_srl) return $matches[0]; - - // 전역변수에 미리 설정한 데이터가 있다면 그걸 return - if(!$GLOBALS['_transImageNameList'][$member_srl]) { - $oMemberModel = &getModel('member'); - - $GLOBALS['_transImageNameList'][$member_srl]['image_name'] = $oMemberModel->getImageName($member_srl); - $GLOBALS['_transImageNameList'][$member_srl]['image_mark'] = $oMemberModel->getImageMark($member_srl); - } - $image_name = $GLOBALS['_transImageNameList'][$member_srl]['image_name']; - $image_mark = $GLOBALS['_transImageNameList'][$member_srl]['image_mark']; - - // 이미지이름이나 마크가 없으면 원본 정보를 세팅 - if(!$image_name && !$image_mark) return $matches[0]; - - if($image_name->width) { - $text = sprintf('id: %s', Context::getRequestUri().$image_name->file, htmlspecialchars(strip_tags($matches[5])), htmlspecialchars(strip_tags($matches[5])), $image_name->width, $image_name->height); - } - - if($image_mark->width) { - $text = sprintf('id: %s%s', Context::getRequestUri().$image_mark->file, htmlspecialchars(strip_tags($matches[5])), htmlspecialchars(strip_tags($matches[5])), $image_mark->width, $image_mark->height, $text); - } - - return sprintf('%s',$member_srl, $text); - } - - /** - * @brief 최종 출력물에서 서명을 변경, 프로필 이미지도 같이 적용함 - * member_extra_info 애드온에서 요청이 됨 - **/ - function transSignature($matches) { - $oModuleModel = &getModel('module'); - $memberModuleConfig = $oModuleModel->getModuleConfig('member'); - - $member_srl = $matches[2]; - if(!$member_srl) return $matches[0]; - - // 전역변수에 미리 설정한 데이터가 있다면 그걸 return - if(!isset($GLOBALS['_transSignatureList'][$member_srl])) { - $oMemberModel = &getModel('member'); - - // 서명을 구해옴 - $signature = $oMemberModel->getSignature($member_srl); - - // 프로필 이미지를 구해옴 - $profile_image = $oMemberModel->getProfileImage($member_srl); - if($profile_image->src) $signature = sprintf('%s', $profile_image->src, $profile_image->width, $profile_image->height, $signature); - - // 서명이 있으면 반환 - if($signature) { - // 서명 높이 제한 값이 있으면 표시 높이 제한 - if($memberModuleConfig->signature_max_height) { - $GLOBALS['_transSignatureList'][$member_srl] = sprintf('
    %s
    ', $memberModuleConfig->signature_max_height, $memberModuleConfig->signature_max_height, $memberModuleConfig->signature_max_height, $signature); - } else { - $GLOBALS['_transSignatureList'][$member_srl] = sprintf('
    %s
    ', $signature); - } - } else { - $GLOBALS['_transSignatureList'][$member_srl] = null; - } - } - - return $GLOBALS['_transSignatureList'][$member_srl].$matches[0]; - } - /** * @brief 모든 세션 정보 파기 **/ @@ -1640,6 +1636,12 @@ foreach($_SESSION as $key => $val) { $_SESSION[$key] = ''; } + session_destroy(); + + if($_COOKIE['xeak']) { + $args->autologin_key = $_COOKIE['xeak']; + executeQuery('member.deleteAutologin', $args); + } } } ?> diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 3a81ac1fb..cf2ff5022 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -146,7 +146,7 @@ unset($info->extra_vars); if(!$extra_vars) return $info; foreach($extra_vars as $key => $val) { - if(eregi('\|\@\|', $val)) $val = explode('|@|', $val); + if(preg_match('/\|\@\|/i', $val)) $val = explode('|@|', $val); if(!$info->{$key}) $info->{$key} = $val; } return $info; @@ -280,6 +280,8 @@ if(!is_array($join_form_list)) $join_form_list = array($join_form_list); $join_form_count = count($join_form_list); for($i=0;$i<$join_form_count;$i++) { + $join_form_list[$i]->column_name = strtolower($join_form_list[$i]->column_name); + $member_join_form_srl = $join_form_list[$i]->member_join_form_srl; $column_type = $join_form_list[$i]->column_type; $column_name = $join_form_list[$i]->column_name; @@ -313,6 +315,12 @@ $obj->lang = $val->column_title; $obj->required = $val->required=='Y'?true:false; $filter_output[] = $obj; + + unset($open_obj); + $open_obj->name = 'open_'.$val->column_name; + $open_obj->required = false; + $filter_output[] = $open_obj; + } return $filter_output; @@ -329,10 +337,18 @@ $extend_form_list = $this->getJoinFormlist(); if(!$extend_form_list) return; + // 관리자이거나 자기 자신이 아니면 비공개의 경우 무조건 패스해버림 + $logged_info = Context::get('logged_info'); + foreach($extend_form_list as $srl => $item) { $column_name = $item->column_name; $value = $member_info->{$column_name}; + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_info->member_srl && $member_info->{'open_'.$column_name}!='Y') { + $extend_form_list[$srl]->is_private = true; + continue; + } + // 추가 확장폼의 종류에 따라 값을 변경 switch($item->column_type) { case 'checkbox' : @@ -349,6 +365,9 @@ } $extend_form_list[$srl]->value = $value; + + if($member_info->{'open_'.$column_name}=='Y') $extend_form_list[$srl]->is_opened = true; + else $extend_form_list[$srl]->is_opened = false; } return $extend_form_list; } @@ -404,54 +423,76 @@ * @brief 프로필 이미지의 정보를 구함 **/ function getProfileImage($member_srl) { - $image_name_file = sprintf('files/member_extra_info/profile_image/%s%d.gif', getNumberingPath($member_srl), $member_srl); - if(!file_exists($image_name_file)) return; - list($width, $height, $type, $attrs) = getimagesize($image_name_file); - $info->width = $width; - $info->height = $height; - $info->src = Context::getRequestUri().$image_name_file; - $info->file = './'.$image_name_file; - return $info; + if(!isset($GLOBALS['__member_info__']['profile_image'][$member_srl])) { + $GLOBALS['__member_info__']['profile_image'][$member_srl] = null; + $exts = array('gif','jpg','png'); + for($i=0;$i<3;$i++) { + $image_name_file = sprintf('files/member_extra_info/profile_image/%s%d.%s', getNumberingPath($member_srl), $member_srl, $exts[$i]); + if(file_exists($image_name_file)) { + list($width, $height, $type, $attrs) = getimagesize($image_name_file); + $info = null; + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_name_file; + $info->file = './'.$image_name_file; + $GLOBALS['__member_info__']['profile_image'][$member_srl] = $info; + break; + } + } + } + + return $GLOBALS['__member_info__']['profile_image'][$member_srl]; } /** * @brief 이미지이름의 정보를 구함 **/ function getImageName($member_srl) { - $image_name_file = sprintf('files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl); - if(!file_exists($image_name_file)) return; - list($width, $height, $type, $attrs) = getimagesize($image_name_file); - $info->width = $width; - $info->height = $height; - $info->src = Context::getRequestUri().$image_name_file; - $info->file = './'.$image_name_file; - return $info; + if(!isset($GLOBALS['__member_info__']['image_name'][$member_srl])) { + $image_name_file = sprintf('files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(file_exists($image_name_file)) { + list($width, $height, $type, $attrs) = getimagesize($image_name_file); + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_name_file; + $info->file = './'.$image_name_file; + $GLOBALS['__member_info__']['image_name'][$member_srl] = $info; + } else $GLOBALS['__member_info__']['image_name'][$member_srl] = null; + } + return $GLOBALS['__member_info__']['image_name'][$member_srl]; } /** * @brief 이미지마크의 정보를 구함 **/ function getImageMark($member_srl) { - $image_mark_file = sprintf('files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl); - if(!file_exists($image_mark_file)) return; - list($width, $height, $type, $attrs) = getimagesize($image_mark_file); - $info->width = $width; - $info->height = $height; - $info->src = Context::getRequestUri().$image_mark_file; - $info->file = './'.$image_mark_file; - return $info; + if(!isset($GLOBALS['__member_info__']['image_mark'][$member_srl])) { + $image_mark_file = sprintf('files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(file_exists($image_mark_file)) { + list($width, $height, $type, $attrs) = getimagesize($image_mark_file); + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_mark_file; + $info->file = './'.$image_mark_file; + $GLOBALS['__member_info__']['image_mark'][$member_srl] = $info; + } else $GLOBALS['__member_info__']['image_mark'][$member_srl] = null; + } + return $GLOBALS['__member_info__']['image_mark'][$member_srl]; } /** * @brief 사용자의 signature를 구함 **/ function getSignature($member_srl) { - $filename = sprintf('files/member_extra_info/signature/%s%d.signature.php', getNumberingPath($member_srl), $member_srl); - if(!file_exists($filename)) return ''; - - $buff = FileHandler::readFile($filename); - $signature = trim(substr($buff, 40)); - return $signature; + if(!isset($GLOBALS['__member_info__']['signature'][$member_srl])) { + $filename = sprintf('files/member_extra_info/signature/%s%d.signature.php', getNumberingPath($member_srl), $member_srl); + if(file_exists($filename)) { + $buff = FileHandler::readFile($filename); + $signature = trim(substr($buff, 40)); + $GLOBALS['__member_info__']['signature'][$member_srl] = $signature; + } else $GLOBALS['__member_info__']['signature'][$member_srl] = null; + } + return $GLOBALS['__member_info__']['signature'][$member_srl]; } /** diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 03f9e1eee..da34964fc 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -110,6 +110,7 @@ $option->enable_default_component = true; $option->enable_component = false; $option->resizable = false; + $option->disable_html = true; $option->height = 200; $editor = $oEditorModel->getEditor($member_info->member_srl, $option); Context::set('editor', $editor); @@ -261,7 +262,11 @@ * @brief 로그아웃 출력 **/ function dispMemberLogout() { - // 템플릿 파일 지정 + $oMemberController = &getController('member'); + $oMemberController->procMemberLogout(); + + Context::set('layout','none'); + $this->setTemplatePath($this->module_path.'/tpl'); $this->setTemplateFile('logout'); } @@ -286,7 +291,7 @@ // message_srl이 있으면 내용 추출 if($message_srl) { $message = $oMemberModel->getSelectedMessage($message_srl); - if($message->message_srl == $message_srl) Context::set('message', $message); + if($message->message_srl == $message_srl && ($message->receiver_srl == $logged_info->member_srl || $message->sender_srl == $logged_info->member_srl) ) Context::set('message', $message); } // 목록 추출 @@ -359,6 +364,7 @@ **/ function dispMemberSendMessage() { $this->setLayoutFile("popup_layout"); + $oMemberModel = &getModel('member'); // 로그인이 되어 있지 않으면 오류 표시 if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); @@ -368,7 +374,17 @@ $receiver_srl = Context::get('receiver_srl'); if(!$receiver_srl || $logged_info->member_srl == $receiver_srl) return $this->stop('msg_not_logged'); - $oMemberModel = &getModel('member'); + // 답글 쪽지일 경우 원본 메세지의 글번호를 구함 + $message_srl = Context::get('message_srl'); + if($message_srl) { + $source_message = $oMemberModel->getSelectedMessage($message_srl); + if($source_message->message_srl == $message_srl && $source_message->sender_srl == $receiver_srl) { + $source_message->title = "[re] ".$source_message->title; + $source_message->content = "\r\n
    \r\n
    ".trim($source_message->content)."
    "; + Context::set('source_message', $source_message); + } + } + $receiver_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); Context::set('receiver_info', $receiver_info); @@ -381,6 +397,7 @@ $option->enable_default_component = false; $option->enable_component = false; $option->resizable = false; + $option->disable_html = true; $option->height = 300; $editor = $oEditorModel->getEditor($logged_info->member_srl, $option); Context::set('editor', $editor); diff --git a/modules/member/queries/deleteAutologin.xml b/modules/member/queries/deleteAutologin.xml new file mode 100644 index 000000000..5919a4058 --- /dev/null +++ b/modules/member/queries/deleteAutologin.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/member/queries/deleteMembersGroup.xml b/modules/member/queries/deleteMembersGroup.xml new file mode 100644 index 000000000..2b59d25a8 --- /dev/null +++ b/modules/member/queries/deleteMembersGroup.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/member/queries/getAutologin.xml b/modules/member/queries/getAutologin.xml new file mode 100644 index 000000000..078182d48 --- /dev/null +++ b/modules/member/queries/getAutologin.xml @@ -0,0 +1,15 @@ + + +
    +
    + + + + + + + + + + + diff --git a/modules/member/queries/getMembers.xml b/modules/member/queries/getMembers.xml new file mode 100644 index 000000000..a12e84dd3 --- /dev/null +++ b/modules/member/queries/getMembers.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/modules/member/queries/insertAutologin.xml b/modules/member/queries/insertAutologin.xml new file mode 100644 index 000000000..ed3c5aa3d --- /dev/null +++ b/modules/member/queries/insertAutologin.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/member/schemas/member_autologin.xml b/modules/member/schemas/member_autologin.xml new file mode 100644 index 000000000..a18bf578c --- /dev/null +++ b/modules/member/schemas/member_autologin.xml @@ -0,0 +1,4 @@ +
    + + +
    diff --git a/modules/member/skins/default/css/common.css b/modules/member/skins/default/css/common.css index 2ee2845e2..47e26ac19 100644 --- a/modules/member/skins/default/css/common.css +++ b/modules/member/skins/default/css/common.css @@ -84,7 +84,7 @@ .readMessage .messageHeader address em { font-size:1em; font-style:white; color:#333333; margin-right:.3em; float:left;} .readMessage .messageHeader address em a { color:#333333;} .readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999; margin-left:10px;} -.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;} +.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; color:#666666;} .readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;} .instantMessage { float:right; overflow:hidden;} .instantMessage li { float:left; padding:0 .8em 0 .8em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center; list-style:none; } @@ -99,28 +99,45 @@ .memberInfoTable th, .memberInfoTable td { border-top:1px solid #eaebe7; padding:.5em;} .memberInfoTable th { background:#f5f5f3; text-align:left; padding:.5em 1em;} .memberInfoTable td { border-left:1px solid #eaebe7;} -.memberInfoTable 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;} +.memberInfoTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; margin-right:.5em; margin-bottom:.5em; color:#666666;} .memberInfoTable td input.radio, .memberInfoTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;} .memberInfoTable td input.w4em { width:4em;} .memberInfoTable td input.w2em { width:2em;} -.memberInfoTable td select { float:left; margin-right:.5em;} +.memberInfoTable td select { margin-right:.5em;} +.memberInfoTable td checkbox { border:0; } .memberInfoTable td .fl { margin-right:.5em;} .memberInfoTable td br { clear:both;} -.memberInfoTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} -.memberInfoTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;} +.memberInfoTable td p { font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;} +.memberInfoTable td label { color:#3f4040; padding-top:.3em; margin-right:.5em;} +.memberInfoTable td ul { list-style:none; } .memberInfoTable td .checkbox { border:none; } +/* 아이디, 이름, 이메일 주소 중복 체크후 중복되면 출력되는 메세지의 className */ +.memberInfoTable td .checkValue { margin-top:5px; font-weight:bold; color:#444444; } + /* modify/ insert member info */ .memberImage { clear:both; } .memberImage .info { margin-bottom:1.5em; float:left; margin-right:1em;} .memberImage .form { float:left; } .memberImage .form input { height:1.5em; margin:0 .3em 0 0; padding:0;} + .checkbox li { float:left; margin-right:2em; } .checkbox li input { border:none; } + .str_birthday { cursor:pointer; float:left; width:80px; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1em; padding:3px 3px 3px 18px; margin-right:.3em;} .krZip .address2 { clear:both; margin-top:10px;} + .extendDesc { clear:both; margin-top:0; font-size:.9em; color:#999999; } +.extendPublic { clear:both; margin-top:5px; padding:0; font-size:.9em; color:#999999; } +.extendPublic input { padding:0; margin:0; } + +.publicItem { display:block; margin-top:5px;} +.publicItem input { margin:0; padding:0;} +.publicItem label { font-weight:normal; margin:0; padding:0; color:#666666;} +span.publicItem { display:inline; margin:0; font-weight:normal; color:#666666; } +span.privateItem { display:inline; margin:0; font-weight:normal; color:#666666; } + .agreementBox { border:1px solid #AAAAAA; margin:.5em 0 0 0; padding:1em; border-bottom:none; height:200px; overflow-y:scroll;} .agreementButton { background-color:#EEEEEE; padding:1em; border:1px solid #AAAAAA; border-top:none;} diff --git a/modules/member/skins/default/css/cyan.css b/modules/member/skins/default/css/cyan.css index f1b1227f1..f44b4ac04 100644 --- a/modules/member/skins/default/css/cyan.css +++ b/modules/member/skins/default/css/cyan.css @@ -1,4 +1,4 @@ @charset "utf-8"; .boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} -.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} +.memberSmallBox .header h3 { margin:0; border:none; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #2895c0; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/green.css b/modules/member/skins/default/css/green.css index c8cfafe64..878496c2b 100644 --- a/modules/member/skins/default/css/green.css +++ b/modules/member/skins/default/css/green.css @@ -1,4 +1,4 @@ @charset "utf-8"; .boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d0dbd1; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} -.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} +.memberSmallBox .header h3 { margin:0; border:none; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #38b549; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/purple.css b/modules/member/skins/default/css/purple.css index 1e7882b43..3cd1adf13 100644 --- a/modules/member/skins/default/css/purple.css +++ b/modules/member/skins/default/css/purple.css @@ -1,4 +1,4 @@ @charset "utf-8"; .boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #d1d9db; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} -.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} +.memberSmallBox .header h3 { margin:0; border:none; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #ac19a9; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/red.css b/modules/member/skins/default/css/red.css index 96cd17842..e3af1d9e4 100644 --- a/modules/member/skins/default/css/red.css +++ b/modules/member/skins/default/css/red.css @@ -1,4 +1,4 @@ @charset "utf-8"; .boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border-left:1px solid #e1e1dd; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} -.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} +.memberSmallBox .header h3 { margin:0; border:none; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/css/white.css b/modules/member/skins/default/css/white.css index 08eca972c..10cb268b4 100644 --- a/modules/member/skins/default/css/white.css +++ b/modules/member/skins/default/css/white.css @@ -1,5 +1,5 @@ @charset "utf-8"; .boardHeader h3 { float:left; clear:both; font-size:1.2em; padding:1em 2em .7em 1.2em; border:none; border-left:1px solid #e1e1dd; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} -.memberSmallBox .header h3 { margin:0; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border:none; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} +.memberSmallBox .header h3 { margin:0; border:none; float:left; clear:both; font-size:1.2em; padding:.8em 2em .6em 1.2em; border:none; border-bottom:3px solid #fe3614; background:url(../images/common/lineH3.gif) no-repeat right bottom;} diff --git a/modules/member/skins/default/find_member_account.html b/modules/member/skins/default/find_member_account.html index 644a7f735..0291df39f 100644 --- a/modules/member/skins/default/find_member_account.html +++ b/modules/member/skins/default/find_member_account.html @@ -8,7 +8,7 @@ - +
    diff --git a/modules/member/skins/default/friends_list.html b/modules/member/skins/default/friends_list.html index f0bea28e0..71e194475 100644 --- a/modules/member/skins/default/friends_list.html +++ b/modules/member/skins/default/friends_list.html @@ -22,17 +22,16 @@
    - + + - - - @@ -55,7 +53,6 @@ - diff --git a/modules/member/skins/default/js/member.js b/modules/member/skins/default/js/member.js index bd813dbec..5ced64d67 100644 --- a/modules/member/skins/default/js/member.js +++ b/modules/member/skins/default/js/member.js @@ -74,13 +74,12 @@ function doUploadImageMark() { /* 로그인 영역에 포커스 */ function doFocusUserId(fo_id) { + if(xScrollTop()) return; var fo_obj = xGetElementById(fo_id); - if(xGetCookie('user_id')) { - fo_obj.user_id.value = xGetCookie('user_id'); - fo_obj.remember_user_id.checked = true; - fo_obj.password.focus(); - } else { - fo_obj.user_id.focus(); + if(fo_obj.user_id) { + try{ + fo_obj.user_id.focus(); + } catch(e) {}; } } @@ -134,8 +133,9 @@ function completeSendMessage(ret_obj) { window.close(); } -function doSendMessage(member_srl) { - var url = current_url.setQuery('module','member').setQuery('act','dispMemberSendMessage').setQuery('receiver_srl',member_srl); +function doSendMessage(member_srl, message_srl) { + if(typeof(message_srl)=='undefined') message_srl = 0; + var url = current_url.setQuery('module','member').setQuery('act','dispMemberSendMessage').setQuery('receiver_srl',member_srl).setQuery('message_srl',message_srl); popopen(url, 'sendMessage'); } diff --git a/modules/member/skins/default/leave_form.html b/modules/member/skins/default/leave_form.html index 016419632..0b087e690 100644 --- a/modules/member/skins/default/leave_form.html +++ b/modules/member/skins/default/leave_form.html @@ -8,7 +8,7 @@ -
    - @@ -43,7 +42,6 @@ {$lang->user_name} {$lang->nick_name} {$lang->regdate}{$lang->cmd_send_message}
    {$val->user_name}
    {$val->nick_name}
    {zdate($val->regdate,"Y-m-d")}{$lang->cmd_send_message}
    +
    diff --git a/modules/member/skins/default/login_form.html b/modules/member/skins/default/login_form.html index 5e59f03b2..64d9511e4 100644 --- a/modules/member/skins/default/login_form.html +++ b/modules/member/skins/default/login_form.html @@ -2,6 +2,11 @@ + +
    @@ -21,8 +26,8 @@

    - - + +

    @@ -57,8 +62,4 @@
    - - diff --git a/modules/member/skins/default/member_info.html b/modules/member/skins/default/member_info.html index 607dad13e..f4b210d50 100644 --- a/modules/member/skins/default/member_info.html +++ b/modules/member/skins/default/member_info.html @@ -22,6 +22,12 @@ + + + + + + @@ -77,19 +83,29 @@ {@ $dummy_chk = 0 } class="first-child" {@ $dummy_chk = 1; }> - + diff --git a/modules/member/skins/default/member_messages.html b/modules/member/skins/default/member_messages.html index b3576371e..86651c3e6 100644 --- a/modules/member/skins/default/member_messages.html +++ b/modules/member/skins/default/member_messages.html @@ -22,11 +22,11 @@ -
    {$message->content}
    +
    {$message->content}
    - {$lang->cmd_reply} + {$lang->cmd_reply} {$lang->cmd_store} diff --git a/modules/member/skins/default/modify_info.html b/modules/member/skins/default/modify_info.html index 5799bb398..08ff8ed41 100644 --- a/modules/member/skins/default/modify_info.html +++ b/modules/member/skins/default/modify_info.html @@ -109,7 +109,7 @@
    - + - + diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html index 3af629df6..00937ca31 100644 --- a/modules/member/skins/default/signup_form.html +++ b/modules/member/skins/default/signup_form.html @@ -41,26 +41,41 @@ - + - + - + - + - + - + - +
    {$lang->nick_name} {htmlspecialchars($member_info->nick_name)}
    {$lang->profile_image}profile_image
    {$lang->image_name}
    {htmlspecialchars($val->column_title)} + {htmlspecialchars($val->column_title)} + - - {htmlspecialchars($val->value[0])} - {htmlspecialchars($val->value[1])} - {htmlspecialchars($val->value[2])}  - - {$val->value[0]} {htmlspecialchars($val->value[1])}  - - {htmlspecialchars(implode(",",$val->value))}  - - {zdate($val->value, "Y-m-d")}  - - {nl2br(htmlspecialchars($val->value))}  - + + {$lang->private} + + + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} + + {htmlspecialchars($val->value[0])}
    {htmlspecialchars($val->value[1])} + + {htmlspecialchars(implode(", ",$val->value))}  + + {zdate($val->value, "Y-m-d")}  + + {nl2br(htmlspecialchars($val->value))}  + +

    {$lang->about_blog_url}

    {$lang->birthday} *{$lang->birthday}
    {zdate($member_info->birthday,"Y-m-d")}
    @@ -149,6 +149,10 @@
    {htmlspecialchars($val->column_title)} * +
    + is_opened)-->checked="checked" value="Y" id="open_{$val->column_name}" /> + +
    diff --git a/modules/member/skins/default/send_message.html b/modules/member/skins/default/send_message.html index e45bf1ab9..f80880033 100644 --- a/modules/member/skins/default/send_message.html +++ b/modules/member/skins/default/send_message.html @@ -9,7 +9,7 @@
    - +
    @@ -22,7 +22,7 @@
    {$lang->title}
    {$lang->cmd_option}
    {$lang->user_name} *

    {$lang->about_user_name}

    + +

    {$lang->about_user_name}

    +
    {$lang->nick_name} *

    {$lang->about_nick_name}

    + +

    {$lang->about_nick_name}

    +
    {$lang->email_address} *

    {$lang->about_email_address}

    + +

    {$lang->about_email_address}

    +
    {$lang->homepage}

    {$lang->about_homepage}

    + +

    {$lang->about_homepage}

    +
    {$lang->blog}

    {$lang->about_blog_url}

    + +

    {$lang->about_blog_url}

    +
    {$lang->birthday} *{$lang->birthday}
     
    @@ -70,7 +85,7 @@
    {$lang->allow_mailing}

    {$lang->about_allow_mailing}

    {$lang->about_allow_mailing}

    @@ -86,6 +101,10 @@ {htmlspecialchars($val->column_title)} * +
    + + +
    @@ -134,21 +153,21 @@ diff --git a/modules/member/skins/default/skin.xml b/modules/member/skins/default/skin.xml index 5066938af..9d0165158 100644 --- a/modules/member/skins/default/skin.xml +++ b/modules/member/skins/default/skin.xml @@ -4,11 +4,15 @@ 会员模块默认皮肤 会員デフォルトスキン Default Member Skin + Por defecto miembro piel + По умолчанию членом кожи (주)NHN (株)NHN (株)NHN NHN Corp + NHN Corp + NHN Корп 회원모듈의 default스킨 디자인 : 서기정 (http://blog.naver.com/addcozy) @@ -28,6 +32,16 @@ default skin of member module Design : Ki-Jeong Seo (http://blog.naver.com/addcozy) HTML/CSS : Chan-Myung Jeong (http://naradesign.net) + + + Por defecto de la piel miembro módulo + Diseño: Ki-Jeong Seo (http://blog.naver.com/addcozy) + HTML / CSS: Jeong Chan-Myung (http://naradesign.net) + + + умолчанию кожу члена модуль + Дизайн: Ги Чен Се (http://blog.naver.com/addcozy) + HTML / CSS: Чен-Чен Мен (http://naradesign.net) @@ -36,30 +50,40 @@ 默认 デフォルト default + Por defecto + умолчанию 청록색 青緑 青绿色 cyan + Cian + бирюзовый 초록색 绿色 green + Verde + зеленый 빨간색 红色 red + Roja + красный 보라색 紫色 purple + Púrpura + Лиловый diff --git a/modules/member/tpl/css/member_admin.css b/modules/member/tpl/css/member_admin.css new file mode 100644 index 000000000..b99be882e --- /dev/null +++ b/modules/member/tpl/css/member_admin.css @@ -0,0 +1,7 @@ +@charset "utf-8"; + +.publicItem { display:block; margin-top:5px;} +.publicItem input { margin:0; padding:0;} +.publicItem label { font-weight:normal; margin:0; padding:0; color:#666666;} +span.publicItem { display:inline; margin:0; font-weight:normal; color:#666666; } + diff --git a/modules/member/tpl/filter/manage_member_group.xml b/modules/member/tpl/filter/manage_member_group.xml new file mode 100644 index 000000000..8332af382 --- /dev/null +++ b/modules/member/tpl/filter/manage_member_group.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index 05e0f8ba8..7c7439fa4 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -1,5 +1,6 @@ + @@ -150,23 +151,25 @@ - - * - - {$val->column_title} + {htmlspecialchars($val->column_title)} + * +
    + is_opened)-->checked="checked" value="Y" id="open_{$val->column_name}" /> + +
    - + - + - + @@ -199,26 +202,26 @@
    - +
    - +
    - +
    - + diff --git a/modules/member/tpl/js/member_admin.js b/modules/member/tpl/js/member_admin.js index b86a5c5f9..ca2824af7 100644 --- a/modules/member/tpl/js/member_admin.js +++ b/modules/member/tpl/js/member_admin.js @@ -282,3 +282,29 @@ function doDisplaySkinColorset(ret_obj) { var new_height = xHeight("member_colorset"); if(typeof(fixAdminLayoutFooter)=="function") fixAdminLayoutFooter(new_height - old_height); } + +/* 그룹 일괄 변경 */ +function doManageMemberGroup() { + var fo_obj = xGetElementById("member_fo"); + var member_srl = new Array(); + + if(typeof(fo_obj.cart.length)=='undefined') { + if(fo_obj.cart.checked) member_srl[member_srl.length] = fo_obj.cart.value; + } else { + var length = fo_obj.cart.length; + for(var i=0;i + + location.href = "{$redirect_url}"; + + location.href = current_url.setQuery('act',''); + + diff --git a/modules/member/tpl/manage_member_group.html b/modules/member/tpl/manage_member_group.html new file mode 100644 index 000000000..c1f12e75d --- /dev/null +++ b/modules/member/tpl/manage_member_group.html @@ -0,0 +1,53 @@ + + + +
    +

    {$lang->cmd_member_group} ({$lang->target} : {count($member_list)})

    +
    + + + + +
    + + + + + + + + + +
    + + +
     
    + + +
    + +
    + + + + + + + + + + + + + + +
    {$lang->user_id}{$lang->nick_name}{$lang->signup_date}
    {$val->user_id}
    {$val->nick_name}
    {zdate($val->regdate, "Y-m-d H:i")}
    +
    + + + + diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index 134d3acdd..caec89fc5 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -84,10 +84,24 @@

    {$lang->about_signature_max_height}

    + + {$lang->after_login_url} + + +

    {$lang->about_after_login_url}

    + + + + {$lang->after_logout_url} + + +

    {$lang->about_after_logout_url}

    + + {$lang->redirect_url} - +

    {$lang->about_redirect_url}

    diff --git a/modules/member/tpl/member_info.html b/modules/member/tpl/member_info.html index 3487d9897..772a33a77 100644 --- a/modules/member/tpl/member_info.html +++ b/modules/member/tpl/member_info.html @@ -95,19 +95,19 @@ {$lang->homepage} - {htmlspecialchars($member_info->homepage)} + {htmlspecialchars($member_info->homepage)}  {$lang->blog} - {htmlspecialchars($member_info->blog)} + {htmlspecialchars($member_info->blog)}  {$lang->birthday} - {zdate($member_info->birthday,'Y-m-d')} + {zdate($member_info->birthday,'Y-m-d')}  {$lang->allow_mailing} - {$member_info->allow_mailing} + {$member_info->allow_mailing}  {$lang->allow_message} @@ -115,7 +115,7 @@ {$lang->signature} - {$member_info->signature} + {$member_info->signature}  {$lang->denied} @@ -127,6 +127,7 @@ {zdate($member_info->limit_date,"Y-m-d H:i")} +   @@ -144,26 +145,31 @@ - {htmlspecialchars($val->column_title)} + {htmlspecialchars($val->column_title)} ({$lang->public}) - {htmlspecialchars($val->value[0])} - {htmlspecialchars($val->value[1])} - {htmlspecialchars($val->value[2])} + {htmlspecialchars($val->value[0])} + - + {htmlspecialchars($val->value[1])} + - + {htmlspecialchars($val->value[2])} - {htmlspecialchars($val->value[0])} {htmlspecialchars($val->value[1])} - - {htmlspecialchars(implode(",",$val->value))} + {htmlspecialchars($val->value[0])}
    {htmlspecialchars($val->value[1])} + + {htmlspecialchars(implode(", ",$val->value))} {zdate($val->value, "Y-m-d")} {nl2br(htmlspecialchars($val->value))} +   {$lang->description} - {htmlspecialchars($member_info->description)} + {htmlspecialchars($member_info->description)}  diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index 9d0880eff..54dc44d06 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -3,9 +3,11 @@ +
    +@@ -15,6 +17,7 @@ +@@ -24,6 +27,7 @@ +@@ -33,6 +37,7 @@ +@@ -42,6 +47,7 @@ +@@ -51,6 +57,7 @@ +@@ -61,6 +68,7 @@ + @@ -73,6 +81,7 @@ +
    {$lang->no} {$lang->user_id} {$lang->user_name} {$lang->nick_name}
    {$no} {htmlspecialchars($val->user_id)} {$lang->denied} @@ -89,6 +98,9 @@
    + @@ -105,6 +117,7 @@ {$lang->last_page}
    +
    diff --git a/modules/menu/conf/module.xml b/modules/menu/conf/module.xml index d9c0f3dcd..05d662c18 100644 --- a/modules/menu/conf/module.xml +++ b/modules/menu/conf/module.xml @@ -15,5 +15,8 @@ + + + diff --git a/modules/menu/lang/en.lang.php b/modules/menu/lang/en.lang.php index 9defe0f8e..d4675bfa6 100644 --- a/modules/menu/lang/en.lang.php +++ b/modules/menu/lang/en.lang.php @@ -5,15 +5,15 @@ * @brief Menu module's basic language pack **/ - $lang->cmd_menu_insert = 'Create menu'; - $lang->cmd_menu_management = 'Menu management'; + $lang->cmd_menu_insert = 'Create Menu'; + $lang->cmd_menu_management = 'Menu Management'; $lang->menu = 'Menu'; $lang->menu_count = 'No. of menu'; - $lang->menu_management = 'Menu management'; + $lang->menu_management = 'Menu Management'; $lang->depth = 'Step'; $lang->parent_menu_name = 'Parent menu name'; - $lang->menu_name = 'Menu name'; + $lang->menu_name = 'Menu Name'; $lang->menu_srl = 'Menu SRL'; $lang->menu_id = 'Menu ID'; $lang->menu_url = 'Menu URL'; @@ -23,20 +23,20 @@ $lang->menu_normal_btn = 'Normal'; $lang->menu_hover_btn = 'Mouse over'; $lang->menu_active_btn = 'When selected'; - $lang->menu_group_srls = 'Accessable groups'; - $lang->layout_maker = "Layout maker"; - $lang->layout_history = "Update history "; - $lang->layout_info = "Layout info"; - $lang->layout_list = 'Layout list'; - $lang->downloaded_list = 'Downloaded list'; - $lang->limit_menu_depth = 'Display enabled'; + $lang->menu_group_srls = 'Accessable Groups'; + $lang->layout_maker = "Layout Maker"; + $lang->layout_history = "Update History "; + $lang->layout_info = "Layout Info"; + $lang->layout_list = 'Layout List'; + $lang->downloaded_list = 'Download List'; + $lang->limit_menu_depth = 'Display Eenabled'; $lang->cmd_make_child = 'Add a child menu'; $lang->cmd_move_to_installed_list = "View created lists"; $lang->cmd_enable_move_menu = "Move menu (Drag the top menu after selecting)"; $lang->cmd_search_mid = "Search mid"; - $lang->msg_cannot_delete_for_child = 'Cannot delete a menu having a child menu.'; + $lang->msg_cannot_delete_for_child = 'A menu with child menus cannot be deleted.'; $lang->about_title = 'Please input the title that is easy to verify when connecting to module.'; $lang->about_menu_management = "Menu management enables you to consist menu in the selected layout.\nYou can create menu upto setted depth and can enter information in details by clicking the menu.\nMenu will be expanded by cliking the folder image.\nIf menu is not shown normally, refresh the information by clicking the button \"Re-create cache file\".\n* Menu created over the depth limit may not be shown properly."; @@ -48,4 +48,6 @@ $lang->about_menu_group_srls = 'If you select a group, only the group members can see the menu. (if xml file is directly opened, it will be shown.)'; $lang->about_menu = "Menu module will help you to create a complete site through the convenient menu management which arranges created modules and links to layouts without any manual works..\nMenu is not a site manager, but it just has information which can link to modules and layouts so you can express different types of menu."; + + $lang->alert_image_only = "Only image files can be registered."; ?> diff --git a/modules/menu/lang/es.lang.php b/modules/menu/lang/es.lang.php index 238b0af29..86e6aac19 100644 --- a/modules/menu/lang/es.lang.php +++ b/modules/menu/lang/es.lang.php @@ -48,4 +48,6 @@ $lang->about_menu_group_srls = 'Si tu selecciona el grupo, sólo los usuarios del grupo pueden ver el menú. (Si el archivo xml es abierto directamente, lo mostrará.)'; $lang->about_menu = "Módulo del menú te ayudara a crear un sitio completo a través de un conveniente manejo del menú que ordena los módulos creados y conecta con el diseño sin ningún otro trabajo.\nEl menú no es un manejador del sitio, sino que permite conectar los módulos con el diseño y a través del diseño puede expresar variados estilos del menú."; + + $lang->alert_image_only = "Sólo los archivos de imagen pueden ser registradas."; ?> diff --git a/modules/menu/lang/jp.lang.php b/modules/menu/lang/jp.lang.php index cb2e1be03..dd8c69c86 100644 --- a/modules/menu/lang/jp.lang.php +++ b/modules/menu/lang/jp.lang.php @@ -48,4 +48,6 @@ $lang->about_menu_group_srls = 'グループを選択すると該当するグループのユーザにのみメニューが表示されます(XMLファイルを直接開くと情報が表示されます)。'; $lang->about_menu = "メニューモジュルは、生成されたモジュールを、便利なメニュー管理機能で、整理したりレイアウトをリンクしたりして煩わしい作業なしでサイトを構築できるようにします。メニューは、サイトを管理するというより、モジュールとレイアウトをリンクして様々なメニューを表示させる情報のみ保持します。"; + + $lang->alert_image_only = "이미지 파일만 등록가능합니다."; ?> diff --git a/modules/menu/lang/ko.lang.php b/modules/menu/lang/ko.lang.php index 66f52c674..3c5f29a5d 100644 --- a/modules/menu/lang/ko.lang.php +++ b/modules/menu/lang/ko.lang.php @@ -48,4 +48,6 @@ $lang->about_menu_group_srls = '그룹을 선택하시면 해당 그룹의 사용자만 메뉴가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)'; $lang->about_menu = "메뉴모듈은 생성된 모듈을 편리한 메뉴관리기를 통해 정리하고 레이아웃과 연결하여 별도의 수작업 없이 완성된 사이트를 구축하도록 도와줍니다..\n메뉴는 사이트를 관리하기 보다는 모듈과 레이아웃을 연결해 주며 레이아웃을 통해서 여러가지 형태의 메뉴를 표시할 수 있도록 하는 정보만 가지고 있습니다."; + + $lang->alert_image_only = "이미지 파일만 등록가능합니다."; ?> diff --git a/modules/menu/lang/ru.lang.php b/modules/menu/lang/ru.lang.php index 9811e89a6..5936b5b13 100644 --- a/modules/menu/lang/ru.lang.php +++ b/modules/menu/lang/ru.lang.php @@ -48,4 +48,6 @@ $lang->about_menu_group_srls = 'Если Вы выберите группу, то только ее члены могут видеть это меню. (если XML файл открыт напрямую, оно будет показано.)'; $lang->about_menu = "Модуль меню поможет Вам создать полноценный сайт посредством удобного менеджмента меню, которое расставляет созданные модули и ссылки в лейауты без всякой ручной работы.\nМеню не является менеджером сайта, но оно содержит информацию, которая может связываться с модулями и лейаутами так, что Вы можете выразить различные виды меню."; + + $lang->alert_image_only = "이미지 파일만 등록가능합니다."; ?> diff --git a/modules/menu/lang/zh-CN.lang.php b/modules/menu/lang/zh-CN.lang.php index 41a4dc32d..9fe9e51a2 100644 --- a/modules/menu/lang/zh-CN.lang.php +++ b/modules/menu/lang/zh-CN.lang.php @@ -48,4 +48,6 @@ $lang->about_menu_group_srls = '如选择用户组,只有所属组用户才能看到此菜单。 —(xml文件中不能隐藏)'; $lang->about_menu = "菜单模块可以通过菜单管理器整理已生成的模块并同布局相连接来轻松建设一个完整的网站。\n菜单模块虽然具有连接模块和布局并通过布局来显示多种形态菜单的信息,但它不具备管理网站的功能。"; -?> \ No newline at end of file + + $lang->alert_image_only = "이미지 파일만 등록가능합니다."; +?> diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 6c5440a40..8ebba16dd 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -59,6 +59,10 @@ } } + // 이미지 버튼 모두 삭제 + $image_path = sprintf('./files/attach/menu_button/%s', $menu_srl); + FileHandler::removeDir($image_path); + $args->menu_srl = $menu_srl; // 메뉴 메뉴 삭제 @@ -87,8 +91,14 @@ // 메뉴 이름 체크 $lang_supported = Context::get('lang_supported'); + $name_inserted = false; foreach($lang_supported as $key => $val) { $menu_name[$key] = $source_args->{"menu_name_".strtolower($key )}; + if($menu_name[$key]) $name_inserted = true; + } + if(!$name_inserted) { + global $lang; + return new Object(-1, sprintf($lang->filter->isnull, $lang->menu_name)); } // 변수를 다시 정리 (form문의 column과 DB column이 달라서) @@ -101,9 +111,9 @@ $args->url = trim($source_args->menu_url); $args->open_window = $source_args->menu_open_window; $args->expand = $source_args->menu_expand; - $args->normal_btn = $source_args->menu_normal_btn; - $args->hover_btn = $source_args->menu_hover_btn; - $args->active_btn = $source_args->menu_active_btn; + $args->normal_btn = $source_args->normal_btn; + $args->hover_btn = $source_args->hover_btn; + $args->active_btn = $source_args->active_btn; $args->group_srls = $source_args->group_srls; // 이미 존재하는지를 확인 @@ -130,7 +140,7 @@ $xml_file = $this->makeXmlFile($args->menu_srl); // url이 mid일 경우 기록 남김 - if(eregi('^([a-zA-Z0-9\_\-]+)$', $args->url)) { + if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $args->url)) { $mid = $args->url; $mid_args->menu_srl = $args->menu_srl; @@ -185,6 +195,11 @@ // XML 파일을 갱신하고 위치을 넘겨 받음 $xml_file = $this->makeXmlFile($args->menu_srl); + // 이미지 버튼 모두 삭제 + if($item_info->normal_btn) @unlink($item_info->normal_btn); + if($item_info->hover_btn) @unlink($item_info->hover_btn); + if($item_info->active_btn) @unlink($item_info->active_btn); + $this->add('xml_file', $xml_file); $this->add('menu_title', $menu_title); $this->add('menu_item_srl', $parent_srl); @@ -250,6 +265,51 @@ $this->add('xml_file',$xml_file); } + /** + * @brief 메뉴 이미지 버튼을 등록 + **/ + function procMenuAdminUploadButton() { + $menu_srl = Context::get('menu_srl'); + $menu_item_srl = Context::get('menu_item_srl'); + $target = Context::get('target'); + $target_file = Context::get($target); + + // 필수 요건이 없거나 업로드된 파일이 아니면 오류 발생 + if(!$menu_srl || !$menu_item_srl || !$target_file || !is_uploaded_file($target_file['tmp_name']) || !preg_match('/\.(gif|jpeg|jpg|png)/i',$target_file['name'])) { + Context::get('error_messge', Context::getLang('msg_invalid_request')); + + // 요건을 만족하고 업로드된 파일이면 지정된 위치로 이동 + } else { + $tmp_arr = explode('.',$target_file['name']); + $ext = $tmp_arr[count($tmp_arr)-1]; + + $path = sprintf('./files/attach/menu_button/%d/', $menu_srl); + $filename = sprintf('%s%d.%s.%s', $path, $menu_item_srl, $target, $ext); + + if(!is_dir($path)) FileHandler::makeDir($path); + + move_uploaded_file($target_file['tmp_name'], $filename); + Context::set('filename', $filename); + } + + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('menu_file_uploaded'); + } + + /** + * @brief 등록된 메뉴 이미지 제거 + **/ + function procMenuAdminDeleteButton() { + $menu_srl = Context::get('menu_srl'); + $menu_item_srl = Context::get('menu_item_srl'); + $target = Context::get('target'); + $filename = Context::get('filename'); + @unlink($filename); + + $this->add('target', $target); + } + /** * @brief 메뉴의 xml 파일을 만들고 위치를 return **/ @@ -272,6 +332,7 @@ if(!$list) { $xml_buff = ""; FileHandler::writeFile($xml_file, $xml_buff); + FileHandler::writeFile($php_file, ''); return $xml_file; } @@ -300,11 +361,11 @@ } // xml 캐시 파일 생성 - $xml_buff = sprintf('%s', $php_script, $this->getXmlTree($tree[0], $tree)); + $xml_buff = sprintf('is_admin=="Y") $_is_admin = true; ?>%s', $php_script, $this->getXmlTree($tree[0], $tree)); // php 캐시 파일 생성 $php_output = $this->getPhpCacheCode($tree[0], $tree); - $php_buff = sprintf('list = array(%s); ?>', $php_output['name'], $php_output['buff']); + $php_buff = sprintf('is_admin=="Y") $_is_admin = true; $lang_type = Context::getLangType(); %s; $menu->list = array(%s); ?>', $php_output['name'], $php_output['buff']); // 파일 저장 FileHandler::writeFile($xml_file, $xml_buff); @@ -336,20 +397,38 @@ $name_str = sprintf('$_names = array(%s); print $_names[$_SESSION["lang_type"]];', $name_arr_str); $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); - if(eregi('^([0-9a-zA-Z\_\-]+)$', $node->url)) $href = getUrl('','mid',$node->url); + if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url)) $href = getUrl('','mid',$node->url); else $href = $url; $open_window = $node->open_window; $expand = $node->expand; - $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); - $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn); - $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn); + + $normal_btn = $node->normal_btn; + if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); + else $normal_btn = ''; + $hover_btn = $node->hover_btn; + if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); + else $hover_btn = ''; + $active_btn = $node->active_btn; + if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); + else $active_btn = ''; + $group_srls = $node->group_srls; + if($normal_btn) { + if(preg_match('/\.png$/',$normal_btn)) $classname = 'class="iePngFix"'; + else $classname = ''; + if($hover_btn) $hover_str = sprintf('onmouseover="this.src=\'%s\'"', $hover_btn); else $hover_str = ''; + if($active_btn) $active_str = sprintf('onmousedown="this.src=\'%s\'"', $active_btn); else $active_str = ''; + $link = sprintf('<img src="%s" onmouseout="this.src=\'%s\'" alt="" %s %s %s />', $normal_btn, $normal_btn, $hover_str, $active_str, $classname); + } else { + $link = ''; + } + // node->group_srls값이 있으면 - if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); + if($group_srls) $group_check_code = sprintf('($_is_admin==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls); else $group_check_code = "true"; $attribute = sprintf( - 'node_srl="%s" parent_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" ', + 'node_srl="%s" parent_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="%s"', $menu_item_srl, $node->parent_srl, $group_check_code, @@ -362,7 +441,9 @@ $expand, $normal_btn, $hover_btn, - $active_btn + $active_btn, + $group_check_code, + $link ); if($child_buff) $buff .= sprintf('%s', $attribute, $child_buff); @@ -400,13 +481,13 @@ $output['url_list'] = array_merge($output['url_list'], $child_output['url_list']); // node->group_srls값이 있으면 - if($node->group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls); + if($node->group_srls) $group_check_code = sprintf('($_is_admin==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls); else $group_check_code = "true"; // 변수 정리 $href = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->href); $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); - if(eregi('^([0-9a-zA-Z\_\-]+)$', $node->url)) $href = getUrl('','mid',$node->url); + if(preg_match('/^([0-9a-zA-Z\_\-]+)$/i', $node->url)) $href = getUrl('','mid',$node->url); else $href = $url; $open_window = $node->open_window; $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); @@ -416,9 +497,35 @@ $child_buff = $child_output['buff']; $expand = $node->expand; + $normal_btn = $node->normal_btn; + if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); + else $normal_btn = ''; + + $hover_btn = $node->hover_btn; + if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); + else $hover_btn = ''; + + $active_btn = $node->active_btn; + if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); + else $active_btn = ''; + + $group_srls = $node->group_srls; + + if($normal_btn) { + if(preg_match('/\.png$/',$normal_btn)) $classname = 'class=\"iePngFix\"'; + else $classname = ''; + if($hover_btn) $hover_str = sprintf('onmouseover=\"this.src=\'%s\'\"', $hover_btn); else $hover_str = ''; + if($active_btn) $active_str = sprintf('onmousedown=\"this.src=\'%s\'\"', $active_btn); else $active_str = ''; + $link = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $normal_btn, $normal_btn, $node->menu_item_srl, $hover_str, $active_str, $classname); + if($active_btn) $link_active = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $active_btn, $node->menu_item_srl, $classname); + else $link_active = $link; + } else { + $link_active = $link = sprintf('$_menu_names[%d][$lang_type]', $node->menu_item_srl); + } + // 속성을 생성한다 ( url_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) $attribute = sprintf( - '"node_srl"=>"%s","parent_srl"=>"%s","text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s)', + '"node_srl"=>"%s","parent_srl"=>"%s","text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s), "link"=>(%s? ( array(%s)&&in_array(Context::get("mid"),array(%s)) ?%s:%s):""),', $node->menu_item_srl, $node->parent_srl, $group_check_code, @@ -434,7 +541,12 @@ $selected, $selected, $expand, - $child_buff + $child_buff, + $group_check_code, + $selected, + $selected, + $link_active, + $link ); // buff 데이터를 생성한다 diff --git a/modules/menu/tpl/js/menu_admin.js b/modules/menu/tpl/js/menu_admin.js index c1dacba33..bbcdad691 100644 --- a/modules/menu/tpl/js/menu_admin.js +++ b/modules/menu/tpl/js/menu_admin.js @@ -201,3 +201,61 @@ function doInsertMid(mid, menu_id) { fo_obj.menu_url.value = mid; window.close(); } + +/* 각 메뉴의 버튼 이미지 등록 */ +function doMenuUploadButton(obj) { + // 이미지인지 체크 + if(!/\.(gif|jpg|jpeg|png)$/i.test(obj.value)) return alert(alertImageOnly); + + var fo_obj = xGetElementById("fo_menu"); + fo_obj.act.value = "procMenuAdminUploadButton"; + fo_obj.target.value = obj.name; + fo_obj.submit(); + fo_obj.act.value = ""; + fo_obj.target.value = ""; +} + +/* 메뉴 이미지 업로드 후처리 */ +function completeMenuUploadButton(target, filename) { + var column_name = target.replace(/^menu_/,''); + var fo_obj = xGetElementById("fo_menu"); + var zone_obj = xGetElementById(target+'_zone'); + var img_obj = xGetElementById(target+'_img'); + + fo_obj[column_name].value = filename; + + var img = new Image(); + img.src = filename; + img_obj.src = img.src; + zone_obj.style.display = "block"; +} + +/* 업로드된 메뉴 이미지 삭제 */ +function doDeleteButton(target) { + var fo_obj = xGetElementById("fo_menu"); + + var col_name = target.replace(/^menu_/,''); + + var params = new Array(); + params['target'] = target; + params['menu_srl'] = fo_obj.menu_srl.value; + params['menu_item_srl'] = fo_obj.menu_item_srl.value; + params['filename'] = fo_obj[col_name].value; + + var response_tags = new Array('error','message', 'target'); + + exec_xml('menu','procMenuAdminDeleteButton', params, completeDeleteButton, response_tags); +} + +function completeDeleteButton(ret_obj, response_tags) { + var target = ret_obj['target']; + + var column_name = target.replace(/^menu_/,''); + var fo_obj = xGetElementById("fo_menu"); + var zone_obj = xGetElementById(target+'_zone'); + var img_obj = xGetElementById(target+'_img'); + fo_obj[column_name].value = ""; + + img_obj.src = ""; + zone_obj.style.display = "none"; +} diff --git a/modules/menu/tpl/menu_file_uploaded.html b/modules/menu/tpl/menu_file_uploaded.html new file mode 100644 index 000000000..ee0a373d6 --- /dev/null +++ b/modules/menu/tpl/menu_file_uploaded.html @@ -0,0 +1,10 @@ + + + + + + diff --git a/modules/menu/tpl/menu_item_info.html b/modules/menu/tpl/menu_item_info.html index 04555040a..ffa43084d 100644 --- a/modules/menu/tpl/menu_item_info.html +++ b/modules/menu/tpl/menu_item_info.html @@ -1,5 +1,8 @@ + + + @@ -15,7 +18,7 @@ {@ $_row = 0;} - + {@ $_row ++ } @@ -49,15 +52,33 @@ - + - + - + diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html index 7bee82f1f..6e09f4de6 100644 --- a/modules/menu/tpl/menu_management.html +++ b/modules/menu/tpl/menu_management.html @@ -5,6 +5,10 @@ + +
    {$lang->menu_name}{$lang->menu_name} {$val}
    {$lang->menu_normal_btn} + + +
    {$lang->menu_hover_btn} + + +
    {$lang->menu_active_btn} + + +
    {$lang->menu_group_srls}
    + + + + + + + + diff --git a/modules/module/queries/getModulesInfo.xml b/modules/module/queries/getModulesInfo.xml new file mode 100644 index 000000000..50fee6e2a --- /dev/null +++ b/modules/module/queries/getModulesInfo.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/module/queries/updateModule.xml b/modules/module/queries/updateModule.xml index 1d3d8e4dc..a9c18747b 100644 --- a/modules/module/queries/updateModule.xml +++ b/modules/module/queries/updateModule.xml @@ -4,6 +4,7 @@ + diff --git a/modules/module/queries/updateModuleGrant.xml b/modules/module/queries/updateModuleGrant.xml index bc6a42b1c..5751b600b 100644 --- a/modules/module/queries/updateModuleGrant.xml +++ b/modules/module/queries/updateModuleGrant.xml @@ -6,6 +6,6 @@ - + diff --git a/modules/opage/lang/es.lang.php b/modules/opage/lang/es.lang.php new file mode 100644 index 000000000..bbcb92d5b --- /dev/null +++ b/modules/opage/lang/es.lang.php @@ -0,0 +1,15 @@ +opage = "Page Exteriores"; + $lang->opage_path = "Ubicacion del documento externo"; + $lang->opage_caching_interval = "Establezca el tiempo de cache"; + + $lang->about_opage = 'Este modulo permite el uso externo de archivos html o php en Zeroboard XE.
    Permite ruta absoluta o relativa, y si la URL comienza con "http://", se puede mostrar la pagina externa del servidor.'; + $lang->about_opage_path= "Por favor ingrese la ubicacion del documento externos.
    Ambos ruta absoluta como '/ path1/path2/sample.php' o ruta relativa como \"../path2/sample.php\" puede ser utilizado.
    Si la via de entrada, como \"http://url/sample.php\", el resultado sera recibido y, a continuacion se muestran.
    Esta es la actual Zeroboard Xe ruta absoluta.
    "; + $lang->about_opage_caching_interval = "La unidad es minuto, y se muestra temporal de los datos guardados por el tiempo asignado.
    Se recomienda a la cache para una buena vez si una gran cantidad de recursos se necesitan otros servidores cuando se muestran los datos o la informacion.
    Un valor de 0 no cache."; +?> diff --git a/modules/opage/opage.controller.php b/modules/opage/opage.controller.php index 6c6c4f64d..d23bb1528 100644 --- a/modules/opage/opage.controller.php +++ b/modules/opage/opage.controller.php @@ -85,7 +85,7 @@ function _replaceSrc($matches) { $href = $matches[4]; - if(eregi("^http", $href) || $href == '#' || eregi("javascript:",$href)) return $matches[0]; + if(preg_match("/^http/i", $href) || $href == '#' || preg_match("/javascript:/i",$href)) return $matches[0]; if(substr($href,0,1)=='/') $href = substr($href,1); $href = $this->target_path.$href; @@ -96,7 +96,7 @@ function _replaceBackgroundUrl($matches) { $href = $matches[1]; - if(eregi("^http",$href) || $href == '#' || eregi("javascript:",$href)) return $matches[0]; + if(preg_match("/^http/i",$href) || $href == '#' || preg_match("/javascript:/i",$href)) return $matches[0]; if(substr($href,0,1)=='/') $href = substr($href,1); $href = $this->target_path.$href; diff --git a/modules/opage/opage.view.php b/modules/opage/opage.view.php index a74349507..3b700edfb 100644 --- a/modules/opage/opage.view.php +++ b/modules/opage/opage.view.php @@ -35,7 +35,7 @@ $cache_file = sprintf("./files/cache/opage/%d.cache.php", $module_info->module_srl); // http 인지 내부 파일인지 점검 - if(eregi("^http:\/\/",$path)) $content = $this->getHtmlPage($path, $caching_interval, $cache_file); + if(preg_match("/^http:\/\//i",$path)) $content = $this->getHtmlPage($path, $caching_interval, $cache_file); else $content = $this->executeFile($path, $caching_interval, $cache_file); Context::set('opage_content', $content); @@ -97,7 +97,7 @@ // 경로와 파일이름을 구함 $tmp_path = explode('/',$cache_file); $filename = $tmp_path[count($tmp_path)-1]; - $filepath = ereg_replace($filename."$","",$cache_file); + $filepath = preg_replace('/'.$filename."$/i","",$cache_file); // 캐시 검사 if($caching_interval <1 || !file_exists($cache_file) || filemtime($cache_file) + $caching_interval*60 <= time() || filemtime($cache_file) + diff --git a/modules/page/page.admin.controller.php b/modules/page/page.admin.controller.php index 6dc24fe21..bfd2fb5a9 100644 --- a/modules/page/page.admin.controller.php +++ b/modules/page/page.admin.controller.php @@ -93,11 +93,16 @@ $output = $oModuleController->updateModule($module_info); if(!$output->toBool()) return $output; + // 해당 페이지에 첨부된 파일의 상태를 유효로 변경 + $oFileController = &getController('file'); + $oFileController->setFilesValid($module_info->module_srl); + // 캐시파일 재생성 - $this->procPageAdminRemoveWidgetCache(); + //$this->procPageAdminRemoveWidgetCache(); $this->add("module_srl", $module_info->module_srl); $this->add("page", Context::get('page')); + $this->add("mid", $module_info->mid); $this->setMessage($msg_code); } diff --git a/modules/page/page.admin.view.php b/modules/page/page.admin.view.php index d112b5876..b41821af3 100644 --- a/modules/page/page.admin.view.php +++ b/modules/page/page.admin.view.php @@ -153,7 +153,9 @@ Context::set('module_info', $this->module_info); // 내용을 세팅 - $content = $this->module_info->content; + $content = Context::get('content'); + if(!$content) $content = $this->module_info->content; + Context::set('content', $content); // 내용중 위젯들을 변환 $oWidgetController = &getController('widget'); diff --git a/modules/page/tpl/filter/insert_page_content.xml b/modules/page/tpl/filter/insert_page_content.xml index bdc237398..58e3b5c2e 100644 --- a/modules/page/tpl/filter/insert_page_content.xml +++ b/modules/page/tpl/filter/insert_page_content.xml @@ -10,6 +10,7 @@ + diff --git a/modules/page/tpl/js/page_admin.js b/modules/page/tpl/js/page_admin.js index 1282949d2..fb95953f6 100644 --- a/modules/page/tpl/js/page_admin.js +++ b/modules/page/tpl/js/page_admin.js @@ -32,8 +32,9 @@ function completeInsertPageContent(ret_obj) { var page = ret_obj['page']; var module_srl = ret_obj['module_srl']; + var mid = ret_obj['mid']; - location.href = current_url.setQuery('act',''); + location.href = current_url.setQuery('mid',mid).setQuery('act',''); } /* 수정한 페이지 컨텐츠를 저장 */ diff --git a/modules/page/tpl/page_content_modify.html b/modules/page/tpl/page_content_modify.html index 733a2ce50..9b3c6bb66 100644 --- a/modules/page/tpl/page_content_modify.html +++ b/modules/page/tpl/page_content_modify.html @@ -1,13 +1,19 @@ + + + +
    {$page_content}
    - + + + - +
    +
    - +
    @@ -32,3 +39,4 @@ xAddEventListener(window,"load",function() { doStartPageModify('zonePageContent', '{$module_info->module_srl}'); }); + diff --git a/modules/point/lang/en.lang.php b/modules/point/lang/en.lang.php index f8ee8b8e0..1c4c9223a 100644 --- a/modules/point/lang/en.lang.php +++ b/modules/point/lang/en.lang.php @@ -34,6 +34,9 @@ $lang->cmd_point_recal = 'Recalculate Point'; $lang->about_cmd_point_recal = "This will check articles/comments/attached files and reset all members' point to preset point."; + $lang->point_link_group = 'Group Change by Level'; + $lang->about_point_link_group = 'If you specify level for a specific group, users are assigned into the group when they adavnce to the level by getting points. When new group is assigned, the user is removed from the former assigned group.'; + $lang->about_module_point = "You can set point for each module and modules which don't have any value will use default point.
    All point will be restored on acting reverse."; $lang->point_signup = 'Signup'; @@ -44,6 +47,7 @@ $lang->point_upload_file = 'On Uploading'; $lang->point_delete_file = 'On Deleting Files'; $lang->point_download_file = 'On Downloading Files (Exclude images)'; + $lang->point_read_document = 'On Reading'; $lang->cmd_point_config = 'Default Setting'; diff --git a/modules/point/lang/es.lang.php b/modules/point/lang/es.lang.php index 19dc287a3..d4b48381b 100644 --- a/modules/point/lang/es.lang.php +++ b/modules/point/lang/es.lang.php @@ -26,13 +26,16 @@ $lang->disable_download = 'Prohibida la descarga'; $lang->about_disable_download = "Se prohibe la descarga de archivos al tener los puntos insuficientes.. (Excepto los archivos de imagen)"; - $lang->level_point_calc = '레벨별 포인트 계산'; - $lang->expression = '레벨 변수 i를 사용하여 자바스크립트 수식을 입력하세요. 예: Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = '계산'; - $lang->cmd_exp_reset = '초기화'; + $lang->level_point_calc = 'Punto por punto cálculo'; + $lang->expression = 'Por favor, de entrada mediante el uso de Javascript fórmula nivel variable i . Ex) Math.pow (i, 2) * 90'; + $lang->cmd_exp_calc = 'Calcular'; + $lang->cmd_exp_reset = 'Restablecer'; - $lang->cmd_point_recal = '포인트 재계산'; - $lang->about_cmd_point_recal = '게시글/댓글/첨부파일등을 모두 검사하여 설정된 포인트 설정에 맞게 모든 회원들의 포인트를 재계산합니다'; + $lang->cmd_point_recal = 'Punto Recalcular'; + $lang->about_cmd_point_recal = 'Que se encargará de chequear los artículos / comentarios / archivos adjuntos y restablecer todos los miembros punto a punto preestablecido.'; + + $lang->point_link_group = 'Grupo de cambio de nivel'; + $lang->about_point_link_group = 'Si especifica nivel para un grupo específico, a los usuarios se les asigna en el grupo cuando se adavnce al nivel por conseguir puntos. Al nuevo grupo se le asigna, el usuario se retira del ex grupo asignado.'; $lang->about_module_point = "Usted puede definir los puntos para cada módulo y los módulos que no tengan ningun valor usarán punto predefinido.
    Todos los puntos serán restituidos al actuar en forma contraria."; @@ -44,6 +47,7 @@ $lang->point_upload_file = 'Al subri archivos'; $lang->point_delete_file = 'Al borrar archivos'; $lang->point_download_file = 'Al descargar archivos (Excepto imágenes)'; + $lang->point_read_document = 'El Reading'; $lang->cmd_point_config = 'Configuración predefinida'; @@ -53,6 +57,6 @@ $lang->msg_cannot_download = "No tiene puntos suficientes para descagar"; - $lang->point_recal_message = '포인트 적용중입니다. (%d / %d)'; - $lang->point_recal_finished = '포인트 재계산이 모두 완료되었습니다'; + $lang->point_recal_message = 'Ajuste de Punto. (%d / %d)'; + $lang->point_recal_finished = 'Punto cálculo está acabado.'; ?> diff --git a/modules/point/lang/jp.lang.php b/modules/point/lang/jp.lang.php index 6b497ac83..0e1b706f6 100644 --- a/modules/point/lang/jp.lang.php +++ b/modules/point/lang/jp.lang.php @@ -31,8 +31,11 @@ $lang->cmd_exp_calc = '計算'; $lang->cmd_exp_reset = '初期化'; - $lang->cmd_point_recal = '포인트 재계산'; - $lang->about_cmd_point_recal = '게시글/댓글/첨부파일등을 모두 검사하여 설정된 포인트 설정에 맞게 모든 회원들의 포인트를 재계산합니다'; + $lang->cmd_point_recal = 'ポイント再計算'; + $lang->about_cmd_point_recal = '掲示物/コメント/添付ファイル全てを調べ、ポイント設定に合わせて、全会員のポイントを再計算します。'; + + $lang->point_link_group = 'グループ連動'; + $lang->about_point_link_group = 'グループにレベルを指定すると、該当レベルになったらグループが変更されます。 ただし、新しいグループに変更されると以前自動登録されたグループは消去されます。'; $lang->about_module_point = 'モジュール別にポイントを指定することができますが、指定されていないモジュールでは、デフォルトポイントが使用されます。すべてのポイント数は、反対のアクションを行った際には原状復帰されます。'; @@ -44,6 +47,7 @@ $lang->point_upload_file = 'アップロード'; $lang->point_delete_file = 'ファイル削除'; $lang->point_download_file = 'ダウンロード'; + $lang->point_read_document = '書き込み照会'; $lang->cmd_point_config = 'デフォルト設定'; @@ -53,6 +57,6 @@ $lang->msg_cannot_download = 'ポイントが不足しているため、ダウンロードできません。'; - $lang->point_recal_message = '포인트 적용중입니다. (%d / %d)'; - $lang->point_recal_finished = '포인트 재계산이 모두 완료되었습니다'; + $lang->point_recal_message = 'ただ今ポイントを適用しています。 (%d / %d)'; + $lang->point_recal_finished = 'ポイント再計算が完了しました。'; ?> diff --git a/modules/point/lang/ko.lang.php b/modules/point/lang/ko.lang.php index 1047b7b87..d6652b705 100644 --- a/modules/point/lang/ko.lang.php +++ b/modules/point/lang/ko.lang.php @@ -34,6 +34,9 @@ $lang->cmd_point_recal = '포인트 재계산'; $lang->about_cmd_point_recal = '게시글/댓글/첨부파일등을 모두 검사하여 설정된 포인트 설정에 맞게 모든 회원들의 포인트를 재계산합니다'; + $lang->point_link_group = '그룹 연동'; + $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면 해당 레벨에 도달할때 그룹이 변경됩니다. 단 새로운 그룹으로 변경될때 이전에 자동 등록된 그룹은 제거됩니다.'; + $lang->about_module_point = '모듈별로 포인트를 지정할 수 있으며 지정되지 않은 모듈은 기본 포인트를 이용하게 됩니다
    모든 점수는 반대 행동을 하였을 경우 원상복귀 됩니다.'; $lang->point_signup = '가입'; @@ -44,6 +47,7 @@ $lang->point_upload_file = '파일 업로드'; $lang->point_delete_file = '파일 삭제'; $lang->point_download_file = '파일 다운로드 (이미지 제외)'; + $lang->point_read_document = '게시글 조회'; $lang->cmd_point_config = '기본 설정'; diff --git a/modules/point/lang/ru.lang.php b/modules/point/lang/ru.lang.php index 431a693fc..2aa29b647 100644 --- a/modules/point/lang/ru.lang.php +++ b/modules/point/lang/ru.lang.php @@ -34,6 +34,9 @@ $lang->cmd_point_recal = '포인트 재계산'; $lang->about_cmd_point_recal = '게시글/댓글/첨부파일등을 모두 검사하여 설정된 포인트 설정에 맞게 모든 회원들의 포인트를 재계산합니다'; + $lang->point_link_group = '그룹 연동'; + $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면 해당 레벨에 도달할때 그룹이 변경됩니다. 단 새로운 그룹으로 변경될때 이전에 자동 등록된 그룹은 제거됩니다.'; + $lang->about_module_point = "Вы можете установть поинты для каждого модуля, а модули, не имеющие значения будут использовать значение по умолчанию для поинтов.
    Все поинты будут восстановлены при обратном действии."; $lang->point_signup = 'Присвоить'; @@ -44,6 +47,7 @@ $lang->point_upload_file = 'При закачке файлов'; $lang->point_delete_file = 'При скачке файлов'; $lang->point_download_file = 'При скачке файлов (кроме изображений)'; + $lang->point_read_document = '게시글 조회'; $lang->cmd_point_config = 'Настройки по умолчанию'; diff --git a/modules/point/lang/zh-CN.lang.php b/modules/point/lang/zh-CN.lang.php index 0a91ebd49..e2793768c 100644 --- a/modules/point/lang/zh-CN.lang.php +++ b/modules/point/lang/zh-CN.lang.php @@ -34,6 +34,9 @@ $lang->cmd_point_recal = '重新计算积分'; $lang->about_cmd_point_recal = '文章/评论/附件等从新检查后按相应设置从新计算积分。'; + $lang->point_link_group = '그룹 연동'; + $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면 해당 레벨에 도달할때 그룹이 변경됩니다. 단 새로운 그룹으로 변경될때 이전에 자동 등록된 그룹은 제거됩니다.'; + $lang->about_module_point = '可以分别对各模块进行积分设置,没有被设置的模块将使用默认值。
    所有积分在相反动作下恢复原始值。即:发表新帖后再删除得到的积分为0分。'; $lang->point_signup = '注册'; @@ -44,6 +47,7 @@ $lang->point_upload_file = '上传文件'; $lang->point_delete_file = '删除文件'; $lang->point_download_file = '下载文件 (图片除外)'; + $lang->point_read_document = '게시글 조회'; $lang->cmd_point_config = '基本设置'; diff --git a/modules/point/point.admin.controller.php b/modules/point/point.admin.controller.php index fd9792e34..4ef8cb560 100644 --- a/modules/point/point.admin.controller.php +++ b/modules/point/point.admin.controller.php @@ -24,30 +24,48 @@ // 변수 정리 $args = Context::getRequestVars(); + // 포인트 이름 체크 $config->point_name = $args->point_name; if(!$config->point_name) $config->point_name = 'point'; + // 기본 포인트 지정 $config->signup_point = (int)$args->signup_point; $config->login_point = (int)$args->login_point; $config->insert_document = (int)$args->insert_document; + $config->read_document = (int)$args->read_document; $config->insert_comment = (int)$args->insert_comment; $config->upload_file = (int)$args->upload_file; $config->download_file = (int)$args->download_file; + // 최고 레벨 $config->max_level = $args->max_level; if($config->max_level>1000) $config->max_level = 1000; if($config->max_level<1) $config->max_level = 1; + // 레벨 아이콘 설정 $config->level_icon = $args->level_icon; + + // 포인트 미달시 다운로드 금지 여부 체크 if($args->disable_download == 'Y') $config->disable_download = 'Y'; else $config->disable_download = 'N'; + // 레벨별 그룹 설정 + foreach($args as $key => $val) { + if(substr($key, 0, strlen('point_group_')) != 'point_group_') continue; + $group_srl = substr($key, strlen('point_group_')); + $level = $val; + if(!$level) unset($config->point_group[$group_srl]); + else $config->point_group[$group_srl] = $level; + } + + // 레벨별 포인트 설정 unset($config->level_step); for($i=1;$i<=$config->max_level;$i++) { $key = "level_step_".$i; $config->level_step[$i] = (int)$args->{$key}; } + // 레벨별 포인트 계산 함수 $config->expression = $args->expression; // 저장 @@ -71,7 +89,7 @@ $args = Context::getRequestVars(); foreach($args as $key => $val) { - preg_match("/^(insert_document|insert_comment|upload_file|download_file)_([0-9]+)$/", $key, $matches); + preg_match("/^(insert_document|insert_comment|upload_file|download_file|read_document)_([0-9]+)$/", $key, $matches); if(!$matches[1]) continue; $name = $matches[1]; $module_srl = $matches[2]; @@ -95,19 +113,30 @@ $module_srl = Context::get('target_module_srl'); if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + // 설정 정보 가져오기 $oModuleModel = &getModel('module'); $config = $oModuleModel->getModuleConfig('point'); - $config->module_point[$module_srl]['insert_document'] = (int)Context::get('insert_document'); - $config->module_point[$module_srl]['insert_comment'] = (int)Context::get('insert_comment'); - $config->module_point[$module_srl]['upload_file'] = (int)Context::get('upload_file'); - $config->module_point[$module_srl]['download_file'] = (int)Context::get('download_file'); + // 설정 저장 + for($i=0;$imodule_point[$srl]['insert_document'] = (int)Context::get('insert_document'); + $config->module_point[$srl]['insert_comment'] = (int)Context::get('insert_comment'); + $config->module_point[$srl]['upload_file'] = (int)Context::get('upload_file'); + $config->module_point[$srl]['download_file'] = (int)Context::get('download_file'); + $config->module_point[$srl]['read_document'] = (int)Context::get('read_document'); + } $oModuleController = &getController('module'); $oModuleController->insertModuleConfig('point', $config); - return new Object(0, 'success_registed'); + $this->setError(-1); + $this->setMessage('success_updated'); } /** @@ -168,7 +197,7 @@ if($output->data) { foreach($output->data as $key => $val) { - if($config->module_point[$val->module_srl]->insert_document) $insert_point = $config->module_point[$val->module_srl]->insert_document; + if($config->module_point[$val->module_srl]['insert_document']) $insert_point = $config->module_point[$val->module_srl]['insert_document']; else $insert_point = $config->insert_document; if(!$val->member_srl) continue; @@ -184,7 +213,7 @@ if($output->data) { foreach($output->data as $key => $val) { - if($config->module_point[$val->module_srl]->insert_comment) $insert_point = $config->module_point[$val->module_srl]->insert_comment; + if($config->module_point[$val->module_srl]['insert_comment']) $insert_point = $config->module_point[$val->module_srl]['insert_comment']; else $insert_point = $config->insert_comment; if(!$val->member_srl) continue; @@ -200,7 +229,7 @@ if($output->data) { foreach($output->data as $key => $val) { - if($config->module_point[$val->module_srl]->upload_file) $insert_point = $config->module_point[$val->module_srl]->upload_file; + if($config->module_point[$val->module_srl]['upload_file']) $insert_point = $config->module_point[$val->module_srl]['upload_file']; else $insert_point = $config->upload_file; if(!$val->member_srl) continue; diff --git a/modules/point/point.admin.view.php b/modules/point/point.admin.view.php index 03949fc9b..15a98ddf0 100644 --- a/modules/point/point.admin.view.php +++ b/modules/point/point.admin.view.php @@ -30,6 +30,18 @@ $level_icon_list = FileHandler::readDir("./modules/point/icons"); Context::set('level_icon_list', $level_icon_list); + // 그룹 목록 가져오기 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + $selected_group_list = array(); + if(count($group_list)) { + foreach($group_list as $key => $val) { + if($val->is_admin == 'Y' || $val->is_default == 'Y') continue; + $selected_group_list[$key] = $val; + } + } + Context::set('group_list', $selected_group_list); + // 템플릿 지정 $this->setTemplateFile('config'); } diff --git a/modules/point/point.class.php b/modules/point/point.class.php index 75c740d95..b5c2c93b1 100644 --- a/modules/point/point.class.php +++ b/modules/point/point.class.php @@ -72,6 +72,9 @@ $config->download_file = -5; $config->download_file_act = 'procFileDownload'; + // 조회 + $config->read_document = 0; + // 설정 저장 $oModuleController->insertModuleConfig('point', $config); @@ -91,6 +94,7 @@ $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after'); $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); + $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); return new Object(); } @@ -115,6 +119,7 @@ if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after')) return true; if(!$oModuleModel->getTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after')) return true; if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after')) return true; + if(!$oModuleModel->getTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after')) return true; return false; } @@ -152,6 +157,8 @@ $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after')) $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); + if(!$oModuleModel->getTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after')) + $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); return new Object(0, 'success_updated'); } @@ -165,5 +172,39 @@ $oPointAdminController->cacheActList(); } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + case 'procPointAdminInsertPointModuleConfig' : + if(!$args->target_module_srl) return false; + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->target_module_srl); + if(!$module_info) return false; + + if($oModuleModel->isModuleAdmin($module_info, $logged_info)) return true; + break; + } + + return false; + } } ?> diff --git a/modules/point/point.controller.php b/modules/point/point.controller.php index 2e9a44c9a..9861bfa6e 100644 --- a/modules/point/point.controller.php +++ b/modules/point/point.controller.php @@ -88,9 +88,14 @@ $point = $config->module_point[$module_srl]['insert_document']; if(!isset($point)) $point = $config->insert_document; + $cur_point += $point; + + // 첨부파일 등록에 대한 포인트 추가 + $point = $config->module_point[$module_srl]['upload_file']; + if(!isset($point)) $point = $config->upload_file; + if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; // 포인트 증감 - $cur_point += $point; $this->setPoint($member_srl,$cur_point); return new Object(); @@ -118,9 +123,14 @@ $point = $config->module_point[$module_srl]['insert_document']; if(!isset($point)) $point = $config->insert_document; + $cur_point -= $point; + + // 첨부파일 삭제에 대한 포인트 추가 + $point = $config->module_point[$module_srl]['upload_file']; + if(!isset($point)) $point = $config->upload_file; + if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count; // 포인트 증감 - $cur_point -= $point; $this->setPoint($member_srl,$cur_point); return new Object(); @@ -180,8 +190,10 @@ /** * @brief 파일 등록 trigger 추가 + * 비유효 파일의 등록에 의한 포인트 획득을 방지하고자 이 method는 일단 무효로 둠 **/ function triggerInsertFile(&$obj) { + return new Object(); $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; if(!$module_srl || !$member_srl) return new Object(); @@ -206,8 +218,11 @@ /** * @brief 파일 삭제 포인트 적용 trigger + * 유효파일을 삭제할 경우에만 포인트 삭제 **/ function triggerDeleteFile(&$obj) { + if($obj->isvalid != 'Y') return new Object(); + $module_srl = $obj->module_srl; $member_srl = $obj->member_srl; if(!$module_srl || !$member_srl) return new Object(); @@ -294,6 +309,48 @@ return new Object(); } + /** + * @brief 조회수 증가시 포인트 적용 + **/ + function triggerUpdateReadedCount(&$obj) { + // 로그인 상태일때만 실행 + $logged_info = Context::get('logged_info'); + if(!$logged_info->member_srl) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + $member_srl = $logged_info->member_srl; + $module_srl = $obj->get('module_srl'); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + // 포인트를 구해옴 + $point = $config->module_point[$obj->get('module_srl')]['read_document']; + if(!isset($point)) $point = $config->read_document; + + // 조회 포인트가 없으면 패스 + if(!$point) return new Object(); + + // 읽은 기록이 있는지 확인 + $args->member_srl = $member_srl; + $args->document_srl = $obj->document_srl; + $output = executeQuery('document.getDocumentReadedLogInfo', $args); + if($output->data->count) return new Object(); + + // 읽은 기록이 없으면 기록 남김 + $output = executeQuery('document.insertDocumentReadedLog', $args); + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + /** * @brief 포인트 설정 **/ @@ -301,10 +358,16 @@ if($point < 0) $point = 0; // 설정 정보 가져오기 + $oMemberModel = &getModel('member'); $oModuleModel = &getModel('module'); + $oPointModel = &getModel('point'); $config = $oModuleModel->getModuleConfig('point'); - // 변수 설정 + // 기존 포인트 정보를 구함 + $prev_point = $oPointModel->getPoint($member_srl, true); + $prev_level = $oPointModel->getLevel($prev_point, $config->level_step); + + // 포인트 변경 $args->member_srl = $member_srl; $args->point = $point; @@ -317,6 +380,58 @@ executeQuery("point.insertPoint", $args); } + // 새로운 레벨을 구함 + $level = $oPointModel->getLevel($point, $config->level_step); + + // 기존 레벨과 새로운 레벨이 다르면 포인트 그룹 설정 시도 + if($level != $prev_level) { + + // 현재 포인트 대비하여 레벨을 계산하고 레벨에 맞는 그룹 설정을 체크 + $point_group = $config->point_group; + + // 포인트 그룹 정보가 있을때 시행 + if($point_group && is_array($point_group) && count($point_group) ) { + + // 기본 그룹을 구함 + $default_group = $oMemberModel->getDefaultGroup(); + + // 포인트 그룹에 속한 그룹과 새로 부여 받을 그룹을 구함 + $point_group_list = array(); + $current_group_srl = 0; + + asort($point_group); + + // 포인트 그룹 설정을 돌면서 현재 레벨까지 체크 + foreach($point_group as $group_srl => $target_level) { + $point_group_list[] = $group_srl; + if($target_level <= $level) { + $current_group_srl = $group_srl; + } + } + $point_group_list[] = $default_group->group_srl; + + // 만약 새로운 그룹이 없다면 기본 그룹을 부여 받음 + if(!$current_group_srl) $current_group_srl = $default_group->group_srl; + + // 일단 기존의 그룹을 모두 삭제 + $del_group_args->member_srl = $member_srl; + $del_group_args->group_srl = implode(',',$point_group_list); + $del_group_output = executeQuery('point.deleteMemberGroup', $del_group_args); + + // 새로운 그룹을 부여 + $new_group_args->member_srl = $member_srl; + $new_group_args->group_srl = $current_group_srl; + $new_group_output = executeQuery('member.addMemberToGroup', $new_group_args); + + // 만약 대상 사용자와 로그인 사용자의 정보가 동일하다면 세션을 변경해줌 + $logged_info = Context::get('logged_info'); + if($logged_info->member_srl == $member_srl) { + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + $_SESSION['logged_info']->group_list = $member_info->group_list; + } + } + } + // 캐시 설정 $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl)); FileHandler::makedir($cache_path); @@ -326,49 +441,5 @@ return $output; } - - /** - * @brief 포인트 레벨 아이콘 표시 - **/ - function transLevelIcon($matches) { - if(!$this->config) { - $oModuleModel = &getModel('module'); - $this->config = $oModuleModel->getModuleConfig('point'); - } - - if(!$this->oPointModel) $this->oPointModel = &getModel('point'); - - $member_srl = $matches[3]; - if($member_srl<1) return $matches[0]; - - if($this->member_code[$member_srl]) return $this->member_code[$member_srl]; - - $point = $this->oPointModel->getPoint($member_srl); - $level = $this->oPointModel->getLevel($point, $this->config->level_step); - - $text = $matches[5]; - - $src = sprintf("modules/point/icons/%s/%d.gif", $this->config->level_icon, $level); - if(!$this->icon_width) { - $info = getimagesize($src); - $this->icon_width = $info[0]; - $this->icon_height = $info[1]; - } - - if($level < $this->config->max_level) { - $next_point = $this->config->level_step[$level+1]; - if($next_point > 0) { - $per = (int)($point / $next_point*100); - } - } - - $title = sprintf("%s:%s%s %s, %s:%s/%s", Context::getLang('point'), $point, $this->config->point_name, $per?"(".$per."%)":"", Context::getLang('level'), $level, $this->config->max_level); - - $text = sprintf('%s%s', $member_srl, Context::getRequestUri().$src, $this->icon_width, $this->icon_height, $title, $title, $text); - - $this->member_code[$member_srl] = $text; - - return $this->member_code[$member_srl]; - } } ?> diff --git a/modules/point/point.view.php b/modules/point/point.view.php index 6c2aded2d..9c47076bb 100644 --- a/modules/point/point.view.php +++ b/modules/point/point.view.php @@ -22,15 +22,15 @@ **/ function triggerDispPointAdditionSetup(&$obj) { $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); - if(!$current_module_srl) { + if(!$current_module_srl && !$current_module_srls) { // 선택된 모듈의 정보를 가져옴 $current_module_info = Context::get('current_module_info'); $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); } - if(!$current_module_srl) return new Object(); - // 설정 정보 가져오기 $oModuleModel = &getModel('module'); $config = $oModuleModel->getModuleConfig('point'); @@ -41,6 +41,7 @@ $module_config['insert_comment'] = $config->insert_comment; $module_config['upload_file'] = $config->upload_file; $module_config['download_file'] = $config->download_file; + $module_config['read_document'] = $config->read_document; } $module_config['module_srl'] = $current_module_srl; diff --git a/modules/point/queries/deleteMemberGroup.xml b/modules/point/queries/deleteMemberGroup.xml new file mode 100644 index 000000000..4df3ee6f0 --- /dev/null +++ b/modules/point/queries/deleteMemberGroup.xml @@ -0,0 +1,9 @@ + + +
    + + + + + + diff --git a/modules/point/queries/getMemberGroupMember.xml b/modules/point/queries/getMemberGroupMember.xml new file mode 100644 index 000000000..e64e61196 --- /dev/null +++ b/modules/point/queries/getMemberGroupMember.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/point/tpl/config.html b/modules/point/tpl/config.html index e0cfee35b..14035a43f 100644 --- a/modules/point/tpl/config.html +++ b/modules/point/tpl/config.html @@ -16,6 +16,19 @@
    +
    + + + + + + + + + + + + - + + + + + + - + - - - - + + + + + diff --git a/modules/point/tpl/point_module_config.html b/modules/point/tpl/point_module_config.html index 151318b7b..0ac5d524f 100644 --- a/modules/point/tpl/point_module_config.html +++ b/modules/point/tpl/point_module_config.html @@ -1,24 +1,34 @@
    - +
    {$lang->point_link_group}{$lang->group}{$lang->level}
    {$val->title}

    {$lang->about_point_link_group}

    {$lang->max_level} @@ -31,7 +44,7 @@
    {$lang->is_default}{$lang->is_default} {$lang->point_signup} {$config->point_name} @@ -58,6 +71,10 @@ {$lang->point_download_file} {$config->point_name}
    {$lang->point_read_document} {$config->point_name}
    {$lang->level_icon} diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html index e5d241067..260ec59ab 100644 --- a/modules/point/tpl/module_config.html +++ b/modules/point/tpl/module_config.html @@ -9,17 +9,19 @@ {$lang->point_insert_comment} {$lang->point_upload_file} {$lang->point_download_file}{$lang->point_read_document}
    {$val->browser_title} ({$val->mid}){$val->browser_title} ({$val->mid})
    {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name}
    + + - - - + - + + + + + + + - + + + + +
    {$lang->point}
    {$lang->point_insert_document}{$lang->point_insert_comment}{$lang->point_upload_file}{$lang->point_download_file} {$module_config['point_name']}
    {$module_config['point_name']}{$lang->point_insert_comment} {$module_config['point_name']}
    {$lang->point_upload_file} {$module_config['point_name']}
    {$lang->point_download_file} {$module_config['point_name']}
    {$lang->point_read_document} {$module_config['point_name']}
    diff --git a/modules/poll/poll.controller.php b/modules/poll/poll.controller.php index 1896c69ae..3e75d95c1 100644 --- a/modules/poll/poll.controller.php +++ b/modules/poll/poll.controller.php @@ -34,7 +34,7 @@ $vars = Context::getRequestVars(); foreach($vars as $key => $val) { if(strpos($key,'tidx')) continue; - if(!eregi("^(title|checkcount|item)_", $key)) continue; + if(!preg_match("/^(title|checkcount|item)_/i", $key)) continue; if(!trim($val)) continue; $tmp_arr = explode('_',$key); diff --git a/modules/poll/skins/default/css/poll.css b/modules/poll/skins/default/css/poll.css index cfe61146b..9e733ebe4 100644 --- a/modules/poll/skins/default/css/poll.css +++ b/modules/poll/skins/default/css/poll.css @@ -1,5 +1,6 @@ -.poll_table { table-layout:fixed; width:100%; } +.poll_table { table-layout:fixed; width:100%; padding:0; border:none;} +.poll_table td { padding:0; margin:0; } .poll_table td.h { background:url(../images/top_bg.png) repeat-x left top; } .poll_table td.title { height:28px; background:url(../images/top_title_bg.png) repeat-x left top; padding:0 20px 0 20px;color:#C3C3C4;} .poll_table td.title strong { color:#FFFFFF; font-weight:bold; } diff --git a/modules/referer/lang/es.lang.php b/modules/referer/lang/es.lang.php new file mode 100644 index 000000000..1c5ba0cd0 --- /dev/null +++ b/modules/referer/lang/es.lang.php @@ -0,0 +1,10 @@ + + * @brief English language pack + */ + + $lang->referer = "Referer"; + $lang->ranking = "Ranking"; +?> diff --git a/modules/referer/lang/zh-CN.php b/modules/referer/lang/zh-CN.lang.php similarity index 100% rename from modules/referer/lang/zh-CN.php rename to modules/referer/lang/zh-CN.lang.php diff --git a/modules/rss/rss.admin.controller.php b/modules/rss/rss.admin.controller.php index 6426fe89c..0f3335e71 100644 --- a/modules/rss/rss.admin.controller.php +++ b/modules/rss/rss.admin.controller.php @@ -20,17 +20,27 @@ * @brief RSS 모듈별 설정 **/ function procRssAdminInsertModuleConfig() { - // 필요한 변수를 받아옴 + // 대상을 구함 $module_srl = Context::get('target_module_srl'); + + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + $open_rss = Context::get('open_rss'); if(!$module_srl || !$open_rss) return new Object(-1, 'msg_invalid_request'); if(!in_array($open_rss, array('Y','H','N'))) $open_rss = 'N'; // 설정 저장 - $output = $this->setRssModuleConfig($module_srl, $open_rss); + for($i=0;$isetRssModuleConfig($srl, $open_rss); + } - $this->setMessage('success_registed'); + $this->setError(-1); + $this->setMessage('success_updated'); } /** diff --git a/modules/rss/rss.class.php b/modules/rss/rss.class.php index ccd888307..26a01e346 100644 --- a/modules/rss/rss.class.php +++ b/modules/rss/rss.class.php @@ -63,5 +63,39 @@ **/ function recompileCache() { } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + case 'procRssAdminInsertModuleConfig' : + if(!$args->target_module_srl) return false; + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->target_module_srl); + if(!$module_info) return false; + + if($oModuleModel->isModuleAdmin($module_info, $logged_info)) return true; + break; + } + + return false; + } } ?> diff --git a/modules/rss/rss.view.php b/modules/rss/rss.view.php index 65f670bff..681b76d70 100644 --- a/modules/rss/rss.view.php +++ b/modules/rss/rss.view.php @@ -25,18 +25,6 @@ **/ $mid = Context::get('mid'); ///< 대상 모듈 id, 없으면 전체로 - $page = (int)Context::get('page'); ///< 페이지, 없으면 1 - if(!$page) $page = 1; - - $list_count = (int)Context::get('list_count'); ///< 목록 갯수, 기본 10, 최고 100개 - if(!$list_count|| $list_count>100) $list_count = 10; - - $start_date = Context::get('start_date'); ///< 시작 일자, 없으면 무시 - if(strlen($start_date)!=14 || !ereg("^([0-9]){14}$", $start_date) ) unset($start_date); - - $end_date = Context::get('end_date'); ///< 종료 일자, 없으면 무시 - if(strlen($end_date)!=14 || !ereg("^([0-9]){14}$", $end_date) ) unset($end_date); - // rss module config를 가져옴 $oModuleModel = &getModel('module'); $rss_config = $oModuleModel->getModuleConfig('rss'); @@ -102,13 +90,12 @@ * 출력할 컨텐츠 추출을 위한 인자 정리 **/ $args->module_srl = $module_srl; - $args->page = $page; - $args->list_count = $list_count; - $args->page_count = 10; + $args->page = 1; + $args->list_count = 15; if($start_date) $args->start_date = $start_date; if($end_date) $args->end_date = $end_date; - $args->sort_index = 'update_order'; + $args->sort_index = 'list_order'; $args->order_type = 'asc'; // 대상 문서들을 가져옴 @@ -167,15 +154,15 @@ **/ function triggerDispRssAdditionSetup(&$obj) { $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); - if(!$current_module_srl) { + if(!$current_module_srl && !$current_module_srls) { // 선택된 모듈의 정보를 가져옴 $current_module_info = Context::get('current_module_info'); $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); } - if(!$current_module_srl) return new Object(); - // 선택된 모듈의 rss설정을 가져옴 $oRssModel = &getModel('rss'); $rss_config = $oRssModel->getRssModuleConfig($current_module_srl); diff --git a/modules/rss/tpl/rss20.html b/modules/rss/tpl/rss20.html index acd8c3ddc..c898bf758 100644 --- a/modules/rss/tpl/rss20.html +++ b/modules/rss/tpl/rss20.html @@ -14,7 +14,7 @@ getNickName()}]]> getPermanentUrl()}]]> - getContent(false)}]]> + getContent(false,false)}]]> getContentText(100)}]]> diff --git a/modules/rss/tpl/rss_module_config.html b/modules/rss/tpl/rss_module_config.html index d8dc840de..40146d5b0 100644 --- a/modules/rss/tpl/rss_module_config.html +++ b/modules/rss/tpl/rss_module_config.html @@ -1,7 +1,7 @@ - + diff --git a/modules/spamfilter/spamfilter.controller.php b/modules/spamfilter/spamfilter.controller.php index d463dceeb..76d681210 100644 --- a/modules/spamfilter/spamfilter.controller.php +++ b/modules/spamfilter/spamfilter.controller.php @@ -13,10 +13,19 @@ function init() { } + /** + * @brief 배치작업등을 할때 스팸필터의 사용을 중지 시킬 필요가 있을 경우 호출 + **/ + function setAvoidLog() { + $_SESSION['avoid_log'] = true; + } + /** * @brief 글 작성시 글 작성 시간 체크 및 금지 ip/단어 처리 루틴 **/ function triggerInsertDocument(&$obj) { + if($_SESSION['avoid_log']) return new Object(); + // 로그인 여부, 로그인 정보, 권한 유무 체크 $is_logged = Context::get('is_logged'); $logged_info = Context::get('logged_info'); @@ -53,6 +62,8 @@ * @brief 댓글 작성 시간 및 금지 ip/ 단어 처리 루틴 **/ function triggerInsertComment(&$obj) { + if($_SESSION['avoid_log']) return new Object(); + // 로그인 여부, 로그인 정보, 권한 유무 체크 $is_logged = Context::get('is_logged'); $logged_info = Context::get('logged_info'); @@ -89,6 +100,8 @@ * @brief 엮인글 작성시 시간 및 ip 검사 **/ function triggerInsertTrackback(&$obj) { + if($_SESSION['avoid_log']) return new Object(); + $oFilterModel = &getModel('spamfilter'); // 해당 글에 엮인글을 한번 이상 추가하였는지를 확인 diff --git a/modules/spamfilter/spamfilter.model.php b/modules/spamfilter/spamfilter.model.php index c1c9f7362..2686c977c 100644 --- a/modules/spamfilter/spamfilter.model.php +++ b/modules/spamfilter/spamfilter.model.php @@ -78,7 +78,7 @@ $count = count($word_list); for($i=0;$i<$count;$i++) { $word = $word_list[$i]->word; - if(eregi($word, $text)!==false) return new Object(-1,sprintf(Context::getLang('msg_alert_denied_word'), $word)); + if(preg_match('/'.$word.'/is', $text)) return new Object(-1,sprintf(Context::getLang('msg_alert_denied_word'), $word)); } return new Object(); @@ -126,7 +126,7 @@ $oTrackbackModel = &getModel('trackback'); $count = $oTrackbackModel->getTrackbackCountByIPAddress($document_srl, $_SERVER['REMOTE_ADDR']); - if($count>0) return Object(-1, 'msg_alert_trackback_denied'); + if($count>0) return new Object(-1, 'msg_alert_trackback_denied'); return new Object(); } diff --git a/modules/springnote/conf/info.xml b/modules/springnote/conf/info.xml index dc8de1acd..01397eada 100644 --- a/modules/springnote/conf/info.xml +++ b/modules/springnote/conf/info.xml @@ -4,17 +4,20 @@ スプリングノート連動Springnote APISpringnote + SpringnoteСпрингноут 제로 Zero Zero Zero + Zero Zero 스프링노트의 페이지를 제로보드XE에서 연동하여 출력하는 기능을 가지고 있는 모듈입니다. スプリングノートのページをゼロボードXEと連動させて出力する機能のモジュールです。 把Springnote网站页面整合到Zeroboard XE的模块。 This modules links pages of Springnote with ZeroboardXE, and display them. + Esta módulos de enlaces de páginas Springnote con ZeroboardXE, y lo muestra. Этот модуль связывает страницы Springnote с ZeroboardXE, и отображает их. diff --git a/modules/springnote/conf/module.xml b/modules/springnote/conf/module.xml index 094b66311..5a9b32cec 100644 --- a/modules/springnote/conf/module.xml +++ b/modules/springnote/conf/module.xml @@ -3,12 +3,16 @@ 목록 + Lista + список 目录 リスト list 열람 + Opinión + мнение 查看 閲覧 view diff --git a/modules/springnote/lang/es.lang.php b/modules/springnote/lang/es.lang.php new file mode 100644 index 000000000..fd771337d --- /dev/null +++ b/modules/springnote/lang/es.lang.php @@ -0,0 +1,30 @@ +springnote = "Springnote"; + $lang->springnote_openid = "OpenID"; + $lang->springnote_userkey = "Usuario clave"; + $lang->springnote_pageid = "Numero de pagina"; + $lang->springnote_pageid_setup = 'Set Page Number'; + $lang->springnote_pageid_option_only = 'Establezca el numero de pagina'; + $lang->springnote_pageid_option_list = 'Feria de Seleccion de Paginas (mostrar la lista)'; + $lang->springnote_domain = "Conjunto de Dominio"; + + $lang->page_url = "URL original"; + $lang->page_modified = "Ultima Modificacion"; + $lang->page_modifier = "El ultimo modificador"; + + $lang->cmd_springnote_list = 'Lista Springnote'; + $lang->cmd_view_info = 'Springnote Informacion'; + + $lang->about_springnote = "Springnote es un Wiki Openmaru de servicios que ofrece.
    Springnote ZeroboardXE modulo especifico springnote muestra las paginas como documentos internos."; + $lang->about_springnote_openid = "Por favor, introduzca su OpenID que creo Springnote"; + $lang->about_springnote_userkey = 'Usuario clave para que se pueda Springnote modulo.
    Por favor, de entrada generada clave de usuario despues de entrar en su OpenID [ Obtener clave de usuario ].'; + $lang->about_springnote_pageid = 'Por favor, de entrada pageid si desea mostrar pagina concreta en primer lugar.'; + $lang->about_springnote_pageid_setup = "Puede establecer 'Mostrar solo seleccionados Paginas (ocultar la lista) \",\" Feria de Seleccion de Paginas (mostrar la lista) \", etc, cuando usted establece el numero de pagina."; + $lang->about_springnote_domain = "Usted puede configurar otro dominio del springnote. (Por favor, de entrada solo de dominio de la forma de 'http://domain.springnote.com')"; +?> diff --git a/modules/springnote/lang/jp.lang.php b/modules/springnote/lang/jp.lang.php index 10015b5f5..fd6f6f1db 100644 --- a/modules/springnote/lang/jp.lang.php +++ b/modules/springnote/lang/jp.lang.php @@ -25,6 +25,6 @@ $lang->about_springnote_openid = "スプリングノートでページを作成したオープンIDを入力してください。"; $lang->about_springnote_userkey = 'スプリングノートとの連動するためのユーザKeyを入力してください。
    [
    ユーザーキー受信]をクリックして入力して生成されるキーの値を入力してください。'; $lang->about_springnote_pageid = '使用するスプリングノートの中の特定ページを出力したい場合、「pageid」の値を入力してください。'; - $lang->about_springnote_pageid_setup = '페이지 번호 지정시 해당 페이지만 보이기(목록 비포함), 해당 페이지부터 보이기(목록 포함)등을 지정할 수 있습니다'; - $lang->about_springnote_domain = '자신의 스프링노트가 아닌 다른 도메인의 스프링노트를 입력할 수 있습니다. (http://도메인.springnote.com 에서 도메인값만 입력해주세요)'; + $lang->about_springnote_pageid_setup = '設定することができます\'選択されたページのみを表示(隠すリスト) \' 、 \'ショーから選択されたページ(番組リスト) \' etcときにページ番号を設定します。'; + $lang->about_springnote_domain = 'springnote他のドメインの設定をお勧めします。 (ドメインのみを入力してくださいフォームからの\' http://domain.springnote.com \' )'; ?> diff --git a/modules/springnote/lang/ru.lang.php b/modules/springnote/lang/ru.lang.php index 82453dd22..cf4a07a8d 100644 --- a/modules/springnote/lang/ru.lang.php +++ b/modules/springnote/lang/ru.lang.php @@ -9,10 +9,10 @@ $lang->springnote_openid = "Открытый ID"; $lang->springnote_userkey = "Ключ юзера"; $lang->springnote_pageid = "Номер страницы"; - $lang->springnote_pageid_setup = '페이지 번호 설정'; - $lang->springnote_pageid_option_only = '지정된 페이지만 보여주기 (목록 보이지 않음)'; - $lang->springnote_pageid_option_list = '지정된 페이지부터 보이기 (목록 보임)'; - $lang->springnote_domain = "도메인 지정"; + $lang->springnote_pageid_setup = 'Установить номер страницы'; + $lang->springnote_pageid_option_only = 'Показать только выбранные страницы (скрыть список)'; + $lang->springnote_pageid_option_list = 'Показать с Отдельные страницы (показать список)'; + $lang->springnote_domain = "Установить доменов"; $lang->page_url = "Оригинальный URL"; $lang->page_modified = "Последняя модификация"; @@ -25,6 +25,6 @@ $lang->about_springnote_openid = "Пожалуйста, введите Ваш OpenID, который создал Springnote."; $lang->about_springnote_userkey = 'Ключ юзера нужен для того, чтобы включить Springnote модуль.
    Пожалуйста, введите сгенерированный Ключ Юзера после ввода Вашего OpenID на [Получить Ключ Юзера] .'; $lang->about_springnote_pageid = 'Пожалуйста, введите pageid, если вы хотите отобразить определенную страницу сначала.'; - $lang->about_springnote_pageid_setup = '페이지 번호 지정시 해당 페이지만 보이기(목록 비포함), 해당 페이지부터 보이기(목록 포함)등을 지정할 수 있습니다'; - $lang->about_springnote_domain = '자신의 스프링노트가 아닌 다른 도메인의 스프링노트를 입력할 수 있습니다. (http://도메인.springnote.com 에서 도메인값만 입력해주세요)'; + $lang->about_springnote_pageid_setup = 'Вы можете установить "Показать только выбранные страницы (скрыть список) \',\' Показать с Отдельные страницы (показать список)" и т.д., когда вы установите номер страницы.'; + $lang->about_springnote_domain = 'Вы можете задать другие доменные springnote. (Введите только домен из формы "http://domain.springnote.com \' )'; ?> diff --git a/modules/springnote/skins/xe_official/css/common.css b/modules/springnote/skins/xe_official/css/common.css index d1bfe469f..b5ac73b47 100644 --- a/modules/springnote/skins/xe_official/css/common.css +++ b/modules/springnote/skins/xe_official/css/common.css @@ -10,12 +10,11 @@ /* account Navigation */ .accountNavigation { float:right; } -.accountNavigation li { float:left; margin-left:7px; list-style:none; padding-top:3px;} +.accountNavigation li { float:left; margin-left:7px; list-style:none; } .accountNavigation li a { font-size:12px; white-space:nowrap; color:#666666; text-decoration:none;} -.accountNavigation li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } -.accountNavigation li.admin a { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; } -.accountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; _padding-top:5px;} -*:first-child+html li.loginAndLogout { padding-top:5px; } +.accountNavigation li.setup { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; } +.accountNavigation li.admin { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; } +.accountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left top; padding-left:8px; } .pageSearch { text-align:right; margin-bottom:10px; } .pageList { border:1px solid #E3E3E2; } diff --git a/modules/springnote/springnote.admin.controller.php b/modules/springnote/springnote.admin.controller.php index e0204cf33..f16764b5d 100644 --- a/modules/springnote/springnote.admin.controller.php +++ b/modules/springnote/springnote.admin.controller.php @@ -200,7 +200,7 @@ } // 이미지 파일이 아니어도 무시 - if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) { + if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { unset($obj->{$vars->name}); continue; } diff --git a/modules/springnote/springnote.model.php b/modules/springnote/springnote.model.php index 59e1f2d9e..8f9112739 100644 --- a/modules/springnote/springnote.model.php +++ b/modules/springnote/springnote.model.php @@ -5,7 +5,7 @@ * @brief springnote모듈의 model 클래스 **/ - set_include_path("./modules/springnote/lib/PEAR"); + set_include_path("./libs/PEAR"); require_once('PEAR.php'); require_once('HTTP/Request.php'); diff --git a/modules/trackback/tpl/trackback_list.html b/modules/trackback/tpl/trackback_list.html index 1b9813b5c..7a09f80ff 100644 --- a/modules/trackback/tpl/trackback_list.html +++ b/modules/trackback/tpl/trackback_list.html @@ -14,7 +14,7 @@
    diff --git a/modules/trackback/tpl/trackback_module_config.html b/modules/trackback/tpl/trackback_module_config.html index 172867e4e..c097d9bec 100644 --- a/modules/trackback/tpl/trackback_module_config.html +++ b/modules/trackback/tpl/trackback_module_config.html @@ -1,7 +1,7 @@ - +
    {$lang->enable_trackback} - enable_trackback!='N')-->checked="checked"/> {$lang->cmd_use} + enable_trackback=='Y')-->checked="checked"/> {$lang->cmd_use}

    {$lang->about_enable_trackback}

    diff --git a/modules/trackback/trackback.admin.controller.php b/modules/trackback/trackback.admin.controller.php index 18d3e3ae5..912e3a73e 100644 --- a/modules/trackback/trackback.admin.controller.php +++ b/modules/trackback/trackback.admin.controller.php @@ -60,15 +60,24 @@ function procTrackbackAdminInsertModuleConfig() { // 필요한 변수를 받아옴 $module_srl = Context::get('target_module_srl'); + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + $enable_trackback = Context::get('enable_trackback'); if(!in_array($enable_trackback, array('Y','N'))) $enable_trackback = 'N'; if(!$module_srl || !$enable_trackback) return new Object(-1, 'msg_invalid_request'); // 설정 저장 - $output = $this->setTrackbackModuleConfig($module_srl, $enable_trackback); + // 설정 저장 + for($i=0;$isetTrackbackModuleConfig($srl, $enable_trackback); + } - $this->setMessage('success_registed'); + $this->setError(-1); + $this->setMessage('success_updated'); } /** diff --git a/modules/trackback/trackback.class.php b/modules/trackback/trackback.class.php index 0bd542c6c..a421ebb50 100644 --- a/modules/trackback/trackback.class.php +++ b/modules/trackback/trackback.class.php @@ -83,5 +83,39 @@ **/ function recompileCache() { } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + case 'procTrackbackAdminInsertModuleConfig' : + if(!$args->target_module_srl) return false; + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->target_module_srl); + if(!$module_info) return false; + + if($oModuleModel->isModuleAdmin($module_info, $logged_info)) return true; + break; + } + + return false; + } } ?> diff --git a/modules/trackback/trackback.controller.php b/modules/trackback/trackback.controller.php index eee40ebf1..4649d5b04 100644 --- a/modules/trackback/trackback.controller.php +++ b/modules/trackback/trackback.controller.php @@ -286,7 +286,7 @@ // 결과를 기다림 (특정 서버의 경우 EOF가 떨어지지 않을 수가 있음 while(!feof($fp)) { $line = trim(fgets($fp, 4096)); - if(eregi("^",$line)) break; + if(preg_match("/^/i",$line)) break; } // socket 닫음 diff --git a/modules/trackback/trackback.model.php b/modules/trackback/trackback.model.php index 31443068a..81fc3376e 100644 --- a/modules/trackback/trackback.model.php +++ b/modules/trackback/trackback.model.php @@ -95,6 +95,7 @@ $module_trackback_config->module_srl = $module_srl; $module_trackback_config->enable_trackback = $trackback_config->enable_trackback=='Y'?'Y':'N'; } + return $module_trackback_config; } diff --git a/modules/trackback/trackback.view.php b/modules/trackback/trackback.view.php index bf14dd401..3737c1e32 100644 --- a/modules/trackback/trackback.view.php +++ b/modules/trackback/trackback.view.php @@ -45,15 +45,15 @@ **/ function triggerDispTrackbackAdditionSetup(&$obj) { $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); - if(!$current_module_srl) { + if(!$current_module_srl && !$current_module_srls) { // 선택된 모듈의 정보를 가져옴 $current_module_info = Context::get('current_module_info'); $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); } - if(!$current_module_srl) return new Object(); - // 선택된 모듈의 trackback설정을 가져옴 $oTrackbackModel = &getModel('trackback'); $trackback_config = $oTrackbackModel->getTrackbackModuleConfig($current_module_srl); diff --git a/modules/widget/lang/es.lang.php b/modules/widget/lang/es.lang.php index b0f3a52fc..243640bed 100644 --- a/modules/widget/lang/es.lang.php +++ b/modules/widget/lang/es.lang.php @@ -41,25 +41,25 @@ $lang->about_widget_code_in_page = 'Luego de ingresar los valores requeridos, presiona el botón "Añadir" para insertar el código de widget dentro de la página.'; $lang->about_widget = "Un Widget es una pequena aplicación para ser usados en los diseños o en el módulo de páginas.\n Puede ser enlazados con un módulo interno o con open api externo y con la configuración de ella puede utilizar en variadas aplicaciones.\nSin la necesidad de utilizar los módulos de página o del diseño de Zeroboard XE, Usted puede directamente añadir un widget usando la función de [Generar Códigos]."; - $lang->cmd_content_insert = "내용 직접 추가"; - $lang->cmd_box_widget_insert = "상자 위젯 추가"; - $lang->cmd_remove_all_widgets = "내용 모두 지우기"; + $lang->cmd_content_insert = "Introduzca contenido por ti mismo"; + $lang->cmd_box_widget_insert = "Insertar cuadro de widget"; + $lang->cmd_remove_all_widgets = "Eliminar todos los reproductores"; - $lang->cmd_widget_size = "위젯 크기"; - $lang->cmd_widget_align = "위젯 정렬"; - $lang->cmd_widget_align_left = "왼쪽"; - $lang->cmd_widget_align_right = "오른쪽"; - $lang->cmd_widget_margin = "외부 여백"; - $lang->cmd_widget_padding = "내부 여백"; - $lang->cmd_widget_border = "위젯 테두리"; - $lang->cmd_widget_border_solid = "실선"; - $lang->cmd_widget_border_dotted = "점선"; - $lang->cmd_widget_background_color = "배경색"; - $lang->cmd_widget_background_image_url = "배경 이미지"; - $lang->cmd_widget_background_image_repeat = "반복"; - $lang->cmd_widget_background_image_no_repeat = "고정"; - $lang->cmd_widget_background_image_x_repeat = "가로 반복"; - $lang->cmd_widget_background_image_y_repeat = "세로 반복"; - $lang->cmd_widget_background_image_x = "가로 위치"; - $lang->cmd_widget_background_image_y = "세로 위치"; + $lang->cmd_widget_size = "Tamaño artilugio"; + $lang->cmd_widget_align = "Alinear Widget"; + $lang->cmd_widget_align_left = "Izquierda"; + $lang->cmd_widget_align_right = "Derecho"; + $lang->cmd_widget_margin = "Margen"; + $lang->cmd_widget_padding = "Relleno"; + $lang->cmd_widget_border = "Frontera"; + $lang->cmd_widget_border_solid = "Sólidos"; + $lang->cmd_widget_border_dotted = "Salpicando"; + $lang->cmd_widget_background_color = "Color de fondo"; + $lang->cmd_widget_background_image_url = "Imagen de fondo"; + $lang->cmd_widget_background_image_repeat = "Repita"; + $lang->cmd_widget_background_image_no_repeat = "No Repetir"; + $lang->cmd_widget_background_image_x_repeat = "Repita X"; + $lang->cmd_widget_background_image_y_repeat = "Repita Y"; + $lang->cmd_widget_background_image_x = "Posición X"; + $lang->cmd_widget_background_image_y = "Posición Y"; ?> diff --git a/modules/widget/tpl/add_content_widget.html b/modules/widget/tpl/add_content_widget.html index 74e08c898..f6ed89969 100644 --- a/modules/widget/tpl/add_content_widget.html +++ b/modules/widget/tpl/add_content_widget.html @@ -1,9 +1,8 @@ -
    - + diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index ecec79d36..d3fc6ad8d 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -49,7 +49,7 @@ function getPadding(obj, direct) { } -/* 위젯 배치 시작을 함 */ +/* 위젯 핸들링 시작 */ var zonePageObj = null; var zoneModuleSrl = 0; function doStartPageModify(zoneID, module_srl) { @@ -155,8 +155,7 @@ function getWidgetCode(childObj, widget) { var value = childObj.attributes[i].nodeValue; if(!value) continue; - if(value && typeof(value)=="string") value = value.replace(/\"/ig,'"'); - attrs += name+'="'+value+'" '; + attrs += name+'="'+escape(value)+'" '; } var style = childObj.getAttribute("style"); return ''; @@ -196,11 +195,28 @@ function doSyncPageContent() { } // 부모창에 위젯을 추가 -function completeAddContent(ret_obj) { - var tpl = ret_obj["tpl"]; +function completeAddContent(fo_obj) { + var editor_sequence = fo_obj.getAttribute('editor_sequence'); + var content = editorGetContent(editor_sequence); + + var tpl = ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + content+ + '
    '+ + '
    '+ + ''+ + '
    '; + opener.doAddWidgetCode(tpl); window.close(); - return false; } /* 박스 위젯 추가 */ @@ -260,6 +276,11 @@ function doAddWidgetCode(widget_code) { var zoneObj = xGetElementById('zonePageContent'); + //zoneObj.style.visibility = 'hidden'; + zoneObj.style.opacity = 0.2; + zoneObj.style.filter = "alpha(opacity=20)"; + + if(selectedWidget && selectedWidget.getAttribute("widget")) { while ( nodes.length ) { if(nodes[0].className == 'widgetClass') zoneObj.parentNode.insertBefore(nodes[0], zoneObj); @@ -273,7 +294,13 @@ function doAddWidgetCode(widget_code) { } } - doFitBorderSize(); + // 위젯 추가후 페이지 리로딩 + var tpl = getWidgetContent(); + + var fo_obj = xGetElementById('pageFo'); + fo_obj.content.value = tpl; + + fo_obj.submit(); } // 클릭 이벤트시 위젯의 수정/제거/이벤트 무효화 처리 diff --git a/modules/widget/tpl/js/widget_admin.js b/modules/widget/tpl/js/widget_admin.js index 63cd16205..aba022d46 100644 --- a/modules/widget/tpl/js/widget_admin.js +++ b/modules/widget/tpl/js/widget_admin.js @@ -102,7 +102,10 @@ function doFillWidgetVars() { case "text" : case "textarea" : var val = selected_node.getAttribute(name); - if(val) node.value = val; + if(!val) continue; + var unescaped_val = unescape(val); + if(!unescaped_val) node.value = val; + else node.value = unescaped_val; break; case "checkbox" : if(selected_node.getAttribute(name)) { diff --git a/modules/widget/widget.class.php b/modules/widget/widget.class.php index 8be456250..7bedf4803 100644 --- a/modules/widget/widget.class.php +++ b/modules/widget/widget.class.php @@ -49,5 +49,42 @@ // widget 생성 캐시 파일 삭제 FileHandler::removeFilesInDir("./files/cache/widget_cache"); } + + /** + * @brief 권한 체크를 실행하는 method + * 모듈 객체가 생성된 경우는 직접 권한을 체크하지만 기능성 모듈등 스스로 객체를 생성하지 않는 모듈들의 경우에는 + * ModuleObject에서 직접 method를 호출하여 권한을 확인함 + * + * isAdminGrant는 관리권한 이양시에만 사용되도록 하고 기본은 false로 return 되도록 하여 잘못된 권한 취약점이 생기지 않도록 주의하여야 함 + **/ + function isAdmin() { + // 로그인이 되어 있지 않으면 무조건 return false + $is_logged = Context::get('is_logged'); + if(!$is_logged) return false; + + // 사용자 아이디를 구함 + $logged_info = Context::get('logged_info'); + + // 모듈 요청에 사용된 변수들을 가져옴 + $args = Context::getRequestVars(); + + // act의 값에 따라서 관리 권한 체크 + switch($args->act) { + case 'dispWidgetAdminAddContent' : + // 레이아웃 정보에 할당된 srl이 없으면 패스 + if(!$args->module_srl) return false; + + // 모듈중 레이아웃이 해당 srl에 연결될 것이 있는지 확인 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + + if($oModuleModel->isModuleAdmin($module_info,$logged_info)) $is_granted = true; + else $is_granted = false; + return $is_granted; + break; + } + + return false; + } } ?> diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index 62d6801ad..ade15ed22 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -130,34 +130,12 @@ $this->add('colorset_list', $colorsets); } - /** - * @brief 직접 내용 입력된 위젯의 처리 - **/ - function procWidgetAddContent() { - $content = Context::get('content'); - $args = Context::getRequestVars('style','widget_padding_left','widget_padding_right','widget_padding_bottom','widget_padding_top'); - - $tpl = $this->transEditorContent($content, $args); - - $this->add('tpl', $tpl); - } - /** * @breif 특정 content의 위젯 태그들을 변환하여 return **/ function transWidgetCode($content, $include_info = false) { - $this->include_info = $include_info; - // 내용중 widget이 아닌 것들을 일단 분리 - /* - $none_widget_code = preg_replace('!]*)widget=([^\>]*?)\>!is', '', $content); - $oPageAdminController = &getAdminController('page'); - if(trim($none_widget_code)) { - $args->style = "float:left;overflow:hidden;padding:none;padding:none"; - $args->widget_padding_left = $args->widget_padding_top = $args->widget_padding_right = $args->widget_padding_bottom = 0; - $none_widget_content = $oPageAdminController->transEditorContent($none_widget_code, $args); - } - */ + $this->include_info = $include_info; // 내용중 위젯을 또다시 구함 (기존 버전에서 페이지 수정해 놓은것과의 호환을 위해서) $content = preg_replace_callback('!]*)widget=([^\>]*?)\>!is', array($this,'transWidget'), $content); @@ -165,17 +143,6 @@ // 박스 위젯을 다시 구함 $content = preg_replace_callback('!]*)widget=([^\>]*?)\>
    !is', array($this,'transWidgetBox'), $content); - // include_info, 즉 위젯의 수정일 경우 css와 js파일을 추가해 주고 위젯 수정용 레이어도 추가함 - if($this->include_info) { - Context::addJsFile("./modules/widget/tpl/js/widget.js"); - Context::addCSSFile("./modules/widget/tpl/css/widget.css"); - - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'widget_layer'); - $content .= $tpl; - - } - return $content; } @@ -183,10 +150,7 @@ * @brief 위젯 코드를 실제 php코드로 변경 **/ function transWidget($matches) { - $oContext = &Context::getInstance(); $buff = trim($matches[0]); - $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', array($oContext, _fixQuotation), $buff); - $buff = str_replace("&","&",$buff); $oXmlParser = new XmlParser(); $xml_doc = $oXmlParser->parse(trim($buff)); @@ -196,14 +160,6 @@ if(!$vars->widget) return ""; - // 캐시 체크 - $widget_sequence = $vars->widget_sequence; - $widget_cache = $vars->widget_cache; - if($widget_cache && $widget_sequence && !$this->include_info) { - $output = WidgetHandler::getCache($widget_sequence, $widget_cache); - if($output) return $output; - } - // 위젯의 이름을 구함 $widget = $vars->widget; unset($vars->widget); @@ -229,54 +185,5 @@ return WidgetHandler::execute($widget, $vars, $this->include_info); } - /** - * @brief 에디터에서 생성한 컨텐츠를 페이지 수정시 사용할 수 있도록 코드 생성 - **/ - function transEditorContent($content, $args = null) { - // 에디터의 내용을 변환하여 visual한 영역과 원본 소스를 가지고 있는 code로 분리 - $code = $content; - - $oContext = &Context::getInstance(); - $content = preg_replace_callback('!]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($oContext,'transEditorComponent'), $content); - $content = preg_replace_callback('!]*)editor_component=([^\>]*?)\>!is', array($oContext,'transEditorComponent'), $content); - - // 결과물에 있는 css Meta 목록을 구해와서 해당 css를 아예 읽어버림 - require_once("./classes/optimizer/Optimizer.class.php"); - $oOptimizer = new Optimizer(); - preg_match_all('!<\!\-\-Meta:([^\-]*?)\-\->!is', $content, $matches); - $css_header = null; - for($i=0;$ireplaceCssPath($css_file, $buff)."\n"; - } - - $tpl = sprintf( - ''. - '
    '. - '
    '. - '
    '. - '
    '. - '
    '. - '
    '. - '
    '. - '
    '. - '
    '. - '%s'. - '
    '. - '
    '. - ''. - '
    ', - $css_header, - $args->style, - $args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom, - $args->widget_padding_top, $args->widget_padding_right, $args->widget_padding_bottom, $args->widget_padding_left, - $content, - base64_encode($code) - ); - - return $tpl; - } - } ?> diff --git a/modules/widget/widget.model.php b/modules/widget/widget.model.php index 088730746..951dc9492 100644 --- a/modules/widget/widget.model.php +++ b/modules/widget/widget.model.php @@ -94,7 +94,8 @@ // 추가 변수 (템플릿에서 사용할 제작자 정의 변수) if(!is_array($xml_obj->extra_vars->var)) $extra_vars[] = $xml_obj->extra_vars->var; else $extra_vars = $xml_obj->extra_vars->var; - if($extra_vars[0]->attrs->id) { + + if($extra_vars[0]->attrs->id || $extra_vars[0]->attrs->name) { $extra_var_count = count($extra_vars); $buff .= sprintf('$widget_info->extra_var_count = "%s";', $extra_var_count); @@ -103,10 +104,14 @@ unset($options); $var = $extra_vars[$i]; - $buff .= sprintf('$widget_info->extra_var->%s->name = "%s";', $var->attrs->id, $var->name->body); - $buff .= sprintf('$widget_info->extra_var->%s->type = "%s";', $var->attrs->id, $var->type->body); - $buff .= sprintf('$widget_info->extra_var->%s->value = $vars->%s;', $var->attrs->id, $var->attrs->id); - $buff .= sprintf('$widget_info->extra_var->%s->description = "%s";', $var->attrs->id, str_replace('"','\"',$var->description->body)); + $id = $var->attrs->id?$var->attrs->id:$var->attrs->name; + $name = $var->name->body?$var->name->body:$var->title->body; + $type = $var->attrs->type?$var->attrs->type:$var->type->body; + + $buff .= sprintf('$widget_info->extra_var->%s->name = "%s";', $id, $name); + $buff .= sprintf('$widget_info->extra_var->%s->type = "%s";', $id, $type); + $buff .= sprintf('$widget_info->extra_var->%s->value = $vars->%s;', $id, $id); + $buff .= sprintf('$widget_info->extra_var->%s->description = "%s";', $id, str_replace('"','\"',$var->description->body)); $options = $var->options; if(!$options) continue; @@ -114,7 +119,7 @@ if(!is_array($options)) $options = array($options); $options_count = count($options); for($j=0;$j<$options_count;$j++) { - $buff .= sprintf('$widget_info->extra_var->%s->options["%s"] = "%s";', $var->attrs->id, $options[$j]->value->body, $options[$j]->name->body); + $buff .= sprintf('$widget_info->extra_var->%s->options["%s"] = "%s";', $id, $options[$j]->value->body, $options[$j]->name->body); } } diff --git a/widgets/DroArc_clock/conf/info.xml b/widgets/DroArc_clock/conf/info.xml index 6de4ca623..e994f0ee9 100644 --- a/widgets/DroArc_clock/conf/info.xml +++ b/widgets/DroArc_clock/conf/info.xml @@ -4,17 +4,20 @@ Flash数字时钟 フラッシュデジタル時計 Flash digital Clock + Reloj digital Flash Цифровые Flash часы 드로아크 DroArc DroArc DroArc + DroArc DroArc 플래쉬로 된 디지털 시계를 출력합니다. 显示Flash数字时钟。 フラッシュのデジタル時計を表示します。 It will display the digital clock created with flash. + Se mostrará el reloj digital creado con flash. Это отображает цифровые часы, созданные flash. @@ -23,12 +26,14 @@ 宽度 横幅 Width + Ancho Ширина text 가로길이를 지정하실 수 있습니다. (기본 150px) 可以设置宽度大小。 (默认为 150px) 横幅のサイズの指定ができます(デフォルト150px)。 It will be able to set the width. (default is 150px) + Se estará en condiciones de establecer el ancho. (Por defecto es 150 px) Возможно установить ширину. (стандартное значение 150px) @@ -37,11 +42,13 @@ 縦幅 Высота Height + Altura text 세로길이를 지정하실 수 있습니다. (기본 64px) 可以设置高度大小。(默认为 64px) 縦幅のサイズの指定ができます(デフォルト64px)。 It will be able to set the width. (default is 64px) + Se estará en condiciones de establecer el ancho. (Por defecto es 64px) Возможно установить высоту. (стандартное значение 64px) diff --git a/widgets/category/category.class.php b/widgets/category/category.class.php new file mode 100644 index 000000000..41790ac7e --- /dev/null +++ b/widgets/category/category.class.php @@ -0,0 +1,56 @@ +mid_list, ','); + if($pos === false) $mid = $args->mid_list; + else $mid = substr($args->mid_list, 0, $pos); + if(!$mid) return; + + // 대상 mid의 module_srl 을 구함 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByMid($mid); + + $module_srl = $module_info->module_srl; + + // 대상 모듈의 카테고리 파일을 불러옴 + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($module_srl); + + // 모듈의 정보를 구함 + $widget_info->module_info = $module_info; + + $widget_info->mid = $mid; + $widget_info->document_category = $document_category; + $widget_info->module_info = $module_info; + $widget_info->category_list = $category_list; + + // 전체 개수를 구함 + $total_count = $oDocumentModel->getDocumentCount($module_srl); + $widget_info->total_document_count = $total_count; + + Context::set('widget_info', $widget_info); + + // 템플릿 컴파일 + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + $tpl_file = 'category'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + } +?> diff --git a/widgets/category/conf/info.xml b/widgets/category/conf/info.xml new file mode 100644 index 000000000..908444e19 --- /dev/null +++ b/widgets/category/conf/info.xml @@ -0,0 +1,40 @@ + + + 게시글 분류 출력기 + 게시글 분류 출력기 + 게시글 분류 출력기 + 게시글 분류 출력기 + 게시글 분류 출력기 + 输出主题分类 + + 제로 + zero + zero + zero + zero + zero + 게시판등 문서모듈의 분류를 사용하는 모듈에서 분류를 추출하여 블로그 카테고리와 같이 출력하는 기능입니다. + 게시판등 문서모듈의 분류를 사용하는 모듈에서 분류를 추출하여 블로그 카테고리와 같이 출력하는 기능입니다. + 게시판등 문서모듈의 분류를 사용하는 모듈에서 분류를 추출하여 블로그 카테고리와 같이 출력하는 기능입니다. + 게시판등 문서모듈의 분류를 사용하는 모듈에서 분류를 추출하여 블로그 카테고리와 같이 출력하는 기능입니다. + 게시판등 문서모듈의 분류를 사용하는 모듈에서 분류를 추출하여 블로그 카테고리와 같이 출력하는 기능입니다. + 把论坛等文本模块的分类在使用的模块里抽出分类后输出类似于博客分类的功能。 + + + + 대상 모듈 + 대상 모듈 + 대상 모듈 + 대상 모듈 + 대상 모듈 + 对象模块 + mid_list + 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. + 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. + 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. + 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. + 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. + 将把被选模块当中的主题作为对象。请选择一个模块。 + + + diff --git a/widgets/category/skins/default/category.html b/widgets/category/skins/default/category.html new file mode 100644 index 000000000..61890d0ac --- /dev/null +++ b/widgets/category/skins/default/category.html @@ -0,0 +1,58 @@ + + + +
    + +
    {$widget_info->module_info->browser_title} [{$widget_info->total_document_count}]
    + + {@ $prev_depth = 0} + {@ $prev_last = false} + {@ $prev_srl = 0} + {@ $prev_expand = false} + + + + + + {@ $class = "plusBottom" }{@ $class = "minusBottom" } + + {@ $class = "joinBottom" } + + + + {@ $class = "plus" }{@ $class = "minus" } + + {@ $class = "join" } + + + + {@ $class = "plus" }{@ $class = "minus" } + + {@ $class = "join" } + + + + + {@ $prev_depth = $val->depth } +
    style="display:none;"> + +
    + {@ $prev_depth = $val->depth } + + +
    +
    + {$val->text} + [{$val->document_count}] +
    +
    + + {@ $prev_last = $val->last} + {@ $prev_srl = $val->category_srl} + {@ $prev_expand = $val->expand} + + + +
    + +
    diff --git a/widgets/category/skins/default/css/category.css b/widgets/category/skins/default/css/category.css new file mode 100644 index 000000000..c90e0e965 --- /dev/null +++ b/widgets/category/skins/default/css/category.css @@ -0,0 +1,79 @@ +@charset "utf-8"; + +.categoryWidget .top { + background:url("../images/top.gif") no-repeat left -1px; + padding-left:14px; + height:18px; +} + +.categoryWidget a { + text-decoration:none; + color:#555555; + padding:0 2px 0 2px; +} + +.categoryWidget a:hover { + text-decoration:underline; +} + +.categoryWidget strong { + font-weight:normal; + color:#DF7901; + font-size:7pt; + font-family:tahoma; +} + +.categoryWidget .selected a { + font-weight:bold; +} + +.categoryWidget .item { + background:url("../images/page.gif") no-repeat left 2px; + padding-left:13px; + height:18px; +} + + +.categoryWidget .child { + background:url("../images/line.gif") repeat-y left top; + padding-left:16px; +} + +.categoryWidget .childBottom { + background:none; + padding-left:16px; +} + +.categoryWidget .plus { + background:url("../images/plus.gif") no-repeat left top; + padding-left:16px; + cursor:pointer; +} + +.categoryWidget .plusBottom { + background:url("../images/plusbottom.gif") no-repeat left top; + padding-left:16px; + cursor:pointer; +} + +.categoryWidget .minus { + background:url("../images/minus.gif") no-repeat left top; + padding-left:16px; + cursor:pointer; +} + +.categoryWidget .minusBottom { + background:url("../images/minusbottom.gif") no-repeat left top; + padding-left:16px; + cursor:pointer; +} + +.categoryWidget .joinBottom { + background:url("../images/joinbottom.gif") no-repeat left top; + padding-left:16px; +} + +.categoryWidget .join{ + background:url("../images/join.gif") no-repeat left top; + padding-left:16px; +} diff --git a/widgets/category/skins/default/images/join.gif b/widgets/category/skins/default/images/join.gif new file mode 100644 index 000000000..34dd47610 Binary files /dev/null and b/widgets/category/skins/default/images/join.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/joinbottom.gif b/widgets/category/skins/default/images/joinbottom.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/tree_menu/joinbottom.gif rename to widgets/category/skins/default/images/joinbottom.gif diff --git a/widgets/category/skins/default/images/line.gif b/widgets/category/skins/default/images/line.gif new file mode 100644 index 000000000..1a259eea0 Binary files /dev/null and b/widgets/category/skins/default/images/line.gif differ diff --git a/widgets/category/skins/default/images/minus.gif b/widgets/category/skins/default/images/minus.gif new file mode 100644 index 000000000..3d212a97a Binary files /dev/null and b/widgets/category/skins/default/images/minus.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/minusbottom.gif b/widgets/category/skins/default/images/minusbottom.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/tree_menu/minusbottom.gif rename to widgets/category/skins/default/images/minusbottom.gif diff --git a/widgets/category/skins/default/images/page.gif b/widgets/category/skins/default/images/page.gif new file mode 100644 index 000000000..be86220c5 Binary files /dev/null and b/widgets/category/skins/default/images/page.gif differ diff --git a/widgets/category/skins/default/images/plus.gif b/widgets/category/skins/default/images/plus.gif new file mode 100644 index 000000000..b2c997233 Binary files /dev/null and b/widgets/category/skins/default/images/plus.gif differ diff --git a/modules/blog/skins/xe_blog/images/tree_menu/plusbottom.gif b/widgets/category/skins/default/images/plusbottom.gif similarity index 100% rename from modules/blog/skins/xe_blog/images/tree_menu/plusbottom.gif rename to widgets/category/skins/default/images/plusbottom.gif diff --git a/widgets/category/skins/default/images/plustop.gif b/widgets/category/skins/default/images/plustop.gif new file mode 100644 index 000000000..5f2d1771e Binary files /dev/null and b/widgets/category/skins/default/images/plustop.gif differ diff --git a/widgets/category/skins/default/images/top.gif b/widgets/category/skins/default/images/top.gif new file mode 100644 index 000000000..244b22810 Binary files /dev/null and b/widgets/category/skins/default/images/top.gif differ diff --git a/widgets/category/skins/default/js/category.js b/widgets/category/skins/default/js/category.js new file mode 100644 index 000000000..dbec70e54 --- /dev/null +++ b/widgets/category/skins/default/js/category.js @@ -0,0 +1,32 @@ +function toggleCategory(evt) { + var e = new xEvent(evt); + var obj = e.target; + var srl = null; + if(obj.nodeName != 'DIV') return; + + if(obj.id && /^category_parent_/.test(obj.id)) { + srl = obj.id.replace(/^category_parent_/,''); + } else if(obj.id && /^category_/.test(obj.id)) { + srl = obj.id.replace(/^category_parent_/,''); + } else if(obj.className && /item/.test(obj.className)) { + var pObj = obj.parentNode; + srl = pObj.id.replace(/^category_parent_/,''); + } + + if(!srl) return; + var obj = xGetElementById("category_"+srl); + if(!obj) return; + + var selObj = xGetElementById("category_parent_"+srl); + if(!selObj) return; + + if(!obj.style.display || obj.style.display == 'block') { + obj.style.display = 'none'; + selObj.className = selObj.className.replace('minus','plus'); + } else { + obj.style.display = 'block'; + selObj.className = selObj.className.replace('plus','minus'); + } +} + +xAddEventListener(document, 'click', toggleCategory); diff --git a/widgets/category/skins/default/skin.xml b/widgets/category/skins/default/skin.xml new file mode 100644 index 000000000..7317ad2ff --- /dev/null +++ b/widgets/category/skins/default/skin.xml @@ -0,0 +1,21 @@ + + + 분류 출력 기본 스킨 + Default Skin of Category Widget + 分类输出基本皮肤 + + 제로 + Zero + Zero + 게시글 분류를 출력하는 기본 스킨입니다 + This is a widget that displays categories of articles. + 输出主题分类的基本皮肤 + + + + 기본 컬러 + Default Color + 默认颜色 + + + diff --git a/widgets/forum/conf/info.xml b/widgets/forum/conf/info.xml new file mode 100644 index 000000000..4f8e1ec61 --- /dev/null +++ b/widgets/forum/conf/info.xml @@ -0,0 +1,94 @@ + + + 포럼형 최근 게시물 + 论坛型最新主题列表 + フォーラムスタイルの最新の記事を表示 + Display Forum Style Newest Articles + Pantalla Foro estilo más reciente de artículos + Дисплей стиле форума новейших статей + + 제로 + zero + zero + Zero + zero + zero + + 한개 또는 여러개의 게시판을 포럼형식으로 정리하여 노출하는 위젯입니다. + 대상 게시판에 설정되어 있는 제목과 설명을 이용하여 설명을 출력합니다. + + + 把一个或多个版面输出类似于论坛形式的控件。 + 利用对象版面里设定的主题和说明显示。 + + + このウィジェットの最新の記事を表示1つまたは複数の委員会からのフォーラムのスタイルです。説明が表示されるターゲットボードのタイトルと説明しています。 + + + This widget displays newest articles from one or more board in forum style. + Description will be displayed with target board's title and description. + + + Este widget muestra más reciente de artículos de uno o varios bordo de estilo en el foro. Descripción se mostrará con la meta bordo del título y la descripción. + + + Этот виджет отображает новейшие изделия из одной или нескольких борту в стиле форума. Описание будет отображаться с целевыми борту название и описание. + + + + + 제목 + 栏目名 + タイトル + Title + Título + Заголовок + text + + + new 표시 시간 (hours) + new图标显示时间(hours) + Newの表示時間 (Hours) + Duration of indication for new item + Duration of indication for new item + Длительность индикации для новых объектов + text + 새로 등록된 게시물의 new 표시시간을 정할 수 있습니다. (시간 단위) + 可以设置最新更新主题的new图标显示时间。 + 新しく登録された書き込みに対して「New」の表示時間を指定します(時間単位)。 + You may set the duration of indication for fresh item. (unit is hour) + Usted puede configurar la duración de la indicación de un nuevo tema. (Unidad es hora) + Вы можете установить длительность индикации для нового объекта. (единица - час) + + + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + Número de letras del título + Длина темы + text + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以设置标题的字数。(0或留空为不限) + Length of Subject can be assigned. (0 or blank value will not restrict the length) + El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) + Длина темы может быть присвоена. (0 или пустое значение не будут ограничивать длину) + + + 대상 모듈 + 模块对象 + モジュール + Target Module + Módulo Objetivo + Модуль назначения + mid_list + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 将把被选模块当中的主题作为对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles to be sorted will be the ones submitted in the selected module. + El objetivo de los documentos agregados serán los del módulo selccionado. + Статьи назначения для сортировки будут теми, что были размещены в выбранном модуле. + + + diff --git a/widgets/forum/forum.class.php b/widgets/forum/forum.class.php new file mode 100644 index 000000000..a725cb8fd --- /dev/null +++ b/widgets/forum/forum.class.php @@ -0,0 +1,118 @@ +title; + + // 최근 글 표시 시간 + $duration_new = $args->duration_new; + if(!$duration_new) $duration_new = 12; + + // 제목 길이 자르기 + $subject_cut_size = $args->subject_cut_size; + if(!$subject_cut_size) $subject_cut_size = 0; + + // 대상 모듈 + if($args->mid_list) $mid_list = explode(",",$args->mid_list); + else return; + + // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 + $oModuleModel = &getModel('module'); + $module_srls = $oModuleModel->getModuleSrlByMid($mid_list); + + // 대상 모듈의 정보를 구함 + $module_list = $oModuleModel->getModulesInfo($module_srls); + + // 각 모듈별로 먼저 정리 시작 + foreach($module_list as $module) { + $modules[$module->module_srl]->title = $module->browser_title; + $modules[$module->module_srl]->mid = $module->mid; + $modules[$module->module_srl]->description = $module->description; + $modules[$module->module_srl]->document_count = 0; + $modules[$module->module_srl]->comment_count = 0; + + // 최근 등록된 댓글의 정보 + $last_comment = null; + $last_args = null; + $last_args->module_srl = $module->module_srl; + $output = executeQuery('widgets.forum.getLatestComments', $last_args); + if($output->data && is_array($output->data)) $last_comment = array_pop($output->data); + + // 최근 등록된 글의 정보 + $last_document = null; + $last_args = null; + $last_args->module_srl = $module->module_srl; + $output = executeQuery('widgets.forum.getLatestDocuments', $last_args); + if($output->data && is_array($output->data)) $last_document = array_pop($output->data); + + $last_item = null; + if($last_comment && $last_document) { + if($last_document->regdate > $last_comment->regdate) $last_item = $last_document; + else $last_item = $last_comment; + } elseif($last_document) { + $last_item = $last_document; + } elseif($last_comment) { + $last_item = $last_comment; + } + $modules[$module->module_srl]->last_item = $last_item; + + if($last_item && $last_item->regdate > date("YmdHis",time()-$duration_new*60*60)) $modules[$module->module_srl]->is_new = true; + } + + // 각 모듈별 전체글을 구함 + $total_documents_args->module_srl = $module->module_srl; + $total_documents_args->module_srls = implode(',',$module_srls); + + $total_documents_output = executeQueryArray('widgets.forum.getTotalDocuments',$total_documents_args); + if($total_documents_output->data) { + foreach($total_documents_output->data as $val) { + $modules[$val->module_srl]->document_count = $val->count; + } + } + + // 각 모듈별 댓글 수를 구함 + $total_comments_args->module_srl = $module->module_srl; + $total_comments_args->module_srls = implode(',',$module_srls); + + $total_comments_output = executeQueryArray('widgets.forum.getTotalComments',$total_comments_args); + if($total_comments_output->data) { + foreach($total_comments_output->data as $val) { + $modules[$val->module_srl]->comment_count = $val->count; + } + } + + $widget_info->title = $title; + $widget_info->modules = $modules; + $widget_info->subject_cut_size = $subject_cut_size; + $widget_info->duration_new = $duration_new * 60*60; + + Context::set('widget_info', $widget_info); + + // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정) + $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); + Context::set('colorset', $args->colorset); + + // 템플릿 파일을 지정 + $tpl_file = 'list'; + + // 템플릿 컴파일 + $oTemplate = &TemplateHandler::getInstance(); + $output = $oTemplate->compile($tpl_path, $tpl_file); + return $output; + } + } +?> diff --git a/widgets/forum/queries/getLatestComments.xml b/widgets/forum/queries/getLatestComments.xml new file mode 100644 index 000000000..d036ad8aa --- /dev/null +++ b/widgets/forum/queries/getLatestComments.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/widgets/forum/queries/getLatestDocuments.xml b/widgets/forum/queries/getLatestDocuments.xml new file mode 100644 index 000000000..7ba49510a --- /dev/null +++ b/widgets/forum/queries/getLatestDocuments.xml @@ -0,0 +1,14 @@ + + +
    + + + + + + + + + + + diff --git a/widgets/forum/queries/getTotalComments.xml b/widgets/forum/queries/getTotalComments.xml new file mode 100644 index 000000000..76c845ba0 --- /dev/null +++ b/widgets/forum/queries/getTotalComments.xml @@ -0,0 +1,15 @@ + + +
    + + + + + + + + + + + + diff --git a/widgets/forum/queries/getTotalDocuments.xml b/widgets/forum/queries/getTotalDocuments.xml new file mode 100644 index 000000000..2abf501b8 --- /dev/null +++ b/widgets/forum/queries/getTotalDocuments.xml @@ -0,0 +1,15 @@ + + +
    + + + + + + + + + + + + diff --git a/widgets/forum/skins/default/css/common.css b/widgets/forum/skins/default/css/common.css new file mode 100644 index 000000000..b25e09364 --- /dev/null +++ b/widgets/forum/skins/default/css/common.css @@ -0,0 +1,28 @@ +.xeForum { background:url("../images/back.gif") repeat-x left top; padding:0; } + +.xeForum div.forumTable { padding:0 6px 0 6px; } +.xeForum table { width:100%; border:0; table-layout:fixed; } + +.xeForum table tr.top { height:22px; } +.xeForum table th { vertical-align:bottom; color:#ffffff; font-weight:normal; padding-bottom:5px; } +.xeForum table th.title { font-weight:normal; text-align:left; padding-left:10px; } +.xeForum table th.last_post { text-align:left; padding-left:15px; } + +.xeForum table tr.content { background:#EFEFEF; height:55px; } + +.xeForum table td.topic, .xeForum td.icon, .xeForum td.title, .xeForum td.topic, .xeForum td.replies , .xeForum td.last_post{ padding:5px 0 5px 0; border-top:1px solid #FFFFFF; } +.xeForum table td.topic, .xeForum td.icon, .xeForum td.title, .xeForum td.topic, .xeForum td.replies , .xeForum td.last_post{ padding:5px 0 5px 0; border-bottom:1px solid #6E6E6E; } +.xeForum table td.icon { text-align:center; } + +.xeForum table td.title a { text-decoration:none; color:#3A3947; font-size:9pt;} +.xeForum table td.title p { margin-top:5px; font-weight:normal; text-decoration:none; color:#838383; font-size:9pt;} +.xeForum table td.title p a { font-weight:normal; text-decoration:underline; color:#838383; font-size:9pt;} + +.xeForum table td.topic, .xeForum td.replies, .xeForum td.last_post { background:#EFEFEF url("../images/div.gif") no-repeat left 3px; } + +.xeForum table td.topic, .xeForum td.replies { text-align:center; color:#3A3947; font-family:tahoma; font-size:8pt; } + +.xeForum table td.last_post { text-align:left; color:#3A3947; font-family:tahoma; font-size:8pt; padding-left:15px; } +.xeForum table td.last_post div.author img { vertical-align:middle; } +.xeForum table td.last_post div.date { margin-top:5px; text-align:left; color:#3A3947; font-family:tahoma; font-size:8pt; } + diff --git a/widgets/forum/skins/default/images/back.gif b/widgets/forum/skins/default/images/back.gif new file mode 100644 index 000000000..8120d20ef Binary files /dev/null and b/widgets/forum/skins/default/images/back.gif differ diff --git a/widgets/forum/skins/default/images/div.gif b/widgets/forum/skins/default/images/div.gif new file mode 100644 index 000000000..22948e423 Binary files /dev/null and b/widgets/forum/skins/default/images/div.gif differ diff --git a/widgets/forum/skins/default/images/icon.gif b/widgets/forum/skins/default/images/icon.gif new file mode 100644 index 000000000..f9a69477f Binary files /dev/null and b/widgets/forum/skins/default/images/icon.gif differ diff --git a/widgets/forum/skins/default/images/icon_new.gif b/widgets/forum/skins/default/images/icon_new.gif new file mode 100644 index 000000000..454fad1fe Binary files /dev/null and b/widgets/forum/skins/default/images/icon_new.gif differ diff --git a/widgets/forum/skins/default/images/lb.gif b/widgets/forum/skins/default/images/lb.gif new file mode 100644 index 000000000..993f47c8d Binary files /dev/null and b/widgets/forum/skins/default/images/lb.gif differ diff --git a/widgets/forum/skins/default/images/lt.gif b/widgets/forum/skins/default/images/lt.gif new file mode 100644 index 000000000..02fbc3c4c Binary files /dev/null and b/widgets/forum/skins/default/images/lt.gif differ diff --git a/widgets/forum/skins/default/images/rb.gif b/widgets/forum/skins/default/images/rb.gif new file mode 100644 index 000000000..2e41a85d9 Binary files /dev/null and b/widgets/forum/skins/default/images/rb.gif differ diff --git a/widgets/forum/skins/default/images/replies.gif b/widgets/forum/skins/default/images/replies.gif new file mode 100644 index 000000000..78ba5d8d8 Binary files /dev/null and b/widgets/forum/skins/default/images/replies.gif differ diff --git a/widgets/forum/skins/default/images/rt.gif b/widgets/forum/skins/default/images/rt.gif new file mode 100644 index 000000000..6c1ad7fa9 Binary files /dev/null and b/widgets/forum/skins/default/images/rt.gif differ diff --git a/widgets/forum/skins/default/images/top_bg.gif b/widgets/forum/skins/default/images/top_bg.gif new file mode 100644 index 000000000..65e69d535 Binary files /dev/null and b/widgets/forum/skins/default/images/top_bg.gif differ diff --git a/widgets/forum/skins/default/list.html b/widgets/forum/skins/default/list.html new file mode 100644 index 000000000..b0d8d642c --- /dev/null +++ b/widgets/forum/skins/default/list.html @@ -0,0 +1,47 @@ + + +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    {$widget_info->title} {$lang->topic}{$lang->replies}{$lang->last_post}
    icon + {$val->title} +

    {$val->description}

    +
    {number_format($val->document_count)}{number_format($val->comment_count)} + +
    + {$val->last_item->nick_name} + go +
    +
    {zdate($val->last_item->regdate,"Y-m-d H:i")}
    + +   + +
    +
    + + +
    +
    diff --git a/widgets/forum/skins/default/skin.xml b/widgets/forum/skins/default/skin.xml new file mode 100644 index 000000000..8c81ce100 --- /dev/null +++ b/widgets/forum/skins/default/skin.xml @@ -0,0 +1,33 @@ + + + 기본 포럼형 위젯 스킨 + 기본 포럼형 위젯 스킨 + 基本论坛型控件皮肤 + 기본 포럼형 위젯 스킨 + + 제로 + zero + zero + zero + + 포럼형 위젯의 기본 스킨입니다. + + + 포럼형 위젯의 기본 스킨입니다. + + + 论坛型控件的基本皮肤。 + + + 포럼형 위젯의 기본 스킨입니다. + + + + + 흰색 바탕용 + 白い背景用 + 白色背景 + White Background + + + diff --git a/widgets/gagachat/conf/info.xml b/widgets/gagachat/conf/info.xml index 5387ab876..b4a2fed16 100644 --- a/widgets/gagachat/conf/info.xml +++ b/widgets/gagachat/conf/info.xml @@ -1,77 +1,137 @@ 가가 채팅 + Gaga Chat + Gaga Chat 디지레이브 + Digirave + Digirave 실시간 채팅방을 생성합니다 + This widget created realtime chat room + Este artilugio creado sala de chat en tiempo real 채팅방 이름(필수/영문) + Title of Room (Essential/English only) + Título de la habitación (Esenciales / Inglés solamente) text 채팅방 이름. (@, @@, @@@ 로 시작하는 채팅방은 회원 시스템과 연동 가능한 보안 채팅방) 보안 채팅방은 http://www.gagalive.kr/live/livechatxe 에서 신청하시길 바랍니다. 회원 시스템과 연동하지 않을 경우 별도의 신청 필요 없이 원하는 채팅방 이름만 입력하면 됩니다. + Title of Room. + (Chat room which title starts with @, @@, @@@ is a secure chat room that can be linked with member system) + Please apply for secure chat room at http://www.gagalive.kr/live/livechatxe. + If member system is unnecessary, you can just input the title. + + Título de la habitación. +(En sala título que comienza con @, @ @, @ @ @ es una sala de chat seguro que puede vincularse con los miembros del sistema) +Por favor, solicitar el seguro en la sala de chat http://www.gagalive.kr/live/livechatxe. +Si los miembros del sistema no es necesario, basta con introducir el título. + 채팅방 보안 키(선택사항) + Chat Room Security Key (Optional)) + Sala de chat clave de seguridad (Opcional)) text 보안 채팅방 사용시에만 필요함. 보안 채팅방을 사용하지 않을 경우에는 빈 칸으로 놔두시길 바랍니다. + Security Key is only necessary for secure chat rooms. In case of normal chat room, please leave it blank. + Clave de seguridad sólo es necesario para garantizar las salas de chat. En caso de la sala de chat normal, por favor dejar en blanco. 채팅방 관리자(선택사항) + Chat Room Adminstrator (Optional) + Sala de chat Administrador (Opcional) text 보안 채팅방 사용시에만 적용됨. 강제 퇴장 기능 가능함. 아이디, 아이디2, 아이디3 처럼 채팅방 관리자들을 , 로 분리하시길 바랍니다. + Adminstrators will be applied for secure chat rooms. Banning available. Please seperate each id with comma(,) like ID1, ID2, ID3. + Adminstrators se aplicarán para garantizar las salas de chat. Se prohíben los disponibles. Por favor, separar cada id con una coma (,) como ID1, ID2, ID3. 채팅방 형태 + Form of Chat Room + Forma de la sala de chat select 세로형/가로형 + Vertical/Horizontal + Vertical/Horizontal 세로형 + Vertical + Vertical 2 가로형 + Horizontal + Horizontal 1 채팅방 높이(선택사항) + Height of Chat Room (Optional) + Altura de la Sala de chat (Opcional) text 채팅방 높이(기본값 450) + Height of chat room (450 as default) + Altura de la sala de chat (450 como valor por defecto) 글씨체(선택사항) + Font (Optional) + Font (Opcional) text Font-family 예) 굴림체 + Font-family ex) Gulim + Font-family ex) Gulim 글씨 색깔(선택사항) + Font Color (Optional) + Font Color (Optional) text 채팅방 글씨 색깔 예) white 또는 #FFFFFF + Font color of chat room ex) white or #FFFFFF + Font color de la ex sala de chat) o blanco # FFFFFF 배경 색깔(선택사항) + Background Color (Optional) + Color de fondo (Opcional) text 채팅방 배경 색깔 예) black 또는 #000000 + Background color of chat room ex) black or #000000 + Color de fondo de la sala de chat ex) o negro # 000000 큰 글씨체 + Large Font + Large Font select 글씨체 크기 + Font size + Font size 작은 글씨체 + Small Font + Small Font small 중간 글씨체 + Medium Font + Medium Font medium 큰 글씨체 + Large Font + Large Font large diff --git a/widgets/gagachat/skins/default/skin.xml b/widgets/gagachat/skins/default/skin.xml index 2ea564dc7..2d684a2fc 100644 --- a/widgets/gagachat/skins/default/skin.xml +++ b/widgets/gagachat/skins/default/skin.xml @@ -1,9 +1,12 @@ 가가 채팅 기본 스킨 + Basic Skin of Gagachat 디지레이브 + Digirave newest_document의 기본 스킨 + Default skin of newest document diff --git a/widgets/login_info/skins/default/js/login.js b/widgets/login_info/skins/default/js/login.js index da278dc3b..9ee9694d4 100644 --- a/widgets/login_info/skins/default/js/login.js +++ b/widgets/login_info/skins/default/js/login.js @@ -1,13 +1,8 @@ /* 로그인 영역에 포커스 */ function doFocusUserId(fo_id) { + if(xScrollTop()) return; var fo_obj = xGetElementById(fo_id); - if(xGetCookie('user_id')) { - fo_obj.user_id.value = xGetCookie('user_id'); - fo_obj.remember_user_id.checked = true; - try{ - fo_obj.password.focus(); - } catch(e) {}; - } else { + if(fo_obj.user_id) { try{ fo_obj.user_id.focus(); } catch(e) {}; diff --git a/widgets/login_info/skins/default/login_form.html b/widgets/login_info/skins/default/login_form.html index 744d38a88..9b8d4a082 100644 --- a/widgets/login_info/skins/default/login_form.html +++ b/widgets/login_info/skins/default/login_form.html @@ -7,6 +7,11 @@ + +

    - - + + + +
    diff --git a/widgets/newest_document/skins/news_ticker/css/black.css b/widgets/newest_document/skins/news_ticker/css/black.css index d0e09c72c..68c6e1f6c 100644 --- a/widgets/newest_document/skins/news_ticker/css/black.css +++ b/widgets/newest_document/skins/news_ticker/css/black.css @@ -1,7 +1,7 @@ .news_ticker_black { height:25px; overflow:hidden; clear:both; background:#FFFFFF url("../images/black/bg.gif") repeat-x left top; white-space:nowrap; } -.news_ticker_black table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed;} -.news_ticker_black table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; } +.news_ticker_black table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed; border-left:1px solid #000000; border-right:1px solid #000000; } +.news_ticker_black table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; padding:0 6px 0 6px; } .news_ticker_black .tickerBox { height:16px; margin:3px 0 3px 0; padding-top:3px; white-space:nowrap; overflow:hidden; } diff --git a/widgets/newest_document/skins/news_ticker/css/blue.css b/widgets/newest_document/skins/news_ticker/css/blue.css index d7d7a9d7d..bc9c8af48 100644 --- a/widgets/newest_document/skins/news_ticker/css/blue.css +++ b/widgets/newest_document/skins/news_ticker/css/blue.css @@ -1,7 +1,7 @@ .news_ticker_blue { height:25px; overflow:hidden; clear:both; background:#FFFFFF url("../images/blue/bg.gif") repeat-x left top; white-space:nowrap; } -.news_ticker_blue table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed;} -.news_ticker_blue table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; } +.news_ticker_blue table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed; border-left:1px solid #000000; border-right:1px solid #000000;} +.news_ticker_blue table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; padding:0 6px 0 6px;} .news_ticker_blue .tickerBox { height:25px; padding-top:6px; white-space:nowrap; overflow:hidden; } diff --git a/widgets/newest_document/skins/news_ticker/css/gray.css b/widgets/newest_document/skins/news_ticker/css/gray.css index f408135a8..3df93b939 100644 --- a/widgets/newest_document/skins/news_ticker/css/gray.css +++ b/widgets/newest_document/skins/news_ticker/css/gray.css @@ -1,7 +1,7 @@ .news_ticker_gray { height:25px; overflow:hidden; clear:both; background:#FFFFFF url("../images/gray/bg.gif") repeat-x left top; white-space:nowrap; } -.news_ticker_gray table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed;} -.news_ticker_gray table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; } +.news_ticker_gray table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed; border-left:1px solid #000000; border-right:1px solid #000000; } +.news_ticker_gray table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; padding:0 6px 0 6px;} .news_ticker_gray .tickerBox { height:25px; padding-top:6px; white-space:nowrap; overflow:hidden; } diff --git a/widgets/newest_document/skins/news_ticker/css/green.css b/widgets/newest_document/skins/news_ticker/css/green.css index 5335aba80..bfbe66f5e 100644 --- a/widgets/newest_document/skins/news_ticker/css/green.css +++ b/widgets/newest_document/skins/news_ticker/css/green.css @@ -1,7 +1,7 @@ .news_ticker_green { height:25px; overflow:hidden; clear:both; background:#FFFFFF url("../images/green/bg.gif") repeat-x left top; white-space:nowrap; } -.news_ticker_green table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed;} -.news_ticker_green table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; } +.news_ticker_green table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed; border-left:1px solid #000000; border-right:1px solid #000000;} +.news_ticker_green table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; padding:0 6px 0 6px; } .news_ticker_green .tickerBox { height:25px; padding-top:6px; white-space:nowrap; overflow:hidden; } diff --git a/widgets/newest_document/skins/news_ticker/css/red.css b/widgets/newest_document/skins/news_ticker/css/red.css index 19fbfb01d..8e2acf392 100644 --- a/widgets/newest_document/skins/news_ticker/css/red.css +++ b/widgets/newest_document/skins/news_ticker/css/red.css @@ -1,7 +1,7 @@ .news_ticker_red { height:25px; overflow:hidden; clear:both; background:#FFFFFF url("../images/red/bg.gif") repeat-x left top; white-space:nowrap; } -.news_ticker_red table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed;} -.news_ticker_red table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; } +.news_ticker_red table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed; border-left:1px solid #000000; border-right:1px solid #000000;} +.news_ticker_red table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; padding:0 6px 0 6px;} .news_ticker_red .tickerBox { height:25px; padding-top:6px; white-space:nowrap; overflow:hidden; } diff --git a/widgets/newest_document/skins/news_ticker/css/yellow.css b/widgets/newest_document/skins/news_ticker/css/yellow.css index 4b05e5d9b..ac1b5d26c 100644 --- a/widgets/newest_document/skins/news_ticker/css/yellow.css +++ b/widgets/newest_document/skins/news_ticker/css/yellow.css @@ -1,7 +1,7 @@ .news_ticker_yellow { height:25px; overflow:hidden; clear:both; background:#FFFFFF url("../images/yellow/bg.gif") repeat-x left top; white-space:nowrap; } -.news_ticker_yellow table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed;} -.news_ticker_yellow table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; } +.news_ticker_yellow table { width:100%; height:25px; margin:0; padding:0; table-layout:fixed; border-left:1px solid #000000; border-right:1px solid #000000;} +.news_ticker_yellow table td { white-space:nowrap; overflow:hidden; height:25px; vertical-align:top; padding:0 6px 0 6px; } .news_ticker_yellow .tickerBox { height:25px; padding-top:6px; white-space:nowrap; overflow:hidden; } diff --git a/widgets/newest_document/skins/news_ticker/images/black/left.gif b/widgets/newest_document/skins/news_ticker/images/black/left.gif deleted file mode 100644 index fc78f4245..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/black/left.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/black/right.gif b/widgets/newest_document/skins/news_ticker/images/black/right.gif deleted file mode 100644 index a273a58db..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/black/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/blue/left.gif b/widgets/newest_document/skins/news_ticker/images/blue/left.gif deleted file mode 100644 index ae1d28e6d..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/blue/left.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/blue/right.gif b/widgets/newest_document/skins/news_ticker/images/blue/right.gif deleted file mode 100644 index 03783ed53..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/blue/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/gray/left.gif b/widgets/newest_document/skins/news_ticker/images/gray/left.gif deleted file mode 100644 index 4bbad9491..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/gray/left.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/gray/right.gif b/widgets/newest_document/skins/news_ticker/images/gray/right.gif deleted file mode 100644 index 9e30f5d0a..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/gray/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/green/left.gif b/widgets/newest_document/skins/news_ticker/images/green/left.gif deleted file mode 100644 index 24aeffcf5..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/green/left.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/green/right.gif b/widgets/newest_document/skins/news_ticker/images/green/right.gif deleted file mode 100644 index 001867bc8..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/green/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/none/right.gif b/widgets/newest_document/skins/news_ticker/images/none/right.gif deleted file mode 100644 index 35d42e808..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/none/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/red/left.gif b/widgets/newest_document/skins/news_ticker/images/red/left.gif deleted file mode 100644 index 2e3ded5e5..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/red/left.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/red/right.gif b/widgets/newest_document/skins/news_ticker/images/red/right.gif deleted file mode 100644 index 02bf6e346..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/red/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/yellow/left.gif b/widgets/newest_document/skins/news_ticker/images/yellow/left.gif deleted file mode 100644 index d8f1d283c..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/yellow/left.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/images/yellow/right.gif b/widgets/newest_document/skins/news_ticker/images/yellow/right.gif deleted file mode 100644 index c6975189f..000000000 Binary files a/widgets/newest_document/skins/news_ticker/images/yellow/right.gif and /dev/null differ diff --git a/widgets/newest_document/skins/news_ticker/list.html b/widgets/newest_document/skins/news_ticker/list.html index 46d94dd9e..a6aff03f8 100644 --- a/widgets/newest_document/skins/news_ticker/list.html +++ b/widgets/newest_document/skins/news_ticker/list.html @@ -11,11 +11,7 @@ {@ $_news_ticker_id = "news_ticker_".time() }

    - - - - -
      @@ -35,7 +31,6 @@
    diff --git a/widgets/newest_document/skins/xe_official/css/black.css b/widgets/newest_document/skins/xe_official/css/black.css index a14fc63d5..59fdfe2cf 100644 --- a/widgets/newest_document/skins/xe_official/css/black.css +++ b/widgets/newest_document/skins/xe_official/css/black.css @@ -6,8 +6,8 @@ .latest_black ul li .title a { color:#818181; text-decoration:none; } .latest_black ul li .title a:hover { text-decoration:underline; } -.latest_black ul li .title span.comment { color:#FE6700; font:.8em Tahoma; } -.latest_black ul li .title span.comment a { color:#FE6700; font:.8em Tahoma; } +.latest_black ul li .title span.comment { color:#FE6700; font:.9em Tahoma; } +.latest_black ul li .title span.comment a { color:#FE6700; font:.9em Tahoma; } .latest_black ul li .date { color:#999999; font:.8em Tahoma; white-space:nowrap; margin-right:5px;} diff --git a/widgets/newest_document/skins/xe_official/css/white.css b/widgets/newest_document/skins/xe_official/css/white.css index dbf002a4c..078498964 100644 --- a/widgets/newest_document/skins/xe_official/css/white.css +++ b/widgets/newest_document/skins/xe_official/css/white.css @@ -6,8 +6,8 @@ .latest_white ul li .title a { color:#555555; text-decoration:none; } .latest_white ul li .title a:hover { text-decoration:underline; } -.latest_white ul li .title span.comment { color:#FE6700; font:.8em Tahoma; } -.latest_white ul li .title span.comment a { color:#FE6700; font:.8em Tahoma; } +.latest_white ul li .title span.comment { color:#FE6700; font:.9em Tahoma; } +.latest_white ul li .title span.comment a { color:#FE6700; font:.9em Tahoma; } .latest_white ul li .date { color:#999999; font:.8em Tahoma; white-space:nowrap; margin-right:5px;} diff --git a/widgets/newest_images/newest_images.class.php b/widgets/newest_images/newest_images.class.php index 45189f3ed..ecd3d6dd0 100644 --- a/widgets/newest_images/newest_images.class.php +++ b/widgets/newest_images/newest_images.class.php @@ -69,18 +69,24 @@ $obj->direct_download = 'Y'; $obj->isvalid = 'Y'; + $oDocumentModel = &getModel('document'); + // 정해진 모듈에서 문서별 파일 목록을 구함 $files_output = executeQueryArray("file.getOneFileInDocument", $obj); + $files_count = count($files_output->data); - $oDocumentModel = &getModel('document'); - if(count($files_output->data)) { - foreach($files_output->data as $key => $val) { - $oDocument = null; - $oDocument = $oDocumentModel->getDocument(); - $oDocument->setAttribute($val); - $document_list[] = $oDocument; + $document_srl_list = array(); + $document_list = array(); + + if($files_count>0) { + for($i=0;$i<$files_count;$i++) $document_srl_list[] = $files_output->data[$i]->document_srl; + + $tmp_document_list = $oDocumentModel->getDocuments($document_srl_list); + if(count($tmp_document_list)) { + foreach($tmp_document_list as $val) $document_list[] = $val; } } + $document_count = count($document_list); $total_count = $widget_info->rows_list_count * $widget_info->cols_list_count; for($i=$document_count;$i<$total_count;$i++) $document_list[] = new DocumentItem(); diff --git a/widgets/newest_images/skins/xe_official/list.html b/widgets/newest_images/skins/xe_official/list.html index 9537078cf..28baefdc7 100644 --- a/widgets/newest_images/skins/xe_official/list.html +++ b/widgets/newest_images/skins/xe_official/list.html @@ -61,7 +61,7 @@
    - + more
    diff --git a/widgets/rank_count/conf/info.xml b/widgets/rank_count/conf/info.xml index a2e8a5d7d..c4f767aa2 100644 --- a/widgets/rank_count/conf/info.xml +++ b/widgets/rank_count/conf/info.xml @@ -3,17 +3,20 @@ 글, 댓글 랭킹 출력 書き込み、コメントランキング出力 Article, Comment Ranking + El artículo, el comentario ranking 会员各项活动排行榜 Рейтинг статей, комментариев Simulz Simulz Simulz + Simulz Simulz Simulz 글, 댓글 작성 순위를 출력합니다. 書き込み、コメント作成順位を出力します。 This widget displays articles and comments ranking. + Este widget muestra de artículos y comentarios ranking. 按发表主题/评论/附件/推荐/查看数显示会员排行的控件。 Этот виджет отображает рейтинг статей и комментариев. @@ -23,12 +26,14 @@ タイトル 栏目名 Title + Título Заголовок text 위젯의 제목으로 출력됩니다. ウィジェットのタイトルとして出力されます。 显示为控件的栏目名。 It will be the title. + Será el título. Это будет заголовком. @@ -49,6 +54,9 @@ 순위 대상 + Rank target + Rango meta + Место целевого 順位対象 排行对象 select @@ -56,12 +64,14 @@ 対象を選択してください。 请选择排行对象。 Rank by + Rank por Рейтинговать по 글 작성 書き込み作成 发表主题 Article + Artículo Статья document @@ -70,6 +80,7 @@ コメント作成 发表评论 Comment + Comentario Комментарий comment @@ -78,6 +89,7 @@ ファイル添付 附件 Attach + Adjuntar Вложение attach @@ -86,6 +98,7 @@ 推薦数 推荐 Votes + Votos Голоса vote @@ -94,6 +107,7 @@ 照合数 查看 Reads + Lecturas Прочтения read @@ -103,18 +117,21 @@ 管理者 显示管理员 Without Admin + Sin Admin Без админа select 순위에 관리자를 포함합니다. 順位に管理者を含みます。 选择排行榜是否要显示管理员。 Disables admins' ranking + Desactiva admins' ranking Отключает учет рейтинга админов 포함 含む 显示 False + Falso Нет false @@ -123,6 +140,7 @@ 含まない 不显示 True + Verdadero Да true @@ -132,12 +150,14 @@ グループを含む 用户组 With Group + Con Grupo С группой text 출력할 회원 그룹명을 입력하세요. 예)준회원,정회원 出力する会員グループ名を入力してください(例:準会員、正会員)。 请输入要显示的会员组。例)准会员,正会员 Enables group's ranking + Permite grupo de la clasificación Включает учет рейтинга группы @@ -145,12 +165,14 @@ グループ除外 豁免用户组 Without Group + Sin Grupo Без группы text 제외할 회원 그룹명을 입력하세요. 예)관리그룹 除外するグループ名を入力してください(例:管理グループ) 请输入豁免用户组名。例)管理组 Disables group's ranking + Desactiva grupo de la clasificación Выключает учет рейтинга группы @@ -158,12 +180,14 @@ 期間(日) 期间(日期) Registration Date + Fecha de Registro Дата регистрации text 설정 기간 내의 순위를 출력합니다. 設定期間内の順位を出力します。 显示设置期间内的会员排行。 Registration Date + Fecha de Registro Дата регистрации diff --git a/widgets/rank_download/conf/info.xml b/widgets/rank_download/conf/info.xml index 51a91eaf0..892073731 100644 --- a/widgets/rank_download/conf/info.xml +++ b/widgets/rank_download/conf/info.xml @@ -3,17 +3,20 @@ 다운로드 랭킹 출력 ダウンロードランキング出力 Download Ranking + Descargar Clasificación 下载附件排行榜 Рейтинг закачек Simulz Simulz Simulz + Simulz Simulz Simulz 자료 내려받기 순위를 출력합니다. ダウンロードランキングを出力します。 This widget displays download ranking. + Este widget muestra descargar ranking. 显示附件下载排行的控件。 Этот виджет отображает рейтинг закачек. @@ -22,12 +25,14 @@ 제목 タイトル Title + Título 栏目名 Залоговок text 위젯의 제목으로 출력됩니다. ウィジェットのタイトルとして出力されます。 It will be displayed as widget's title. + Que se mostrarán en forma de widget de título. 显示为控件的栏目名。 Это будет заголовком виджета. @@ -35,12 +40,14 @@ 목록수 リスト数 No. of List + N º de la lista 目录数 Число списка text 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 出力されるリスト数を指定することができます(デフォルト5個)。 You may set number of list that will be displayed. (default 5) + Usted puede configurar el número de lista que se mostrarán. (Por defecto 5) 可以设置要显示的排行数。(默认 5个) Вы можете выбрать число списка для отображения. (стандарт: 5) @@ -48,18 +55,21 @@ 파일 종류 ファイルの種類 File Type + Tipo de archivo 附件类型 Тип файла select 순위에 포함할 파일 종류를 선택하세요. 順位に含むファイルの種類を選択してください。 Please select file type to include. + Por favor, seleccione el tipo de archivo a incluir. 请选择要显示的附件类型。 Пожалуйста, выберите тип файла для включения. 모두 全て All + Todos 全部 Все all @@ -68,6 +78,7 @@ 이미지 제외 イメージ除外 Exclude Images + Excluir imágenes 图片除外 Исключить изображения noimage @@ -76,6 +87,7 @@ 이미지만 イメージのみ Images Only + Sólo imágenes 图片 Только изображения image @@ -85,18 +97,21 @@ 내려 받기 ダウンロード Download + Descargar 显示下载链接 Скачать select 바로 내려 받는 링크를 보여줍니다. 直接ダウンロードするリンクを表示します。 It shows direct download link. + Muestra enlace de descarga directa. 可以选择是否要显示下载链接。 Это показывает прямую ссылку для скачки. 링크 보임 リンク表示 Show Link + Ver Link 显示 Показать ссылку Y @@ -105,6 +120,7 @@ 링크 숨김 リンク非表示 Hide Link + Ocultar Link 不显示 Спрятать ссылку N @@ -114,12 +130,14 @@ 대상 모듈 対象モジュール Target Module + Objetivo Módulo 对象模块 Модуль назначения mid_list 선택하신 모듈에 등록된 글을 대상으로 합니다. 選択したモジュールに登録されたコンテンツ(書き込み)を対象とします。 Articles in selected module will be target. + Los artículos seleccionados en el módulo se meta. 将把被选模块中的主题作为对象。 Статьи в выбранном модуле будут назначением. diff --git a/widgets/rank_point/conf/info.xml b/widgets/rank_point/conf/info.xml index 5b5a82c2a..657074ba5 100644 --- a/widgets/rank_point/conf/info.xml +++ b/widgets/rank_point/conf/info.xml @@ -3,17 +3,20 @@ 포인트 랭킹 출력 ポイントランキング出力 Display Point Ranking + Pantalla punto ranking 会员积分排行榜 Отображение рейтинга поинтов Simulz Simulz + Simulz Simulz Simulz Simulz 회원의 포인트 순위를 출력합니다. 会員のポイント順位を出力します。 This widget displays members' point ranking. + Este widget muestra de los miembros del punto de la clasificación. 显示会员积分排行的控件。 Этот виджет отображает рейтинг поитов пользователей. @@ -22,11 +25,14 @@ 제목 タイトル Title + Título + Название 栏目名 text 위젯의 제목으로 출력됩니다. ウィジェットのタイトルとして出力します。 It will be displayed as widget's title. + Que se mostrarán en forma de widget de título. 显示为控件的栏目名。 Это будет заголовком виджета. @@ -34,11 +40,14 @@ 목록수 リスト数 No. of List + N º de la lista + Количество Список 目录数 text 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 出力されるリストの数を指定することができます(デフォルト5個)。 You may set number of list that will be displayed. (default 5) + Usted puede configurar el número de lista que se mostrarán. (Por defecto 5) 可以设置要显示的会员数。(默认为5个) Вы можете выбрать число списка для отображения. (стандарт: 5) @@ -46,17 +55,21 @@ 관리자 管理者 Administrator + Administrador + Администратор 显示管理员 select 순위에 관리자를 포함합니다. 順位に管理者を含みます。 Administrators will be also ranked. + Los administradores también se clasificó. 选择排行榜是否要显示管理员。 Администраторы будут тоже подлежать рейтингу. 포함 含む Include + Incluir 显示 Включить false @@ -65,6 +78,7 @@ 미포함 含まない Exclude + Excluir 不显示 Исключить true @@ -74,12 +88,14 @@ 그룹 포함 グループを含む Include Group + Incluir Grupo 用户组 Включить группу text 출력할 회원 그룹명을 입력하세요. 예)준회원,정회원 出力する会員のグループ名を入力してください(例:準会員、正会員)。 Please input name of group to include. ex) Associate, Regular Group + Introduce nombre de grupo a incluir. Ex) Asociado, Grupo Regular 请输入要显示的会员组。例)准会员,正会员 Пожалуйста, введите имя группы для включения. например: Общая, Обычная (Associate, Regular Group) @@ -87,12 +103,14 @@ 그룹 제외 グループ除外 Exclude Group + Excluir Grupo 豁免用户组 Исключить группу text 제외할 회원 그룹명을 입력하세요. 예)관리그룹,정회원 除外するグループ名を入力してください(管理グループ、正会員)。 Please input name of group to exclude. ex) Managing, Regular Group + Introduce nombre de grupo para excluir. Ex) Administrar, regular Group 请输入豁免用户组名。例)管理组 Пожалуйста, введите имя группы для ислючения. например: Общая, Обычная (Associate, Regular Group) diff --git a/widgets/rank_point/rank_point.class.php b/widgets/rank_point/rank_point.class.php index de79b7ded..4b609926e 100644 --- a/widgets/rank_point/rank_point.class.php +++ b/widgets/rank_point/rank_point.class.php @@ -45,6 +45,8 @@ $obj->list_count = $list_count; $obj->is_admin = $args->without_admin == "true" ? "N" : ""; + $output = new Object(); + if(count($target_group) || count($target_group_without)) { // 그룹 목록을 구해옴 $group_list = $oMemberModel->getGroups(); diff --git a/widgets/rss_reader/rss_reader.class.php b/widgets/rss_reader/rss_reader.class.php index 1e61bda13..695e5bcc2 100644 --- a/widgets/rss_reader/rss_reader.class.php +++ b/widgets/rss_reader/rss_reader.class.php @@ -49,7 +49,7 @@ fclose($fp); $encoding = preg_match("/<\?xml.*encoding=\"(.+)\".*\?>/i", $buff, $matches); - if($encoding && !eregi("UTF-8", $matches[1])) $buff = trim(iconv($matches[1]=="ks_c_5601-1987"?"EUC-KR":$matches[1], "UTF-8", $buff)); + if($encoding && !preg_match("/UTF-8/i", $matches[1])) $buff = trim(iconv($matches[1]=="ks_c_5601-1987"?"EUC-KR":$matches[1], "UTF-8", $buff)); $buff = preg_replace("/<\?xml.*\?>/i", "", $buff); @@ -99,4 +99,4 @@ return $output; } } -?> \ No newline at end of file +?> diff --git a/widgets/tab_newest_document/conf/info.xml b/widgets/tab_newest_document/conf/info.xml index 94057debc..f571a3331 100644 --- a/widgets/tab_newest_document/conf/info.xml +++ b/widgets/tab_newest_document/conf/info.xml @@ -3,7 +3,7 @@ 탭 형태 최근 문서 출력 选项卡主题列表 タブスタイル最新コンテンツ出力 - Display tab style newest documents + Display Tab Style Newest Articles 탭 형태 최근 문서 출력 Отображение последних статей в стиле закладок @@ -16,7 +16,7 @@ 최근 문서를 탭형태로 출력하는 위젯입니다. 选项卡样式最新主题列表控件。 最新コンテンツをタブスタイルに出力するウィジェットです。 - This widget displays newest articles like tab style. + This widget displays newest articles as tab style. 최근 문서를 탭형태로 출력하는 위젯입니다. Этот виджет отображает последние статьи в tab-стиле. diff --git a/widgets/webzine/conf/info.xml b/widgets/webzine/conf/info.xml index ddc34722e..5bf833fdc 100644 --- a/widgets/webzine/conf/info.xml +++ b/widgets/webzine/conf/info.xml @@ -4,7 +4,7 @@ 网络杂志型主题列表 ウェブジンスタイル最新コンテンツ出力 Display Newest Articles with Webzine Style - 웹진 형태 최근 문서 출력 + Mostrar más nuevos artículos con el estilo Webzine Отображение последних статей в стиле webzine 제로 @@ -16,7 +16,7 @@ 把最新主题显示为网络杂志类型的控件。 最新コンテンツをウェブジンスタイルで出力するウィジェットです。 This widget displays newest articles with webzine style. - 최근 문서를 웹진형태로 출력하는 위젯입니다. + Este widget muestra más reciente de artículos con webzine estilo. Этот виджет отображает последние статьи в стиле webzine. @@ -40,7 +40,7 @@ 排序对象 ソート対象 Target to be sorted - Objetivo para ser ordenados + Objetivo para ser ordenados Назначение для сортировки select 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. @@ -96,7 +96,7 @@ 升序 昇順 Asending order - Orden Acendente + Orden Acendente По возрастанию asc @@ -106,12 +106,14 @@ new图标显示时间(hours) Newの表示時間 (Hours) Duration of indication for new item + Duración de la indicación para el nuevo tema Длительность индикации для новых объектов text 새로 등록된 게시물의 new 표시시간을 정할 수 있습니다. (시간 단위) 可以设置最新更新主题的new图标显示时间。 新しく登録された書き込みに対して「New」の表示時間を指定します(時間単位)。 You may set the duration of indication for fresh item. (unit is hour) + Usted puede configurar la duración de la indicación de un nuevo tema. (Unidad es hora) Вы можете установить длительность индикации для нового объекта. (единица - час) @@ -149,11 +151,13 @@ サムネール生成方法 缩略图生成方式 Thumbnail Type + Thumbnail Type Тип миниатюры 썸네일 생성 방법을 선택할 수 있습니다. (crop : 꽉 채우기, ratio : 비율 맞추기) サムネールの生成方法を選択します(Crop : トリミング, Ratio : 比率)。 可以选择缩略图生成方式。 (crop : 裁减, ratio : 比例) Thumbnail Type may be set here. + Tipo de miniatura puede establecerse aquí. Тип миниатюры может быть установлен здесь. select @@ -161,6 +165,7 @@ Crop (トリミング) Crop (裁减) Crop + Cultivos Crop (Обрезание) crop @@ -169,6 +174,7 @@ Ratio (比率) Ratio (比例) Ratio + Ratio Ratio (Отношение) ratio @@ -193,11 +199,13 @@ イメージ縦幅 高度 Height of Image + Altura de la imagen Высота изображения 이미지의 세로 크기를 지정할 수 있습니다. (기본 100px) イメージの縦幅サイズを指定します(デフォルト 100px) 可以指定图片高度。(默认为100px) You can set the height of image. (100 as default) + Se puede establecer la altura de la imagen. (100 como valor por defecto) Вы можете установить вытсоту изображения. (стандарт: 100px) text diff --git a/widgets/webzine/skins/notice_style/css/normal.css b/widgets/webzine/skins/notice_style/css/normal.css new file mode 100644 index 000000000..3c2881850 --- /dev/null +++ b/widgets/webzine/skins/notice_style/css/normal.css @@ -0,0 +1,16 @@ +.noticeBox { padding-bottom:5px; overflow:hidden; } + +.noticeBox h2 { font-size:1em; display:block; height:21px; padding:9px 0 0 9px; margin-bottom:5px; color:#000000; background:url(../images/normal/lineNotice.gif) no-repeat left bottom;} + +.noticeBox .listTable { width:100%; table-layout:fixed; border:none;} + +.noticeBox .titleBox { margin-top:8px;border-bottom:2px solid #DDDDDD; padding-bottom:5px; margin-bottom:10px; } +.noticeBox .titleBox .title { } +.noticeBox .titleBox .title strong { font-weight:normal; font-size:0.9em; color:#ed2a32; } +.noticeBox .titleBox .title a { font-weight:bold; font-size:1.4em; color:#444444; text-decoration:none; } +.noticeBox .titleBox .title a:hover { font-weight:bold; font-size:1.4em; text-decoration:underline; } +.noticeBox .titleBox .regdate { font-size:0.9em; color:#AAAAAA; } + +.noticeBox .contentbox { line-height:120%; } +.noticeBox .contentbox img.thumbnail { padding:4px; border:1px solid #DEDEDE; margin:0 10px 10px 0;} +.noticeBox .contentbox img.thumbnail:hover { border:1px solid #54564b; } diff --git a/widgets/webzine/skins/notice_style/list.html b/widgets/webzine/skins/notice_style/list.html new file mode 100644 index 000000000..615f526ea --- /dev/null +++ b/widgets/webzine/skins/notice_style/list.html @@ -0,0 +1,49 @@ + + + + + + +
    + +

    {$widget_info->title}

    + + + +
    + + {@ $count = 0; } + + + + {@ $oDocument = $widget_info->document_list[$i*$widget_info->cols_list_count + $j]} + {@ $_existsThumbnail = $oDocument->thumbnailExists($widget_info->thumbnail_width,$widget_info->thumbnail_height,$widget_info->thumbnail_type) } + + + + + +
    + +
    + + + {$oDocument->getTitle($widget_info->subject_cut_size)} + + + + [{$oDocument->getRegdate("m-d")}] + + +
    + +
    + + {$oDocument->getSummary($widget_info->content_cut_size)} +
    + +
     
    + +
    + +
    diff --git a/widgets/webzine/skins/notice_style/skin.xml b/widgets/webzine/skins/notice_style/skin.xml new file mode 100644 index 000000000..afde87d30 --- /dev/null +++ b/widgets/webzine/skins/notice_style/skin.xml @@ -0,0 +1,25 @@ + + + 공지사항 형태의 출력 + 공지사항 형태의 출력 + 공지사항 형태의 출력 + 공지사항 형태의 출력 + + 제로 + Zero + Zero + Zero + 글 목록과 이미지가 같이 출력되는 웹진형 스킨입니다. 이미지가 있는 글들만 노출이 됩니다. + コンテンツリストとイメージが一緒に出力されるウェブジンスタイルスキンです。イメージを含むコンテンツのみ表示されます。 + 可以同时显示最新主题列表及缩略图的网络杂志型默认皮肤。只显示有图片的最新主题。 + This is a webzine style skin that displays article list and images. Articles with images will be exposed only. + + + + 기본 컬러 + デフォルトカラー + 默认颜色 + Default Color + + + diff --git a/widgets/webzine/skins/xe_official/css/normal.css b/widgets/webzine/skins/xe_official/css/normal.css index 2953f356e..9585eaa20 100644 --- a/widgets/webzine/skins/xe_official/css/normal.css +++ b/widgets/webzine/skins/xe_official/css/normal.css @@ -20,7 +20,7 @@ .nw_box .thumbnailBox .titleBox { margin-top:8px; margin-bottom:5px;} .nw_box .thumbnailBox .titleBox .title { } -.nw_box .thumbnailBox .titleBox .title strong { font-weight:bold; font-size:0.9em; color:#ed2a32; } +.nw_box .thumbnailBox .titleBox .title strong { font-weight:normal; font-size:0.9em; color:#ed2a32; } .nw_box .thumbnailBox .titleBox .title a { color:#000000; text-decoration:none; } .nw_box .thumbnailBox .titleBox .title a:hover { text-decoration:underline; }