merge from 1.5.3.2 (~r11225)

git-svn-id: http://xe-core.googlecode.com/svn/trunk@11226 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
flyskyko 2012-09-13 06:14:45 +00:00
parent 54e3a72065
commit 77f5aa2671
313 changed files with 8058 additions and 14251 deletions

View file

@ -142,6 +142,11 @@
$addon_info->mid_list = array();
}
if($extra_vals->xe_run_method)
{
$addon_info->xe_run_method = $extra_vals->xe_run_method;
}
// Add information
if($xml_obj->version && $xml_obj->attrs->version == '0.2') {
@ -187,7 +192,10 @@
$obj->title = $val->title->body;
$obj->type = $val->attrs->type;
$obj->description = $val->description->body;
$obj->value = $extra_vals->{$obj->name};
if($obj->name)
{
$obj->value = $extra_vals->{$obj->name};
}
if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); }
if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); }
@ -280,7 +288,10 @@
$obj->title = $val->title->body;
$obj->type = $val->type->body ? $val->type->body : 'text';
$obj->description = $val->description->body;
$obj->value = $extra_vals->{$obj->name};
if($obj->name)
{
$obj->value = $extra_vals->{$obj->name};
}
if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); }
if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); }
// 'Select'type obtained from the option list.

View file

@ -163,14 +163,33 @@
$extra_vars = unserialize($val->extra_vars);
$mid_list = $extra_vars->mid_list;
if(!is_array($mid_list)||!count($mid_list)) $mid_list = null;
$mid_list = base64_encode(serialize($mid_list));
$buff .= '$rm = \'' . $extra_vars->xe_run_method . "';";
$buff .= '$ml = array(';
if($mid_list)
{
foreach($mid_list as $mid)
{
$buff .= "'$mid' => 1,";
}
}
$buff .= ');';
$buff .= sprintf('$addon_file = \'./addons/%s/%s.addon.php\';', $addon, $addon);
if($val->extra_vars) {
unset($extra_vars);
$extra_vars = base64_encode($val->extra_vars);
}
$addon_include = sprintf('unset($addon_info); $addon_info = unserialize(base64_decode(\'%s\')); @include($addon_file);', $extra_vars);
$buff .= sprintf(' $_ml = unserialize(base64_decode("%s")); $addon_path = "%saddons/%s/"; $addon_file = "%s.addon.php"; if(file_exists($addon_path.$addon_file) && (!is_array($_ml) || in_array($_m, $_ml))) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); @include($addon_path.$addon_file); }', $mid_list, './', $addon, $addon, $extra_vars);
$buff .= 'if(file_exists($addon_file)){';
$buff .= 'if($rm === \'no_run_selected\'){';
$buff .= 'if(!isset($ml[$_m])){';
$buff .= $addon_include;
$buff .= '}}else{';
$buff .= 'if(isset($ml[$_m]) || count($ml) === 0){';
$buff .= $addon_include;
$buff .= '}}}';
}
$buff = sprintf('<?php if(!defined("__XE__")) exit(); $_m = Context::get(\'mid\'); %s ?>', $buff);

View file

@ -115,4 +115,13 @@
<value xml:lang="zh-CN"><![CDATA[此插件不存在设置。]]></value>
<value xml:lang="zh-TW"><![CDATA[此附加元件的設定不存在。]]></value>
</item>
<item name="run_method">
<value xml:lang="ko"><![CDATA[작동 방식]]></value>
</item>
<item name="run_selected_module">
<value xml:lang="ko"><![CDATA[선택한 모듈에서 사용]]></value>
</item>
<item name="no_run_selected_module">
<value xml:lang="ko"><![CDATA[선택한 모듈에서 사용안함]]></value>
</item>
</lang>

View file

@ -49,6 +49,13 @@
<block cond="$mid_list">
<h3 class="h3">{$lang->module}</h3>
<p>{$lang->about_addon_mid}</p>
<p class="q">{$lang->run_method}</p>
<p class="a">
<select name="xe_run_method">
<option value="run_selected" selected="selected"|cond="$addon_info->xe_run_method === 'run_selected'">{$lang->run_selected_module}</option>
<option value="no_run_selected" selected="selected"|cond="$addon_info->xe_run_method === 'no_run_selected'">{$lang->no_run_selected_module}</option>
</select>
</p>
<p><input type="checkbox" id="check_all" /> <label for="check_all">Check all</label></p>
<fieldset loop="$mid_list => $module_category_srl, $modules" style="border: 1px solid #ccc; margin:1em 0; padding:.5em 1em">
<legend cond="$modules->title">{$modules->title}</legend>

View file

@ -123,10 +123,16 @@
$args->site_srl = $site_info->site_srl;
$args->layout_srl = $vars->layout;
// layout submit
$output = executeQuery('layout.updateAllLayoutInSiteWithTheme', $args);
if (!$output->toBool()) return $output;
// set layout info member
$oModuleController = &getController('module');
$memberConfig->layout_srl = $vars->layout;
$oModuleController->updateModuleConfig('member', $memberConfig);
$skin_args->site_srl = $site_info->site_srl;
foreach($vars as $key=>$val){
@ -148,13 +154,13 @@
$skin_args->module_srls = implode(',', $article_module_srls);
}
}
$skin_output = executeQuery('module.updateAllModuleSkinInSiteWithTheme', $skin_args);
if (!$skin_output->toBool()) return $skin_output;
$oModuleModel = &getModel('module');
$module_config = $oModuleModel->getModuleConfig($module, $site_info->site_srl);
$module_config->skin = $val;
$oModuleController = &getController('module');
$oModuleController->insertModuleConfig($module, $module_config, $site_info->site_srl);
}
}
@ -169,6 +175,7 @@
// Save File
FileHandler::writeFile($theme_file, $theme_buff);
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAdminTheme');
return $this->setRedirectUrl($returnUrl, $output);
}

View file

@ -215,10 +215,9 @@
$oXmlParser = new XmlParser();
$_xml_obj = $oXmlParser->loadXmlFile($info_file);
if(!$_xml_obj->theme) return;
if(!$_xml_obj->theme) return;
$xml_obj = $_xml_obj->theme;
if(!$_xml_obj->theme) return;
// 스킨이름
$theme_info->name = $theme_name;
@ -247,7 +246,7 @@
$layout_parse = explode('/',$layout_path);
switch($layout_parse[1]){
case 'themes' : {
$layout_info->name = $theme_name.'.'.$layout_parse[count($layout_parse)-1];
$layout_info->name = $theme_name.'|@|'.$layout_parse[count($layout_parse)-1];
break;
}
case 'layouts' : {
@ -255,6 +254,7 @@
break;
}
}
$layout_info->title = $layout_parse[count($layout_parse)-1];
$layout_info->path = $layout_path;
$site_info = Context::get('site_module_info');
@ -278,7 +278,7 @@
$args->site_srl = (int)$site_module_info->site_srl;
$args->layout_srl = getNextSequence();
$args->layout = $layout_info->name;
$args->title = $layout_info->name;
$args->title = $layout_info->title;
$args->layout_type = "P";
// Insert into the DB
$oLayoutAdminController = &getAdminController('layout');
@ -302,7 +302,7 @@
case 'themes' : {
$is_theme = true;
$module_name = $skin_parse[count($skin_parse)-1];
$skin_info->name = $theme_name.'.'.$module_name;
$skin_info->name = $theme_name.'|@|'.$module_name;
break;
}
case 'modules' : {
@ -469,6 +469,31 @@
$output = executeQueryArray('admin.getSiteAllList', $args, $columnList);
if($output->toBool()) $siteList = $output->data;
$oModuleModel = &getModel('module');
foreach($siteList as $key => $value)
{
$args->site_srl = $value->site_srl;
$list = $oModuleModel->getModuleSrlList($args);
if(!is_array($list))
{
$list = array($list);
}
foreach($list as $k => $v)
{
if(!is_dir('./modules/' . $v->module))
{
unset($list[$k]);
}
}
if(!count($list))
{
unset($siteList[$key]);
}
}
$this->add('site_list', $siteList);
}

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
<p class="power">
Powered by <strong><a href="{_XE_LOCATION_SITE_}" target="_blank">XE</a></strong>. <span class="vr">|</span>
<strong>Your version</strong>: {__XE_VERSION__} <span class="vr">|</span>
<!--@if(isset($latestVersion))--><strong>Latest version</strong>: <a href="{$latestVersion->url}" target="_blank" title="{zdate($latestVersion->date, 'Y-m-d')}">{$latestVersion->title}</a><!--@end-->
<!--@if(isset($latestVersion))--><strong>Latest version</strong>: <a href="{htmlspecialchars(html_entity_decode($latestVersion->url))}" target="_blank" title="{zdate($latestVersion->date, 'Y-m-d')}">{$latestVersion->title}</a><!--@end-->
</p>
<p class="cache">
<button type="button" class="text" onclick="doResetAdminMenu();">{$lang->cmd_admin_menu_reset}</button> <span class="vr">|</span>

View file

@ -16,7 +16,7 @@
</ul>
</div>
<div class="gnb">
<ul class="nav">
<ul class="nav-gnb">
<li loop="$gnbUrlList=>$key,$value" class="activeOn"|cond="$parentSrl==$key"><a href="{getFullUrl('')}{$value['href']}"><span>{$value['text']}</span></a>
<ul cond="count($value['list'])">
<li loop="$value['list']=>$key2,$value2"><a href="{getFullUrl('')}{$value2['href']}">{$value2['text']}</a></li>
@ -31,23 +31,6 @@
<option cond="count($value['list']) == 0" value="{getFullUrl('')}{$value['href']}" selected="selected"|cond="!$subMenuTitle">{$value['text']}</option>
</block>
</select>
<div class="bmk active">
<a href="#bmk" class="bmAnchor" data-effect="fade" data-duration="200">{$lang->favorite}</a>
<ul id="bmk" class="bmContent">
<li loop="$favorite_list => $favorite">
<a href="{getUrl('', 'module', 'admin', 'act', $favorite->admin_index_act)}">{$favorite->title}</a>
<form class="action" action="">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procAdminToggleFavorite" />
<input type="hidden" name="site_srl" value="0" />
<input type="hidden" name="module_name" value="{$favorite->module}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" class="text" title="{$lang->cmd_delete}">x</button>
</form>
</li>
<li cond="!is_array($favorite_list) || count($favorite_list) < 1">{$lang->no_data}</li>
</ul>
</div>
<select class="mnv">
<option>{$lang->favorite}</option>
<option loop="$favorite_list => $favorite" value="{getUrl('', 'module', 'admin', 'act', $favorite->admin_index_act)}">{$favorite->title}</option>

View file

@ -3,7 +3,7 @@
<ul>
<!--@if(count($gnbUrlList[$parentSrl]['list']) > 0)-->
<!--@foreach($gnbUrlList[$parentSrl]['list'] AS $key=>$value)-->
<li <!--@if($value['text'] == $subMenuTitle)-->class="active"<!--@end-->><a href="{html_entity_decode($value['href'])}">{$value['text']}</a></li>
<li <!--@if($value['text'] == $subMenuTitle)-->class="active"<!--@end-->><a href="{htmlspecialchars(html_entity_decode($value['href']))}">{$value['text']}</a></li>
<!--@end-->
<!--@end-->
</ul>

View file

@ -0,0 +1,17 @@
<div class="sct well">
<h2>{$lang->favorite}</h2>
<ul class="nav nav-list">
<li loop="$favorite_list => $favorite">
<a href="{getUrl('', 'module', 'admin', 'act', $favorite->admin_index_act)}">{$favorite->title}</a>
<form class="action" action="./">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procAdminToggleFavorite" />
<input type="hidden" name="site_srl" value="0" />
<input type="hidden" name="module_name" value="{$favorite->module}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" class="text" title="{$lang->cmd_delete}">&times;</button>
</form>
</li>
<li cond="!is_array($favorite_list) || count($favorite_list) < 1"><a href="{getUrl('', 'module', 'admin', 'act', 'dispModuleAdminContent')}">{$lang->no_data}</a></li>
</ul>
</div>

View file

@ -70,7 +70,7 @@
<h2 class="h2">{$lang->admin_menu_add}</h2>
<ul>
<li>
<p class="q"><label for="name">{$lang->module}</label></p>
<p class="q"><label for="menuNameList">{$lang->module}</label></p>
<div class="a">
<select name="menu_name" id="menuNameList">
</select>

View file

@ -30,21 +30,21 @@
<p class="a"><input type="text" name="ftp_port" id="ftp_port" value="{$ftp_info->ftp_port}" /><span class="desc">Default : 21</span></p>
</li>
<li>
<p class="q"><label for="ftp_passive">{$lang->about_use_ftp_passive_mode}</label></p>
<p class="q"><label>{$lang->about_use_ftp_passive_mode}</label></p>
<p class="a">
<input type="radio" name="ftp_pasv" id="ftp_passive_y" value="Y" <!--@if($ftp_info->ftp_pasv == 'Y')-->checked="checked" <!--@end-->/> <label for="ftp_passive_y">{$lang->cmd_yes}</label>
<input type="radio" name="ftp_pasv" id="ftp_passive_n" value="N" <!--@if($ftp_info->ftp_pasv != 'Y')-->checked="checked" <!--@end-->/> <label for="ftp_passive_n">{$lang->cmd_no}</label>
</p>
</li>
<li>
<p class="q"><label for="sftp">{$lang->about_use_sftp_support}</label><span cond="!$sftp_support"><label for="sftp"> ({$lang->disable_sftp_support})</label></span></p>
<p class="q"><label>{$lang->about_use_sftp_support}</label><span cond="!$sftp_support"><label> ({$lang->disable_sftp_support})</label></span></p>
<p class="a">
<input type="radio" name="sftp" id="sftp_y" value="Y" <!--@if($ftp_info->sftp == 'Y')-->checked="checked" <!--@end--> <!--@if(!$sftp_support)-->disabled<!--@end-->/> <label for="sftp_y">{$lang->cmd_yes}</label>
<input type="radio" name="sftp" id="sftp_y" value="Y" <!--@if($ftp_info->sftp == 'Y')-->checked="checked" <!--@end--><!--@if(!$sftp_support)-->disabled <!--@end-->/> <label for="sftp_y">{$lang->cmd_yes}</label>
<input type="radio" name="sftp" id="sftp_n" value="N" <!--@if($ftp_info->sftp != 'Y')-->checked="checked" <!--@end-->/> <label for="sftp_n">{$lang->cmd_no}</label>
</p>
</li>
<li>
<p class="q"><label for="ftp_path">{$lang->msg_ftp_installed_ftp_realpath}</label></p>
<p class="q"><label for="ftp_root_path">{$lang->msg_ftp_installed_ftp_realpath}</label></p>
<p class="a">
<input type="text" name="ftp_root_path" id="ftp_root_path" value="{$ftp_info->ftp_root_path}" />
<a href="#ftpSuggestion" onclick="getFTPList(); return false;" class="tgAnchor">{$lang->ftp_get_list}</a>

View file

@ -20,33 +20,64 @@ jQuery(function($){
<load target="../install/lang/lang.xml" usecdn="true" />
<load target="../../session/tpl/js/session.js" usecdn="true" />
<form action="" method="post" id="ftp_form" class="form" enctype="multipart/form-data">
<script>
jQuery(function($){
$('.moduleSearch').bind('moduleSelect', function(e, aSelected){
var sType, sName, sSrl;
sType = aSelected[0].type;
sName = aSelected[0].browser_title;
sSrl = aSelected[0].module_srl;
$('#_target_module').val(sName);
$('#index_module_srl').val(sSrl);
});
});
</script>
<form action="./" method="post" id="ftp_form" class="form" enctype="multipart/form-data">
<input type="hidden" name="module" value="install" />
<input type="hidden" name="act" value="procInstallAdminConfig" />
<h1 class="h1">{$lang->menu_gnb_sub['adminConfigurationGeneral']}</h1>
<fieldset class="section">
<h2 class="h2">{$lang->subtitle_primary}</h2>
<ul>
<li class="modulefinder">
<li class="modulefinder moduleSearch">
<p class="q">{$lang->about_start_module}</p>
<p class="a">
<div class="a">
<input type="hidden" name="index_module_srl" id="index_module_srl" value="{$start_module->index_module_srl}" />
<input type="text" name="_target_module" id="_target_module" value="{$start_module->browser_title} ({$start_module->mid})" readonly />
<a href="#modalWindow" class="modalAnchor" onClick="viewSiteSearch()">{$lang->cmd_find}</a> </p>
<p class="site_keyword_search" style="display:none">
<input type="text" name="site_keyword" /> <a href="#suggestion3" class="tgAnchor findsite">{$lang->cmd_confirm}</a>
<div id="suggestion3" class="tgContent suggestion" >
<ul></ul>
<a href="#moduleSearchWindow" class="tgAnchor moduleSearch">{$lang->cmd_find}</a>
<div id="moduleSearchWindow" class="moduleSearchWindow tgContent">
<div class="siteList sectionDiv">
<h2>{$lang->select_site}</h2>
<div class="siteListSearchBox">
<div class="siteListSearchBoxBorder">
<div class="searchImg icon-search"></div>
<input type="text" class="siteListSearchInput" name="site_filter">
</div>
</div>
<div class="siteListUL">
<ul>
</ul>
</div>
</div>
</p>
<p>
<select class="moduleList" style="width:290px"></select>
</p>
<p>
<select class="moduleIdList" style="width:290px"></select>
<a href="#" id="sitefind_addBtn" onclick="setStartModule()" style="display:none;">{$lang->cmd_select}</a>
</p>
</p>
<div class="moduleTypeList sectionDiv">
<h2>{$lang->select_module_type}</h2>
<div>
<ul class="moduleTypeListUL">
</ul>
</div>
</div>
<div class="moduleInstanceList sectionDiv">
<h2>{$lang->select_module_instance}</h2>
<div>
<select class="moduleInstanceListSelect" size="8">
</select>
</div>
<button class="btn btn_primary moduleSearch_ok">{$lang->cmd_select}</button>
</div>
</div>
</div>
</li>
<li>
<p class="q">{$lang->about_lang_select}</p>
@ -64,13 +95,13 @@ jQuery(function($){
</p>
</li>
<li>
<p class="q"><label for="">{$lang->about_default_lang}</label></p>
<p class="q"><label for="change_lang_type">{$lang->about_default_lang}</label></p>
<p class="a">
<select name="change_lang_type">
<select name="change_lang_type" id="change_lang_type">
<!--@foreach($lang_supported as $key => $val)-->
<option value="{$key}" <!--@if($key==$selected_lang)-->selected="selected"<!--@end-->>{$val}</option>
<!--@endforeach-->
</select>
</select>
</p>
</li>
<li>
@ -132,7 +163,7 @@ jQuery(function($){
<h2 class="h2">{$lang->subtitle_advanced}</h2>
<ul>
<li>
<p class="q"><label for="admin_ip">{$lang->about_admin_ip_limit}</label>[<a href="#helpAdminip" class="tgAnchor">?</a>]</p>
<p class="q"><label for="admin_ip_list">{$lang->about_admin_ip_limit}</label>[<a href="#helpAdminip" class="tgAnchor">?</a>]</p>
<div class="tgContent layer" id="helpAdminip">
<p>{$lang->detail_about_admin_ip_limit}</p>
</div>
@ -148,7 +179,7 @@ jQuery(function($){
<p class="a"><input type="text" name="default_url" id="default_url" value="{$default_url}"/></p>
</li>
<li>
<p class="q"><label for="use_ssl">{$lang->use_ssl}</label>[<a href="#helpUsessl" class="tgAnchor">?</a>]</p>
<p class="q"><label>{$lang->use_ssl}</label>[<a href="#helpUsessl" class="tgAnchor">?</a>]</p>
<div class="tgContent layer" id="helpUsessl">
<p>{$lang->about_use_ssl}</p>
</div>
@ -159,11 +190,11 @@ jQuery(function($){
</p>
</li>
<li>
<p class="q">{$lang->server_ports}</p>
<p class="q"><label>{$lang->server_ports}</label></p>
<p class="a">
<label for="">HTTP:</label> <input type="text" name="http_port" id="http_port" size="5" value="{$http_port}" style="width:40px" />
<label for="http_port">HTTP:</label> <input type="text" name="http_port" id="http_port" size="5" value="{$http_port}" style="width:40px" />
&nbsp;&nbsp;
<label for="">HTTPS:</label> <input type="text" name="https_port" id="https_port" size="5" value="{$https_port}" style="width:40px" />
<label for="https_port">HTTPS:</label> <input type="text" name="https_port" id="https_port" size="5" value="{$https_port}" style="width:40px" />
</p>
</li>
<li cond="__XE_CDN_VERSION__!='%__XE_CDN_VERSION__%'">
@ -174,14 +205,14 @@ jQuery(function($){
</p>
</li>
<li>
<p class="q"><label for="">{$lang->about_use_rewrite}</label></p>
<p class="q"><label>{$lang->about_use_rewrite}</label></p>
<p class="a">
<input type="radio" name="use_rewrite" id="use_rewrite_y" value="Y" <!--@if($use_rewrite == 'Y')-->checked="checked" <!--@end-->/> <label for="use_rewrite_y">{$lang->cmd_yes}</label>
<input type="radio" name="use_rewrite" id="use_rewrite_n" value="N" <!--@if($use_rewrite != 'Y')-->checked="checked" <!--@end-->/> <label for="use_rewrite_n">{$lang->cmd_no}</label>
</p>
</li>
<li>
<p class="q"><label for="use_sso">{$lang->about_use_sso}</label>[<a href="#helpUsesso" class="tgAnchor">?</a>]</p>
<p class="q"><label>{$lang->about_use_sso}</label>[<a href="#helpUsesso" class="tgAnchor">?</a>]</p>
<div class="tgContent layer" id="helpUsesso">
<p>{$lang->about_sso}</p>
</div>
@ -191,7 +222,7 @@ jQuery(function($){
</p>
</li>
<li>
<p class="q"><label for="">{$lang->use_db_session}</label>[<a href="#helpUsedbSession" class="tgAnchor">?</a>]</p>
<p class="q"><label>{$lang->use_db_session}</label>[<a href="#helpUsedbSession" class="tgAnchor">?</a>]</p>
<div class="tgContent layer" id="helpUsedbSession">
<p>{$lang->about_db_session}</p>
</div>
@ -201,7 +232,7 @@ jQuery(function($){
</p>
</li>
<li>
<p class="q"><label for="">{$lang->qmail_compatibility}</label>[<a href="#helpQmail" class="tgAnchor">?</a>]</p>
<p class="q"><label>{$lang->qmail_compatibility}</label>[<a href="#helpQmail" class="tgAnchor">?</a>]</p>
<div class="tgContent layer" id="helpQmail">
<p>{$lang->about_qmail_compatibility}</p>
</div>

View file

@ -1,4 +1,4 @@
@charset "utf-8";
@charset "utf-8";
/* Element Reset */
header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}
.x,
@ -6,7 +6,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x input,
.x textarea,
.x select,
.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}
.x button{font-size:13px;color:#333}
.x button,
.x input[type=submit],
.x input[type=reset],
@ -15,11 +15,10 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x p{line-height:1.5}
/* Section & Heading */
.x .section{margin:1em 0;padding:0;border:0}
.x .h1,
.x .h2,
.x .h3,
.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}
.x .h1{border-width:4px;font-size:24px;border-color:#666}
.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em 0;font-size:16px;padding:0 15px;line-height:36px}
.x .h2{border-width:3px;font-size:20px;border-color:#888}
.x .h3{border-width:2px;font-size:16px;border-color:#aaa}
.x .h4{border-width:1px;font-size:12px;border-color:#ccc}
@ -74,7 +73,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .table th.text,
.x .table td.text{width:100%}
/* Form */
.x .form{margin:1em 0;padding:0}
.x .form{margin:0 0 1em 0;padding:0}
.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}
.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}
.x .form em{font-style:normal;color:#e00}
@ -119,49 +118,40 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
/* Global Navigation Bar */
.x .gnb{height:34px;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}
.x .gnb:after{content:"";display:block;clear:both}
.x .gnb .nav{float:left;position:relative;display:inline-block;*display:inline;zoom:1;margin:0 0 0 20px;padding:1px;list-style:none}
.x .gnb .nav ul{_position:absolute;display:block;_display:inline;zoom:1;clear:both;margin:0;padding:0;border:0;overflow:hidden}
.x .gnb.active .nav{top:-5px;padding:5px 5px 5px 0;margin:0 0 -100% 20px;border:1px solid #aaa;background:#fff;box-shadow:0 0 10px #999;border-radius:5px}
.x .gnb.active .nav ul{top:0;_position:relative;box-shadow:none;display:block;_display:inline;clear:both;padding:0;margin:0;border:0}
.x .gnb .nav:after{content:"";display:block;clear:both}
.x .gnb .nav li{position:relative;display:inline-block;*display:inline;zoom:1;vertical-align:top;overflow:hidden;margin:0}
.x .gnb .nav li.activeOn{z-index:10}
.x .gnb .nav li.activeOn>a{border:1px solid #ccc}
.x .gnb .nav li li{display:block;_float:left;clear:both;overflow:hidden;border:0;margin:0}
.x .gnb .nav li li:first-child{border:0}
.x .gnb .nav li a{display:block;_float:left;font-weight:bold;color:#333;font-size:12px;height:14px;padding:9px 0;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}
.x .gnb .nav li a span{padding:0 15px;border-left:1px solid #fff}
.x .gnb.active .nav li a span,
.x .gnb .nav li:first-child a span,
.x .gnb .nav li.activeOn+li a span{border:0;margin:0 0 0 1px}
.x .gnb .nav li a:hover,
.x .gnb .nav li a:active,
.x .gnb .nav li a:focus{background:#f4f4f4}
.x .gnb .nav li.activeOn>a{background:#fff;padding:8px 0}
.x .gnb .nav li li a{color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}
.x .gnb .nav li li a:hover,
.x .gnb .nav li li a:active,
.x .gnb .nav li li a:focus{border:0;background:#eee}
.x .gnb .bmk{position:relative;float:right;padding:8px 15px;margin:0 20px -100% 0;text-align:right;display:inline}
.x .gnb .bmk.active{top:-5px;padding:12px 14px 10px 15px;background-color:#fff;border:1px solid #aaa;box-shadow:0 0 10px #999;border-radius:5px}
.x .gnb .bmk .bmAnchor{height:16px;text-shadow:0 1px 0 #fff;display:inline-block;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}
.x .gnb .bmk ul{display:none}
.x .gnb .bmk.active ul{position:relative;list-style:none;display:block !important;text-align:left;background:none;margin:0 !important;padding:10px 0 0 0 !important;border:0;box-shadow:none;border-radius:0}
.x .gnb .bmk li{display:block;position:relative;padding:3px 15px 3px 0 !important;white-space:nowrap}
.x .gnb .bmk li a{display:inline;padding:0;background:none !important;font-weight:normal}
.x .gnb .bmk li .action{position:absolute;top:0;right:0}
.x .gnb .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0;padding:0;border:0;background:none;overflow:visible}
.x .gnb .nav-gnb{float:left;position:relative;display:inline-block;*display:inline;zoom:1;margin:0 0 0 20px;padding:1px;list-style:none}
.x .gnb .nav-gnb ul{_position:absolute;display:block;_display:inline;zoom:1;clear:both;margin:0;padding:0;border:0;overflow:hidden;height:0}
.x .gnb.active .nav-gnb{top:-5px;padding:5px 5px 5px 0;margin:0 0 -100% 20px;border:1px solid #aaa;background:#fff;box-shadow:0 0 10px #999;border-radius:5px}
.x .gnb.active .nav-gnb ul{top:0;_position:relative;box-shadow:none;display:block;_display:inline;clear:both;padding:0;margin:0;border:0}
.x .gnb .nav-gnb:after{content:"";display:block;clear:both}
.x .gnb .nav-gnb li{position:relative;display:inline-block;*display:inline;zoom:1;vertical-align:top;overflow:hidden;margin:0}
.x .gnb .nav-gnb li.activeOn{z-index:10}
.x .gnb .nav-gnb li.activeOn>a{border:1px solid #ccc}
.x .gnb .nav-gnb li li{display:block;_float:left;clear:both;overflow:hidden;border:0;margin:0}
.x .gnb .nav-gnb li li:first-child{border:0}
.x .gnb .nav-gnb li a{display:block;_float:left;font-weight:bold;color:#333;font-size:12px;height:14px;padding:9px 0;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}
.x .gnb .nav-gnb li a span{padding:0 15px;border-left:1px solid #fff}
.x .gnb.active .nav-gnb li a span,
.x .gnb .nav-gnb li:first-child a span,
.x .gnb .nav-gnb li.activeOn+li a span{border:0;margin:0 0 0 1px}
.x .gnb .nav-gnb li a:hover,
.x .gnb .nav-gnb li a:active,
.x .gnb .nav-gnb li a:focus{background:#f4f4f4}
.x .gnb .nav-gnb li.activeOn>a{background:#fff;padding:8px 0}
.x .gnb .nav-gnb li li a{color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}
.x .gnb .nav-gnb li li a:hover,
.x .gnb .nav-gnb li li a:active,
.x .gnb .nav-gnb li li a:focus{border:0;background:#eee}
.x .gnb .mnv{width:100%;height:32px;display:none}
@media only all and (max-width:860px){
@media all and (max-width:860px){
.x .gnb{height:auto}
.x .gnb .nav,
.x .gnb .bmk{display:none}
.x .gnb .nav-gnb,
.x .sct{display:none}
.x .gnb .mnv{display:block}
}
/* Local Navigation */
.x .lnb{position:relative;float:left;width:210px;margin:1em 0 1em -240px;line-height:normal;zoom:1;display:inline}
.x .lnb .h2{margin-top:0;border-left:0;padding-left:0}
.x .lnb ul{margin:0 !important;padding:0;list-style:none}
.x .lnb{position:relative;float:left;width:210px;margin:0 0 1em -230px;line-height:normal;zoom:1;display:inline}
.x .lnb .h2{position:relative;z-index:2;margin:0 0 -1px 0;padding:0 10px;border:1px solid #444;border-bottom:0;border-radius:4px 4px 0 0;background:#555;font-size:13px;color:#fff;line-height:36px}
.x .lnb ul{margin:0 !important;padding:0;list-style:none;position:relative;z-index:1}
.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}
.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}
.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}
@ -177,6 +167,19 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .lnb li.active li a{border:0}
.x .lnb li.active ul{display:block;border-top:1px solid #eee}
.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}
.x .lnb li:last-child a,
.x .lnb li.active:last-child{border-radius:0 0 4px 4px !important}
/* Shortcut */
.x .sct{float:right;width:138px;position:relative;right:-160px;margin:0 0 0 -140px;padding:8px 0}
.x .sct h2{margin:0 0 5px 15px;font-size:13px}
.x .sct ul{margin:0;font-size:12px}
.x .sct li{position:relative}
.x .sct a{text-decoration:none}
.x .sct form{position:absolute;margin:0;padding:0;top:2px;right:-10px}
.x .sct .text{text-decoration:none;font-weight:bold;color:#999 !important;width:16px;height:16px;margin:0}
.x .sct .text:hover,
.x .sct .text:active,
.x .sct .text:focus{color:#333 !important}
/* Content Navigation */
.x .cnb{margin:1em 0;position:relative;zoom:1}
.x .cnb:after{content:"";display:block;clear:both}
@ -252,7 +255,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}
/* Skip Navigation */
.x .skipNav{margin:0;text-align:center}
@media only all and (max-width:860px){
@media all and (max-width:860px){
.x .skipNav{display:none}
}
.x .skipNav a{position:absolute;width:1px;height:1px;display:block;padding:10px 0;font-weight:bold;overflow:hidden}
@ -281,7 +284,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .header .account a{color:#fff;display:inline-block;height:14px}
.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}
.x .header #language{position:absolute;top:19px;right:-20px;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}
@media only all and (max-width:860px){
@media all and (max-width:860px){
.x .header #language{right:-10px}
}
.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}
@ -295,16 +298,17 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}
/* Footer */
.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1}
.x .footer *{font-size:12px}
.x .footer:after{content:"";display:block;clear:both}
.x .footer p{margin:0}
.x .footer .power{float:left}
.x .footer .cache{float:right}
.x .footer .vr{color:#ccc}
/* Body */
.x .body{position:relative;z-index:1;padding:1em 20px 1em 260px;zoom:1}
.x .body{position:relative;z-index:1;padding:30px 170px 30px 240px;zoom:1}
.x .body:after{content:"";display:block;clear:both}
/* Content */
.x .content{float:right;width:100%;margin-left:-230px;zoom:1}
.x .content{float:right;width:100%;margin-left:-100%;zoom:1;outline:0}
.x .content:after{content:"";display:block;clear:both}
.x .content a{color:#33a}
.x .content a:hover,
@ -315,15 +319,16 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .content .portlet a:active,
.x .content .portlet a:focus{text-decoration:underline}
/* Dashboard */
.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}
.x .dashboard .portlet{float:left;width:48%;margin-right:1em}
.x .dashboard .section{margin-top:0}
.x .dashboard .portlet{float:left;width:48%;margin-right:1em;margin-top:0}
.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}
.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}
@media only all and (min-width:1300px){
@media all and (min-width:1300px){
.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}
}
/* Single Column*/
.x .single{position:relative;float:none;width:auto;margin-left:-240px}
.x .single{padding-left:10px}
.x .single .content{position:relative;float:left;width:100%;margin:0}
/* Search */
.x .search{zoom:1}
.x .search:after{content:"";display:block;clear:both}
@ -578,9 +583,9 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}
.x .sTog{float:right;border:0;background-color:transparent;width:28px;height:18px;opacity:.5;filter:alpha(opacity=50)}
/* Responsive Layout */
@media only all and (max-width:860px){
@media all and (max-width:860px){
.x .header .account ul{padding-right:10px}
.x .body{padding:0}
.x .body{padding:1em 0 0 0}
.x .content{float:none;margin-left:0}
.x .lnb{float:none;width:auto;margin:1em 0}
.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}
@ -678,6 +683,28 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}
.x .clear:after{content:"";display:block;clear:both}
.x .moduleSearchWindow{position:absolute;width:700px;z-index:100}
.x .moduleSearchWindow, .moduleSearchWindow div{margin:0;padding:0;color:#2d2c2d;font-size:12px}
.x .moduleSearchWindow h2{margin:0;padding:4px;height:24px;line-height:24px;background:#666;text-align:left;color:#fff;font-size:12px}
.x .moduleSearchWindow .sectionDiv{position:relative;margin:0px;background:#fff;border:1px solid}
.x .moduleSearchWindow .siteList{float:left;width:295px}
.x .moduleSearchWindow .highlight{background:yellow;color:red;font-style:italic}
.x .moduleSearchWindow .moduleTypeList{margin-left:5px;float:left;width:200px}
.x .moduleSearchWindow .moduleInstanceList{float:right;width:190px}
.x .moduleSearchWindow ul{margin:0;padding:0;border:0}
.x .moduleSearchWindow li{font-size:12px;border:0;border-bottom:1px solid #ccc;margin:0;padding: 4px 4px;font-family: ,NanumGothic,"맑은 고딕","Malgun Gothic",AppleGothic,,Dotum,,Gulim,sans-serif}
.x .moduleSearchWindow li:hover, .moduleSearchWindow li.on{background:#eee;cursor:pointer}
.x .moduleSearchWindow li div{margin:0;padding:0;display:inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis}
.x .moduleSearchWindow .siteList li div{width:270px}
.x .moduleSearchWindow .siteListSearchBox{margin:0;padding:4px 0;height:24px;border-bottom:1px solid #888}
.x .moduleSearchWindow .siteListSearchBoxBorder{margin-left:3px;height: 22px;width: 287px;border: 1px solid #ccc}
.x .moduleSearchWindow input.siteListSearchInput{margin:0;padding:0;position:relative;float:right;width: 260px;margin-right:4px;border:0}
.x .moduleSearchWindow .siteListSearchBox .searchImg{position:relative;float:left;margin-top:4px;margin-left:4px}
.x .moduleSearchWindow .moduleTypeList li div{width:170px}
.x .moduleSearchWindow .moduleInstanceList li div{width:190px}
.x .moduleSearchWindow .moduleSearch_ok {float:right}
.x .moduleSearchWindow select.moduleInstanceListSelect {width:100%}
/*!
* Bootstrap v2.0.4
*
@ -687,7 +714,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
*
* Designed and built with all the love in the world@twitter by@mdo and@fat.
*/
/* Bootstrap - Icon */
/* Bootstrap - Icons */
[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}
[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0}
.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}
@ -830,4 +857,69 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.icon-tasks{background-position:-384px -144px}
.icon-filter{background-position:-408px -144px}
.icon-briefcase{background-position:-432px -144px}
.icon-fullscreen{background-position:-456px -144px}
.icon-fullscreen{background-position:-456px -144px}
/* Bootstrap - Nav */
.nav{margin-bottom:18px;margin-left:0;list-style:none}
.nav > li > a{display:block}
.nav > li > a:hover{text-decoration:none;background-color:#eeeeee}
.nav > .pull-right{float:right}
.nav .nav-header{display:block;padding:3px 15px;font-weight:bold;line-height:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase}
.nav li + .nav-header{margin-top:9px}
.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}
.nav-list > li > a,
.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5)}
.nav-list > li > a{padding:3px 15px}
.nav-list > .active > a,
.nav-list > .active > a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc}
.nav-list [class^="icon-"]{margin-right:2px}
.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff}
.nav-tabs,
.nav-pills{ *zoom:1}
.nav-tabs:before,
.nav-pills:before,
.nav-tabs:after,
.nav-pills:after{display:table;content:""}
.nav-tabs:after,
.nav-pills:after{clear:both}
.nav-tabs > li,
.nav-pills > li{float:left}
.nav-tabs > li > a,
.nav-pills > li > a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}
.nav-tabs{border-bottom:1px solid #ddd}
.nav-tabs > li{margin-bottom:-1px}
.nav-tabs > li > a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}
.nav-tabs > li > a:hover{border-color:#eeeeee #eeeeee #dddddd}
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover{color:#555555;cursor:default;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent}
.nav-pills > li > a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}
.nav-pills > .active > a,
.nav-pills > .active > a:hover{color:#ffffff;background-color:#0088cc}
.nav-stacked > li{float:none}
.nav-stacked > li > a{margin-right:0}
.nav-tabs.nav-stacked{border-bottom:0}
.nav-tabs.nav-stacked > li > a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.nav-tabs.nav-stacked > li:first-child > a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}
.nav-tabs.nav-stacked > li:last-child > a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}
.nav-tabs.nav-stacked > li > a:hover{z-index:2;border-color:#ddd}
.nav-pills.nav-stacked > li > a{margin-bottom:3px}
.nav-pills.nav-stacked > li:last-child > a{margin-bottom:1px}
.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}
.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}
.nav-tabs .dropdown-toggle .caret,
.nav-pills .dropdown-toggle .caret{margin-top:6px;border-top-color:#0088cc;border-bottom-color:#0088cc}
.nav-tabs .dropdown-toggle:hover .caret,
.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}
.nav-tabs .active .dropdown-toggle .caret,
.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333}
.nav > .dropdown.active > a:hover{color:#000000;cursor:pointer}
.nav-tabs .open .dropdown-toggle,
.nav-pills .open .dropdown-toggle,
.nav > li.dropdown.open.active > a:hover{color:#ffffff;background-color:#999999;border-color:#999999}
.nav li.dropdown.open .caret,
.nav li.dropdown.open.active .caret,
.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100)}
/* Bootstrap - Miscellaneous */
.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05)}
.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15)}
.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}
.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,7 @@
@charset "utf-8";
.x,
.x table,
.x input,
.x textarea,
.x select,
.x button{font-family:Tahoma,Geneva,sans-serif}

View file

@ -4,4 +4,4 @@
.x input,
.x textarea,
.x select,
.x button{font-family:,NanumGothic,"맑은 고딕","Malgun Gothic",AppleGothic,,Dotum,,Gulim,sans-serif}
.x button{font-family:,NanumGothic,"맑은 고딕","Malgun Gothic",,Dotum,sans-serif}

View file

@ -101,4 +101,5 @@
</div>
</div>
</div>
<include target="./_spShortcut.html" />
<include target="./_spFooter.html" />

View file

@ -154,14 +154,13 @@ jQuery(function($){
$.fn.xeMenu = function(){
this
.attr('role', 'navigation') // WAI-ARIA role
.find('>.nav>li')
.find('>.nav-gnb>li')
.attr('role', 'menuitem') // WAI-ARIA role
.find('>ul').css('height','0').end()
.filter(':has(>ul)')
.attr('aria-haspopup', 'true') // WAI-ARIA
.end()
.end()
.find('>.nav')
.find('>.nav-gnb')
.mouseover(function(){
$(this)
.parent('.gnb').addClass('active').end()
@ -185,28 +184,6 @@ jQuery(function($){
$(this).mouseover();
}
});
this
.find('>.bmk')
.removeClass('active')
.mouseover(function(){
$(this).addClass('active')
})
.mouseleave(function(){
$(this).removeClass('active')
})
.focusout(function(){
var $this = $(this);
setTimeout(function(){
if(!$this.find(':focus').length) {
$this.mouseleave();
}
}, 1);
})
.delegate('a', {
focus : function(){
$(this).mouseover();
}
});
};
$('div.gnb').xeMenu();
@ -576,6 +553,202 @@ $('.modulefinder').xeModuleFinder();
});
// Module Search : A New Version Of Module Finder
jQuery(function($){
_xeModuleSearch = function(){
var t = this;
var $t = $(this);
var $moduleSearchWindow = $t.find(".moduleSearchWindow");
var $siteListDiv = $moduleSearchWindow.find('.siteList');
var $moduleTypeListDiv = $moduleSearchWindow.find('.moduleTypeList');
var $moduleInstanceListDiv = $moduleSearchWindow.find('.moduleInstanceList');
var $siteList = $siteListDiv.find('UL');
var $moduleTypeList = $moduleTypeListDiv.find('UL');
var $moduleInstanceList = $moduleInstanceListDiv.find('SELECT');
var $siteListSearchInput = $moduleSearchWindow.find('INPUT.siteListSearchInput');
var aSiteListData;
var MAX_LIST_HEIGHT = 280;
function setListSize($UL, nHeight){
var nWidth, $div;
$UL.find('li div').width('');
$UL.css('height', '');
$UL.css('overflow-y', '');
if($UL.height() > nHeight){
$div = $UL.find('li div');
$div.width($div.width()-20+'px');
$UL.css('height', nHeight+'px');
$UL.css('overflow-y', 'auto');
}
}
function setSiteList(sFilter){
var sDomain;
var rxFilter = new RegExp(sFilter, "ig");
var list = aSiteListData;
$siteList.empty();
for(i=0,c=list.length; i < c; i++) {
sDomain = list[i].domain;
if(sFilter){
if(!sDomain.match(rxFilter)) continue;
sDomain = sDomain.replace(rxFilter, function(sKeyword){
return '<span class="highlight">'+sKeyword+'</span>';
});
}
$li = $('<li />').appendTo($siteList);
$('<a>').attr('href', '#').html(
'<div>' + sDomain + '</div>' +
'<span class="icon-circle-arrow-right" style="display:inline-block;float:right;width:16px;height:16px;"></span>'
).data('site_srl', list[i].site_srl).appendTo($li);
}
setListSize($siteList, MAX_LIST_HEIGHT - $siteListSearchInput.parent("DIV").height());
}
$siteListSearchInput.keyup(function(){
setSiteList($siteListSearchInput.val());
});
if(typeof console == 'undefined'){
console={log:function(){}};
}
$t
.not('.xe-module-search')
.addClass('xe-module-search')
.find('a.tgAnchor.moduleSearch')
.bind('before-open.tc', function(){
var $this;
$this = $(this);
function on_complete(data) {
var $li, list = data.site_list, i, c;
if(data.error || !$.isArray(list)) {
$this.trigger('close.tc');
return;
}
aSiteListData = list;
setSiteList($siteListSearchInput.val());
$siteListSearchInput.focus();
};
$siteList.empty();
$moduleInstanceList.empty();
$moduleTypeListDiv.hide();
$moduleInstanceListDiv.hide();
$.exec_json('admin.getSiteAllList', {domain:""}, on_complete);
})
.end()
.find('.tgContent .siteListUL')
.delegate('a','click',function(oEvent){
var $this, $finder;
$this = $(this);
$finder = $this.closest('.modulefinder');
function on_complete(data) {
var list = data.module_list, x;
if(data.error || !list) return;
for(x in list) {
if(!list.hasOwnProperty(x)) continue;
$li = $('<li />').appendTo($moduleTypeList);
$('<a>').attr('href', '#').html(
'<div>'+list[x].title+'</div>' +
'<span class="icon-circle-arrow-right" style="display:inline-block;float:right;width:16px;height:16px;"></span>'
).data('moduleInstanceList', list[x].list).appendTo($li);
//$('<option />').attr('value', x).text(list[x].title).appendTo($mod_select);
}
$moduleSearchWindow.find('.moduleTypeList').show();
setListSize($moduleTypeList, MAX_LIST_HEIGHT);
$siteList.find('li').removeClass('on');
$this.parent('li').addClass('on');
};
//$finder.find('a.tgAnchor.findsite').trigger('close.tc');
$moduleTypeList.empty();
$moduleInstanceListDiv.hide();
$.exec_json('module.procModuleAdminGetList', {site_srl:$this.data('site_srl')}, on_complete);
oEvent.preventDefault();
})
.end()
//.find('.moduleList,.moduleIdList').hide().end()
.find('.moduleTypeListUL')
.delegate('a', 'click', function(oEvent){
var $this, $mid_select, val, list;
$this = $(this);
list = $this.data('moduleInstanceList');
if(!list) return;
t.sSelectedModuleType = $this.text();
$moduleInstanceList.empty();
for(var x in list) {
if(!list.hasOwnProperty(x)) continue;
$li = $('<option />').html(list[x].browser_title).appendTo($moduleInstanceList).val(list[x].module_srl).data('mid', list[x].module_srl)
.data('module_srl', list[x].module_srl).data('layout_srl', list[x].layout_srl).data('browser_title', list[x].browser_title);
}
$moduleInstanceListDiv.show();
setListSize($moduleInstanceList, MAX_LIST_HEIGHT);
$moduleTypeList.find('li').removeClass('on');
$this.parent('li').addClass('on');
oEvent.preventDefault();
})
.end()
.find('.moduleSearch_ok').click(function(oEvent){
var aSelected = [];
$t.find('.moduleInstanceListSelect option:selected').each(function(){
aSelected.push({
'type' : t.sSelectedModuleType,
'module_srl' : $(this).data('module_srl'),
'layout_srl' : $(this).data('layout_srl'),
'browser_title' : $(this).data('browser_title')
});
});
$t.trigger('moduleSelect', [aSelected]);
$('.tgAnchor.moduleSearch').trigger('close.tc');
oEvent.preventDefault();
});
return this;
};
$.fn.xeModuleSearch = function(){
$(this).each(_xeModuleSearch);
};
$('.moduleSearch').xeModuleSearch();
});
// Sortable table
jQuery(function($){
@ -769,10 +942,10 @@ $('.multiLangEdit')
function on_complete(data, idx){
var results = data.results, $btn, i, c;
if(data.error || !results || (r_idx != idx+1)) return;
$this.removeClass('loading');
if(data.error || !results || results.length === 0 || (r_idx != idx+1)) return;
$ul.empty();
for(i=0,c=results.length; i < c; i++) {
$btn = $('<button type="button" class="_btnLang" />').data('langkey', results[i].name).text(results[i].value);
@ -799,6 +972,8 @@ $('.multiLangEdit')
$active = $ul.find('button.active');
if(key == ENTER) {
if($active.length === 0) return true;
$active.click();
return false;
}
@ -904,8 +1079,17 @@ $('.multiLangEdit')
var $li = $('<li />').appendTo($langlist);
var anchor_id = $layer.data('layer_index');
var lang_text = this[xe.current_lang];
if(!lang_text) {
for(lang_code in this) {
lang_text = this[lang_code];
break;
}
}
$('<a href="#langInput_'+anchor_id+'" class="langItem" />')
.text(this[xe.current_lang])
.text(lang_text)
.data('multilang-name', key)
.appendTo($li);
});
@ -1204,17 +1388,11 @@ function completeInstallModule(ret_obj) {
jQuery(function($){
$('body').ajaxComplete(function(){ hideWaitingFogLayer() });
});
// admin single column layout
jQuery(function($){
if($('.x>.body>.lnb').length == 0){ // When it have no lnb
$('.x>.body>.content').addClass('single'); // Add class single
if($('.x>.body .lnb').length == 0){ // When it have no lnb
$('.x>.body').addClass('single'); // Add class single
}
});
// Details toggle in admin table
jQuery(function($){
var viewBtn = $('.x .dsTg span.side>button.text');
var tdTitle = $('.x .dsTg td.title');
tdTitle.each(function(){
@ -1230,10 +1408,7 @@ jQuery(function($){
viewBtn.toggleClass('details');
details.slideToggle(200);
});
});
// Toggle Content
jQuery(function($){
var $h2h3 = $('.x .content .h2, .x .content .h3').not('.portlet .h2, .modal .h2');
$h2h3.each(function(){
var $sTog = $('<button type="button" class="sTog" title="Open/Close"><i class="icon-chevron-up"></i></button>');
@ -1250,4 +1425,4 @@ jQuery(function($){
}
});
});
});
});

File diff suppressed because one or more lines are too long

View file

@ -2,7 +2,7 @@ jQuery(function(b){function k(a){if(moduleList=a.menuList){var c=b("#menuNameLis
b(this).parent().prevAll("._parent_key").val();a.find("input[name=menu_item_srl]").val(i);a.submit()});b("a._child_delete").click(function(){var i=b(this).parents("li").find("._item_key").val();a.find("input[name=menu_item_srl]").val(i);a.submit()})});
jQuery(function(b){function k(a,b){for(var c=0,e=0;a&&a!=b;)c+=a.offsetTop,e+=a.offsetLeft,a=a.offsetParent;return{top:c,left:e}}b("form.siteMap").delegate("li:not(.placeholder)","dropped.st",function(){var a=b(this),d;d=a.find(">input._parent_key");a.parent("ul").parent("li").length?d.val(a.parent("ul").parent("li").find(">input._item_key").val()):d.val("0")});var d=!1,h=b('<li class="placeholder">');b("div.adminMenu").delegate("li:not(.placeholder,.parent)",{"mousedown.st":function(a){var i,c,e,
f,m,n,j,l,g;if(!(b(a.target).is("a,input,label,textarea")||1!=a.which)){d=!0;c=b(this);n=c.height();m=c.width();e=c.parentsUntil(".siteMap").filter("ul");f=e.eq(-1);f.css("position","relative");i=a.pageY;j=k(this,f.get(0));$clone=c.clone(!0).attr("target",!0);for(a=e.length-1;a;a--)$clone=$clone.wrap("<li><ul /></li>").parent().parent();l=[];f.find("li").each(function(){if(c[0]===this||c.has(this).length)return!0;var a=k(this,f.get(0));l.push({top:a.top,bottom:a.top+32,$item:b(this)})});$clone.find(".side,input").remove().end().addClass("draggable").css({position:"absolute",
opacity:0.6,width:m,height:n,left:j.left,top:j.top,zIndex:100}).appendTo(f.eq(0));h.css({position:"absolute",opacity:0.6,width:m,height:"10px",left:j.left,top:j.top,zIndex:99}).appendTo(f.eq(0));c.css("opacity",0.6);b(document).unbind("mousemove.st mouseup.st").bind("mousemove.st",function(a){var b,c,d;g=null;a=j.top-(i-a.pageY);for(b=0,c=l.length;b<c;b++)d=l[b],d.top>a||d.bottom<a||(g={element:d.$item},d.$item.hasClass("parent")?(g.state="prepend",h.css("top",d.bottom-5)):d.top>a-12?(g.state="before",
opacity:0.6,width:m,height:n,left:j.left,top:j.top,zIndex:100}).appendTo(f.eq(0));h.css({position:"absolute",opacity:0.6,width:m,height:"10px",left:j.left,top:j.top,zIndex:99}).appendTo(f.eq(0));c.css("opacity",0.6);b(document).unbind("mousemove.st mouseup.st").bind("mousemove.st",function(a){var b,c,d;g=null;a=j.top-(i-a.pageY);b=0;for(c=l.length;b<c;b++)d=l[b],d.top>a||d.bottom<a||(g={element:d.$item},d.$item.hasClass("parent")?(g.state="prepend",h.css("top",d.bottom-5)):d.top>a-12?(g.state="before",
h.css("top",d.top-5)):(g.state="after",h.css("top",d.bottom-5)));$clone.css({top:a})}).bind("mouseup.st",function(){var a,e;d=!1;b(document).unbind("mousemove.st mouseup.st");c.css("opacity","");$clone.remove();h.remove();e=b("<li />").height(c.height());if(g){a=b(g.element);c.before(e);if("prepend"==g.state)a.find(">ul").length||a.find(">.side").after("<ul>"),a.find(">ul").prepend(c.hide());else a[g.state](c.hide());c.slideDown(100,function(){c.removeClass("active")});e.slideUp(100,function(){var a=
e.parent();e.remove();a.children("li").length||a.remove()});c.trigger("dropped.st")}});return!1}},"mouseover.st":function(){d||b(this).addClass("active");return!1},"mouseout.st":function(){d||b(this).removeClass("active");return!1}}).find("li").prepend('<button type="button" class="moveTo">Move to</button>').filter(".parent").find(">button.moveTo").css({visibility:"hidden","margin-left":"-12px"}).end().end().end();b('<div id="dropzone-marker" />').css({display:"none",position:"absolute",backgroundColor:"#000",
opacity:0.7}).appendTo("body")});

View file

@ -1,6 +1,6 @@
jQuery(function(c){function o(a,c){for(var b=0,g=0;a&&a!=c;)b+=a.offsetTop,g+=a.offsetLeft,a=a.offsetParent;return{top:b,left:g}}var l=!1,k=c('<li class="placeholder">');c("form.siteMap").delegate("li:not(.placeholder)",{"mousedown.st":function(a){var d,b,g,h,n,p,i,m,j;if(!(c(a.target).is("a,input,label,textarea")||1!=a.which)){l=!0;b=c(this);p=b.height();n=b.width();g=b.parentsUntil(".siteMap").filter("ul");h=g.eq(-1);h.css("position","relative");d=a.pageY;i=o(this,h.get(0));$clone=b.clone(!0).attr("target",
!0);for(a=g.length-1;a;a--)$clone=$clone.wrap("<li><ul /></li>").parent().parent();m=[];h.find("li").each(function(){if(b[0]===this||b.has(this).length)return!0;var a=o(this,h.get(0));m.push({top:a.top,bottom:a.top+32,item:this})});$clone.find(".side,input").remove().end().addClass("draggable").css({position:"absolute",opacity:0.6,width:n,height:p,left:i.left,top:i.top,zIndex:100}).appendTo(h.eq(0));k.css({position:"absolute",opacity:0.6,width:n,height:"5px",left:i.left,top:i.top,zIndex:99}).appendTo(h.eq(0));
b.css("opacity",0.6);c(document).unbind("mousemove.st mouseup.st").bind("mousemove.st",function(a){var b,c,e,f;j=null;a=i.top-(d-a.pageY);for(b=0,c=m.length;b<c;b++)if(f=a,e=m[b],0==b&&f<e.top&&(f=e.top),b==c-1&&f>e.bottom&&(f=e.bottom),e.top<=f&&e.bottom>=f){b=e.item;3>=Math.abs(e.top-f)?(k.css({top:e.top-3,height:"5px"}),f="before"):3>=Math.abs(e.bottom-f)?(k.css({top:e.bottom-3,height:"5px"}),f="after"):(k.css({top:e.top+3,height:"27px"}),f="prepend");j={element:b,state:f};break}$clone.css({top:a})}).bind("mouseup.st",
b.css("opacity",0.6);c(document).unbind("mousemove.st mouseup.st").bind("mousemove.st",function(a){var b,c,e,f;j=null;a=i.top-(d-a.pageY);b=0;for(c=m.length;b<c;b++)if(f=a,e=m[b],0==b&&f<e.top&&(f=e.top),b==c-1&&f>e.bottom&&(f=e.bottom),e.top<=f&&e.bottom>=f){b=e.item;3>=Math.abs(e.top-f)?(k.css({top:e.top-3,height:"5px"}),f="before"):3>=Math.abs(e.bottom-f)?(k.css({top:e.bottom-3,height:"5px"}),f="after"):(k.css({top:e.top+3,height:"27px"}),f="prepend");j={element:b,state:f};break}$clone.css({top:a})}).bind("mouseup.st",
function(){var a,d;l=!1;c(document).unbind("mousemove.st mouseup.st");b.css("opacity","");$clone.remove();k.remove();d=c("<li />").height(b.height());if(j){a=c(j.element);b.before(d);if("prepend"==j.state)a.find(">ul").length||a.find(">.side").after("<ul>"),a.find(">ul").prepend(b.hide());else a[j.state](b.hide());b.slideDown(100,function(){b.removeClass("active")});d.slideUp(100,function(){var a=d.parent();d.remove();a.children("li").length||a.remove()});b.trigger("dropped.st")}});return!1}},"mouseover.st":function(){l||
c(this).addClass("active");return!1},"mouseout.st":function(){l||c(this).removeClass("active");return!1}}).find("li").prepend('<button type="button" class="moveTo">Move to</button>').append('<span class="vr"></span><span class="hr"></span>').find("input:text").focus(function(){var a=c(this),d=a.prev("label"),b=a.parent();a.width(b.width()-(parseInt(b.css("text-indent"))||0)-a.next(".side").width()-60).css("opacity","");d.hide()}).blur(function(){var a=c(this),d=a.prev("label"),b=a.val();a.width(0).css("opacity",
0);d.removeClass("no-text").empty().text(b).show();b||d.addClass("no-text").text("---")}).each(function(a){var d=c(this),a="sitemap-id-"+a;d.attr("id",a).css({width:0,opacity:0,overflow:"hidden"}).before("<label />").prev("label").attr("for",a).text(d.val())}).end().end()});

View file

@ -1,8 +1,7 @@
<!--#include("./_spHeader.html")-->
<div class="content" id="content">
<include target="./_spHeader.html" />
<div class="content" id="content" tabindex="0">
{$content}
</div>
<!--@if($parentSrl != 0)-->
<!--#include("./_spLnb.content.html")-->
<!--@end-->
<!--#include("./_spFooter.html")-->
<include target="./_spLnb.content.html" cond="$parentSrl != 0" />
<include target="./_spShortcut.html" />
<include target="./_spFooter.html" />

View file

@ -323,6 +323,11 @@
{
$package->depends[$key]->need_update = true;
$package->package_srl .= ",". $dep->package_srl;
if($dep->path === '.')
{
Context::set('contain_core', TRUE);
}
}
else
{
@ -338,6 +343,11 @@
$package->need_update = version_compare($package->version, $installedPackage->current_version, ">");
}
Context::set("package", $package);
if($package->path === '.')
{
Context::set('contain_core', TRUE);
}
}
if(!$_SESSION['ftp_password'])
{

View file

@ -328,4 +328,7 @@
<value xml:lang="en"><![CDATA[Cannot delete this package (no moduleUninstall() in the module class).]]></value>
<value xml:lang="jp"><![CDATA[このパッケージは、削除をサポートしません(モジュールクラスにmoduleUninstall()がありません)。]]></value>
</item>
<item name="msg_update_core">
<value xml:lang="ko"><![CDATA[<strong style="color:red">XE core가 업데이트 됩니다.</strong><br />core 업데이트 시 설치된 프로그램의 호환성을 반드시 점검하시기 바랍니다.]]></value>
</item>
</lang>

View file

@ -2,6 +2,9 @@
<load target="js/waiting.js" usecdn="true" />
<h2 class="h2">{$package->title} ver. {$package->version}</h2>
<div cond="$contain_core" class="message info">
<p>{$lang->msg_update_core}</p>
</div>
<p cond="$package->installed">{$lang->current_version}: {$package->cur_version} <block cond="$package->need_update">({$lang->require_update})</block></p>
<p cond="!$package->installed">{$lang->require_installation}</p>
<block cond="$package->depends">

View file

@ -82,7 +82,7 @@
$document_srl = $obj->document_srl;
if(!$document_srl) return new Object();
return $this->deleteComments($document_srl, true);
return $this->deleteComments($document_srl, $obj);
}
/**
@ -206,7 +206,11 @@
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
if(Mobile::isFromMobilePhone())
{
$obj->content = nl2br(htmlspecialchars($obj->content));
if($obj->use_html != 'Y')
{
$obj->content = htmlspecialchars($obj->content);
}
$obj->content = nl2br($obj->content);
}
if(!$obj->regdate) $obj->regdate = date("YmdHis");
// remove iframe and script if not a top administrator on the session.
@ -545,16 +549,55 @@
$oCommentModel = &getModel('comment');
// check if comment already exists
$comment = $oCommentModel->getComment($comment_srl);
if($comment->comment_srl != $comment_srl) return new Object(-1, 'msg_invalid_request');
if($comment->comment_srl != $comment_srl)
{
return new Object(-1, 'msg_invalid_request');
}
$document_srl = $comment->document_srl;
// call a trigger (before)
$output = ModuleHandler::triggerCall('comment.deleteComment', 'before', $comment);
if(!$output->toBool()) return $output;
// check if child comment exists on the comment
$child_count = $oCommentModel->getChildCommentCount($comment_srl);
if($child_count>0) return new Object(-1, 'fail_to_delete_have_children');
if(!$output->toBool())
{
return $output;
}
// check if permission is granted
if(!$is_admin && !$comment->isGranted()) return new Object(-1, 'msg_not_permitted');
if(!$is_admin && !$comment->isGranted())
{
return new Object(-1, 'msg_not_permitted');
}
// check if child comment exists on the comment
$childs = $oCommentModel->getChildComments($comment_srl);
if(count($childs) > 0)
{
$deleteAllComment = true;
if (!$is_admin)
{
$logged_info = Context::get('logged_info');
foreach($childs as $val)
{
if($val->member_srl != $logged_info->member_srl)
{
$deleteAllComment = false;
break;
}
}
}
if(!$deleteAllComment)
{
return new Object(-1, 'fail_to_delete_have_children');
}
else
{
foreach($childs as $val)
{
$output = $this->deleteComment($val->comment_srl, $is_admin, $isMoveToTrash);
if(!$output->toBool()) return $output;
}
}
}
// begin transaction
$oDB = &DB::getInstance();
@ -623,12 +666,21 @@
* @param int $document_srl
* @return object
*/
function deleteComments($document_srl) {
function deleteComments($document_srl, $obj = NULL) {
// create the document model object
$oDocumentModel = &getModel('document');
$oCommentModel = &getModel('comment');
// check if permission is granted
$oDocument = $oDocumentModel->getDocument($document_srl);
// check if permission is granted
if(is_object($obj))
{
$oDocument = new documentItem();
$oDocument->setAttribute($obj);
}
else
{
$oDocument = $oDocumentModel->getDocument($document_srl);
}
if(!$oDocument->isExists() || !$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted');
// get a list of comments and then execute a trigger(way to reduce the processing cost for delete all)
$args->document_srl = $document_srl;
@ -742,6 +794,10 @@
return new Object(-1, $failed_voted);
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
// update the number of votes
if($point < 0) {
$args->blamed_count = $oComment->get('blamed_count') + $point;
@ -753,6 +809,23 @@
// leave logs
$args->point = $point;
$output = executeQuery('comment.insertCommentVotedLog', $args);
$obj->member_srl = $oComment->get('member_srl');
$obj->module_srl = $oComment->get('module_srl');
$obj->comment_srl = $oComment->get('comment');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
$trigger_output = ModuleHandler::triggerCall('comment.updateVotedCount', 'after', $obj);
if(!$trigger_output->toBool())
{
$oDB->rollback();
return $trigger_output;
}
$oDB->commit();
// leave into session information
$_SESSION['voted_comment'][$comment_srl] = true;

View file

@ -71,7 +71,7 @@
$url = getUrl('','module','admin','act','dispCommentAdminList','search_target','ipaddress','search_keyword',$oComment->getIpAddress());
$oCommentController->addCommentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress');
$url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oComment->getIpAddress());
$url = sprintf("var params = new Array(); params['ipaddress_list']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oComment->getIpAddress());
$oCommentController->addCommentPopupMenu($url,'cmd_add_ip_to_spamfilter','','javascript');
}
}
@ -107,6 +107,17 @@
return (int)$output->data->count;
}
/**
* Returns the number of child comments
* @param int $comment_srl
* @return int
*/
function getChildComments($comment_srl) {
$args->comment_srl = $comment_srl;
$output = executeQueryArray('comment.getChildComments', $args);
return $output->data;
}
/**
* Get the comment
* @param int $comment_srl

View file

@ -251,9 +251,11 @@
<item name="published_name_list" type="array">
<item name="Y">
<value xml:lang="en"><![CDATA[Published]]></value>
<value xml:lang="ko"><![CDATA[공개 발행]]></value>
</item>
<item name="N">
<value xml:lang="en"><![CDATA[Unpublished]]></value>
<value xml:lang="ko"><![CDATA[발행 대기]]></value>
</item>
</item>
<item name="comment_manager">
@ -266,7 +268,7 @@
<value xml:lang="ko"><![CDATA[선택한 댓글]]></value>
<value xml:lang="en"><![CDATA[Selected Comment]]></value>
<value xml:lang="jp"><![CDATA[選択したコメント]]></value>
<value xml:lang="zh-TW"><![CDATA[已選回覆]]></value>
<value xml:lang="zh-TW"><![CDATA[已選回覆]]></value>
</item>
<item name="cmd_comment_validation">
<value xml:lang="en"><![CDATA[Use comment validation]]></value>
@ -276,11 +278,22 @@
</item>
<item name="published">
<value xml:lang="en"><![CDATA[Publish status]]></value>
<value xml:lang="ko"><![CDATA[발행 상태]]></value>
</item>
<item name="cmd_publish">
<value xml:lang="en"><![CDATA[Publish]]></value>
<value xml:lang="ko"><![CDATA[발행]]></value>
</item>
<item name="cmd_unpublish">
<value xml:lang="en"><![CDATA[Unpublish]]></value>
<value xml:lang="ko"><![CDATA[발행 중지]]></value>
</item>
<item name="select_module">
<value xml:lang="ko"><![CDATA[모듈 선택]]></value>
<value xml:lang="en"><![CDATA[Select Module]]></value>
</item>
<item name="page">
<value xml:lang="ko"><![CDATA[페이지]]></value>
<value xml:lang="en"><![CDATA[Page]]></value>
</item>
</lang>

View file

@ -0,0 +1,12 @@
<query id="getChildComments" action="select">
<tables>
<table name="comments" />
</tables>
<columns>
<column name="comment_srl" />
<column name="member_srl" />
</columns>
<conditions>
<condition operation="equal" column="parent_srl" var="comment_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -18,8 +18,8 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
| <a href="{getUrl('search_target','is_published','search_keyword', 'Y')}" <!--@if($search_target == 'is_published' && $search_keyword == 'Y')-->class="active"<!--@end-->>{$lang->published_name_list['Y']}</a>
<block cond="$modules_list">
| <label for="comment_modules" <!--@if($search_target == 'module')-->class="active"<!--@end-->>Select Module:
<select id="comment_modules" name="comment_modules" onchange="location.href='{getUrl('search_target','module','search_keyword','')}&search_keyword='+this.value">
| <label for="comment_modules" <!--@if($search_target == 'module')-->class="active"<!--@end-->>{$lang->select_module}:
<select id="comment_modules" name="comment_modules" onchange="location.href='{getUrl('search_target','module','search_keyword','')}&amp;search_keyword='+this.value">
<option></option>
<!--@foreach($modules_list as $key => $node)-->
<option value="{$key}"<!--@if($key==$search_keyword)-->selected<!--@end-->>{$node}</option>
@ -136,14 +136,14 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</form>
</div>
<div class="search">
<form action="" class="pagination">
<form action="./" class="pagination">
<input type="hidden" name="error_return_url" value="" />
<input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" />
<input cond="$search_keyword" type="hidden" name="search_keyword" value="{$search_keyword}" />
<input cond="$search_target" type="hidden" name="search_target" value="{$search_target}" />
<a href="{getUrl('page', '')}" class="direction">&laquo; FIRST</a>
<a href="{getUrl('page', '')}" class="direction">&laquo; {$lang->first_page}</a>
<block cond="$page_navigation->first_page + $page_navigation->page_count > $page_navigation->last_page && $page_navigation->page_count != $page_navigation->total_page">
{@$isGoTo = true}
<a href="{getUrl('page', '')}">1</a>
@ -159,7 +159,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<a href="#goTo" class="tgAnchor" title="{$lang->cmd_go_to_page}">...</a>
<a href="{getUrl('page', $page_navigation->last_page)}">{$page_navigation->last_page}</a>
</block>
<a href="{getUrl('page', $page_navigation->last_page)}" class="direction">LAST &raquo;</a>
<a href="{getUrl('page', $page_navigation->last_page)}" class="direction">{$lang->last_page} &raquo;</a>
<span cond="$isGoTo" id="goTo" class="tgContent">
<input name="page" title="{$lang->cmd_go_to_page}" />
<button type="submit">Go</button>

View file

@ -13,7 +13,7 @@
<!-- 목록 -->
<div class="table">
<table width="100%" border="1" cellspacing="0">
<caption>Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}</caption>
<caption>{$lang->all} {number_format($total_count)}, {$lang->page} {number_format($page)}/{number_format($total_page)}</caption>
<thead>
<tr>
<th scope="col"><input type="checkbox" onclick="XE.checkboxToggleAll(); return false;" /></th>
@ -49,7 +49,7 @@
<!-- 페이지 네비게이션 -->
<div class="pagination">
<a href="{getUrl('page','','module_srl','')}" class="direction">&lsaquo; {$lang->first_page}</a>
<a href="{getUrl('page','','module_srl','')}" class="direction">&laquo; {$lang->first_page}</a>
<!--@while($page_no = $page_navigation->getNextPage())-->
<!--@if($page == $page_no)-->
<strong>{$page_no}</strong>
@ -57,5 +57,5 @@
<a href="{getUrl('page',$page_no,'module_srl','')}">{$page_no}</a>
<!--@end-->
<!--@end-->
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="direction">{$lang->last_page} &rsaquo;</a>
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="direction">{$lang->last_page} &raquo;</a>
</div>

View file

@ -19,11 +19,13 @@
**/
function procCommunicationAdminInsertConfig() {
// get the default information
$args = Context::gets('skin','colorset','editor_skin','editor_colorset');
$args = Context::gets('skin','colorset','editor_skin','editor_colorset', 'mskin');
if(!$args->skin) $args->skin = 'default';
if(!$args->colorset) $args->colorset = 'white';
if(!$args->editor_skin) $args->editor_skin = 'default';
if(!$args->mskin) $args->mskin = 'default';
if(!$args->skin) $args->skin = "default";
if(!$args->colorset) $args->colorset = "white";
if(!$args->editor_skin) $args->editor_skin = "default";
// create the module module Controller object
$oModuleController = &getController('module');
$output = $oModuleController->insertModuleConfig('communication',$args);

View file

@ -28,10 +28,14 @@
Context::set('editor_skin_list', $oEditorModel->getEditorSkinList() );
// get a list of communication skins
Context::set('communication_skin_list', $oModuleModel->getSkins($this->module_path) );
// get a list of communication skins
Context::set('communication_mobile_skin_list', $oModuleModel->getSkins($this->module_path, 'm.skins') );
$security = new Security();
$security->encodeHTML('communication_config..');
$security->encodeHTML('editor_skin_list..');
$security->encodeHTML('communication_skin_list..title');
$security->encodeHTML('communication_skin_list..title');
$security->encodeHTML('communication_mobile_skin_list..title');
// specify a template
$this->setTemplatePath($this->module_path.'tpl');

View file

@ -23,6 +23,19 @@
**/
function checkUpdate() {
if(!is_dir("./files/member_extra_info/new_message_flags")) return true;
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('message');
if($config->skin)
{
$config_parse = explode('.', $config->skin);
if (count($config_parse) > 1)
{
$template_path = sprintf('./themes/%s/modules/communication/', $config_parse[0]);
if(is_dir($template_path)) return true;
}
}
return false;
}
@ -33,6 +46,24 @@
function moduleUpdate() {
if(!is_dir("./files/member_extra_info/new_message_flags"))
FileHandler::makeDir('./files/member_extra_info/new_message_flags');
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('message');
if($config->skin)
{
$config_parse = explode('.', $config->skin);
if (count($config_parse) > 1)
{
$template_path = sprintf('./themes/%s/modules/communication/', $config_parse[0]);
if(is_dir($template_path))
{
$config->skin = implode('|@|', $config_parse);
$oModuleController = &getController('module');
$oModuleController->updateModuleConfig('communication', $config);
}
}
}
return new Object(0, 'success_updated');
}

View file

@ -0,0 +1,68 @@
<?php
require_once(_XE_PATH_.'modules/communication/communication.view.php');
class communicationMobile extends communicationView {
function init() {
$oCommunicationModel = &getModel('communication');
$this->communication_config = $oCommunicationModel->getConfig();
$skin = $this->communication_config->mskin;
Context::set('communication_config', $this->communication_config);
$tpl_path = sprintf('%sm.skins/%s', $this->module_path, $skin);
$this->setTemplatePath($tpl_path);
}
function dispCommunicationMessages()
{
// Error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
}
$logged_info = Context::get('logged_info');
if(!array_key_exists('dispCommunicationMessages', $logged_info->menu_list))
{
return $this->stop('msg_invalid_request');
}
// Set the variables
$message_srl = Context::get('message_srl');
$message_type = 'R';
Context::set('message_type', $message_type);
$oCommunicationModel = &getModel('communication');
// extract contents if message_srl exists
if($message_srl)
{
$templateFile = 'read_message';
$columnList = array('message_srl', 'sender_srl', 'receiver_srl', 'message_type', 'title', 'content', 'readed', 'regdate');
$message = $oCommunicationModel->getSelectedMessage($message_srl, $columnList);
if($message->message_srl == $message_srl && ($message->receiver_srl == $logged_info->member_srl) )
{
stripEmbedTagForAdmin($message->content, $message->sender_srl);
Context::set('message', $message);
}
}
else
{
$templateFile = 'messages';
}
// Extract a list
$columnList = array('message_srl', 'readed', 'title', 'member.member_srl', 'member.nick_name', 'message.regdate', 'readed_date');
$output = $oCommunicationModel->getMessages($message_type, $columnList);
// set a template file
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('message_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
$oSecurity = new Security();
$oSecurity->encodeHTML('message_list..nick_name');
$this->setTemplateFile($templateFile);
}
}

View file

@ -25,6 +25,7 @@
if(!$communication_config->skin) $communication_config->skin = 'default';
if(!$communication_config->colorset) $communication_config->colorset = 'white';
if(!$communication_config->editor_skin) $communication_config->editor_skin = 'default';
if(!$communication_config->mskin) $communication_config->mskin = 'default';
return $communication_config;
}

View file

@ -19,7 +19,7 @@
Context::set('communication_config', $this->communication_config);
$config_parse = explode('.', $skin);
$config_parse = explode('|@|', $skin);
if (count($config_parse) > 1){
$tpl_path = sprintf('./themes/%s/modules/communication/', $config_parse[0]);
}else{

View file

@ -0,0 +1,127 @@
@charset "utf-8";
/* Mobile XE (/modules/board/m.skins/default) */
body{margin:0;background:#fff;color:#000;word-wrap:break-word}
body,input,textarea,select,button,table{font-family:Tahoma,Geneva,sans-serif}
img{border:0}
em{font-style:normal}
form{margin:0;padding:0}
fieldset{margin:0;padding:0;border:0}
textarea{resize:vertical}
input[type=checkbox],
input[type=radio]{width:13px;height:13px;margin:0;padding:0}
/* Common */
.fl{float:left}
.fr{float:right}
/* Background */
.rp li li,
.rp .answer,
.rp .btn,
/* Body */
.bd{background:#f8f8f8;padding:1px 0}
.co{margin:10px;line-height:1.4;font-size:14px;color:#333}
.co:after{content:"";display:block;clear:both;zoom:1}
/* Hx */
.hx{position:relative;border-bottom:1px solid #ccc8be;padding:8px 10px;margin:0}
.hx:after{content:"";margin:0 -10px;position:relative;top:10px;display:block;clear:both;height:1px;background:#fff}
.hx.h2{background:#e5e5e5;text-shadow:1px 1px 0 #fff;padding-right:40px}
.hx.h2 em{font-size:12px;color:#6352d2}
.hx.h3{background:#868686;color:#fff}
.hx.h3 em{font-size:12px}
.hx h2, .hx h3{margin:0 10px 0 0;display:inline}
.hx h2{font-size:16px;line-height:1.4}
.hx h3{font-size:14px}
.hx a{color:#000}
.hx .ex{font-size:12px}
.hx .tg{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;overflow:visible;border:0;cursor:pointer;opacity:0;background:none}
.hx .ca{font-size:12px;text-decoration:underline;color:#333}
.hx .ca:after{content:"";display:inline-block;position:relative;left:4px;width:0;height:0;border:4px solid;border-color:transparent;border-left-color:#8d7de1;margin:0 -8px 0 0}
.hx .write{position:absolute;top:8px;right:10px;background-position:0 0;display:inline-block;width:28px;height:27px;font-size:0;overflow:hidden;text-indent:-28px}
/* Global Navigation */
.gn{margin:0;padding:0;list-style:none;background:#d3d1cc;text-shadow:1px 1px 0 #fff}
.gn li{background:#c3c3c3;border:1px solid #a3a09a;border-left:0;border-right:0;margin:0 0 -1px 0}
.gn li li{background:#f8f8f8;border:1px solid #c9c9c9;border-left:0;border-right:0}
.gn li li li{background:#e8e8e8}
.gn ul{margin:0 0 -1px 0;padding:0;list-style:none}
.gn a{position:relative;text-decoration:none;display:block;padding:10px;font-size:16px}
.gn li a{color:#333}
.gn li a:after{position:absolute;top:7px;right:10px;content:"";color:#888;font-size:18px;font-weight:bold;font-family:Verdana, Geneva, sans-serif}
.gn li li a:before{content:"";display:inline-block;width:6px;height:6px;border:1px dotted #666;border-top:0;border-right:0;margin:0 4px 0 0;vertical-align:top}
.gn li li a{padding-left:15px}
.gn li li li a{padding-left:30px}
.gn li li li li a{padding-left:45px}
.gn li li li li li a{padding-left:60px}
.gn em{color:#6352d2;font-size:12px}
/* List */
.lt{margin:0;padding:0;list-style:none;background:#f8f8f8;font-size:14px}
.lt li{border-bottom:1px solid #ccc8be;overflow:hidden}
.lt .read{background:url(../img/read.png) no-repeat 10px center;padding:5px 5px 5px 52px}
.lt .unread{background:url(../img/unread.png) no-repeat 10px center;padding:5px 5px 5px 52px}
.lt a{float:left;display:inline-block;text-decoration:none;color:#000;padding:5px}
.lt .memberInfo{float:right;padding:5px 5px 5px 34px;background:url(../img/member.png) no-repeat 10px center;}
.lt .notice{display:inline-block;background:#a06acd;font-weight:bold;color:#fff;font-size:12px;padding:1px;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px}
.lt .title{display:block;margin:0 0 5px 0}
.lt .title strong{font-size:14px;font-weight:bold}
.lt .title em{font-size:12px;color:#333;color:#6352d2}
.lt .auth{display:block;font-size:12px}
.lt .auth .time{padding:0 5px;border-left:1px solid #bfbfbf}
/* Toggle Open */
.tgo{display:none;background:#f8f8f8;color:#333;margin:0;padding:0;list-style:none;font-size:14px;color:#333}
.tgo.open{display:block}
.file{margin:0;padding:0;list-style:none}
.file li{border-top:1px solid #c9c9c9;border-bottom:1px solid #c9c9c9;margin:0 0 -1px 0}
.file a{text-decoration:none;display:block;padding:10px 0 10px 10px;color:#333}
.file .size{font-size:12px;border-left:1px solid #bfbfbf;margin:0 5px;padding:0 10px;color:#666}
.rp ul{margin:10px 0 -11px -10px;padding:0;list-style:none}
.rp li{border-top:1px solid #c9c9c9;border-bottom:1px solid #c9c9c9;padding:10px 0 10px 10px;margin:0 0 -1px 0}
.rp .xe_content, .rp p{margin:0 0 5px 0}
.rp ul ul{margin-left:-25px}
.rp ul ul ul{margin-left:-40px}
.rp ul ul ul ul{margin-left:-55px}
.rp ul ul ul ul ul{margin-left:-70px}
.rp ul ul ul ul ul ul{margin-left:-85px}
.rp li li,
.rp .answer{padding-left:25px;background-position:10px -145px}
.rp li li li{padding-left:40px;background-position:25px -145px}
.rp li li li li{padding-left:55px;background-position:40px -145px}
.rp li li li li li{padding-left:70px;background-position:55px -145px}
.rp li li li li li li{padding-left:85px;background-position:70px -145px}
.rp .btn{display:inline-block;width:15px;height:15px;overflow:hidden;vertical-align:middle;text-indent:15px}
.rp .btn.ed{background-position:0 -32px}
.rp .btn.de{background-position:-15px -32px}
.rp .btn.re{background-position:-30px -32px}
.rp .auth{font-size:12px}
.rp .auth .time{padding:0 5px;border-left:1px solid #bfbfbf}
/* Form Field */
.origin{padding:10px 0;margin:0 10px;font-size:14px}
.ff{margin:0;padding:10px 0}
.ff ul{margin:0 10px 10px 10px;padding:10px 0 0 0;list-style:none}
.ff li{margin:0 0 5px 0;padding:0}
.ff label{margin-right:10px}
.ff label+input[type=text],
.ff label+input[type=password],
.ff label+textarea,
.ff label+select{display:block;width:96%;font-size:14px;margin:0 0 5px 0}
.ff label+input[type=text],
.ff label+input[type=password],
.ff label+textarea{padding:5px}
/* Button Area */
.bna{text-align:center;padding:0 10px;margin:10px 0;zoom:1}
.bna:after{content:"";display:block;clear:both}
.bn{display:inline-block;line-height:26px !important;padding:0 10px;font-size:12px;font-weight:bold;border:1px solid;text-decoration:none;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;cursor:pointer;vertical-align:middle}
.bn[type=submit],
.bn[type=button]{height:28px}
.bn[href]{height:26px}
.bn.dark{border-color:#666;background:#777 -webkit-gradient(linear,0% 0%,0% 100%,from(#7e7c78),to(#5c5b58));background:#777 -moz-linear-gradient(top,#7e7c78,#5c5b58);background-color:#777;color:#fff;box-shadow:0 0 1px #fff inset;-moz-box-shadow:0 0 1px #fff inset;-webkit-box-shadow:0 0 1px #fff inset}
.bn.white{border-color:#b5b5b5;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#f6f6f6),color-stop(0.5,#f0f0f0),color-stop(0.5,#e4e4e4));background:#1b1b1b -moz-linear-gradient(top,#fff,#e4e4e4);background-color:#fff;color:#000}
/* Pagination */
.pn{font-size:12px;text-align:center;background:#f2f0ec;padding:15px 0;border-top:1px solid #fff}
.pn a{color:#333;text-decoration:none}
.pn strong{margin:0 10px}
.pn .prev:before{content:"";display:inline-block;width:0;height:0;margin:0 4px 0 0;border:4px solid;border-color:transparent;border-right-color:#999}
.pn .next:after{content:"";display:inline-block;width:0;height:0;margin:0 0 0 4px;border:4px solid;border-color:transparent;border-left-color:#999}
/* Search */
.sh{border:1px solid #bfbfbf;border-left:0;border-right:0;background:#e8e8e8;padding:10px;text-align:center}
.sh *{vertical-align:top}
.sh select{width:80px;font-size:14px;margin:0 0 5px 0}
.sh input[type=text]{width:160px;margin:0;font-size:14px;padding:5px}
.sh .shbn{width:28px;height:28px;border:1px solid #666;background:#777 url(../img/mx.png) no-repeat 5px -60px;box-shadow:0 0 1px #fff inset;-moz-box-shadow:0 0 1px #fff inset;-webkit-box-shadow:0 0 1px #fff inset;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;cursor:pointer}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,17 @@
<load target="css/mcommunication.css" />
<div class="bd">
<div class="hx h2">
<h2>{$lang->message_box['R']}</h2>
</div>
<ul class="lt">
<li loop="$message_list => $no,$val" class="read"|cond="$val->readed == 'Y'" class="unread"|cond="$val->readed != 'Y'">
<a href="{getUrl('message_srl', $val->message_srl)}">{$val->title}</a>
<span class="memberInfo">{$val->nick_name} ({zdate($val->regdate,"Y-m-d")})</span>
</li>
</ul>
<div class="pn">
<a cond="$page != 1" href="{getUrl('page',$page-1,'document_srl','')}" class="prev">{$lang->cmd_prev}</a>
<strong>{$page} / {$page_navigation->last_page}</strong>
<a cond="$page != $page_navigation->last_page" href="{getUrl('page',$page+1,'document_srl','')}" class="next">{$lang->cmd_next}</a>
</div>
</div>

View file

@ -0,0 +1,12 @@
<load target="css/mcommunication.css" />
<div class="hx h2">
<h2>{$message->title}</h2><span class="ex">{$message->nick_name} | {zdate($message->regdate, "Y.m.d H:i")}</span>
</div>
<div class="co">
<div class="xe_content">{$message->content}</div>
</div>
<div class="bna">
<span class="fl"><a href="{getUrl('message_srl', '')}" class="bn white">{$lang->cmd_list}</a></span>
</div>

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<skin version="0.2">
<title xml:lang="ko">XE 커뮤니케이션 모바일 기본 스킨</title>
<description xml:lang="ko">
XE 커뮤니케이션 모바일 기본 스킨입니다.
NHN (developers@xpressengine.com)
</description>
<version>0.1</version>
<date>2012-08-07</date>
<author email_address="developers@xpressengine.com" link="http://xpressengine.com/">
<name xml:lang="ko">NHN</name>
<name xml:lang="en">NHN</name>
<name xml:lang="zh-TW">NHN</name>
<name xml:lang="tr">NHN</name>
</author>
<extra_vars />
</skin>

View file

@ -39,6 +39,14 @@
<th scope="row">{$lang->colorset}</th>
<td><div id="communication_colorset"></div></td>
</tr>
<tr>
<th scope="row">{$lang->mobile_skin}</th>
<td>
<select name="mskin">
<option loop="$communication_mobile_skin_list => $key,$val" value="{$key}" selected="selected"|cond="$key==$communication_config->mskin" >{$val->title}</option>
</select>
</td>
</tr>
</table>
</div>
<div class="btnArea">

View file

@ -235,7 +235,11 @@ class documentController extends document {
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
if(Mobile::isFromMobilePhone())
{
$obj->content = nl2br(htmlspecialchars($obj->content));
if($obj->use_html != 'Y')
{
$obj->content = htmlspecialchars($obj->content);
}
$obj->content = nl2br($obj->content);
}
// Remove iframe and script if not a top adminisrator in the session.
if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);
@ -408,7 +412,10 @@ class documentController extends document {
}
}
// Remove iframe and script if not a top adminisrator in the session.
if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);
if($logged_info->is_admin != 'Y')
{
$obj->content = removeHackTag($obj->content);
}
// if temporary document, regdate is now setting
if($source_obj->get('status') == $this->getConfigStatus('temp')) $obj->regdate = date('YmdHis');
@ -882,7 +889,10 @@ class documentController extends document {
if($point > 0) $failed_voted = 'failed_voted';
else $failed_voted = 'failed_blamed';
// Return fail if session already has information about votes
if($_SESSION['voted_document'][$document_srl]) return new Object(-1, $failed_voted);
if($_SESSION['voted_document'][$document_srl])
{
return new Object(-1, $failed_voted);
}
// Get the original document
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
@ -891,11 +901,13 @@ class documentController extends document {
$_SESSION['voted_document'][$document_srl] = true;
return new Object(-1, $failed_voted);
}
// Create a member model object
$oMemberModel = &getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// Check if document's author is a member.
if($oDocument->get('member_srl')) {
// Create a member model object
$oMemberModel = &getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// Pass after registering a session if author's information is same as the currently logged-in user's.
if($member_srl && $member_srl == $oDocument->get('member_srl')) {
$_SESSION['voted_document'][$document_srl] = true;
@ -915,6 +927,11 @@ class documentController extends document {
$_SESSION['voted_document'][$document_srl] = true;
return new Object(-1, $failed_voted);
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
// Update the voted count
if($point < 0)
{
@ -931,8 +948,6 @@ class documentController extends document {
$args->point = $point;
$output = executeQuery('document.insertDocumentVotedLog', $args);
if(!$output->toBool()) return $output;
// Leave in the session information
$_SESSION['voted_document'][$document_srl] = true;
$obj->member_srl = $oDocument->get('member_srl');
$obj->module_srl = $oDocument->get('module_srl');
@ -941,8 +956,17 @@ class documentController extends document {
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oDocument->get('blamed_count') : $oDocument->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
$output = ModuleHandler::triggerCall('document.updateVotedCount', 'after', $obj);
if(!$output->toBool()) return $output;
$trigger_output = ModuleHandler::triggerCall('document.updateVotedCount', 'after', $obj);
if(!$trigger_output->toBool()) {
$oDB->rollback();
return $trigger_output;
}
$oDB->commit();
// Leave in the session information
$_SESSION['voted_document'][$document_srl] = true;
// Return result
if($point > 0)
{
@ -959,52 +983,99 @@ class documentController extends document {
* @param int $document_srl
* @return void|Object
*/
function declaredDocument($document_srl) {
function declaredDocument($document_srl)
{
// Fail if session information already has a reported document
if($_SESSION['declared_document'][$document_srl]) return new Object(-1, 'failed_declared');
$trigger_obj = new stdClass();
$trigger_obj->document_srl = $document_srl;
// Call a trigger (before)
$trigger_output = ModuleHandler::triggerCall('document.declaredDocument', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// Check if previously reported
$args->document_srl = $document_srl;
$output = executeQuery('document.getDeclaredDocument', $args);
if(!$output->toBool()) return $output;
$declared_count = $output->data->declared_count;
// Get the original document
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
// Pass if the author's IP address is as same as visitor's.
/*if($oDocument->get('ipaddress') == $_SERVER['REMOTE_ADDR']) {
$_SESSION['declared_document'][$document_srl] = true;
return new Object(-1, 'failed_declared');
}*/
// Check if document's author is a member.
if($oDocument->get('member_srl')) {
if($oDocument->get('member_srl'))
{
// Create a member model object
$oMemberModel = &getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// Pass after registering a session if author's information is same as the currently logged-in user's.
if($member_srl && $member_srl == $oDocument->get('member_srl')) {
if($member_srl && $member_srl == $oDocument->get('member_srl'))
{
$_SESSION['declared_document'][$document_srl] = true;
return new Object(-1, 'failed_declared');
}
}
// Use member_srl for logged-in members and IP address for non-members.
if($member_srl) {
if($member_srl)
{
$args->member_srl = $member_srl;
} else {
}
else
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
}
$args->document_srl = $document_srl;
$output = executeQuery('document.getDocumentDeclaredLogInfo', $args);
// Pass after registering a sesson if reported/declared documents are in the logs.
if($output->data->count) {
if($output->data->count)
{
$_SESSION['declared_document'][$document_srl] = true;
return new Object(-1, 'failed_declared');
}
// begin transaction
$oDB = &DB::getInstance();
$oDB->begin();
// Add the declared document
if($declared_count > 0) $output = executeQuery('document.updateDeclaredDocument', $args);
else $output = executeQuery('document.insertDeclaredDocument', $args);
if(!$output->toBool()) return $output;
// Leave logs
$output = executeQuery('document.insertDocumentDeclaredLog', $args);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
// Call a trigger (after)
$trigger_obj->declared_count = $declared_count + 1;
$trigger_output = ModuleHandler::triggerCall('document.declaredDocument', 'after', $trigger_obj);
if(!$trigger_output->toBool())
{
$oDB->rollback();
return $trigger_output;
}
// commit
$oDB->commit();
// Leave in the session information
$_SESSION['declared_document'][$document_srl] = true;
@ -1261,17 +1332,23 @@ class documentController extends document {
$js_code = array();
$js_code[] = '<script type="text/javascript">//<![CDATA[';
$js_code[] = '(function($){';
$js_code[] = 'var validator = xe.getApp("validator")[0];';
$js_code[] = 'if(!validator) return false;';
$js_code[] = 'var validator = xe.getApp("validator")[0];';
$js_code[] = 'if(!validator) return false;';
$logged_info = Context::get('logged_info');
$logged_info = Context::get('logged_info');
foreach($extra_keys as $idx => $val) {
$js_code[] = sprintf('validator.cast("ADD_MESSAGE", ["extra_vars%s","%s"]);', $val->idx, $val->name);
if($val->is_required == 'Y') $js_code[] = sprintf('validator.cast("ADD_EXTRA_FIELD", ["extra_vars%s", { required:true }]);', $val->idx);
}
foreach($extra_keys as $idx => $val)
{
$idx = $val->idx;
if($val->type == 'kr_zip')
{
$idx .= '[]';
}
$js_code[] = sprintf('validator.cast("ADD_MESSAGE", ["extra_vars%s","%s"]);', $idx, $val->name);
if($val->is_required == 'Y') $js_code[] = sprintf('validator.cast("ADD_EXTRA_FIELD", ["extra_vars%s", { required:true }]);', $idx);
}
$js_code[] = '})(jQuery);';
$js_code[] = '})(jQuery);';
$js_code[] = '//]]></script>';
$js_code = implode("\n", $js_code);

View file

@ -193,224 +193,102 @@
*/
function getDocumentList($obj, $except_notice = false, $load_extra_vars=true, $columnList = array()) {
$sort_check = $this->_setSortIndex($obj, $load_extra_vars);
$obj->sort_index = $sort_check->sort_index;
$obj->sort_index = $sort_check->sort_index;
// cache controll
$oCacheHandler = &CacheHandler::getInstance('object');
if($oCacheHandler->isSupport()){
$object_key = 'object:'.$obj->module_srl.'_category_srl:'.$obj->category_srl.'_list_count:'.$obj->list_count.'_search_target:'.$obj->search_target.'_search_keyword:'.$obj->search_keyword.'_page'.$obj->page.'_sort_index:'.$obj->sort_index.'_order_type:'.$obj->order_type;
$cache_key = $oCacheHandler->getGroupKey('documentList', $object_key);
$output = $oCacheHandler->get($cache_key);
$output = $oCacheHandler->get($cache_key);
if($output)
{
return $output;
}
}
if(!$output){
$logged_info = Context::get('logged_info');
$sort_check = $this->_setSortIndex($obj, $load_extra_vars);
$this->_setSearchOption($obj, $args, $query_id, $use_division);
$obj->sort_index = $sort_check->sort_index;
// Check the target and sequence alignment
if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc';
// If that came across mid module_srl instead of a direct module_srl guhaejum
if($obj->mid) {
$oModuleModel = &getModel('module');
$obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid);
unset($obj->mid);
}
// Module_srl passed the array may be a check whether the array
if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl);
else $args->module_srl = $obj->module_srl;
// Except for the test module_srl
if(is_array($obj->exclude_module_srl)) $args->exclude_module_srl = implode(',', $obj->exclude_module_srl);
else $args->exclude_module_srl = $obj->exclude_module_srl;
// Variable check
$args->category_srl = $obj->category_srl?$obj->category_srl:null;
$args->sort_index = $obj->sort_index;
$args->order_type = $obj->order_type;
$args->page = $obj->page?$obj->page:1;
$args->list_count = $obj->list_count?$obj->list_count:20;
$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 ($sort_check->isExtraVars)
{
$output = executeQueryArray($query_id, $args);
}
else
{
// document.getDocumentList query execution
// Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because
$groupByQuery = array('document.getDocumentListWithinComment' => 1, 'document.getDocumentListWithinTag' => 1);
if(isset($groupByQuery[$query_id])) {
$group_args = clone($args);
$group_args->sort_index = 'documents.'.$args->sort_index;
$output = executeQueryArray($query_id, $group_args);
if(!$output->toBool()||!count($output->data)) return $output;
// only admin document list, temp document showing
if($obj->statusList) $args->statusList = $obj->statusList;
else
{
if($logged_info->is_admin == 'Y' && !$obj->module_srl)
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp'));
else
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'));
}
// Category is selected, further sub-categories until all conditions
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);
}
// Used to specify the default query id (based on several search options to query id modified)
$query_id = 'document.getDocumentList';
// If the search by specifying the document division naeyonggeomsaekil processed for
$use_division = false;
// Search options
$searchOpt->search_target = $obj->search_target;
$searchOpt->search_keyword = $obj->search_keyword;
$this->_setSearchOption($searchOpt, $args, $query_id, $use_division);
if ($sort_check->isExtraVars)
{
$query_id = 'document.getDocumentListExtraSort';
$output = executeQueryArray($query_id, $args);
}
else
{
/**
* list_order asc sort of division that can be used only when
*/
if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false;
/**
* If it is true, use_division changed to use the document division
*/
if($use_division) {
// Division begins
$division = (int)Context::get('division');
// order by list_order and (module_srl===0 or module_srl many count), therefore case table full scan
if($args->sort_index == 'list_order' && ($args->exclude_module_srl === '0' || count(explode(',', $args->module_srl)) > 5))
{
$listSqlID = 'document.getDocumentListUseIndex';
$divisionSqlID = 'document.getDocumentDivisionUseIndex';
}
else
{
$listSqlID = 'document.getDocumentList';
$divisionSqlID = 'document.getDocumentDivision';
}
// If you do not value the best division top
if(!$division) {
$division_args->module_srl = $args->module_srl;
$division_args->exclude_module_srl = $args->exclude_module_srl;
$division_args->list_count = 1;
$division_args->sort_index = $args->sort_index;
$division_args->order_type = $args->order_type;
$division_args->statusList = $args->statusList;
$output = executeQuery($listSqlID, $division_args, $columnList);
if($output->data) {
$item = array_pop($output->data);
$division = $item->list_order;
}
$division_args = null;
}
// The last division
$last_division = (int)Context::get('last_division');
// Division after division from the 5000 value of the specified Wanted
if(!$last_division) {
$last_division_args->module_srl = $args->module_srl;
$last_division_args->exclude_module_srl = $args->exclude_module_srl;
$last_division_args->list_count = 1;
$last_division_args->sort_index = $args->sort_index;
$last_division_args->order_type = $args->order_type;
$last_division_args->list_order = $division;
$last_division_args->page = 5001;
$output = executeQuery($divisionSqlID, $last_division_args, $columnList);
if($output->data) {
$item = array_pop($output->data);
$last_division = $item->list_order;
}
}
// Make sure that after last_division article
if($last_division) {
$last_division_args = null;
$last_division_args->module_srl = $args->module_srl;
$last_division_args->exclude_module_srl = $args->exclude_module_srl;
$last_division_args->list_order = $last_division;
$output = executeQuery("document.getDocumentDivisionCount", $last_division_args);
if($output->data->count<1) $last_division = null;
}
$args->division = $division;
$args->last_division = $last_division;
Context::set('division', $division);
Context::set('last_division', $last_division);
foreach($output->data as $key => $val) {
if($val->document_srl) $target_srls[] = $val->document_srl;
}
// document.getDocumentList query execution
// Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because
if(in_array($query_id, array('document.getDocumentListWithinComment', 'document.getDocumentListWithinTag'))) {
$group_args = clone($args);
$group_args->sort_index = 'documents.'.$args->sort_index;
$output = executeQueryArray($query_id, $group_args);
if(!$output->toBool()||!count($output->data)) return $output;
foreach($output->data as $key => $val) {
if($val->document_srl) $target_srls[] = $val->document_srl;
}
$page_navigation = $output->page_navigation;
$keys = array_keys($output->data);
$virtual_number = $keys[0];
$target_args->document_srls = implode(',',$target_srls);
$target_args->list_order = $args->sort_index;
$target_args->order_type = $args->order_type;
$target_args->list_count = $args->list_count;
$target_args->page = 1;
$output = executeQueryArray('document.getDocuments', $target_args);
$output->page_navigation = $page_navigation;
$output->total_count = $page_navigation->total_count;
$output->total_page = $page_navigation->total_page;
$output->page = $page_navigation->cur_page;
} else {
$output = executeQueryArray($query_id, $args, $columnList);
}
}
// Return if no result or an error occurs
if(!$output->toBool()||!count($output->data)) return $output;
$idx = 0;
$data = $output->data;
unset($output->data);
if(!isset($virtual_number))
{
$keys = array_keys($data);
$page_navigation = $output->page_navigation;
$keys = array_keys($output->data);
$virtual_number = $keys[0];
$target_args->document_srls = implode(',',$target_srls);
$target_args->list_order = $args->sort_index;
$target_args->order_type = $args->order_type;
$target_args->list_count = $args->list_count;
$target_args->page = 1;
$output = executeQueryArray('document.getDocuments', $target_args);
$output->page_navigation = $page_navigation;
$output->total_count = $page_navigation->total_count;
$output->total_page = $page_navigation->total_page;
$output->page = $page_navigation->cur_page;
} else {
$output = executeQueryArray($query_id, $args, $columnList);
}
if($except_notice) {
foreach($data as $key => $attribute) {
if($attribute->is_notice == 'Y') $virtual_number --;
}
}
foreach($data as $key => $attribute) {
if($except_notice && $attribute->is_notice == 'Y') continue;
$document_srl = $attribute->document_srl;
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) {
$oDocument = null;
$oDocument = new documentItem();
$oDocument->setAttribute($attribute, false);
if($is_admin) $oDocument->setGrant();
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
}
$output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl];
$virtual_number --;
}
if($load_extra_vars) $this->setToAllDocumentExtraVars();
if(count($output->data)) {
foreach($output->data as $number => $document) {
$output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl];
}
}
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output);
}
// Return if no result or an error occurs
if(!$output->toBool()||!count($output->data)) return $output;
$idx = 0;
$data = $output->data;
unset($output->data);
if(!isset($virtual_number))
{
$keys = array_keys($data);
$virtual_number = $keys[0];
}
if($except_notice) {
foreach($data as $key => $attribute) {
if($attribute->is_notice == 'Y') $virtual_number --;
}
}
foreach($data as $key => $attribute) {
if($except_notice && $attribute->is_notice == 'Y') continue;
$document_srl = $attribute->document_srl;
if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) {
$oDocument = null;
$oDocument = new documentItem();
$oDocument->setAttribute($attribute, false);
if($is_admin) $oDocument->setGrant();
$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument;
}
$output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl];
$virtual_number --;
}
if($load_extra_vars) $this->setToAllDocumentExtraVars();
if(count($output->data)) {
foreach($output->data as $number => $document) {
$output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl];
}
}
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output);
return $output;
}
@ -596,7 +474,7 @@
$url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','ipaddress','search_keyword',$oDocument->getIpAddress());
$oDocumentController->addDocumentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress');
$url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oDocument->getIpAddress());
$url = sprintf("var params = new Array(); params['ipaddress_list']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oDocument->getIpAddress());
$oDocumentController->addDocumentPopupMenu($url,'cmd_add_ip_to_spamfilter','','javascript');
}
}
@ -654,6 +532,23 @@
return $output->data;
}
function getDocumentExtraVarsCount($module_srl, $search_obj = NULL)
{
// Additional search options
$args->module_srl = $module_srl;
$args->category_srl = $search_obj->category_srl;
$args->var_idx = $search_obj->s_var_idx;
$args->var_eid = $search_obj->s_var_eid;
$args->var_value = $search_obj->s_var_value;
$output = executeQuery('document.getDocumentExtraVarsCount', $args);
// Return total number of
$total_count = $output->data->count;
return (int)$total_count;
}
/**
* Import page of the document, module_srl Without throughout ..
* @param documentItem $oDocument
@ -661,62 +556,34 @@
* @return int
*/
function getDocumentPage($oDocument, $opt) {
// Sort type changes depending on the query args
switch($opt->sort_index) {
case 'update_order' :
if($opt->order_type == 'desc') $args->rev_update_order = $oDocument->get('update_order');
else $args->update_order = $oDocument->get('update_order');
break;
case 'regdate' :
if($opt->order_type == 'asc') $args->rev_regdate = $oDocument->get('regdate');
else $args->regdate = $oDocument->get('regdate');
break;
case 'voted_count' :
case 'blamed_count' :
case 'readed_count' :
case 'comment_count' :
case 'title' :
return 1;
break;
default :
if($opt->order_type == 'desc') $args->rev_list_order = $oDocument->get('list_order');
else $args->list_order = $oDocument->get('list_order');
break;
}
$args->module_srl = $oDocument->get('module_srl');
$args->sort_index = $opt->sort_index;
$args->order_type = $opt->order_type;
$this->_setSearchOption($opt, $args, $query_id, $use_division);
$sort_check = $this->_setSortIndex($args, TRUE);
if($opt->statusList) $args->statusList = $opt->statusList;
if($sort_check->isExtraVars)
{
return 1;
}
else
{
$logged_info = Context::get('logged_info');
if($logged_info->is_admin == 'Y' && !$args->module_srl)
if($sort_check->sort_index === 'list_order' || $sort_check->sort_index === 'update_order')
{
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp'));
if($args->order_type === 'desc')
{
$args->{'rev_' . $sort_check->sort_index} = $oDocument->get($sort_check->sort_index);
}
else
{
$args->{$sort_check->sort_index} = $oDocument->get($sort_check->sort_index);
}
}
else
{
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'));
}
}
// Category is selected, further sub-categories until all conditions
if($opt->category_srl)
{
$categoryList = $this->getCategoryList($opt->module_srl);
if(array_key_exists($opt->category_srl, $categoryList))
{
$categoryInfo = $categoryList[$opt->category_srl];
$args->categorySrlList = $categoryInfo->childs;
array_push($args->categorySrlList, $opt->category_srl);
return 1;
}
}
// Guhanhu total number of the article search page
$output = executeQuery('document.getDocumentPage', $args);
$output = executeQuery($query_id . 'Page', $args);
$count = $output->data->count;
$page = (int)(($count-1)/$opt->list_count)+1;
return $page;
@ -1081,8 +948,8 @@
if(is_array($output->data)) return $output->data[0]->document_srl;
return $output->data->document_srl;
}
}
}
/**
* Return docuent's alias
* @param int $document_srl
@ -1299,9 +1166,9 @@
}
/**
* 게시물 목록의 검색 옵션을 Setting함(2011.03.08 - cherryfilter)
* page변수가 없는 상태에서 page 값을 알아오는 method(getDocumentPage) 검색하지 않은 값을 return해서 검색한 값을 가져오도록 검색옵션이 추가 .
* 검색옵션의 중복으로 인해 private method로 별도 분리
* 게시ë¬?목ë¡<EFBFBD>??ê²€???µì…˜??Setting??2011.03.08 - cherryfilter)
* pageë³€?˜ê? ?†ëŠ” ?<EFBFBD>태?<EFBFBD>서 page ê°ì<EFBFBD> ?Œì•„?¤ëŠ” method(getDocumentPage)??ê²€?‰í•˜ì§€ ?Šì? ê°ì<EFBFBD> return?´ì„œ ê²€?‰í•œ ê°ì<EFBFBD> ê°€?¸ì˜¤?„ë¡<EFBFBD> ê²€?‰ì˜µ?˜ì<EFBFBD>´ ì¶”ê? ??
* ê²€?‰ì˜µ?˜ì<EFBFBD>˜ 중복?¼ë¡œ ?¸í•´ private methodë¡?별ë<EFBFBD> 분리
* @param object $searchOpt
* @param object $args
* @param string $query_id
@ -1310,6 +1177,66 @@
*/
function _setSearchOption($searchOpt, &$args, &$query_id, &$use_division)
{
// Variable check
$args->category_srl = $searchOpt->category_srl?$searchOpt->category_srl:null;
$args->order_type = $searchOpt->order_type;
$args->page = $searchOpt->page?$searchOpt->page:1;
$args->list_count = $searchOpt->list_count?$searchOpt->list_count:20;
$args->page_count = $searchOpt->page_count?$searchOpt->page_count:10;
$args->start_date = $searchOpt->start_date?$searchOpt->start_date:null;
$args->end_date = $searchOpt->end_date?$searchOpt->end_date:null;
$args->member_srl = $searchOpt->member_srl;
$logged_info = Context::get('logged_info');
$sort_check = $this->_setSortIndex($searchOpt, $load_extra_vars);
$args->sort_index = $sort_check->sort_index;
// Check the target and sequence alignment
$orderType = array('desc' => 1, 'asc' => 1);
if(!isset($orderType[$args->order_type])) $args->order_type = 'asc';
// If that came across mid module_srl instead of a direct module_srl guhaejum
if($searchOpt->mid) {
$oModuleModel = &getModel('module');
$args->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid);
unset($searchOpt->mid);
}
// Module_srl passed the array may be a check whether the array
if(is_array($searchOpt->module_srl)) $args->module_srl = implode(',', $searchOpt->module_srl);
else $args->module_srl = $searchOpt->module_srl;
// Except for the test module_srl
if(is_array($searchOpt->exclude_module_srl)) $args->exclude_module_srl = implode(',', $searchOpt->exclude_module_srl);
else $args->exclude_module_srl = $searchOpt->exclude_module_srl;
// only admin document list, temp document showing
if($searchOpt->statusList) $args->statusList = $searchOpt->statusList;
else
{
if($logged_info->is_admin == 'Y' && !$searchOpt->module_srl)
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp'));
else
$args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'));
}
// Category is selected, further sub-categories until all conditions
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);
}
// Used to specify the default query id (based on several search options to query id modified)
$query_id = 'document.getDocumentList';
// If the search by specifying the document division naeyonggeomsaekil processed for
$use_division = false;
// Search options
$search_target = $searchOpt->search_target;
$search_keyword = $searchOpt->search_keyword;
@ -1380,6 +1307,93 @@
break;
}
}
if ($sort_check->isExtraVars)
{
$query_id = 'document.getDocumentListExtraSort';
}
else
{
/**
* list_order asc sort of division that can be used only when
*/
if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false;
/**
* If it is true, use_division changed to use the document division
*/
if($use_division) {
// Division begins
$division = (int)Context::get('division');
// order by list_order and (module_srl===0 or module_srl may count), therefore case table full scan
if($args->sort_index == 'list_order' && ($args->exclude_module_srl === '0' || count(explode(',', $args->module_srl)) > 5))
{
$listSqlID = 'document.getDocumentListUseIndex';
$divisionSqlID = 'document.getDocumentDivisionUseIndex';
}
else
{
$listSqlID = 'document.getDocumentList';
$divisionSqlID = 'document.getDocumentDivision';
}
// If you do not value the best division top
if(!$division)
{
$division_args->module_srl = $args->module_srl;
$division_args->exclude_module_srl = $args->exclude_module_srl;
$division_args->list_count = 1;
$division_args->sort_index = $args->sort_index;
$division_args->order_type = $args->order_type;
$division_args->statusList = $args->statusList;
$output = executeQuery($divisionSqlID, $division_args, array('list_order'));
if($output->data)
{
$item = array_pop($output->data);
$division = $item->list_order;
}
$division_args = null;
}
// The last division
$last_division = (int)Context::get('last_division');
// Division after division from the 5000 value of the specified Wanted
if(!$last_division) {
$last_division_args->module_srl = $args->module_srl;
$last_division_args->exclude_module_srl = $args->exclude_module_srl;
$last_division_args->list_count = 1;
$last_division_args->sort_index = $args->sort_index;
$last_division_args->order_type = $args->order_type;
$last_division_args->list_order = $division;
$last_division_args->page = 5001;
$output = executeQuery($divisionSqlID, $last_division_args, array('list_order'));
if($output->data) {
$item = array_pop($output->data);
$last_division = $item->list_order;
}
}
// Make sure that after last_division article
if($last_division)
{
$last_division_args = new stdClass();
$last_division_args->module_srl = $args->module_srl;
$last_division_args->exclude_module_srl = $args->exclude_module_srl;
$last_division_args->list_order = $last_division;
$output = executeQuery('document.getDocumentDivisionCount', $last_division_args);
if($output->data->count<1) $last_division = null;
}
$args->division = $division;
$args->last_division = $last_division;
Context::set('division', $division);
Context::set('last_division', $last_division);
}
}
}
}
?>

View file

@ -0,0 +1,29 @@
<query id="getDocumentExtraVarsCount" action="select">
<tables>
<table query="true" alias="A">
<tables>
<table name="documents" />
<table name="document_extra_vars" alias="extra_vars" />
</tables>
<columns>
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" />
<condition operation="equal" column="extra_vars.var_idx" var="var_idx" pipe="and" />
<condition operation="equal" column="extra_vars.eid" var="var_eid" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" />
<condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" />
</conditions>
<groups>
<group column="extra_vars.document_srl" />
</groups>
</table>
</tables>
<columns>
<column name="count(A.count)" alias="count" />
</columns>
</query>

View file

@ -1,30 +1,21 @@
<query id="getDocumentPage" action="select">
<query id="getDocumentListPage" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="count(*)" alias="count" />
<column name="count(document_srl)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" />
<condition operation="in" column="category_srl" var="categorySrlList" pipe="and" />
<condition operation="more" column="comment_count" var="comment_count" filter="number" pipe="and" />
<condition operation="less" column="comment_count" var="rev_comment_count" filter="number" pipe="and" />
<condition operation="more" column="voted_count" var="voted_count" filter="number" pipe="and" />
<condition operation="less" column="voted_count" var="rev_voted_count" filter="number" pipe="and" />
<condition operation="less" column="blamed_count" var="blamed_count" filter="number" pipe="and" />
<condition operation="more" column="blamed_count" var="rev_blamed_count" filter="number" pipe="and" />
<condition operation="more" column="readed_count" var="readed_count" filter="number" pipe="and" />
<condition operation="less" column="readed_count" var="rev_readed_count" filter="number" pipe="and" />
<condition operation="less" column="list_order" var="list_order" filter="number" pipe="and" />
<condition operation="more" column="list_order" var="rev_list_order" filter="number" pipe="and" />
<condition operation="more" column="title" var="title" filter="number" pipe="and" />
<condition operation="less" column="title" var="rev_title" filter="number" pipe="and" />
<condition operation="more" column="regdate" var="regdate" filter="number" pipe="and" />
<condition operation="less" column="regdate" var="rev_regdate" filter="number" pipe="and" />
<condition operation="less" column="update_order" var="update_order" filter="number" pipe="and" />
<condition operation="more" column="update_order" var="rev_update_order" filter="number" pipe="and" />
<condition operation="in" column="module_srl" var="module_srl" filter="number" />
<condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="in" column="category_srl" var="category_srl" pipe="and" />
<condition operation="equal" column="is_notice" var="s_is_notice" pipe="and" />
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="in" column="status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="more" column="list_order" var="division" pipe="and" />
<condition operation="below" column="list_order" var="last_division" pipe="and" />
</group>
<group pipe="and">
<condition operation="like" column="title" var="s_title" />
<condition operation="like" column="content" var="s_content" pipe="or" />
@ -45,5 +36,15 @@
<condition operation="like_prefix" column="last_update" var="s_last_update" pipe="or" />
<condition operation="like_prefix" column="ipaddress" var="s_ipaddress" pipe="or" />
</group>
<group pipe="and">
<condition operation="more" column="last_update" var="start_date" pipe="and" />
<condition operation="less" column="last_update" var="end_date" pipe="and" />
</group>
<group pipe="and">
<condition operation="less" column="list_order" var="list_order" filter="number" pipe="and" />
<condition operation="more" column="list_order" var="rev_list_order" filter="number" pipe="and" />
<condition operation="less" column="update_order" var="update_order" filter="number" pipe="and" />
<condition operation="more" column="update_order" var="rev_update_order" filter="number" pipe="and" />
</group>
</conditions>
</query>

View file

@ -0,0 +1,24 @@
<query id="getDocumentListWithExtraVarsPage" action="select">
<tables>
<table name="documents" />
<table name="document_extra_vars" alias="extra_vars" />
</tables>
<columns>
<column name="count(distinct documents.document_srl)" alias="count" />
</columns>
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" />
<condition operation="equal" column="extra_vars.var_idx" var="var_idx" notnull="notnull" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" />
<condition operation="like" column="extra_vars.value" var="var_value" notnull="notnull" pipe="and" />
<group pipe="and">
<condition operation="less" column="documents.list_order" var="list_order" filter="number" pipe="and" />
<condition operation="more" column="documents.list_order" var="rev_list_order" filter="number" pipe="and" />
<condition operation="less" column="documents.update_order" var="update_order" filter="number" pipe="and" />
<condition operation="more" column="documents.update_order" var="rev_update_order" filter="number" pipe="and" />
</group>
</conditions>
</query>

View file

@ -0,0 +1,28 @@
<query id="getDocumentListWithinCommentPage" action="select">
<tables>
<table name="documents" alias="documents" />
<table name="comments" alias="comments" />
</tables>
<columns>
<column name="count(distinct documents.document_srl)" alias="count" />
</columns>
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" />
<condition operation="equal" column="documents.document_srl" default="comments.document_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="more" column="documents.list_order" var="division" pipe="and" />
<condition operation="below" column="documents.list_order" var="last_division" pipe="and" />
</group>
<condition operation="like" column="comments.content" var="s_comment" notnull="notnull" pipe="and" />
<group pipe="and">
<condition operation="less" column="documents.list_order" var="list_order" filter="number" pipe="and" />
<condition operation="more" column="documents.list_order" var="rev_list_order" filter="number" pipe="and" />
<condition operation="less" column="documents.update_order" var="update_order" filter="number" pipe="and" />
<condition operation="more" column="documents.update_order" var="rev_update_order" filter="number" pipe="and" />
</group>
</conditions>
</query>

View file

@ -21,4 +21,7 @@
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
<groups>
<group column="documents.document_srl" />
</groups>
</query>

View file

@ -0,0 +1,23 @@
<query id="getDocumentListWithinTagPage" action="select">
<tables>
<table name="documents" alias="documents" />
<table name="tags" alias="tags" />
</tables>
<columns>
<column name="count(distinct documents.document_srl)" alias="count" />
</columns>
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="notin" column="documents.module_srl" var="exclude_module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.document_srl" default="tags.document_srl" notnull="notnull" pipe="and" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="like" column="tags.tag" var="s_tags" notnull="notnull" pipe="and" />
<group pipe="and">
<condition operation="less" column="documents.list_order" var="list_order" filter="number" pipe="and" />
<condition operation="more" column="documents.list_order" var="rev_list_order" filter="number" pipe="and" />
<condition operation="less" column="documents.update_order" var="update_order" filter="number" pipe="and" />
<condition operation="more" column="documents.update_order" var="rev_update_order" filter="number" pipe="and" />
</group>
</conditions>
</query>

View file

@ -48,7 +48,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</tr>
</tfoot>
<tbody>
<!--@foreach($document_list as $no => $oDocument)-->
<!--@foreach($document_list as $no => $oDocument)-->
<tr>
<td class="title"><a href="{getUrl('','document_srl',$oDocument->document_srl)}" target="_blank">{$oDocument->getTitle()}</a></td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
@ -122,14 +122,14 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</div>
<div class="search">
<form action="" class="pagination">
<form action="./" class="pagination">
<input type="hidden" name="error_return_url" value="" />
<input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" />
<input cond="$search_keyword" type="hidden" name="search_keyword" value="{$search_keyword}" />
<input cond="$search_target" type="hidden" name="search_target" value="{$search_target}" />
<input cond="$search_keyword" type="hidden" name="search_keyword" value="{$search_keyword}" />
<input cond="$search_target" type="hidden" name="search_target" value="{$search_target}" />
<a href="{getUrl('page', '')}" class="direction">&laquo; FIRST</a>
<a href="{getUrl('page', '')}" class="direction">&laquo; {$lang->first_page}</a>
<block cond="$page_navigation->first_page + $page_navigation->page_count > $page_navigation->last_page && $page_navigation->page_count != $page_navigation->total_page">
{@$isGoTo = true}
<a href="{getUrl('page', '')}">1</a>
@ -145,7 +145,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<a href="#goTo" class="tgAnchor" title="{$lang->cmd_go_to_page}">...</a>
<a href="{getUrl('page', $page_navigation->last_page)}">{$page_navigation->last_page}</a>
</block>
<a href="{getUrl('page', $page_navigation->last_page)}" class="direction">LAST &raquo;</a>
<a href="{getUrl('page', $page_navigation->last_page)}" class="direction">{$lang->last_page} &raquo;</a>
<span cond="$isGoTo" id="goTo" class="tgContent">
<input name="page" title="{$lang->cmd_go_to_page}" />
<button type="submit">Go</button>

View file

@ -59,7 +59,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</tr>
</tfoot>
<tbody>
<!--@foreach($document_list as $no => $oDocument)-->
<!--@foreach($document_list as $no => $oDocument)-->
<tr>
<td class="title"><a href="{getUrl('','document_srl',$oDocument->document_srl)}" target="_blank"><!--@if(trim($oDocument->getTitle()))-->{$oDocument->getTitle()}<!--@else--><em>{$lang->no_title_document}</em><!--@end--></a></td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
@ -133,14 +133,14 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</div>
<div class="search">
<form action="" class="pagination">
<form action="./" class="pagination">
<input type="hidden" name="error_return_url" value="" />
<input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" />
<input cond="$search_keyword" type="hidden" name="search_keyword" value="{$search_keyword}" />
<input cond="$search_target" type="hidden" name="search_target" value="{$search_target}" />
<input cond="$search_keyword" type="hidden" name="search_keyword" value="{$search_keyword}" />
<input cond="$search_target" type="hidden" name="search_target" value="{$search_target}" />
<a href="{getUrl('page', '')}" class="direction">&laquo; FIRST</a>
<a href="{getUrl('page', '')}" class="direction">&laquo; {$lang->first_page}</a>
<block cond="$page_navigation->first_page + $page_navigation->page_count > $page_navigation->last_page && $page_navigation->page_count != $page_navigation->total_page">
{@$isGoTo = true}
<a href="{getUrl('page', '')}">1</a>
@ -156,7 +156,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<a href="#goTo" class="tgAnchor" title="{$lang->cmd_go_to_page}">...</a>
<a href="{getUrl('page', $page_navigation->last_page)}">{$page_navigation->last_page}</a>
</block>
<a href="{getUrl('page', $page_navigation->last_page)}" class="direction">LAST &raquo;</a>
<a href="{getUrl('page', $page_navigation->last_page)}" class="direction">{$lang->last_page} &raquo;</a>
<span cond="$isGoTo" id="goTo" class="tgContent">
<input name="page" title="{$lang->cmd_go_to_page}" />
<button type="submit">Go</button>

View file

@ -22,6 +22,13 @@ var listShow = xe.createPlugin('list', {
w1 = im.$obj.prop('width');
h1 = im.$obj.prop('height');
if (w1 == 0){
w1 = im.$obj.attr('width');
}
if(h1 ==0){
h1 = im.$obj.attr('height');
}
if(w1 > width - 25) {
w2 = width - 25;
scale = w2 / w1;

View file

@ -3,4 +3,5 @@
* @brief List-type image gallery
* @author NHN (developers@xpressengine.com)
**/
(function(k){var h=xe.createPlugin("list",{API_SHOW_LIST:function(i,h){var c=h[0],d,e,j,b,a,g,f;d=this.cast("GET_IMAGES",[c]);if(d.length){c=k("#zone_list_gallery_"+c).empty();width=c.innerWidth();e=0;for(j=d.length;e<j;e++)b=d[e],a=b.$obj.prop("width"),f=b.$obj.prop("height"),a>width-25&&(g=width-25,a=g/a,f=Math.floor(f*a),a=g,b.$obj.attr("rel","xe_gallery")),c.append(b.$obj),b.$obj.css({width:a+"px",height:f,margin:"0 10px",display:"block"})}}}),i=xe.getApp("Gallery")[0];i&&i.registerPlugin(new h)})(jQuery);
(function(k){var h=xe.createPlugin("list",{API_SHOW_LIST:function(i,h){var d=h[0],e,f,j,b,a,g,c;e=this.cast("GET_IMAGES",[d]);if(e.length){d=k("#zone_list_gallery_"+d).empty();width=d.innerWidth();f=0;for(j=e.length;f<j;f++)b=e[f],a=b.$obj.prop("width"),c=b.$obj.prop("height"),0==a&&(a=b.$obj.attr("width")),0==c&&(c=b.$obj.attr("height")),a>width-25&&(g=width-25,a=g/a,c=Math.floor(c*a),a=g,b.$obj.attr("rel","xe_gallery")),d.append(b.$obj),b.$obj.css({width:a+"px",height:c,margin:"0 10px",display:"block"})}}}),
i=xe.getApp("Gallery")[0];i&&i.registerPlugin(new h)})(jQuery);

View file

@ -1,10 +1,10 @@
var selected_node=null;
function getSlideShow(){var c,b,d="",e,a,f,g;if(typeof opener!="undefined"){c=opener.editorPrevNode;b=jQuery(c);if(b.is("img"))selected_node=c,d=$(c).width()-4,c=b.attr("gallery_style"),e=b.attr("gallery_align")||"center",a=b.attr("border_color"),f=b.attr("bg_color"),g=b.attr("border_thickness")||1,get_by_id("width").value=d,get_by_id("gallery_style").selectedIndex=c=="list"?1:0,get_by_id("gallery_align").selectedIndex=e=="left"?1:e=="right"?2:0,get_by_id("border_thickness").value=g,get_by_id("border_color_input").value=
a,manual_select_color("border",get_by_id("border_color_input")),get_by_id("bg_color_input").value=f,manual_select_color("bg",get_by_id("bg_color_input")),d=b.attr("images_list");b=get_by_id("fo").editor_sequence.value;if(b=opener.get_by_id("uploaded_file_list_"+b)){c=get_by_id("image_list");for(e=0;e<b.length;e++){a=b.options[e];f=a.value;if(!f)break;f=opener.uploadedFiles[f].download_url.replace(request_uri,"");/(jpg|jpeg|gif|png)$/i.test(f)&&(g=!1,d.indexOf(f)!=-1&&(g=!0),a=new Option(a.text,a.value,
!1,g),c.options.add(a))}}}}
function insertSlideShow(){if(typeof opener!="undefined"){for(var c=[],b=get_by_id("image_list"),d=0;d<b.length;d++){var e=b.options[d];e.selected&&(e=opener.uploadedFiles[e.value].download_url.replace(request_uri,""),c[c.length]=e)}if(c.length){for(var b=get_by_id("width").value,e=get_by_id("gallery_style").options[get_by_id("gallery_style").selectedIndex].value,a=get_by_id("gallery_align").options[get_by_id("gallery_align").selectedIndex].value,f=get_by_id("border_thickness").value,g=get_by_id("border_color_input").value,
function getSlideShow(){var c,b,d="",e,a,f,g;if("undefined"!=typeof opener&&(c=opener.editorPrevNode,b=jQuery(c),b.is("img")&&(selected_node=c,d=$(c).width()-4,c=b.attr("gallery_style"),e=b.attr("gallery_align")||"center",a=b.attr("border_color"),f=b.attr("bg_color"),g=b.attr("border_thickness")||1,get_by_id("width").value=d,get_by_id("gallery_style").selectedIndex="list"==c?1:0,get_by_id("gallery_align").selectedIndex="left"==e?1:"right"==e?2:0,get_by_id("border_thickness").value=g,get_by_id("border_color_input").value=
a,manual_select_color("border",get_by_id("border_color_input")),get_by_id("bg_color_input").value=f,manual_select_color("bg",get_by_id("bg_color_input")),d=b.attr("images_list")),b=get_by_id("fo").editor_sequence.value,b=opener.get_by_id("uploaded_file_list_"+b))){c=get_by_id("image_list");for(e=0;e<b.length;e++){a=b.options[e];f=a.value;if(!f)break;f=opener.uploadedFiles[f].download_url.replace(request_uri,"");/(jpg|jpeg|gif|png)$/i.test(f)&&(g=!1,-1!=d.indexOf(f)&&(g=!0),a=new Option(a.text,a.value,
!1,g),c.options.add(a))}}}
function insertSlideShow(){if("undefined"!=typeof opener){for(var c=[],b=get_by_id("image_list"),d=0;d<b.length;d++){var e=b.options[d];e.selected&&(e=opener.uploadedFiles[e.value].download_url.replace(request_uri,""),c[c.length]=e)}if(c.length){for(var b=get_by_id("width").value,e=get_by_id("gallery_style").options[get_by_id("gallery_style").selectedIndex].value,a=get_by_id("gallery_align").options[get_by_id("gallery_align").selectedIndex].value,f=get_by_id("border_thickness").value,g=get_by_id("border_color_input").value,
i=get_by_id("bg_color_input").value,h="",d=0;d<c.length;d++)h+=c[d].trim()+" ";selected_node?(selected_node.setAttribute("width",b),selected_node.setAttribute("gallery_style",e),selected_node.setAttribute("align",a),selected_node.setAttribute("gallery_align",a),selected_node.setAttribute("border_thickness",f),selected_node.setAttribute("border_color",g),selected_node.setAttribute("bg_color",i),selected_node.setAttribute("images_list",h),selected_node.style.width=b+"px"):(c='<img src="../../../../common/img/blank.gif" editor_component="image_gallery" width="'+
b+'" gallery_style="'+e+'" align="'+a+'" gallery_align="'+a+'" border_thickness="'+f+'" border_color="'+g+'" bg_color="'+i+'" style="width:'+b+'px;border:2px dotted #4371B9;background:url(./modules/editor/components/image_gallery/tpl/image_gallery_component.gif) no-repeat center;" images_list="'+h+'" />',opener.editorFocus(opener.editorPrevSrl),d=opener.editorGetIFrame(opener.editorPrevSrl),opener.editorReplaceHTML(d,c));opener.editorFocus(opener.editorPrevSrl)}window.close()}}
function select_color(c,b){get_by_id(c+"_preview_color").style.backgroundColor="#"+b;get_by_id(c+"_color_input").value=b}function manual_select_color(c,b){if(b.value.length==6)code=b.value,get_by_id(c+"_preview_color").style.backgroundColor="#"+code}
function printColor(c,b){for(var d=["22","44","66","88","AA","CC","EE"],e="",a=0;a<8;a+=1)e+=printColorBlock(c,a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16),b);for(a=0;a<d.length;a+=3)for(var f=0;f<d.length;f+=2)for(var g=0;g<d.length;g++)e+=printColorBlock(c,d[a]+d[f]+d[g],b);for(a=8;a<16;a+=1)e+=printColorBlock(c,a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16),b);document.write(e)}
function select_color(c,b){get_by_id(c+"_preview_color").style.backgroundColor="#"+b;get_by_id(c+"_color_input").value=b}function manual_select_color(c,b){6==b.value.length&&(code=b.value,get_by_id(c+"_preview_color").style.backgroundColor="#"+code)}
function printColor(c,b){for(var d="22 44 66 88 AA CC EE".split(" "),e="",a=0;8>a;a+=1)e+=printColorBlock(c,a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16),b);for(a=0;a<d.length;a+=3)for(var f=0;f<d.length;f+=2)for(var g=0;g<d.length;g++)e+=printColorBlock(c,d[a]+d[f]+d[g],b);for(a=8;16>a;a+=1)e+=printColorBlock(c,a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16)+a.toString(16),b);document.write(e)}
function printColorBlock(c,b,d){return'<div style="float:left;background-color:#'+b+'"><img src="'+d+'" class="color_icon" onmouseover="this.className=\'color_icon_over\'" onmouseout="this.className=\'color_icon\'" onclick="select_color(\''+c+"','"+b+'\')" alt="color" /></div>'}jQuery(function(){getSlideShow()});

View file

@ -5,5 +5,5 @@
**/
(function(k){var m=xe.createPlugin("slideShow",{_holders:{},_thumbs:{},_current:{},init:function(){this._holders={};this._thumbs={};this._current={}},API_SHOW_SLIDE:function(g,f){var b=this,a=f[0],c="@"+a,d,e,j,i,h,l;d=this.cast("GET_IMAGES",[a]);if(d.length){e=k("#zone_slide_gallery_"+a);i=e.find(".slide_gallery_placeholder").css("overflow","hidden");e.find(".slide_gallery_loading_text").remove();j=e.find(".slide_gallery_thumbnail_image_box").show();h=0;for(l=d.length;h<l;h++)d[h].$obj.clone().css({cursor:"pointer",
width:"60px",height:"60px",margin:"5px",opacity:0.5}).click({idx:h},function(c){b.cast("SET_SLIDE",[a,c.data.idx])}).appendTo(j);k("#zone_gallery_navigator_status_"+a).click(function(){j.toggle()});e.find(".__prev").click(function(){b.cast("PREV_SLIDE",[a]);return!1}).end().find(".__next").click(function(){b.cast("NEXT_SLIDE",[a]);return!1});this._holders[c]=i;this._thumbs[c]=j;this._current[c]=0;this.cast("SET_SLIDE",[a,0])}},_showSideSlide:function(g,f){var b,a;b=this.cast("GET_IMAGES",[g]);b.length&&
(a=this._current["@"+g]+f,0>a?a=b.length-1:a>=b.length&&(a=0),this.cast("SET_SLIDE",[g,a]))},API_NEXT_SLIDE:function(g,f){this._showSideSlide(f[0],1)},API_PREV_SLIDE:function(g,f){this._showSideSlide(f[0],-1)},API_SET_SLIDE:function(g,f){var b=f[0],a=f[1],c,d,e;c=this.cast("GET_IMAGES",[b]);if(c.length&&is_def(d=c[a]))this._current["@"+b]=a,k("#zone_gallery_navigator_status_"+b).text(a+1+"/"+c.length),this._thumbs["@"+b].find("img").eq(a).animate({opacity:1}).end().not(":eq("+a+")").animate({opacity:0.5}),
(a=this._current["@"+g],a+=f,0>a?a=b.length-1:a>=b.length&&(a=0),this.cast("SET_SLIDE",[g,a]))},API_NEXT_SLIDE:function(g,f){this._showSideSlide(f[0],1)},API_PREV_SLIDE:function(g,f){this._showSideSlide(f[0],-1)},API_SET_SLIDE:function(g,f){var b=f[0],a=f[1],c,d,e;c=this.cast("GET_IMAGES",[b]);if(c.length&&is_def(d=c[a]))this._current["@"+b]=a,k("#zone_gallery_navigator_status_"+b).text(a+1+"/"+c.length),this._thumbs["@"+b].find("img").eq(a).animate({opacity:1}).end().not(":eq("+a+")").animate({opacity:0.5}),
b=this._holders["@"+b],c=b.parent().innerWidth(),a=d.$obj.prop("width"),e=d.$obj.prop("height"),0==a&&(a=d.$obj.attr("width")),0==e&&(e=d.$obj.attr("height")),a>c-20&&(c-=20,e=Math.floor(e*(c/a)),a=c,d.$obj.css("cursor","pointer"),d.$obj.attr("rel","xe_gallery")),d.$obj.css({width:a,height:e,margin:"0 10px"}),b.empty().append(d.$obj)}}),i=xe.getApp("Gallery")[0];i&&i.registerPlugin(new m)})(jQuery);

View file

@ -295,10 +295,10 @@
.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_width{width:35px;height:13px}
.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_color,
.xpress-editor .tool li.table .layer fieldset.color dd input#table_bg_color{width:70px;height:15px;*margin-right:3px}
.xpress-editor .tool li.table .layer table{position:absolute;top:18px;left:75px;width:137px;height:40px;table-layout:fixed}
.xpress-editor .tool li.table .layer table{position:absolute;top:18px;left:75px;width:137px;height:40px;table-layout:fixed;border-collapse:separate;border:0}
.xpress-editor .tool li.table .layer table *{font-size:0;line-height:0}
.xpress-editor .tool li.table .layer table th,
.xpress-editor .tool li.table .layer table td{text-align:center}
.xpress-editor .tool li.table .layer table td{text-align:center;padding:0;border:0}
.xpress-editor .tool li.table .layer .btn_area{position:absolute;bottom:12px;padding:0;z-index:1}
.xpress-editor .tool li.table .layer .palette{display:none;position:absolute;z-index:2;left:11px;width:204px;padding:8px 7px 7px 7px;_padding-right:6px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f}
.xpress-editor .tool li.table .layer.p1 .palette{display:block;top:163px}

File diff suppressed because one or more lines are too long

View file

@ -8,25 +8,23 @@
<h1 class="h1">File Upload</h1>
<ul>
<li>
<p class="q">{$lang->allow_outlink}</p>
<p class="q"><label>{$lang->allow_outlink}</label></p>
<p class="a">
<input type="radio" name="allow_outlink" value="Y" id="allow_outlink_y" checked="checked"|cond="$config->allow_outlink == 'Y'" /> <label for="allow_outlink_y">{$lang->cmd_yes}</label>
<input type="radio" name="allow_outlink" value="N" id="allow_outlink_n" checked="checked"|cond="$config->allow_outlink == 'N'" /> <label for="allow_outlink_n">{$lang->cmd_no}</label>
</p>
</li>
<li style="display:none"|cond="$config->allow_outlink == 'N'" class="_outLink">
<p class="q">{$lang->allow_outlink_format}</p>
<p class="a">
<input type="text" name="allow_outlink_format" value="{$config->allow_outlink_format}" />
<p>{$lang->about_allow_outlink_format}</p>
</p>
<p class="q"><label for="allow_outlink_format">{$lang->allow_outlink_format}</label></p>
<p class="a"><input type="text" name="allow_outlink_format" id="allow_outlink_format" value="{$config->allow_outlink_format}" /></p>
<p class="desc">{$lang->about_allow_outlink_format}</p>
</li>
<li style="display:none"|cond="$config->allow_outlink == 'N'" class="_outLink">
<p class="q">{$lang->allow_outlink_site}</p>
<p class="a">
<textarea type="text" name="allow_outlink_site" rows="8" cols="42">{$config->allow_outlink_site}</textarea>
<p>{$lang->about_allow_outlink_site}</p>
</p>
<p class="q"><label for="allow_outlink_site">{$lang->allow_outlink_site}</label></p>
<p class="a"><textarea name="allow_outlink_site" id="allow_outlink_site" rows="8" cols="42">{$config->allow_outlink_site}</textarea></p>
<p class="desc">{$lang->about_allow_outlink_site}</p>
</li>
<li>
<p class="q"><label for="filesize">{$lang->about_allowed_filesize}</label></p>
@ -38,12 +36,11 @@
</li>
<li>
<p class="q"><label for="allowedFiletypes">{$lang->allowed_filetypes}</label></p>
<p class="a"><input id="allowedFiletypes" type="text" name="allowed_filetypes" value="{$config->allowed_filetypes}" />
<p>{$lang->about_allowed_filetypes}</p>
</p>
<p class="a"><input id="allowedFiletypes" type="text" name="allowed_filetypes" value="{$config->allowed_filetypes}" /></p>
<p class="desc">{$lang->about_allowed_filetypes}</p>
</li>
</ul>
<div class="btnArea">
<span class="btn medium"><input type="submit" value="{$lang->cmd_save}" /></span>
</div>
</form>
</form>

View file

@ -93,15 +93,22 @@
* @return void
*/
function procImporterAdminSync() {
$oMemberModel = &getModel('member');
$member_config = $oMemberModel->getMemberConfig();
$postFix = ($member_config->identifier == 'email_address') ? 'ByEmail' : '';
// 계정이 이메일인 경우 이메일 정보로 사용자를 싱크하도록 한다. 이때 변수명은 그대로 user_id를 사용한다.
/* DBMS가 CUBRID인 경우 MySQL과 동일한 방법으로는 문서 댓글에 대한 사용자 정보를 동기화 없으므로 예외 처리 합니다.
CUBRID를 사용하지 않는 경우에만 보편적인 기존 질의문을 사용합니다. */
$db_info = Context::getDBInfo ();
if ($db_info->db_type != "cubrid") {
$output = executeQuery('importer.updateDocumentSync');
$output = executeQuery('importer.updateCommentSync');
$output = executeQuery('importer.updateDocumentSync'.$postFix);
$output = executeQuery('importer.updateCommentSync'.$postFix);
}
else {
$output = executeQueryArray ('importer.getDocumentMemberSrlWithUserID');
$output = executeQueryArray ('importer.getDocumentMemberSrlWithUserID'.$postFix);
if (is_array ($output->data) && count ($output->data)) {
$success_count = 0;
$error_count = 0;
@ -109,7 +116,7 @@
foreach ($output->data as $val) {
$args->user_id = $val->user_id;
$args->member_srl = $val->member_srl;
$tmp = executeQuery ('importer.updateDocumentSyncForCUBRID', $args);
$tmp = executeQuery ('importer.updateDocumentSyncForCUBRID'.$postFix, $args);
if ($tmp->toBool () === true) {
$success_count++;
}
@ -120,7 +127,7 @@
}
} // documents section
$output = executeQueryArray ('importer.getCommentMemberSrlWithUserID');
$output = executeQueryArray ('importer.getCommentMemberSrlWithUserID'.$postFix);
if (is_array ($output->data) && count ($output->data)) {
$success_count = 0;
$error_count = 0;
@ -128,7 +135,7 @@
foreach ($output->data as $val) {
$args->user_id = $val->user_id;
$args->member_srl = $val->member_srl;
$tmp = executeQuery ('importer.updateCommentSyncForCUBRID', $args);
$tmp = executeQuery ('importer.updateCommentSyncForCUBRID'.$postFix, $args);
if ($tmp->toBool () === true) {
$success_count++;
}

View file

@ -0,0 +1,19 @@
<query id="getCommentMemberSrlWithUserIDByEmail" action="select">
<tables>
<table name="member" alias="member" />
<table name="comments" alias="comments" />
</tables>
<columns>
<column name="member.member_srl" alias="member_srl" />
<column name="member.email_address" alias="user_id" />
</columns>
<conditions>
<condition operation="equal" column="comments.email_address" default="member.email_address" />
</conditions>
<groups>
<group column="member_srl" />
</groups>
<navigation>
<index var="member_srl" default="member_srl" order="asc" />
</navigation>
</query>

View file

@ -0,0 +1,19 @@
<query id="getDocumentMemberSrlWithUserIDByEmail" action="select">
<tables>
<table name="member" alias="member" />
<table name="documents" alias="documents" />
</tables>
<columns>
<column name="member.member_srl" alias="member_srl" />
<column name="member.email_address" alias="user_id" />
</columns>
<conditions>
<condition operation="equal" column="documents.email_address" default="member.email_address" />
</conditions>
<groups>
<group column="member_srl" />
</groups>
<navigation>
<index var="member_srl" default="member_srl" order="asc" />
</navigation>
</query>

View file

@ -0,0 +1,12 @@
<query id="updateCommentSyncByEmail" action="update">
<tables>
<table name="comments" alias="comments" />
<table name="member" alias="member" />
</tables>
<columns>
<column name="comments.member_srl" default="member.member_srl" filter="number" />
</columns>
<conditions>
<condition operation="equal" column="comments.email_address" default="member.email_address" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="updateCommentSyncForCUBRIDByEmail" action="update">
<tables>
<table name="comments" />
</tables>
<columns>
<column name="member_srl" var="member_srl" filter="number" />
</columns>
<conditions>
<condition operation="equal" column="email_address" var="user_id" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="updateDocumentSyncByEmail" action="update">
<tables>
<table name="documents" alias="documents" />
<table name="member" alias="member" />
</tables>
<columns>
<column name="documents.member_srl" default="member.member_srl" filter="number" />
</columns>
<conditions>
<condition operation="equal" column="documents.email_address" default="member.email_address" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="updateDocumentSyncForCUBRIDByEmail" action="update">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="member_srl" var="member_srl" filter="number" />
</columns>
<conditions>
<condition operation="equal" column="email_address" var="user_id" />
</conditions>
</query>

View file

@ -9,7 +9,6 @@
<action name="dispInstallDBForm" type="view" standalone="true" />
<action name="dispInstallConfigForm" type="view" standalone="true" />
<action name="dispInstallManagerForm" type="view" standalone="true" />
<action name="procInstallAgreement" type="controller" standalone="true" />
<action name="procCubridDBSetting" type="controller" standalone="true" ruleset="cubrid" />
<action name="procFirebirdDBSetting" type="controller" standalone="true" ruleset="firebird" />
<action name="procMssqlDBSetting" type="controller" standalone="true" ruleset="mssql" />

View file

@ -79,6 +79,10 @@
$admin_ip_list = preg_replace("/[\r|\n|\r\n]+/",",",$admin_ip_list);
$admin_ip_list = preg_replace("/\s+/","",$admin_ip_list);
if(preg_match('/(<\?|<\?php|\?>)/xsm', $admin_ip_list))
{
$admin_ip_list = '';
}
$db_info = Context::getDBInfo();
$db_info->default_url = Context::get('default_url');

View file

@ -22,26 +22,6 @@
$this->etc_tmp_config_file = _XE_PATH_.'files/config/tmpEtc.config.php';
}
/**
* @brief LGPL, Enviroment gathering agreement
**/
function procInstallAgreement()
{
global $lang;
$requestVars = Context::gets('lgpl_agree', 'enviroment_gather');
if($requestVars->lgpl_agree != 'Y') {
return new Object('-1', $lang->msg_license_agreement_alert);
}
$_SESSION['lgpl_agree'] = $requestVars->lgpl_agree;
if($requestVars->enviroment_gather=='Y') {
FileHandler::writeFile('./files/env/install','1');
}
$url = getNotEncodedUrl('', 'act', 'dispInstallCheckEnv');
header('location:'.$url);
}
/**
* @brief cubrid db setting wrapper, becase Server Side Validator...
* Server Side Validatro can use only one proc, one ruleset
@ -195,6 +175,10 @@
}
}
// save selected lang info
$oInstallAdminController = &getAdminController('install');
$oInstallAdminController->saveLangSelected(array(Context::getLangType()));
// Display a message that installation is completed
$this->setMessage('msg_install_completed');

View file

@ -50,6 +50,7 @@
}
}
Context::set('l', Context::getLangType());
$this->setTemplateFile('introduce');
}
@ -60,7 +61,6 @@
$this->setTemplateFile('check_env');
}
/**
* @brief Choose a DB
**/

View file

@ -837,4 +837,198 @@
<value xml:lang="en"><![CDATA[Information on '<em>web server, DBMS, PHP version and extension, XE modules and addons</em>' is sent to the XE statistics collection server. This information is collected anonymously and used to improve our software only.<em> You don't have to agree to this.</em>]]></value>
<value xml:lang="jp"><![CDATA['<em>ウェブサーバー、DBMS、PHPバージョンおよびExtension、XEモジュール、およびアドオン</em>'情報が、XE統計収集サーバーへ転送されます。より良いソフトウェアを製作するための目的で活用されます。情報は、匿名で収集され、外部へ公開することはありません。<em>この項目は、同意しなくても構いません。</em>]]></value>
</item>
<item name="ftp_form_title">
<value xml:lang="ko"><![CDATA[FTP 계정 정보 입력]]></value>
<value xml:lang="en"><![CDATA[FTP Account Information]]></value>
<value xml:lang="jp"><![CDATA[サーバーのFTP情報の入力]]></value>
<value xml:lang="zh-CN"><![CDATA[设置FTP信息]]></value>
<value xml:lang="zh-TW"><![CDATA[輸入 FTP 資訊]]></value>
<value xml:lang="fr"><![CDATA[FTP 정보 입력]]></value>
<value xml:lang="de"><![CDATA[FTP-Server festlegen]]></value>
<value xml:lang="ru"><![CDATA[Введите данные FTP]]></value>
<value xml:lang="es"><![CDATA[Datos de conexión para FTP]]></value>
<value xml:lang="tr"><![CDATA[FTP Hesap Bilgileri]]></value>
<value xml:lang="vi"><![CDATA[Thông tin FTP]]></value>
<value xml:lang="mn"><![CDATA[FTP мэдээлэл оруулах]]></value>
</item>
<item name="ftp">
<value xml:lang="ko"><![CDATA[FTP]]></value>
<value xml:lang="en"><![CDATA[FTP]]></value>
<value xml:lang="jp"><![CDATA[FTP]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP]]></value>
<value xml:lang="fr"><![CDATA[FTP]]></value>
<value xml:lang="de"><![CDATA[FTP]]></value>
<value xml:lang="ru"><![CDATA[FTP]]></value>
<value xml:lang="es"><![CDATA[FTP]]></value>
<value xml:lang="tr"><![CDATA[FTP]]></value>
<value xml:lang="vi"><![CDATA[FTP]]></value>
<value xml:lang="mn"><![CDATA[FTP]]></value>
</item>
<item name="ftp_host">
<value xml:lang="ko"><![CDATA[FTP 서버 주소]]></value>
<value xml:lang="en"><![CDATA[FTP hostname]]></value>
<value xml:lang="jp"><![CDATA[FTPサーバーアドレス]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP服务器名]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP 主機名稱]]></value>
<value xml:lang="de"><![CDATA[FTP-Server hostname]]></value>
<value xml:lang="tr"><![CDATA[FTP sistem adı]]></value>
<value xml:lang="vi"><![CDATA[Tên Host FTP]]></value>
</item>
<item name="ftp_port">
<value xml:lang="ko"><![CDATA[FTP port]]></value>
<value xml:lang="en"><![CDATA[FTP port]]></value>
<value xml:lang="jp"><![CDATA[FTPポート番号port]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP端口]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP 埠口]]></value>
<value xml:lang="de"><![CDATA[FTP Port]]></value>
<value xml:lang="tr"><![CDATA[FTP portu]]></value>
<value xml:lang="vi"><![CDATA[Cổng kết nối]]></value>
</item>
<item name="about_ftp_password">
<value xml:lang="ko"><![CDATA[FTP Password는 저장되지 않습니다.]]></value>
<value xml:lang="en"><![CDATA[FTP password will not be stored.]]></value>
<value xml:lang="jp"><![CDATA[FTP情報は保存できません。]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP密码不会被保存。]]></value>
<value xml:lang="zh-TW"><![CDATA[不會儲存 FTP 密碼]]></value>
<value xml:lang="de"><![CDATA[Das Passwort des FTPs wird nicht gespeichert.]]></value>
<value xml:lang="tr"><![CDATA[FTP şifresi saklanmayacaktır.]]></value>
<value xml:lang="vi"><![CDATA[Mật khẩu của FTP sẽ không lưu lại]]></value>
</item>
<item name="cmd_check_ftp_connect">
<value xml:lang="ko"><![CDATA[FTP 접속 확인]]></value>
<value xml:lang="en"><![CDATA[Check FTP Connection]]></value>
<value xml:lang="jp"><![CDATA[FTP接続を確認する]]></value>
<value xml:lang="zh-CN"><![CDATA[测试FTP连接]]></value>
<value xml:lang="zh-TW"><![CDATA[檢查 FTP 連線]]></value>
<value xml:lang="de"><![CDATA[Verbindung des FTPs checken]]></value>
<value xml:lang="es"><![CDATA[conexión de FTP confirmada]]></value>
<value xml:lang="tr"><![CDATA[FTP Bağlantısını kontrol ediniz]]></value>
<value xml:lang="vi"><![CDATA[Kiểm tra kết nối bằng FTP]]></value>
<value xml:lang="mn"><![CDATA[FTP холболт шалгах]]></value>
</item>
<item name="msg_safe_mode_ftp_needed">
<value xml:lang="ko"><![CDATA[PHP의 <strong>safe_mode=On</strong>일 경우 XE의 정상적인 동작을 돕습니다.]]></value>
<value xml:lang="en"><![CDATA[When safe_mode setting of PHP is On, you should enter FTP account information to install XE.]]></value>
<value xml:lang="jp"><![CDATA[PHPのsafe_modeがOnの場合、FTP情報を登録することで、XEのインストール及び利用が可能になります。]]></value>
<value xml:lang="zh-CN"><![CDATA[当PHP的safe_mode=On时请必须输入相关FTP信息否则将无法正常安装或使用XE程序。]]></value>
<value xml:lang="zh-TW"><![CDATA[當 PHP 的安全模式(safe_mode)開啟時,請輸入相關 FTP 資訊,否則無法正常安裝或使用程式。]]></value>
<value xml:lang="fr"><![CDATA[PHP의 safe_mode가 On일 경우 FTP 정보를 꼭 입력해주셔야 XE의 설치 및 사용이 가능합니다]]></value>
<value xml:lang="de"><![CDATA[Zur Installation und Nutzung des XEs muss die Angabe des FTPs festgestellt werden, wenn safe_mode in PHP 'An' ist.]]></value>
<value xml:lang="es"><![CDATA[Si la la variable safe_mode está activa[safe_mode=On], debe rellenar los datos de FTP para seguir instalando y usar con normalidad el XE.]]></value>
<value xml:lang="tr"><![CDATA[Eğer PHP güvenli mod ayarları etkinse, XE'yi kurmak için FTP hesap bilgilerini girmelisiniz.]]></value>
<value xml:lang="vi"><![CDATA[Nếu safe_mode của PHP mở, bạn có thể cài đặt các thành phần bổ xung cho XE một cách tự động qua FTP.]]></value>
<value xml:lang="mn"><![CDATA[PHP의 safe_mode가 Onбайх тохиолдолд , FTP мэдээллийг заавал оруулснаар XE идэвжvvлэх болон хэрэглэх боломжтой болно.]]></value>
</item>
<item name="msg_safe_mode_ftp_needed2">
<value xml:lang="ko"><![CDATA[모듈의 쉬운 설치 또는 업데이트가 가능해 집니다.]]></value>
<value xml:lang="en"><![CDATA[Easy installation or update of module is enabled.]]></value>
<value xml:lang="jp"><![CDATA[モジュールのイージーインストール、または更新が可能になります。]]></value>
<value xml:lang="zh-TW"><![CDATA[可用的安裝或更新。]]></value>
</item>
<item name="msg_safe_mode_ftp_config">
<value xml:lang="ko"><![CDATA[이 정보는 <strong>files/config/ftp.config.php</strong> 파일에 저장 됩니다. 설치 후 환경설정 페이지에서도 등록, 변경, 제거 할 수 있습니다.]]></value>
<value xml:lang="en"><![CDATA[This information is stored in <strong>files/config/ftp.config.php</strong>. You can add, change or delete this on the Settings page after the installation.]]></value>
<value xml:lang="zh-TW"><![CDATA[此資料會儲存在 <strong>files/config/ftp.config.php</strong> 檔案中。 安裝後可在設定頁面中新增、更改或刪除此資訊。]]></value>
<value xml:lang="de"><![CDATA[Die Angabe wird unter <strong>files/config/ftp.config.php</strong> gespeichert. Nach der Installation ist es auch möglich, dass die Angabe von Administrator modifiziert oder gelöscht werden kann.]]></value>
</item>
<item name="msg_ftp_not_connected">
<value xml:lang="ko"><![CDATA[localhost로의 FTP 접속 오류가 발생했습니다. FTP 포트 번호를 확인해주시거나 FTP 서비스가 가능한지 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Connection to the localhost via FTP failed. Please check the port number and whether the FTP service is available.]]></value>
<value xml:lang="jp"><![CDATA[localhostへのFTP接続エラーが発生しました。FTPポート(port)番号をはじめ、FTPサービスが可能であるかを確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[发生本地(localhost)FTP连接错误。请确认ftp端口号及支持ftp服务与否。]]></value>
<value xml:lang="zh-TW"><![CDATA[本地(localhost) FTP連線錯誤。請檢查 FTP 埠口並確認是否支援 FTP 功能。]]></value>
<value xml:lang="fr"><![CDATA[localhost로의 FTP 접속 오류가 발생하였습니다. ftp 포트 번호를 확인해주시거나 ftp 서비스가 가능한지 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Ein Verbindungsfehler des FTPs an localhost ist aufgetreten. Bitte FTP_Port checken, oder ob FTP_Service möglich ist.]]></value>
<value xml:lang="ru"><![CDATA[Connection to localhost via FTP failed. Please check the port number and if FTP service is available.]]></value>
<value xml:lang="es"><![CDATA[Ha ocurrico un error de conexión al FTP del localhost. Verifique el puerto del FTP y/o el funcionamiento del servicio FTP.]]></value>
<value xml:lang="tr"><![CDATA[Yerel web alanına FTP bağlantısı sağlanamadı. Lütfen port numarasını ve FTP servisinin mevcut olup-olmadığını kontrol ediniz .]]></value>
<value xml:lang="vi"><![CDATA[Kết nối bằng FTP không thành công. Xin vui lòng kiểm tra lại thông tin tài khoản và cổng kết nối!]]></value>
<value xml:lang="mn"><![CDATA[localhost-ын FTP холболт амжилтгvй боллоо. FTP дугаараа шалгах буюу эсвэл FTP vйлчилгээг ашиглах боломжтой эсэхээ шалгана уу.]]></value>
</item>
<item name="msg_ftp_invalid_auth_info">
<value xml:lang="ko"><![CDATA[입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Authentication failed. Please check the username and password.]]></value>
<value xml:lang="jp"><![CDATA[ログインに失敗しました。FTPアクセス情報を再度確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP登录失败。请确认输入的FTP信息。]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP登入失敗。請確認輸入的 FTP 資訊。]]></value>
<value xml:lang="fr"><![CDATA[입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Anmeldungsfehler mit der Angabe des FTPs Bitte die Angabe des FTPs festlegen.]]></value>
<value xml:lang="es"><![CDATA[Los datos de login para el FTP no son correctos. Veriféquelos.]]></value>
<value xml:lang="tr"><![CDATA[Kimlik doğrulama başarısız oldu. Lütfen kullanıcı adını ve şifreyi kontrol ediniz.]]></value>
<value xml:lang="vi"><![CDATA[Xác nhận thất bại. Xin vui lòng kiểm tra lại tên sử dụng và mật khẩu.]]></value>
<value xml:lang="mn"><![CDATA[Таны оруулсан FTP мэдээллээр нэвтэрч чадсангvй. FTPмэдээллээ шалгана уу.]]></value>
</item>
<item name="msg_ftp_mkdir_fail">
<value xml:lang="ko"><![CDATA[FTP를 이용한 디렉토리 생성 명령에 실패했습니다. FTP 서버의 설정을 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Failed to create a directory using FTP. Please check the permission of FTP account.]]></value>
<value xml:lang="jp"><![CDATA[FTPでのディレクトリ生成に失敗しました。FTPサーバーの設定を再度確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[新建文件夹失败。请确认 FTP服务器设置。]]></value>
<value xml:lang="zh-TW"><![CDATA[新增資料夾失敗。請確認 FTP 主機設置。]]></value>
<value xml:lang="fr"><![CDATA[FTP를 이용한 디렉토리 생성 명령을 실패하였습니다. FTP 서버의 설정을 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Der Befehl von Herstellung des Verzeichnisses durch FTP ist gescheitert. FTP_Server festlegen.]]></value>
<value xml:lang="es"><![CDATA[Ha fallado el comando de FTP para la creación de directorio. Verifique la configuración del servicio FTP en el servidor]]></value>
<value xml:lang="tr"><![CDATA[Dizin oluşturma başarısız oldu. Lütfen FTP hesap iznini kontrol ediniz.]]></value>
<value xml:lang="vi"><![CDATA[Lỗi khi tạo thư mục. Xin vui lòng kiểm tra lại quyền truy cập FTP.]]></value>
<value xml:lang="mn"><![CDATA[FTP-г ашиглан eгсeн eгeгдлийг биелvvлж чадсангvй. FTP серверийн идэвхжvvлэлтээ шалгана уу.]]></value>
</item>
<item name="msg_ftp_chmod_fail">
<value xml:lang="ko"><![CDATA[FTP를 이용한 디렉토리의 속성 변경에 실패했습니다. FTP 서버의 설정을 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Chmod failed. Please check the permission and configuration of the FTP server.]]></value>
<value xml:lang="jp"><![CDATA[FTPでのディレクトリ属性変更に失敗しました。FTPサーバーの設定を再度確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[修改文件夹属性失败。请确认 FTP服务器设置。]]></value>
<value xml:lang="zh-TW"><![CDATA[修改資料夾權限失敗。請確認 FTP 主機設置。]]></value>
<value xml:lang="fr"><![CDATA[FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Die Modifikation der Zugriffsberechtigung des Verzeichnisses durch FTP ist gescheitert. FTP_Server festlegen.]]></value>
<value xml:lang="ru"><![CDATA[Chmod failed. Please check the permission and configuration of FTP server.]]></value>
<value xml:lang="es"><![CDATA[Ha fallado el comando de FTP para la modificación de atributos de directorio. Verifique la configuración del servicio FTP en el servidor.]]></value>
<value xml:lang="tr"><![CDATA[Chmod başarılamadı. Lütfen FTP sunucusunun izin ve yapılandırmasını kontrol ediniz.]]></value>
<value xml:lang="vi"><![CDATA[CHMOD thất bại. Xin vui lòng kiểm tra lại.]]></value>
<value xml:lang="mn"><![CDATA[FTP-г ашиглан eeрчлeлтийг хийж чадсангvй. FTP серверийн идэвхжvvлэлтээ шалгана уу.]]></value>
</item>
<item name="msg_ftp_connect_success">
<value xml:lang="ko"><![CDATA[FTP 접속 및 인증에 성공했습니다.]]></value>
<value xml:lang="en"><![CDATA[Successfully connected to FTP server and authenticated.]]></value>
<value xml:lang="jp"><![CDATA[FTP接続、および認証に成功しました。]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP连接成功。]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP連線成功。]]></value>
<value xml:lang="fr"><![CDATA[FTP 접속 및 인증 성공하였습니다]]></value>
<value xml:lang="de"><![CDATA[Die Verbindung zu FTP ist erfolgreich und verifiziert.]]></value>
<value xml:lang="es"><![CDATA[conexión con éxito al FTP]]></value>
<value xml:lang="tr"><![CDATA[FTP sunucusu için bağlantı ve kimlik doğrulama sağlandı.]]></value>
<value xml:lang="vi"><![CDATA[Đã xác nhận và kết nối thành công tới máy chủ bằng FTP.]]></value>
<value xml:lang="mn"><![CDATA[FTP холболт болон баталгаажуулалт хийгдлээ.]]></value>
</item>
<item name="ftp_path_title">
<value xml:lang="ko"><![CDATA[FTP 경로 정보 입력]]></value>
<value xml:lang="en"><![CDATA[FTP Path Information]]></value>
<value xml:lang="jp"><![CDATA[FTPパス情報入力]]></value>
<value xml:lang="zh-CN"><![CDATA[输入FTP路径信息]]></value>
<value xml:lang="zh-TW"><![CDATA[請輸入 FTP 路經]]></value>
<value xml:lang="de"><![CDATA[Pfad des FTPs eingeben]]></value>
<value xml:lang="tr"><![CDATA[FTP Yolu Bilgileri]]></value>
<value xml:lang="vi"><![CDATA[Hãy nhập thông tin đường dẫn của FTP.]]></value>
</item>
<item name="msg_ftp_installed_realpath">
<value xml:lang="ko"><![CDATA[설치된 XE의 절대경로]]></value>
<value xml:lang="en"><![CDATA[Absolute Path of XE]]></value>
<value xml:lang="jp"><![CDATA[インストールされたXEの絶対パス]]></value>
<value xml:lang="zh-CN"><![CDATA[XE绝对路径]]></value>
<value xml:lang="zh-TW"><![CDATA[XE絕對路經]]></value>
<value xml:lang="de"><![CDATA[absoluter Pfad, in dem XE installiert ist.]]></value>
<value xml:lang="tr"><![CDATA[XE Salt Yolu]]></value>
<value xml:lang="vi"><![CDATA[Đường dẫn thư mục đã cài đặt XE]]></value>
</item>
<item name="msg_ftp_installed_ftp_realpath">
<value xml:lang="ko"><![CDATA[설치된 XE의 FTP 경로 설정]]></value>
<value xml:lang="en"><![CDATA[Absolute FTP Path of XE]]></value>
<value xml:lang="jp"><![CDATA[インストールされたXEのFTP絶対パス設定]]></value>
<value xml:lang="zh-CN"><![CDATA[FTP绝对路径设置]]></value>
<value xml:lang="zh-TW"><![CDATA[XE的 FTP 絕對路經]]></value>
<value xml:lang="fr"><![CDATA[설치된 XE의 FTP 절대경로 설정]]></value>
<value xml:lang="de"><![CDATA[absoluten Pfad des FTPs, in dem XE installiert ist, festlegen.]]></value>
<value xml:lang="es"><![CDATA[설치된 XE의 FTP 절대경로 설정]]></value>
<value xml:lang="tr"><![CDATA[XE Salt FTP Yolu]]></value>
<value xml:lang="vi"><![CDATA[Đường dẫn tuyệt đối của thư mục cài đặt XE trên FTP]]></value>
</item>
</lang>

View file

@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<ruleset version="1.5.0">
<customrules>
</customrules>
<fields>
<customrules>
<rule name="mysqlUserId" type="regex" test="/^[a-z0-9_]*$/i" />
</customrules>
<fields>
<field name="db_type" required="true" default="mysql" />
<field name="db_hostname" required="true" length="1:250" default="localhost" />
<field name="db_port" required="true" length="1:250" rule="number" default="3306" />
<field name="db_userid" required="true" length="1:250" rule="alpha_number" />
<field name="db_userid" required="true" length="1:250" rule="mysqlUserId" />
<field name="db_password" required="true" length="1:250"/>
<field name="db_database" required="true" length="1:250" />
<field name="db_table_prefix" length="2:20" rule="alpha" />
</fields>
</fields>
</ruleset>

View file

@ -1,10 +0,0 @@
<filter name="introduce" module="install" act="procInstallAgreement">
<form>
<node target="lgpl_agree" required="true" />
<node target="enviroment_gather" required="false" />
</form>
<response callback_func="completeAgreement">
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -4,11 +4,7 @@
<include target="progress_menu.html" />
<span class="dummy"></span>
<div id="content">
<form action="./" class="agreement" method="post">
<input type="hidden" name="module" value="install" />
<input type="hidden" name="act" value="procInstallAgreement" /> <!-- UX/Remove -->
<input type="hidden" name="lgpl_agree" value="Y" /> <!-- UX/Remove -->
<input type="hidden" name="enviroment_gather" value="N" /> <!-- UX/Remove -->
<div class="agreement">
<div class="desc">
<ul style="list-style:none">
<li loop="$lang_supported=>$key,$val" style="position:relative; margin:0 0 4px 0">
@ -20,10 +16,10 @@
</div>
<div class="ibtnArea">
<div class="fRight">
<span class="ibtn icon"><span class="check"></span> <input type="submit" value="{$lang->cmd_next}" /></span>
<span class="ibtn icon"><span class="check"></span> <a href="{getUrl('', 'act', 'dispInstallCheckEnv')}" >{$lang->cmd_next}</a></span>
</div>
</div>
</form>
</div>
</div>
</div>
<include target="footer.html" />

View file

@ -7,6 +7,11 @@
class integration_searchAdminView extends integration_search {
/**
* Cofiguration of integration serach module
*
* @var object module config
*/
var $config = null;
/**

View file

@ -25,7 +25,20 @@
*
* @return bool
**/
function checkUpdate() {
function checkUpdate()
{
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('integration_search');
if($config->skin)
{
$config_parse = explode('.', $config->skin);
if (count($config_parse) > 1)
{
$template_path = sprintf('./themes/%s/modules/integration_search/', $config_parse[0]);
if(is_dir($template_path)) return true;
}
}
return false;
}
@ -34,7 +47,26 @@
*
* @return Object
**/
function moduleUpdate() {
function moduleUpdate()
{
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('message');
if($config->skin)
{
$config_parse = explode('.', $config->skin);
if (count($config_parse) > 1)
{
$template_path = sprintf('./themes/%s/modules/integration_search/', $config_parse[0]);
if(is_dir($template_path))
{
$config->skin = implode('|@|', $config_parse);
$oModuleController = &getController('module');
$oModuleController->updateModuleConfig('integration_search', $config);
}
}
}
return new Object(0, 'success_updated');
}

View file

@ -7,7 +7,15 @@
class integration_searchView extends integration_search {
/**
* Target mid
* @var array target mid
*/
var $target_mid = array();
/**
* Skin
* @var string skin name
*/
var $skin = 'default';
/**
@ -30,9 +38,27 @@
if(!$this->grant->access) return new Object(-1,'msg_not_permitted');
$config = $oModuleModel->getModuleConfig('integration_search');
if(!$config->skin) $config->skin = 'default';
if(!$config->skin)
{
$config->skin = 'default';
$template_path = sprintf('%sskins/%s', $this->module_path, $config->skin);
}
else
{
//check theme
$config_parse = explode('|@|', $config->skin);
if (count($config_parse) > 1)
{
$template_path = sprintf('./themes/%s/modules/integration_search/', $config_parse[0]);
}
else
{
$template_path = sprintf('%sskins/%s', $this->module_path, $config->skin);
}
}
// Template path
$this->setTemplatePath($template_path);
Context::set('module_info', unserialize($config->skin_vars));
$this->setTemplatePath($this->module_path."/skins/".$config->skin."/");
$target = $config->target;
if(!$target) $target = 'include';

View file

@ -16,6 +16,7 @@
<action name="dispLayoutAdminInsert" type="view" menu_name="installedLayout" />
<action name="dispLayoutAdminModify" type="view" menu_name="installedLayout" />
<action name="dispLayoutAdminEdit" type="view" menu_name="installedLayout" />
<action name="dispLayoutAdminCopyLayout" type="view" />
<action name="dispLayoutPreview" type="view" />
@ -23,6 +24,8 @@
<action name="procLayoutAdminCodeUpdate" type="controller" ruleset="codeUpdate" />
<action name="procLayoutAdminUserImageUpload" type="controller" ruleset="imageUpload" />
<action name="procLayoutAdminUserImageDelete" type="controller" />
<action name="procLayoutAdminConfigImageUpload" type="controller" />
<action name="procLayoutAdminConfigImageDelete" type="controller" />
<action name="procLayoutAdminDelete" type="controller" ruleset="deleteLayout" />
<action name="procLayoutAdminInsert" type="controller" standalone="true" ruleset="insertLayout" />
@ -32,6 +35,7 @@
<action name="procLayoutAdminUserValueInsert" type="controller" standalone="true" />
<action name="procLayoutAdminUserLayoutExport" type="controller" standalone="true" />
<action name="procLayoutAdminUserLayoutImport" type="controller" standalone="true" ruleset="userLayoutImport" />
<action name="procLayoutAdminCopyLayout" type="controller" standalone="true" />
</actions>
<menus>

View file

@ -24,7 +24,10 @@
<value xml:lang="es"><![CDATA[Editar el Diseño]]></value>
<value xml:lang="tr"><![CDATA[Yerleşim Düzeni Düzenle]]></value>
<value xml:lang="vi"><![CDATA[Sửa giao diện]]></value>
</item>
<item name="cmd_layout_copy">
<value xml:lang="ko"><![CDATA[레이아웃 복사]]></value>
<value xml:lang="en"><![CDATA[Copy Layout]]></value>
</item>
<item name="layout_name">
<value xml:lang="ko"><![CDATA[레이아웃 이름]]></value>
@ -1068,4 +1071,12 @@
<value xml:lang="zh-TW"><![CDATA[從"已安裝版面"中建立新版面。 確認版面路徑是否上傳正確及修改版面相關設定。]]></value>
</item>
</item>
<item name="msg_empty_origin_layout">
<value xml:lang="ko"><![CDATA[원본 Layout이 없습니다.]]></value>
<value xml:lang="en"><![CDATA[Original layout is not exist]]></value>
</item>
<item name="msg_empty_target_layout">
<value xml:lang="ko"><![CDATA[복사할 Layout이 지정되어 있지 않습니다.]]></value>
<value xml:lang="en"><![CDATA[Target layout is not assigned]]></value>
</item>
</lang>

View file

@ -143,38 +143,36 @@
}
}
}
$tmpDir = sprintf('./files/attach/images/%s/tmp', $args->layout_srl);
// Separately handle if a type of extra_vars is an image
if($layout_info->extra_var) {
foreach($layout_info->extra_var as $name => $vars) {
if($vars->type!='image') continue;
$image_obj = $extra_vars->{$name};
$extra_vars->{$name} = $layout_info->extra_var->{$name}->value;
// Get a variable on a request to delete
$del_var = $extra_vars->{"del_".$name};
unset($extra_vars->{"del_".$name});
// Delete the old file if there is a request to delete or a new file is uploaded
if($del_var == 'Y' || $image_obj['tmp_name']) {
FileHandler::removeFile($extra_vars->{$name});
$extra_vars->{$name} = '';
if($del_var == 'Y' && !$image_obj['tmp_name']) continue;
}
// Ignore if the file is not successfully uploaded
if(!$image_obj['tmp_name'] || !is_uploaded_file($image_obj['tmp_name'])) continue;
// Ignore if the file is not an image (swf the paths ~)
if(!preg_match("/\.(jpg|jpeg|gif|png|swf)$/i", $image_obj['name'])) continue;
// Upload the file to a path
$path = sprintf("./files/attach/images/%s/", $args->layout_srl);
// Create a directory
if(!FileHandler::makeDir($path)) continue;
$fileName = $extra_vars->{$name};
if($vars->value == $fileName)
{
continue;
}
$filename = $path.$image_obj['name'];
// Move the file
if(!move_uploaded_file($image_obj['tmp_name'], $filename)) continue;
FileHandler::removeFile($vars->value);
$extra_vars->{$name} = $filename;
if(!$fileName)
{
continue;
}
$pathInfo = pathinfo($fileName);
$tmpFileName = sprintf('%s/tmp/%s', $pathInfo['dirname'], $pathInfo['basename']);
if(!FileHandler::moveFile($tmpFileName, $fileName))
{
unset($extra_vars->{$name});
}
}
}
// Save header script into "config" of layout module
$oModuleModel = &getModel('module');
$oModuleController = &getController('module');
@ -188,8 +186,9 @@
$output = $this->updateLayout($args);
if(!$output->toBool()) return $output;
$this->setRedirectUrl(Context::get('error_return_url'));
return $output;
FileHandler::removeDir($tmpDir);
return $this->setRedirectUrl(Context::get('error_return_url'), $output);
}
/**
@ -606,6 +605,140 @@
$this->setRedirectUrl(Context::get('error_return_url'));
}
/**
* layout copy
* @return void
*/
function procLayoutAdminCopyLayout()
{
$sourceArgs = Context::getRequestVars();
if($sourceArgs->layout == 'faceoff')
{
return $this->stop('not supported');
}
if(!$sourceArgs->layout_srl)
{
return $this->stop('msg_empty_origin_layout');
}
if(!is_array($sourceArgs->title) || count($sourceArgs->title) == 0)
{
return $this->stop('msg_empty_target_layout');
}
$oLayoutModel = &getModel('layout');
$layout = $oLayoutModel->getLayout($sourceArgs->layout_srl);
$args->extra_vars = $oLayoutModel->getLayoutRawData($sourceArgs->layout_srl, array('extra_vars'));
$extra_vars = unserialize($args->extra_vars);
$oModuleController = &getController('module');
$layout_config->header_script = $extra_vars->header_script;
// Get information to create a layout
$args->site_srl = (int)$layout->site_srl;
$args->layout = $layout->layout;
$args->layout_type = $layout->type;
if(!$args->layout_type) $args->layout_type = "P";
$oDB = &DB::getInstance();
$oDB->begin();
if(is_array($sourceArgs->title))
{
foreach($sourceArgs->title AS $key=>$value)
{
if(!trim($value))
{
continue;
}
$args->layout_srl = getNextSequence();
$args->title = $value;
// for header script
$oModuleController->insertModulePartConfig('layout', $args->layout_srl, $layout_config);
// Insert into the DB
$output = $this->insertLayout($args);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
// initiate if it is faceoff layout
$this->initLayout($args->layout_srl, $args->layout);
// update layout info
$output = $this->updateLayout($args);
if (!$output->toBool())
{
$oDB->rollback();
return $output;
}
$this->_copyLayoutFile($layout->layout_srl, $args->layout_srl);
}
}
$oDB->commit();
$this->setMessage('success_registed');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
global $lang;
htmlHeader();
alertScript($lang->success_registed);
reload(true);
closePopupScript();
htmlFooter();
Context::close();
exit;
}
}
/**
* Layout file copy
* @param $sourceLayoutSrl origin layout number
* @param $targetLayoutSrl origin layout number
* @return void
*/
function _copyLayoutFile($sourceLayoutSrl, $targetLayoutSrl)
{
$oLayoutModel = &getModel('layout');
$sourceLayoutPath = FileHandler::getRealPath($oLayoutModel->getUserLayoutPath($sourceLayoutSrl));
$targetLayoutPath = FileHandler::getRealPath($oLayoutModel->getUserLayoutPath($targetLayoutSrl));
$sourceImagePath = $oLayoutModel->getUserLayoutImagePath($sourceLayoutSrl);
$targetImagePath = $oLayoutModel->getUserLayoutImagePath($targetLayoutSrl);
FileHandler::makeDir($targetImagePath);
$sourceFileList = $oLayoutModel->getUserLayoutFileList($sourceLayoutSrl);
foreach($sourceFileList as $key => $file)
{
if(is_readable($sourceLayoutPath.$file))
{
FileHandler::copyFile($sourceLayoutPath.$file, $targetLayoutPath.$file);
if($file == 'layout.html' || $file == 'layout.css')
{
$this->_changeFilepathInSource($targetLayoutPath.$file, $sourceImagePath, $targetImagePath);
}
}
}
}
/**
* Change resource file path in Layout file
* @param string $file
* @return void
*/
function _changeFilepathInSource($file, $source, $target)
{
$content = FileHandler::readFile($file);
$content = str_replace($source, $target, $content);
FileHandler::writeFile($file, $content);
}
/**
* import layout
* @param int $layout_srl
@ -635,5 +768,90 @@
// Remove uploaded file
FileHandler::removeFile($source_file);
}
/**
* Upload config image
*/
function procLayoutAdminConfigImageUpload()
{
$layoutSrl = Context::get('layout_srl');
$name = Context::get('name');
$img = Context::get('img');
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile("after_upload_config_image.html");
if(!$img['tmp_name'] || !is_uploaded_file($img['tmp_name']))
{
Context::set('msg', Context::getLang('upload failed'));
return;
}
if(!preg_match('/\.(jpg|jpeg|gif|png|swf)$/i', $img['name']))
{
Context::set('msg', Context::getLang('msg_layout_image_target'));
return;
}
$path = sprintf('./files/attach/images/%s/', $layoutSrl);
$tmpPath = $path . 'tmp/';
if(!FileHandler::makeDir($tmpPath))
{
Context::set('msg', Context::getLang('make directory failed'));
return;
}
$ext = substr(strrchr($img['name'],'.'),1);
$_fileName = md5(crypt(rand(1000000,900000), rand(0,100))).'.'.$ext;
$fileName = $path . $_fileName;
$tmpFileName = $tmpPath . $_fileName;
if(!move_uploaded_file($img['tmp_name'], $tmpFileName))
{
Context::set('msg', Context::getLang('move file failed'));
return;
}
Context::set('name', $name);
Context::set('fileName', $fileName);
Context::set('tmpFileName', $tmpFileName);
}
/**
* Delete config image
*/
function procLayoutAdminConfigImageDelete()
{
$layoutSrl = Context::get('layout_srl');
$name = Context::get('name');
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile("after_delete_config_image.html");
$oModel = &getModel('layout');
$layoutInfo = $oModel->getLayout($layoutSrl);
if($layoutInfo->extra_var_count)
{
foreach($layoutInfo->extra_var as $varId => $val)
{
$newLayoutInfo->{$varId} = $val->value;
}
}
unset($newLayoutInfo->{$name});
$args->layout_srl = $layoutSrl;
$args->extra_vars = serialize($newLayoutInfo);
$output = $this->updateLayout($args);
if(!$output->toBool())
{
Context::set('msg', Context::getLang($output->getMessage()));
return $output;
}
FileHandler::removeFile($layoutInfo->extra_var->{$name}->value);
Context::set('name', $name);
}
}
?>

View file

@ -149,7 +149,7 @@
//Security
$security = new Security();
$security->encodeHTML('layout_list..layout','layout_list..title');
$security->encodeHTML('layout_list..layout','layout_list..title');
// Get layout info
$layout = Context::get('layout');
@ -179,7 +179,7 @@
Context::set('selected_layout', $layout_info);
$this->setTemplateFile('layout_modify');
}
}
/**
* Insert Layout details
@ -457,5 +457,19 @@
$this->setTemplateFile('layout_image_list');
}
/**
* Copy layout instance
* @return void
*/
function dispLayoutAdminCopyLayout(){
$layoutSrl = Context::get('layout_srl');
$oLayoutModel = &getModel('layout');
$layout = $oLayoutModel->getLayout($layoutSrl);
Context::set('layout', $layout);
$this->setTemplateFile('copy_layout');
}
}
?>

View file

@ -35,6 +35,18 @@
if(!$oDB->isColumnExists('layouts', 'layout_type')) return true;
$args->layout = '.';
$output = executeQueryArray('layout.getLayoutDotList', $args);
if($output->data && count($output->data) > 0)
{
foreach($output->data as $layout)
{
$layout_path = explode('.', $layout->layout);
if(count($layout_path) != 2) continue;
if(is_dir(sprintf(_XE_PATH_ . 'themes/%s/layouts/%s', $layout_path[0], $layout_path[1]))) return true;
}
}
return false;
}
@ -66,6 +78,22 @@
$oDB->addColumn('layouts','layout_type','char',1,'P',true);
}
$args->layout = '.';
$output = executeQueryArray('layout.getLayoutDotList', $args);
if($output->data && count($output->data) > 0)
{
foreach($output->data as $layout)
{
$layout_path = explode('.', $layout->layout);
if(count($layout_path) != 2) continue;
if(is_dir(sprintf(_XE_PATH_ . 'themes/%s/layouts/%s', $layout_path[0], $layout_path[1])))
{
$args->layout = implode('|@|', $layout_path);
$args->layout_srl = $layout->layout_srl;
$output = executeQuery('layout.updateLayout', $args);
}
}
}
return new Object(0, 'success_updated');
}

View file

@ -97,6 +97,16 @@
return $layout_info;
}
function getLayoutRawData($layout_srl, $columnList = array())
{
$args->layout_srl = $layout_srl;
$output = executeQuery('layout.getLayout', $args, $columnList);
if(!$output->toBool())
return;
return $output->data->extra_vars;
}
/**
* Get a layout path
* @param string $layout_name
@ -104,7 +114,7 @@
* @return string path of layout
**/
function getLayoutPath($layout_name, $layout_type = "P") {
$layout_parse = explode('.', $layout_name);
$layout_parse = explode('|@|', $layout_name);
if (count($layout_parse) > 1){
$class_path = './themes/'.$layout_parse[0].'/layouts/'.$layout_parse[1].'/';
}else if($layout_name == 'faceoff'){
@ -472,7 +482,11 @@
$layout_config = $oModuleModel->getModulePartConfig('layout', $layout_srl);
$header_script = trim($layout_config->header_script);
if($header_script) $buff .= sprintf(' $layout_info->header_script = "%s"; ', str_replace('"','\\"',$header_script));
if($header_script)
{
$header_script = str_replace('"','\\"',$header_script);
$buff .= sprintf(' $layout_info->header_script = "%s"; ', str_replace('$','\$',$header_script));
}
$buff = '<?php if(!defined("__ZBXE__")) exit(); '.$buff.' ?>';
FileHandler::writeFile($cache_file, $buff);

View file

@ -0,0 +1,16 @@
<query id="getLayoutDotList" action="select">
<tables>
<table name="layouts" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="site_srl" var="site_srl" filter="number" default="0" notnull="notnull" />
<condition operation="equal" column="layout_type" var="layout_type" default="P" pipe="and" />
<condition operation="like" column="layout" var="layout" default="." pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="layout_srl" order="desc" />
</navigation>
</query>

View file

@ -4,7 +4,7 @@
<rule name="imageExtension" type="regex" test="/\.(gif|jpg|jpeg|gif|png|swf|flv)$/i" />
</customrules>
<fields>
<field name="user_layout_image" required="true" rule="imageExtension" />
<field name="user_layout_image['name']" required="true" rule="imageExtension" />
<field name="layout_srl" required="true" rule="number" />
</fields>
</ruleset>

View file

@ -0,0 +1,7 @@
<script type="text/javascript">
<!--@if($msg)-->
alert('{$msg}');
<!--@else-->
parent.afterDeleteConfigImage('{$name}');
<!--@end-->
</script>

View file

@ -0,0 +1,7 @@
<script type="text/javascript">
<!--@if($msg)-->
alert('{$msg}');
<!--@else-->
parent.afterUploadConfigImage('{$name}', '{$fileName}', '{$tmpFileName}');
<!--@end-->
</script>

View file

@ -0,0 +1,40 @@
<script type="text/javascript">
var addLang = '{$lang->cmd_insert}';
</script>
<load target="js/layout_admin.js" usecdn="true" />
<h1 class="h1">{$lang->cmd_layout_copy}</h1>
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form action="./" method="post">
<input type="hidden" name="layout" value="{$layout->layout}" />
<input type="hidden" name="act" value="procLayoutAdminCopyLayout" />
<input type="hidden" name="layout_srl" value="{$layout->layout_srl}" />
<div class="table">
<table width="100%" border="1" cellspacing="0">
<tr>
<th scope="row">{$lang->layout_name}</th>
<td>{$layout->title}</td>
</tr>
<tr>
<th scope="row">{$lang->title}</th>
<td>{$layout->layout_title}</td>
</tr>
</table>
</div>
<div class="table">
<table width="100%" border="1" cellspacing="0" id="inputTable">
<tr>
<th scope="col"><div>{$lang->title}<div></th>
<th scope="col"><div>{$lang->cmd_insert}</div></th>
</tr>
<tr>
<td><input type="text" name="title[]" size="50" /></td>
<td><span class="btn"><input type="button" value="{$lang->cmd_insert}" onclick="addLayoutCopyInputbox()" /></span></td>
</tr>
</table>
</div>
<div class="btnArea">
<span class="btn"><input type="submit" value="{$lang->cmd_save}" /></span>
</div>
</form>

View file

@ -1,5 +1,4 @@
<!--#include("header.html")-->
<!-- 레이아웃의 목록 -->
<div class="table">
<table width="100%" border="1" cellspacing="0">

View file

@ -49,6 +49,20 @@ function deleteFile(layout_srl,filename){
});
}
function addLayoutCopyInputbox()
{
var html = '<tr>';
html += '<td><input type="text" name="title[]" size="50" /></td>';
html += '<td><span class="btn"><input type="button" value="'+addLang+'" onclick="addLayoutCopyInputbox()" /></span></td>';
html += '</tr>';
var it = jQuery('#inputTable');
it.append(html);
it.find('SPAN.btn').hide();
it.find('TR:last-child SPAN.btn').show();
}
(function($){
/* preview layout */
@ -78,4 +92,4 @@ validator.cast('ADD_CALLBACK', ['update_layout_code', function(form) {
return false;
}]);
})(jQuery);
})(jQuery);

View file

@ -0,0 +1,34 @@
function doSubmitConfig()
{
var $forms = jQuery('#layout_config').find('input[name][type="hidden"], input[name][type="text"], input[name][type="checkbox"]:checked, select[name], textarea[name], input[name][type="radio"]:checked');
var $configForm = jQuery('#config_form');
var $container = $configForm.children('div');
$container.empty();
$forms.each(function($)
{
var $this = jQuery(this);
if($this.parents('.imageUpload').length) return;
var $input = jQuery('<input>').attr('type', 'hidden').attr('name', $this.attr('name')).val($this.val());
$container.append($input);
});
$configForm.submit();
}
function afterUploadConfigImage(name, fileName, tmpFileName)
{
jQuery('#preview_' + name + ' img').attr('src', tmpFileName);
jQuery('#preview_' + name).show();
jQuery('#file_select' + name).val('');
jQuery('#file_' + name).val(fileName);
}
function deleteImage(name)
{
jQuery('#preview_' + name + ' img').removeAttr('src');
jQuery('#preview_' + name).hide();
jQuery('#file_' + name).val('');
}

View file

@ -17,6 +17,7 @@
<th scope="col" class="nowr">{$lang->regdate}</th>
<th scope="col" class="nowr">{$lang->cmd_layout_management}</th>
<th scope="col" class="nowr">{$lang->cmd_layout_edit}</th>
<th scope="col" class="nowr">{$lang->cmd_copy}</th>
<th scope="col" class="nowr">{$lang->cmd_delete}</th>
</tr>
</thead>
@ -32,6 +33,7 @@
<td class="nowr">{zdate($item->regdate, "Y-m-d")}</td>
<td class="nowr"><a href="{getUrl('act', 'dispLayoutAdminModify', 'layout_srl', $item->layout_srl)}">{$lang->cmd_layout_management}</a></td>
<td class="nowr"><a href="{getUrl('act', 'dispLayoutAdminEdit', 'layout_srl', $item->layout_srl)}">{$lang->cmd_layout_edit}</a></td>
<td class="nowr"><a href="{getUrl('', 'module', 'layout', 'act', 'dispLayoutAdminCopyLayout', 'layout_srl', $item->layout_srl)}" onclick="popopen(this.href);return false;" title="{$lang->cmd_copy}">{$lang->cmd_copy}</a></td>
<td class="nowr">
<form class="layout_delete_form" ruleset="deleteLayout" action="./" method="post">
<input type="hidden" name="module" value="layout" />

View file

@ -1,10 +1,8 @@
<include target="header.html" />
<load target="js/adminList.js" usecdn="true" />
<script type="text/javascript">
xe.lang.confirm_delete = '{$lang->confirm_delete}';
</script>
<h2 class="h2">{$layout_info->title} ver {$layout_info->version} ({$layout_info->layout})</h2>
<div class="table even easyList">
<table width="100%" border="1" cellspacing="0">
@ -15,6 +13,7 @@
<th scope="col" class="nowr">{$lang->regdate}</th>
<th scope="col" class="nowr">{$lang->cmd_layout_management}</th>
<th scope="col" class="nowr">{$lang->cmd_layout_edit}</th>
<th scope="col" class="nowr">{$lang->cmd_copy}</th>
<th scope="col" class="nowr">{$lang->cmd_delete}</th>
</tr>
</thead>
@ -25,12 +24,12 @@
<td class="nowr">{zdate($layout->regdate, "Y-m-d")}</td>
<td class="nowr"><a href="{getUrl('act', 'dispLayoutAdminModify', 'layout_srl', $layout->layout_srl)}">{$lang->cmd_layout_management}</a></td>
<td class="nowr"><a href="{getUrl('act', 'dispLayoutAdminEdit', 'layout_srl', $layout->layout_srl)}">{$lang->cmd_layout_edit}</a></td>
<td class="nowr"><a href="{getUrl('', 'module', 'layout', 'act', 'dispLayoutAdminCopyLayout', 'layout_srl', $layout->layout_srl)}" onclick="popopen(this.href);return false;" title="{$lang->cmd_copy}">{$lang->cmd_copy}</a></td>
<td class="nowr">
<form class="layout_delete_form" ruleset="deleteLayout" action="./" method="post">
<input type="hidden" name="module" value="layout" />
<input type="hidden" name="act" value="procLayoutAdminDelete" />
<input type="hidden" name="layout_srl" value="{$layout->layout_srl}" />
<input class="text" type="submit" value="{$lang->cmd_delete}" />
</form>
</td>

View file

@ -1,16 +1,21 @@
<include target="header.html" />
<load target="js/layout_modify.js" />
<h2 cond="$act == 'dispLayoutAdminModify'" class="h2">{$selected_layout->layout_title}</h2>
<h2 cond="$act == 'dispLayoutAdminInsert'" class="h2">{$selected_layout->title}</h2>
<form ruleset="updateLayout"|cond="$act == 'dispLayoutAdminModify'" ruleset="insertLayout"|cond="$act == 'dispLayoutAdminInsert'" action="./" class="form" enctype="multipart/form-data" method="post">
<input type="hidden" name="module" value="layout" />
<input type="hidden" name="act" value="procLayoutAdminUpdate"|cond="$act == 'dispLayoutAdminModify'" value="procLayoutAdminInsert"|cond="$act == 'dispLayoutAdminInsert'" />
<input type="hidden" name="layout_srl" value="{$layout_srl}" />
<input type="hidden" name="layout" value="{$selected_layout->layout}" />
<input type="hidden" name="_layout_type" value="{$selected_layout->layout_type}" />
<input type="hidden" name="success_return_url" value="{getUrl('act', 'dispLayoutAdminInstanceList')}" />
<form id="config_form" ruleset="updateLayout"|cond="$act == 'dispLayoutAdminModify'" ruleset="insertLayout"|cond="$act == 'dispLayoutAdminInsert'" action="./" class="form" enctype="multipart/form-data" method="post">
<input type="hidden" name="module" value="layout" />
<input type="hidden" name="act" value="procLayoutAdminUpdate"|cond="$act == 'dispLayoutAdminModify'" value="procLayoutAdminInsert"|cond="$act == 'dispLayoutAdminInsert'" />
<input type="hidden" name="layout_srl" value="{$layout_srl}" />
<input type="hidden" name="layout" value="{$selected_layout->layout}" />
<input type="hidden" name="_layout_type" value="{$selected_layout->layout_type}" />
<input type="hidden" name="success_return_url" value="{getUrl('act', 'dispLayoutAdminInstanceList')}" />
<!--// For submit config. Do not delete this division. -->
<div></div>
</form>
<div id="layout_config" class="form">
<ul>
<li>
<p class="q">{$lang->layout}</p>
@ -44,7 +49,7 @@
</li>
</ul>
<block loop="$selected_layout->extra_var => $name, $var">
<block cond="$act == 'dispLayoutAdminModify'" loop="$selected_layout->extra_var => $name, $var">
<block cond="!$not_first && !$var->group"><ul></block>
<block cond="$group != $var->group">
<block cond="$not_first"></ul></block>
@ -71,10 +76,21 @@
</div>
<block cond="$var->type == 'image'">
<block cond="$var->value">
<p><img src="../../../{$var->value}" alt="" /> <input type="checkbox" name="del_{$name}" value="Y" id="del_{$name}" /><label for="del_{$name}">{$lang->cmd_delete}</label></p>
</block>
<p><input type="file" name="{$name}" value="" /></p>
<input type="hidden" name="{$name}" id="file_{$name}" value="{$var->value}" />
<div id="preview_{$name}" style="display:none;"|cond="!$var->value">
<img src="../../../{$var->value}"|cond="$var->value" alt="" style="max-width: 250px" />
<input type="button" value="{$lang->cmd_delete}" onclick="deleteImage('{$name}')" />
</div>
<form action="./" enctype="multipart/form-data" method="post" target="hiddenIframe" class="imageUpload">
<input type="hidden" name="module" value="layout" />
<input type="hidden" name="act" value="procLayoutAdminConfigImageUpload" />
<input type="hidden" name="layout_srl" value="{$layout_srl}" />
<input type="hidden" name="name" value="{$name}" />
<p>
<input type="file" name="img" id="file_select_{$name}" value="" />
<input type="submit" value="{$lang->cmd_submit}" />
</p>
</form>
</block>
<select cond="$var->type == 'select'" name="{$name}">
@ -118,8 +134,7 @@
<p class="desc">{$var->description}</p>
</li>
</block>
</ul>
<block cond="$act == 'dispLayoutAdminModify'"></ul></block>
<h3 class="h3" cond="$selected_layout->menu">{$lang->menu}</h3>
<ul cond="$selected_layout->menu">
@ -148,10 +163,18 @@
</ul>
<div class="btnArea">
<span class="etc">
<!--@if($layout)-->
<span class="btn"><a href="{getUrl('', 'module', 'admin', 'act', 'dispLayoutAdminInstanceList', 'layout', $selected_layout->layout)}">{$lang->cmd_list}</a></span>
<!--@else-->
<span class="btn"><a href="{getUrl('', 'module', 'admin', 'act', 'dispLayoutAdminAllInstanceList')}">{$lang->cmd_list}</a></span>
<!--@end-->
</span>
<span class="btn medium">
<input type="submit" value="{$lang->cmd_insert}"|cond="$act == 'dispLayoutAdminInsert'" value="{$lang->cmd_save}"|cond="$act == 'dispLayoutAdminModify'" />
<input type="submit" value="{$lang->cmd_insert}"|cond="$act == 'dispLayoutAdminInsert'" value="{$lang->cmd_save}"|cond="$act == 'dispLayoutAdminModify'" onclick="doSubmitConfig()"/>
</span>
</div>
<include target="include.multilang.html" />
<include target="include.multilang.textarea.html" />
</form>
</div>
<iframe name="hiddenIframe" src="about:blank" width="0" height="0" frameborder="0"></iframe>

View file

@ -1,14 +1,14 @@
<div class="cnb">
<a cond="$type == 'M'" href="{getUrl('act', 'dispLayoutAdminInstalledList', 'type', 'P')}">PC({$pcLayoutCount})</a>
<block cond="$type != 'M'">PC({$pcLayoutCount})</block>
|
<a cond="$type != 'M'" href="{getUrl('act', 'dispLayoutAdminInstalledList', 'type', 'M')}">Mobile({$mobileLayoutCount})</a>
<block cond="$type == 'M'">Mobile({$mobileLayoutCount})</block>
<a cond="$type == 'M'" href="{getUrl('act', 'dispLayoutAdminInstalledList', 'type', 'P')}">PC({$pcLayoutCount})</a>
<block cond="$type != 'M'">PC({$pcLayoutCount})</block>
|
<a cond="$type != 'M'" href="{getUrl('act', 'dispLayoutAdminInstalledList', 'type', 'M')}">Mobile({$mobileLayoutCount})</a>
<block cond="$type == 'M'">Mobile({$mobileLayoutCount})</block>
</div>
<div class="cnb">
<a cond="$act != 'dispLayoutAdminAllInstanceList'" href="{getUrl('act', 'dispLayoutAdminAllInstanceList', 'layout_srl', '')}">{$lang->instance_layout}</a>
<block cond="$act == 'dispLayoutAdminAllInstanceList'">{$lang->instance_layout}</block>
|
<a cond="$act != 'dispLayoutAdminInstalledList'" href="{getUrl('act', 'dispLayoutAdminInstalledList')}">{$lang->installed_layout}</a>
<block cond="$act == 'dispLayoutAdminInstalledList'">{$lang->installed_layout}</block>
<a cond="$act != 'dispLayoutAdminAllInstanceList'" href="{getUrl('act', 'dispLayoutAdminAllInstanceList', 'layout_srl', '')}">{$lang->instance_layout}</a>
<block cond="$act == 'dispLayoutAdminAllInstanceList'">{$lang->instance_layout}</block>
|
<a cond="$act != 'dispLayoutAdminInstalledList'" href="{getUrl('act', 'dispLayoutAdminInstalledList')}">{$lang->installed_layout}</a>
<block cond="$act == 'dispLayoutAdminInstalledList'">{$lang->installed_layout}</block>
</div>

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