merge from 1.5.2

git-svn-id: http://xe-core.googlecode.com/svn/trunk@10446 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
devjin 2012-03-20 08:03:02 +00:00
parent 6c23751ef8
commit c727926d9e
382 changed files with 6855 additions and 3603 deletions

View file

@ -178,17 +178,15 @@
if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); }
// 'Select'type obtained from the option list.
if(is_array($val->options)) {
$option_count = count($val->options);
if($val->options && !is_array($val->options))
{
$val->options = array($val->options);
}
for($i = 0; $i < $option_count; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->attrs->value;
}
} else {
$obj->options[0]->title = $val->options[0]->title->body;
$obj->options[0]->value = $val->options[0]->attrs->value;
}
for($i = 0, $c = count($val->options); $i < $c; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->attrs->value;
}
$addon_info->extra_vars[] = $obj;
}
@ -273,14 +271,15 @@
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.
if(is_array($val->options)) {
$option_count = count($val->options);
if($val->options && !is_array($val->options))
{
$val->options = array($val->options);
}
for($i = 0; $i < $option_count; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->value->body;
}
}
for($i = 0, $c = count($val->options); $i < $c; $i++) {
$obj->options[$i]->title = $val->options[$i]->title->body;
$obj->options[$i]->value = $val->options[$i]->value->body;
}
$addon_info->extra_vars[] = $obj;
}

View file

@ -137,10 +137,10 @@
$extra_vars = base64_encode($val->extra_vars);
}
$buff .= sprintf(' $_ml = unserialize(base64_decode("%s")); if(file_exists("%saddons/%s/%s.addon.php") && (!is_array($_ml) || in_array($_m, $_ml))) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); $addon_path = "%saddons/%s/"; @include("%saddons/%s/%s.addon.php"); }', $mid_list, _XE_PATH_, $addon, $addon, $extra_vars, _XE_PATH_, $addon, _XE_PATH_, $addon, $addon);
$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 = sprintf('<?php if(!defined("__ZBXE__")) exit(); $_m = Context::get(\'mid\'); %s ?>', $buff);
$buff = sprintf('<?php if(!defined("__XE__")) exit(); $_m = Context::get(\'mid\'); %s ?>', $buff);
$addon_path = _XE_PATH_.'files/cache/addons/';
if(!is_dir($addon_path)) FileHandler::makeDir($addon_path);

View file

@ -61,7 +61,7 @@
<value xml:lang="en"><![CDATA[Select a target where the added is used.<br />(If you select none, the addon will be used on all targets.)]]></value>
<value xml:lang="jp"><![CDATA[アドオンを使用する対象を指定します。<br />(選択しない場合、すべてのモジュールが利用可能対象となります]]></value>
<value xml:lang="zh-CN"><![CDATA[可以指定使用插件的对象。<br />(全部解除表示可用在所有对象。)]]></value>
<value xml:lang="zh-TW"><![CDATA[可以指定使用附加元件的目標。<br />(全部不選取表示可用所有目標。)]]></value>
<value xml:lang="zh-TW"><![CDATA[可以指定使用附加元件的目標。<br />(全部不選取表示可用所有目標。)]]></value>
<value xml:lang="fr"><![CDATA[On peut choisir des objets dans lesquels la Compagnon soit utilisé.<br />(Tout sera choisi quand rien n'est choisi.)]]></value>
<value xml:lang="ru"><![CDATA[애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제시 모든 대상에서 사용 가능합니다)]]></value>
<value xml:lang="es"><![CDATA[Add-ons se puede utilizar para especificar el destino. <br /> (Todo gratis, están disponibles en todos los destinos)]]></value>
@ -73,7 +73,7 @@
<value xml:lang="en"><![CDATA[Addons control many actions performed in your site rather than display HTML results.<br />You can control useful functions simply by switching ON/OFF of addons.]]></value>
<value xml:lang="jp"><![CDATA[アドオンは、HTMLの出力をコントロールするというより、動作を制御する役割をします。アドオンを「使用/未使用」に設定するだけで、サイトの運営に有用な機能を利用できます。]]></value>
<value xml:lang="zh-CN"><![CDATA[插件就是对动作(Action)的有效控制来给核心程序提供扩展功能的一种组件。<br />只需启用/禁用操作,即可为网站提供强大的扩展功能。]]></value>
<value xml:lang="zh-TW"><![CDATA[附加元件可對 Action進行控制並可擴展核心程式功能,而不是顯示輸出 HTML結果。<br />『啟用/禁用』附加元件,以增強網站的功能。]]></value>
<value xml:lang="zh-TW"><![CDATA[附加元件可對 Action 進行控制並可擴展核心程式功能,而不是顯示 HTML 結果。<br />『啟用/禁用』附加元件,以增強網站的功能。]]></value>
<value xml:lang="fr"><![CDATA[La Compagnon, c'est pour contrôler les actions plutôt d'imprimer des résultats de HTML.<br/>Par la Touche à Bascule des compagnons que vous voulez faire marcher ou arrêter, vous pouvez appliquer les fonctions très utiles à administrer votre site Web.]]></value>
<value xml:lang="ru"><![CDATA[Аддон служит больше для контролирования действий, чем для отображения HTML-результатов.<br />Простым включением/выключением любых аддонов, Вы можете использовать очень полезные функции для администрирования Вашего веб-сайта]]></value>
<value xml:lang="es"><![CDATA[Addon is para controlar las acciones y no para mostrar el resultado en HTML.<br /> Sólo con activar o desactivar el addon que desee, podrá obtener funciones útiles para la administración de tu sitio web.]]></value>
@ -84,25 +84,30 @@
<value xml:lang="ko"><![CDATA[설치된 애드온]]></value>
<value xml:lang="en"><![CDATA[Installed Add-ons]]></value>
<value xml:lang="jp"><![CDATA[インストールされているアドオン]]></value>
<value xml:lang="zh-TW"><![CDATA[已安裝附加元件]]></value>
</item>
<item name="about_installed_addon">
<value xml:lang="ko"><![CDATA[PC, Mobile에 체크하면 애드온을 켤 수 있습니다.]]></value>
<value xml:lang="en"><![CDATA[Check PC and Mobile to switch on the addon.]]></value>
<value xml:lang="jp"><![CDATA[PC、Mobileを選択するとアドオンを使用できます。]]></value>
<value xml:lang="zh-TW"><![CDATA[可選擇切換 PC 和 Mobile 的附加元件。]]></value>
</item>
<item name="fixed">
<value xml:lang="ko"><![CDATA[고정]]></value>
<value xml:lang="en"><![CDATA[Fixed]]></value>
<value xml:lang="jp"><![CDATA[固定]]></value>
<value xml:lang="zh-TW"><![CDATA[固定]]></value>
</item>
<item name="about_fixed">
<value xml:lang="ko"><![CDATA[체크하면 사이트 관리자가 이 설정을 변경할 수 없음.]]></value>
<value xml:lang="en"><![CDATA[Check this, and the site administrator cannot change this setting.]]></value>
<value xml:lang="jp"><![CDATA[選択すると、サイトマネージャーがこの設定を変更することができません。]]></value>
<value xml:lang="zh-TW"><![CDATA[選擇此項後,網站管理員將無法變更設定。]]></value>
</item>
<item name="msg_not_exist_option">
<value xml:lang="ko"><![CDATA[이 애드온은 설정이 존재하지 않습니다.]]></value>
<value xml:lang="en"><![CDATA[Configuration for this addon does not exist.]]></value>
<value xml:lang="en"><![CDATA[Configuration for this addon does not exist.]]></value>
<value xml:lang="jp"><![CDATA[このアドオンは、設定がありません。]]></value>
<value xml:lang="zh-TW"><![CDATA[此附加元件的設定不存在。]]></value>
</item>
</lang>

View file

@ -8,19 +8,22 @@
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="table even easyList">
<div class="table even easyList dsTg">
<table width="100%" border="1" cellspacing="0">
<caption>All({$addon_count})</caption>
<caption>
All({$addon_count})
<span class="side"><button type="button" class="text"><span class="hide">{$lang->simple_view}</span><span class="show">{$lang->detail_view}</span></button></span>
</caption>
<thead>
<tr>
<th scope="col" class="title">{$lang->addon_name}</th>
<th scope="col">{$lang->version}</th>
<th scope="col">{$lang->author}</th>
<th scope="col">{$lang->installed_path}</th>
<th scope="col">{$lang->cmd_setup}</th>
<th scope="col">PC</th>
<th scope="col">Mobile</th>
<th scope="col">{$lang->cmd_delete}</th>
<th scope="col" class="nowr">{$lang->version}</th>
<th scope="col" class="nowr">{$lang->author}</th>
<th scope="col" class="nowr">{$lang->installed_path}</th>
<th scope="col" class="nowr">{$lang->cmd_setup}</th>
<th scope="col" class="nowr">PC</th>
<th scope="col" class="nowr">Mobile</th>
<th scope="col" class="nowr">{$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
@ -32,18 +35,18 @@
{$lang->msg_avail_easy_update} <a href="{$addon->update_url}&amp;return_url={urlencode(getRequestUriByServerEnviroment())}">{$lang->msg_do_you_like_update}</a>
</p>
</td>
<td>{$addon->version}</td>
<td>
<td class="nowr">{$addon->version}</td>
<td class="nowr">
<block loop="$addon->author => $author">
<a cond="$author->homepage" href="{$author->homepage}" target="_blank">{$author->name}</a>
<block cond="!$author->homepage">{$author->name}</block>
</block>
</td>
<td>{$addon->path}</td>
<td><a href="{getUrl('act', 'dispAddonAdminSetup', 'selected_addon', $addon->addon_name)}">{$lang->cmd_setup}</a></td>
<td><input type="checkbox" name="pc_on[]" title="PC" value="{htmlspecialchars($addon->addon_name)}" checked="checked"|cond="$addon->activated" /></td>
<td><input type="checkbox" name="mobile_on[]" title="Mobile" value="{htmlspecialchars($addon->addon_name)}" checked="checked"|cond="$addon->mactivated" /></td>
<td><a cond="$addon->remove_url" href="{$addon->remove_url}&amp;return_url={urlencode(getRequestUriByServerEnviroment())}">{$lang->cmd_delete}</a></td>
<td class="nowr">{$addon->path}</td>
<td class="nowr"><a href="{getUrl('act', 'dispAddonAdminSetup', 'selected_addon', $addon->addon_name)}">{$lang->cmd_setup}</a></td>
<td class="nowr"><input type="checkbox" name="pc_on[]" title="PC" value="{htmlspecialchars($addon->addon_name)}" checked="checked"|cond="$addon->activated" /></td>
<td class="nowr"><input type="checkbox" name="mobile_on[]" title="Mobile" value="{htmlspecialchars($addon->addon_name)}" checked="checked"|cond="$addon->mactivated" /></td>
<td class="nowr"><a cond="$addon->remove_url" href="{$addon->remove_url}&amp;return_url={urlencode(getRequestUriByServerEnviroment())}">{$lang->cmd_delete}</a></td>
</tr>
</tbody>
</table>

View file

@ -32,7 +32,7 @@
<p class="q"><label for="{$var->name}">{$var->title}</label></p>
<p class="a">
<input cond="$var->type == 'text'" type="text" name="{$var->name}" id="{$var->name}" value="{htmlspecialchars($var->value)}" class="lang_code">
<textarea cond="$var->type == 'textarea'" name="{$var->name}" id="{$var->name}" class="lang_code">{htmlspecialchars($var->value)}</textarea>
<textarea cond="$var->type == 'textarea'" name="{$var->name}" id="{$var->name}" class="lang_code" rows="8" cols="42">{htmlspecialchars($var->value)}</textarea>
<select cond="$var->type == 'select'" name="{$var->name}" id="{$var->name}">
<option loop="$var->options => $option" value="{$option->value}" selected="selected"|cond="$var->value == $option->value">{$option->title}</option>
</select>

View file

@ -40,6 +40,7 @@
function getAdminFTPList()
{
Context::loadLang('./modules/autoinstall/lang');
set_time_limit(5);
require_once(_XE_PATH_.'libs/ftp.class.php');
$ftp_info = Context::getRequestVars();
@ -90,6 +91,10 @@
if(strpos($v,'d') === 0 || strpos($v, '<DIR>')) $list[] = substr(strrchr($v,' '),1) . '/';
}
}
else
{
return new Object(-1,'msg_ftp_no_directory');
}
$this->add('list', $list);
}

View file

@ -144,6 +144,43 @@
$output = $oAdminAdminModel->getFavoriteList(0, true);
Context::set('favorite_list', $output->get('favoriteList'));
// Retrieve recent news and set them into context,
// move from index method, because use in admin footer
$newest_news_url = sprintf("http://news.xpressengine.com/%s/news.php?version=%s&package=%s", _XE_LOCATION_, __ZBXE_VERSION__, _XE_PACKAGE_);
$cache_file = sprintf("%sfiles/cache/newest_news.%s.cache.php", _XE_PATH_, _XE_LOCATION_);
if(!file_exists($cache_file) || filemtime($cache_file)+ 60*60 < time()) {
// Considering if data cannot be retrieved due to network problem, modify filemtime to prevent trying to reload again when refreshing administration page
// Ensure to access the administration page even though news cannot be displayed
FileHandler::writeFile($cache_file,'');
FileHandler::getRemoteFile($newest_news_url, $cache_file, null, 1, 'GET', 'text/html', array('REQUESTURL'=>getFullUrl('')));
}
if(file_exists($cache_file)) {
$oXml = new XmlParser();
$buff = $oXml->parse(FileHandler::readFile($cache_file));
$item = $buff->zbxe_news->item;
if($item) {
if(!is_array($item)) $item = array($item);
foreach($item as $key => $val) {
$obj = null;
$obj->title = $val->body;
$obj->date = $val->attrs->date;
$obj->url = $val->attrs->url;
$news[] = $obj;
}
Context::set('news', $news);
if(isset($news) && is_array($news))
{
Context::set('latestVersion', array_shift($news));
}
}
Context::set('released_version', $buff->zbxe_news->attrs->released_version);
Context::set('download_link', $buff->zbxe_news->attrs->download_link);
}
Context::set('subMenuTitle', $subMenuTitle);
Context::set('gnbUrlList', $menu->list);
Context::set('parentSrl', $parentSrl);
@ -151,62 +188,6 @@
Context::setBrowserTitle($browserTitle);
}
function loadSideBar()
{
$oModuleModel = &getModel('module');
$installed_module_list = $oModuleModel->getModulesXmlInfo();
$installed_modules = $package_modules = array();
$package_idx = 0;
foreach($installed_module_list as $key => $val) {
if($val->category == 'migration') $val->category = 'system';
if($val->category == 'interlock') $val->category = 'accessory';
if($val->category == 'statistics') $val->category = 'accessory';
if($val->module == 'admin' || !$val->admin_index_act) continue;
// get action information
$action_spec = $oModuleModel->getModuleActionXml($val->module);
$actions = array();
if($action_spec->default_index_act) $actions[] = $action_spec->default_index_act;
if($action_spec->admin_index_act) $actions[] = $action_spec->admin_index_act;
if($action_spec->action) foreach($action_spec->action as $k => $v) $actions[] = $k;
$obj = null;
$obj->category = $val->category;
$obj->title = $val->title;
$obj->description = $val->description;
$obj->index_act = $val->admin_index_act;
if(in_array(Context::get('act'), $actions)) $obj->selected = true;
// Packages
if($val->category == 'package') {
if($package_idx == 0) $obj->position = "first";
else $obj->position = "mid";
$package_modules[] = $obj;
$package_idx ++;
if($obj->selected) Context::set('package_selected',true);
// Modules
} else {
$installed_modules[] = $obj;
}
if($obj->selected) {
Context::set('selected_module_category', $val->category);
Context::set('selected_module_info', $val);
}
}
if(count($package_modules)) $package_modules[count($package_modules)-1]->position = 'end';
Context::set('package_modules', $package_modules);
Context::set('installed_modules', $installed_modules);
Context::setBrowserTitle("XE Admin Page");
// add javascript tooltip plugin - gony
Context::loadJavascriptPlugin('qtip');
Context::loadJavascriptPlugin('watchinput');
$security = new Security();
$security->encodeHTML('selected_module_info.', 'selected_module_info.author..', 'package_modules..', 'installed_modules..');
}
/**
* @brief Display Super Admin Dashboard
* @return none
@ -277,51 +258,29 @@
Context::set('latestTrackbackList', $output->data);
unset($args, $output, $columnList);
//Retrieve recent news and set them into context
$newest_news_url = sprintf("http://news.xpressengine.com/%s/news.php?version=%s&package=%s", _XE_LOCATION_, __ZBXE_VERSION__, _XE_PACKAGE_);
$cache_file = sprintf("%sfiles/cache/newest_news.%s.cache.php", _XE_PATH_, _XE_LOCATION_);
if(!file_exists($cache_file) || filemtime($cache_file)+ 60*60 < time()) {
// Considering if data cannot be retrieved due to network problem, modify filemtime to prevent trying to reload again when refreshing administration page
// Ensure to access the administration page even though news cannot be displayed
FileHandler::writeFile($cache_file,'');
FileHandler::getRemoteFile($newest_news_url, $cache_file, null, 1, 'GET', 'text/html', array('REQUESTURL'=>getFullUrl('')));
}
if(file_exists($cache_file)) {
$oXml = new XmlParser();
$buff = $oXml->parse(FileHandler::readFile($cache_file));
$item = $buff->zbxe_news->item;
if($item) {
if(!is_array($item)) $item = array($item);
foreach($item as $key => $val) {
$obj = null;
$obj->title = $val->body;
$obj->date = $val->attrs->date;
$obj->url = $val->attrs->url;
$news[] = $obj;
}
Context::set('news', $news);
}
Context::set('released_version', $buff->zbxe_news->attrs->released_version);
Context::set('download_link', $buff->zbxe_news->attrs->download_link);
}
// Get list of modules
$oModuleModel = &getModel('module');
$module_list = $oModuleModel->getModuleList();
if(is_array($module_list))
{
$isUpdated = false;
$needUpdate = false;
$addTables = false;
foreach($module_list AS $key=>$value)
{
if($value->need_install || $value->need_update)
$isUpdated = true;
if($value->need_install)
{
$addTables = true;
}
if($value->need_update)
{
$needUpdate = true;
}
}
}
Context::set('module_list', $module_list);
Context::set('isUpdated', $isUpdated);
Context::set('needUpdate', $isUpdated);
Context::set('addTables', $addTables);
Context::set('needUpdate', $needUpdate);
// gathering enviroment check
$mainVersion = join('.', array_slice(explode('.', __ZBXE_VERSION__), 0, 2));

View file

@ -82,7 +82,10 @@
$args->menu_srl = $menuSrl;
$args->menu_item_srl = getNextSequence();
$args->name = '{$lang->menu_gnb[\''.$value.'\']}';
if($value == 'dashboard') $args->url = getUrl('', 'module', 'admin');
if($value == 'dashboard')
{
$args->url = 'index.php?module=admin';
}
else $args->url = '#';
$args->listorder = -1*$args->menu_item_srl;
$output = executeQuery('menu.insertMenuItem', $args);

View file

@ -874,11 +874,6 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]></value>
<value xml:lang="en"><![CDATA[Ratio(Keep Aspect)]]></value>
<value xml:lang="jp"><![CDATA[Ratio(縦横の比率をキープ)]]></value>
</item>
<item name="ratio">
<value xml:lang="ko"><![CDATA[Ratio(비율 맞추기)]]></value>
<value xml:lang="en"><![CDATA[Ratio(Keep Aspect)]]></value>
<value xml:lang="jp"><![CDATA[Ratio(縦横の比率をキープ)]]></value>
</item>
<item name="about_admin_ip_limit">
<value xml:lang="ko"><![CDATA[관리자 페이지로 접근가능한 IP대역을 지정합니다.]]></value>
<value xml:lang="en"><![CDATA[Sepcify IP address band that can access the admin page.]]></value>
@ -1073,6 +1068,21 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]></value>
<value xml:lang="ko"><![CDATA[업데이트 가능]]></value>
<value xml:lang="en"><![CDATA[Update Available]]></value>
</item>
<item name="need_update_and_table">
<value xml:lang="ko"><![CDATA[DB Table 생성과 모듈 업데이트 필요]]></value>
<value xml:lang="en"><![CDATA[Need to Create DB Table and Update Module]]></value>
<value xml:lang="jp"><![CDATA[DBテーブルの生成とモジュールの更新が必要]]></value>
</item>
<item name="need_update">
<value xml:lang="ko"><![CDATA[모듈 업데이트 필요]]></value>
<value xml:lang="en"><![CDATA[Need to Update Module]]></value>
<value xml:lang="jp"><![CDATA[モジュールの更新が必要]]></value>
</item>
<item name="need_table">
<value xml:lang="ko"><![CDATA[DB Table 생성 필요]]></value>
<value xml:lang="en"><![CDATA[Need to Create DB Table]]></value>
<value xml:lang="jp"><![CDATA[DBテーブルの生成が必要]]></value>
</item>
<item name="admin_menu_setup">
<value xml:lang="ko"><![CDATA[관리자 메뉴 설정]]></value>
<value xml:lang="en"><![CDATA[Admin Menu Setup]]></value>
@ -1185,32 +1195,19 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]></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 name="msg_ftp_no_directory">
<value xml:lang="ko"><![CDATA[FTP 접속에 성공했으나, 디렉토리 정보를 읽어올 수 없습니다. 서버 설정을 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="jp"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="zh-CN"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="zh-TW"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="fr"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="de"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="ru"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="es"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="tr"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="vi"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
<value xml:lang="mn"><![CDATA[Succeed to connect to the host via FTP. However, can not read any directory list informaiton. Check the server configurations.]]></value>
</item>
<item name="msg_ftp_mkdir_fail">
<value xml:lang="ko"><![CDATA[FTP를 이용한 디렉토리 생성 명령에 실패했습니다. FTP 서버의 설정을 확인해주세요.]]></value>

View file

@ -1,10 +1,14 @@
</div>
<div class="footer">
<p class="power">Powered by <strong><a href="{_XE_LOCATION_SITE_}" target="_blank">XE</a></strong> (ver. {__XE_VERSION__}).</p>
<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-->
</p>
<p class="cache">
<button type="button" class="text" onclick="doResetAdminMenu();">{$lang->cmd_admin_menu_reset}</button>
<button type="button" class="text" onclick="doRecompileCacheFile();">{$lang->cmd_remake_cache}</button>
<button type="button" class="text" onclick="doClearSession();">{$lang->cmd_clear_session}</button>
<button type="button" class="text" onclick="doResetAdminMenu();">{$lang->cmd_admin_menu_reset}</button> <span class="vr">|</span>
<button type="button" class="text" onclick="doRecompileCacheFile();">{$lang->cmd_remake_cache}</button> <span class="vr">|</span>
<button type="button" class="text" onclick="doClearSession();">{$lang->cmd_clear_session}</button> <span class="vr">|</span>
<a href="http://code.google.com/p/xe-core/issues/entry" target="_blank">{$lang->bug_report}</a>
</p>
</div>

View file

@ -15,31 +15,43 @@
</li>
</ul>
</div>
<div class="gnb jx">
<ul>
<li loop="$gnbUrlList=>$key,$value" class="activeOn"|cond="$parentSrl==$key"><a href="{$value['href']}">{$value['text']}</a>
<div class="gnb">
<ul class="nav">
<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="{$value2['href']}">{$value2['text']}</a></li>
<li loop="$value['list']=>$key2,$value2"><a href="{getFullUrl('')}{$value2['href']}">{$value2['text']}</a></li>
</ul>
</li>
</ul>
</div>
<div class="bmk">
<a href="#bmk" class="tgAnchor" data-effect="fade" data-duration="200">{$lang->favorite}</a>
<ul id="bmk" class="tgContent">
<li loop="$favorite_list => $favorite">
<a href="{getUrl('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>
<select class="mnv">
<block loop="$gnbUrlList=>$key,$value">
<optgroup label="{$value['text']}" cond="count($value['list']) > 0">
<option loop="$value['list']=>$key2,$value2" value="{getFullUrl('')}{$value2['href']}" selected="selected"|cond="$value2['text'] == $subMenuTitle">{$value2['text']}</option>
</optgroup>
<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>
</select>
</div>
</div>
<div class="body">
<div class="body">

View file

@ -76,7 +76,7 @@ jQuery(function($){
<li>
<p class="q"><label for="time_zone">{$lang->about_timezone}</label></p>
<p class="a">
<select name="time_zone" id="time_zone" class="fullWidth">
<select name="time_zone" id="time_zone">
<!--@foreach($time_zone_list as $key => $val)-->
<option value="{$key}" <!--@if($time_zone==$key)-->selected="selected"<!--@end-->>{$val}</option>
<!--@endforeach-->
@ -105,7 +105,7 @@ jQuery(function($){
<p>{$lang->detail_input_footer_script}</p>
</div>
<p class="a">
<textarea name="htmlFooter" id="htmlFooter" rows="4" cols="42">{$htmlFooter}</textarea>
<textarea name="htmlFooter" id="htmlFooter" rows="8" cols="42">{$htmlFooter}</textarea>
</p>
</li>
<li>
@ -137,7 +137,7 @@ jQuery(function($){
<p>{$lang->detail_about_admin_ip_limit}</p>
</div>
<p class="a">
<textarea name="admin_ip_list" id="admin_ip_list" rows="4" cols="42">{$admin_ip_list}</textarea>
<textarea name="admin_ip_list" id="admin_ip_list" rows="8" cols="42">{$admin_ip_list}</textarea>
{$lang->local_ip_address} : {$IP}</p>
</li>
<li>

View file

@ -58,19 +58,21 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .table caption strong{color:#e00}
.x .table caption .side{float:right;font-weight:normal;margin-left:1em}
.x .table th,
.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}
.x .table th{background:#f8f8f8}
.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}
.x .table th{background:#f8f8f8;white-space:nowrap}
.x .table thead th{border-bottom:1px solid #999}
.x .table tfoot td{font-weight:bold;background:#f8f8f8}
.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}
.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}
.x .table tbody tr:hover{background:#ffd !important}
.x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle}
.x .table img{vertical-align:middle}
.x .table em{font-style:normal;font-weight:normal;color:#e00}
.x .table th.nowr,
.x .table td.nowr{white-space:nowrap}
.x .table th.title,
.x .table td.title,
.x .table th.text,
.x .table td.text{white-space:normal;width:100%}
.x .table td[colspan]{white-space:normal}
.x .table td.text{width:100%}
/* Form */
.x .form{margin:1em 0;padding:0}
.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}
@ -84,6 +86,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .form input[type=file]{cursor:pointer}
.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}
.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}
.x .form li:hover{background:#ffd}
.x .form li:first-child{border-top:0}
.x .form li>label:first-child{display:block;font-weight:bold}
.x .form li label em{font-weight:normal}
@ -91,6 +94,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .form input[type=text],
.x .form input[type=password],
.x .form input[type=file],
.x .form select[size],
.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}
.x .form input[type=text],
.x .form input[type=password],
@ -105,7 +109,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .form input[type=checkbox][disabled=disabled],
.x .form select[disabled=disabled],
.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}
.x .form textarea{padding:3px 4px;vertical-align:top}
.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}
.x .form span.desc,
.x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}
.x .form p.desc{margin:.25em 0;line-height:1.4}
@ -113,60 +117,46 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .form .a{margin:0 0 5px 0}
.x .form .tgForm{margin-right:1em}
/* Global Navigation Bar */
.x .gnb{position:relative;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 ul{margin:0;padding:0 0 0 20px;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}
.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}
.x .gnb ul:after{content:"";display:block;clear:both}
.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}
.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}
.x .gnb li li:first-child{border:0}
.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;height:14px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}
.x .gnb li a:hover,
.x .gnb li a:active,
.x .gnb li a:focus,
.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}
.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}
.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}
.x .gnb li.active li a:hover,
.x .gnb li.active li a:active,
.x .gnb li.active li a:focus{border:0;background:#eee}
.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}
.x .gnb.jx ul{display:block;position:static;padding:0}
.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}
.x .gnb.jx ul ul{border:0}
.x .gnb.jx li li{border:0}
.x .gnb.jx li a{float:none;display:block}
.x .gnb.jx li a:hover,
.x .gnb.jx li a:active,
.x .gnb.jx li a:focus{background:none}
.x .gnb.jx li.activeOn>a{background:#ddd}
.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 .mnv{width:100%;height:32px;display:none}
@media only all and (max-width:860px){
.x .gnb ul{padding-left:1em}
.x .gnb .setting{right:1em}
}
@media only all and (max-width:640px){
.x .gnb ul{display:block;position:static;padding:0}
.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}
.x .gnb ul ul{border:0;position:static}
.x .gnb li li{border:0}
.x .gnb li a{float:none;display:block}
.x .gnb li a:hover,
.x .gnb li a:active,
.x .gnb li a:focus{background:none}
.x .gnb li.activeOn>a{background:#ddd}
}
/* Favorite */
.x .bmk{position:absolute;right:20px;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}
.x .bmk>a{text-shadow:0 1px 0 #fff}
.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}
.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}
.x .bmk li .action{position:absolute;top:0;right:0}
.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}
@media only all and (max-width:640px){
.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}
.x .bmk .tgAnchor{display:block}
.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}
.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}
.x .gnb{height:auto}
.x .gnb .nav,
.x .gnb .bmk{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}
@ -236,7 +226,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di
.x .prgrs.prgrsLarge .pAction,
.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}
/* Modal Window */
.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}
.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:99}
.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}
.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}
.modal ul,
@ -262,7 +252,10 @@ 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}
.x .skipNav a{position:absolute;width:1px;height:1px;display:block;font-weight:bold;padding:10px 0}
@media only 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}
.x .skipNav a:hover,
.x .skipNav a:active,
.x .skipNav a:focus{position:relative;width:auto;height:auto}
@ -270,11 +263,11 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0}
.x .header:after{content:"";display:block;clear:both}
.x .header a{text-decoration:none}
.x .header h1{margin:0 15px 10px 20px;font-size:24px;line-height:32px;display:inline-block;zoom:1}
.x .header h1{margin:0 0 10px 20px;font-size:24px;line-height:32px;display:inline-block;*display:inline;zoom:1;vertical-align:middle}
.x .header h1 *{vertical-align:middle}
.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}
.x .header h1 a{display:inline-block;color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}
.x .header h1 .url{font-size:12px;font-weight:normal}
.x .header .site{margin:0;display:inline-block;zoom:1}
.x .header .site{margin:0 0 10px 20px;display:inline-block;*display:inline;zoom:1}
.x .header .site a{color:#fff;text-decoration:underline}
.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}
.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}
@ -282,12 +275,15 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}
.x .header #siteMapList li{white-space:nowrap}
.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0}
.x .header .account ul{margin:0 2px 0 0;padding:5px 20px 5px 0;list-style:none}
.x .header .account ul{margin:0;padding:5px 20px 5px 0;list-style:none}
.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}
.x .header .account li:first-child{border:0}
.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:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}
.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){
.x .header #language{right:-10px}
}
.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}
.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}
.x .header #language li.selected a{text-decoration:underline}
@ -303,6 +299,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.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:after{content:"";display:block;clear:both}
@ -334,7 +331,9 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .search form{float:right;margin:1em 0}
.x .search form *{vertical-align:middle}
/* Site Map */
.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}
.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:3px 4px;margin:0;border:0;background:transparent}
.x .siteMap h2:hover input,
.x .siteMap h2 input:focus{background:#ff0;border:1px dashed #ccc;margin:-1px}
.x .siteMap label{cursor:text}
.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}
.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}
@ -496,7 +495,10 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .easyNav h2{font-size:16px}
.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}
.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}
.x .easyList td p{margin-top:0}
.x .easyList caption .side .text .hide,
.x .easyList caption .side .details .show{display:none}
.x .easyList caption .side .details .hide{display:inline}
.x .easyList td p:first-child{margin:0}
.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}
/* Font Preview */
.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}
@ -576,7 +578,6 @@ 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}
/* Responsive Layout */
@media only all and (max-width:860px){
.x .header h1{margin-left:.7em}
.x .header .account ul{padding-right:10px}
.x .body{padding:0}
.x .content{float:none;margin-left:0}
@ -587,10 +588,6 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */
.x .easyNav .category{float:none;display:block;width:auto}
.x .easyNav .filter{position:static}
}
@media only all and (max-width:640px){
.x .skipNav a{position:relative;width:auto;height:auto}
.modal{position:absolute}
}
/* Legacy Code (Don't use it. It will be removed as soon as possible.) */
.x h3.xeAdmin,
.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,7 @@
<!--#include("./_spHeader.html")-->
<div class="content dashboard" id="content">
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
@ -15,15 +18,17 @@
</div>
</form>
<!--@end-->
<!--@if($isUpdated)-->
<!--@if($addTables || $needUpdate)-->
<div class="message update">
<h2>{$lang->update_available}</h2>
<h2 cond="$needUpdate && $addTables">{$lang->need_update_and_table}</h2>
<h2 cond="$needUpdate && !$addTables">{$lang->need_update}</h2>
<h2 cond="!$needUpdate && $addTables">{$lang->need_table}</h2>
<ul>
<!--@foreach($module_list AS $key => $value)-->
<!--@if($value->need_install)-->
<li><a href="{getUrl('','module','admin','act',$val->admin_index_act)}">{$value->module}</a> - <a href="#" onclick="doInstallModule('{$value->module}');return false;">{$lang->cmd_install}</a></li>
<li style="margin:0 0 4px 0;">{$value->module} - <span class="btn"><button type="button" onclick="doInstallModule('{$value->module}')">{$lang->cmd_create_db_table}</button></span></li>
<!--@else if($value->need_update)-->
<li><a href="{getUrl('','module','admin','act',$val->admin_index_act)}">{$value->module}</a> - <a href="#" onclick="doUpdateModule('{$value->module}')">{$lang->cmd_update}</a></li>
<li style="margin:0 0 4px 0;">{$value->module} - <span class="btn"><button type="button" onclick="doUpdateModule('{$value->module}')">{$lang->cmd_module_update}</button></li>
<!--@end-->
<!--@end-->
</ul>
@ -41,7 +46,7 @@
</ul>
</div>
<div class="portlet">
<h2 class="h2">{$lang->latest_documents}</h2>
<h2 class="h2"><a href="{getUrl('', 'module', 'admin', 'act', 'dispDocumentAdminList')}">{$lang->latest_documents}</a></h2>
<ul class="lined">
<!--@foreach($latestDocumentList AS $key=>$value)-->
{@$document = $value->variables}
@ -63,7 +68,7 @@
</ul>
</div>
<div class="portlet">
<h2 class="h2">{$lang->latest_comments}</h2>
<h2 class="h2"><a href="{getUrl('', 'module', 'admin', 'act', 'dispCommentAdminList')}">{$lang->latest_comments}</a></h2>
<ul class="lined">
<!--@foreach($latestCommentList AS $key=>$value)-->
<li>
@ -84,7 +89,7 @@
</ul>
</div>
<div class="portlet">
<h2 class="h2">{$lang->latest_trackbacks}</h2>
<h2 class="h2"><a href="{getUrl('', 'module', 'admin', 'act', 'dispTrackbackAdminList')}">{$lang->latest_trackbacks}</a></h2>
<ul class="lined">
<!--@foreach($latestTrackbackList AS $key=>$value)-->
<li>
@ -103,32 +108,6 @@
<li cond="!is_array($latestTrackbackList) || count($latestTrackbackList) < 1">{$lang->no_data}</li>
</ul>
</div>
<div class="portlet">
<h2 class="h2">{$lang->notices}</h2>
<ul class="lined">
<!--@foreach($news AS $key=>$value)-->
<li><a href="{$value->url}" target="_blank">{$value->title}</a> <span class="side">{zdate($value->date, 'Y-m-d')}</span></li>
<!--@end-->
<li cond="!is_array($news) || count($news) < 1">{$lang->no_data}</li>
</ul>
</div>
<div class="portlet">
<h2 class="h2">{$lang->favorites}</h2>
<ul class="lined">
<li loop="$favorite_list => $favorite">
<a href="{getUrl('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">{$lang->cmd_delete}</button>
</form>
</li>
<li cond="!is_array($favorite_list) || count($favorite_list) < 1">{$lang->no_data}</li>
</UL>
</div>
</div>
</div>
<!--#include("./_spFooter.html")-->

View file

@ -152,51 +152,73 @@ jQuery(function($){
// Global Navigation Bar
jQuery(function($){
$.fn.xeMenu = function(){
this
.removeClass('jx')
.attr('role', 'navigation') // WAI-ARIA role
.find('li')
.attr('role', 'menuitem') // WAI-ARIA role
.find('>ul').hide().end()
.filter(':has(>ul)')
.attr('aria-haspopup', 'true') // WAI-ARIA
$.fn.xeMenu = function(){
this
.attr('role', 'navigation') // WAI-ARIA role
.find('>.nav>li')
.attr('role', 'menuitem') // WAI-ARIA role
.find('>ul').css('height','0').end()
.filter(':has(>ul)')
.attr('aria-haspopup', 'true') // WAI-ARIA
.end()
.end()
.end()
.delegate('li', {
mouseover : function(){
.find('>.nav')
.mouseover(function(){
$(this)
.addClass('active')
.find('>ul').show().end()
.parentsUntil('.gnb')
.filter('li').addClass('active').end()
.end()
},
mouseleave : function(){
.parent('.gnb').addClass('active').end()
.find('>li>ul').css('height','auto').end()
})
.mouseleave(function(){
$(this)
.removeClass('active')
.find('>ul').hide();
},
focusout : function(){
.parent('.gnb').removeClass('active').end()
.find('>li>ul').css('height','0').end()
})
.focusout(function(){
var $this = $(this);
setTimeout(function(){
if(!$this.find(':focus').length) {
$this.removeClass('active').find('>ul').hide();
$this.mouseleave();
}
}, 1);
}
})
.delegate('a', {
focus : function(){
$(this).parent('li').mouseover();
}
});
};
})
.delegate('a', {
focus : 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();
$('div.gnb').xeMenu();
$('.gnb>.mnv').change(function(){
window.location.href=$(this).find('option:selected').val();
});
});
// Modal Window
jQuery(function($){
@ -944,7 +966,7 @@ function initLayer($layer) {
.bind('multilang-reset', function(){
$layer
.data('multilang-current-name', '')
.find('.langInput li').find('>input:text,>textarea').val(' ').prev('label').css('visibility','visible');
.find('.langInput li').find('>input:text,>textarea').val('').prev('label').css('visibility','visible');
mode = MODE_SAVE;
setTitleText();
@ -1190,3 +1212,21 @@ jQuery(function($){
$('.x>.body>.content').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(){
var $t = $(this)
if($t.find('p.update').length==0){
$t.addClass('tg').find('>p:not(:first-child)').hide();
} else {
$t.addClass('up');
}
});
var details = $('.x .dsTg td.tg>p:not(:first-child)');
viewBtn.click(function(){
viewBtn.toggleClass('details');
details.slideToggle(200);
});
});

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,5 @@
<?php
require_once(_XE_PATH_.'libs/ftp.class.php');
class ModuleInstaller {
var $package = null;
@ -139,10 +140,13 @@
$_files = $oTar->files;
$file_list = array();
foreach($_files as $key => $info) {
FileHandler::writeFile($this->download_path."/".$info['name'], $info['file']);
$file_list[] = $info['name'];
}
if(is_array($_files))
{
foreach($_files as $key => $info) {
FileHandler::writeFile($this->download_path."/".$info['name'], $info['file']);
$file_list[] = $info['name'];
}
}
return $file_list;
}
@ -187,6 +191,11 @@
}
function _connect() {
if(!function_exists('ssh2_connect'))
{
return new Object(-1, 'msg_sftp_not_supported');
}
if(!$this->ftp_info->ftp_user || !$this->ftp_info->sftp || $this->ftp_info->sftp != 'Y') return new Object(-1,'msg_ftp_invalid_auth_info');
if($this->ftp_info->ftp_host)
@ -217,7 +226,7 @@
if(!@ssh2_sftp_unlink($this->sftp, $target_path))
{
return new Object(-1, "failed to delete file ".$path);
return new Object(-1, sprintf(Context::getLang('msg_delete_file_failed'), $path));
}
return new Object();
}
@ -229,7 +238,7 @@
if(!@ssh2_sftp_rmdir($this->sftp, $target_path))
{
return new Object(-1, "failed to delete directory ".$path);
return new Object(-1, sprintf(Context::getLang('msg_delete_dir_failed'), $path));
}
return new Object();
}
@ -284,7 +293,10 @@
}
$this->connection = ftp_connect($ftp_host, $this->ftp_info->ftp_port);
if(!$this->connection) return new Object(-1, 'msg_ftp_not_connected');
if(!$this->connection)
{
return new Object(-1, sprintf(Context::getLang('msg_ftp_not_connected'), $ftp_host));
}
$login_result = @ftp_login($this->connection, $this->ftp_info->ftp_user, $this->ftp_password);
if(!$login_result)
@ -361,7 +373,7 @@
return new Object(-1, "msg_make_directory_failed");
}
if(!stristr(PHP_OS, 'win'))
if(strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
{
if (function_exists('ftp_chmod')) {
if(!ftp_chmod($this->connection, 0755, $ftp_path))
@ -411,7 +423,10 @@
}
$this->oFtp = new ftp();
if(!$this->oFtp->ftp_connect($ftp_host, $this->ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected');
if(!$this->oFtp->ftp_connect($ftp_host, $this->ftp_info->ftp_port))
{
return new Object(-1, sprintf(Context::getLang('msg_ftp_not_connected'), $ftp_host));
}
if(!$this->oFtp->ftp_login($this->ftp_info->ftp_user, $this->ftp_password)) {
$this->_close();
return new Object(-1,'msg_ftp_invalid_auth_info');
@ -427,7 +442,7 @@
if(!$this->oFtp->ftp_delete($target_path))
{
return new Object(-1, "failed to delete file ".$path);
return new Object(-1, sprintf(Context::getLang('msg_delete_file_failed'), $path));
}
return new Object();
}
@ -439,7 +454,7 @@
if(!$this->oFtp->ftp_rmdir($target_path))
{
return new Object(-1, "failed to delete directory ".$path);
return new Object(-1, sprintf(Context::getLang('msg_delete_dir_failed'), $path));
}
return new Object();
}
@ -451,8 +466,6 @@
function _copyDir(&$file_list){
if(!$this->ftp_password) return new Object(-1,'msg_ftp_password_input');
require_once(_XE_PATH_.'libs/ftp.class.php');
$output = $this->_connect();
if(!$output->toBool()) return $output;

View file

@ -12,13 +12,13 @@
<menus>
<menu name="easyInstall">
<title xml:lang="en">Easy Install</title>
<title xml:lang="ko">쉬운설치</title>
<title xml:lang="ko">쉬운 설치</title>
<title xml:lang="zh-CN">Easy Install</title>
<title xml:lang="jp">Easy Install</title>
<title xml:lang="es">Easy Install</title>
<title xml:lang="ru">Easy Install</title>
<title xml:lang="fr">Easy Install</title>
<title xml:lang="zh-TW">Easy Install</title>
<title xml:lang="zh-TW">自動安裝</title>
<title xml:lang="vi">Easy Install</title>
<title xml:lang="mn">Easy Install</title>
<title xml:lang="tr">Easy Install</title>

View file

@ -71,24 +71,26 @@
<value xml:lang="en"><![CDATA[If the %s is not set, the installation or update will not work. Pleas configure the FTP information.]]></value>
<value xml:lang="jp"><![CDATA[%sが完了されないと、イージーインストールが動作しません。 FTP設定を確認してください。]]></value>
<value xml:lang="ru"><![CDATA[If %s is not set, installation would not work. Please configure FTP information]]></value>
<value xml:lang="zh-TW"><![CDATA[請先將 %s,否則無法執行自動安裝功能。]]></value>
<value xml:lang="zh-TW"><![CDATA[請先將 %s完成,否則無法執行自動安裝功能。]]></value>
</item>
<item name="ftp_setup">
<value xml:lang="ko"><![CDATA[FTP 설정]]></value>
<value xml:lang="en"><![CDATA[FTP configuration]]></value>
<value xml:lang="jp"><![CDATA[FTP設定]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP設定]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP 設定]]></value>
</item>
<item name="description_update">
<value xml:lang="ko"><![CDATA[쉬운설치 사용전 %s를 해주세요.]]></value>
<value xml:lang="ko"><![CDATA[쉬운 설치 사용전 %s를 해주세요.]]></value>
<value xml:lang="en"><![CDATA[Click %s before using EasyInstall.]]></value>
<value xml:lang="jp"><![CDATA[新しくインストールしたモジュールバージョン情報などは%sを押すと反映されます。]]></value>
<value xml:lang="zh-TW"><![CDATA[使用自動安裝前請先點擊%s]]></value>
<value xml:lang="ru"><![CDATA[If you have upgraded or installed programs without EasyInstall module, please press %s to renew new information]]></value>
</item>
<item name="status_update">
<value xml:lang="ko"><![CDATA[상태 업데이트]]></value>
<value xml:lang="en"><![CDATA[update button]]></value>
<value xml:lang="jp"><![CDATA[アップデート]]></value>
<value xml:lang="zh-TW"><![CDATA[更新按鈕]]></value>
</item>
<item name="install">
<value xml:lang="ko"><![CDATA[설치]]></value>
@ -115,7 +117,7 @@
<value xml:lang="en"><![CDATA[Version]]></value>
<value xml:lang="jp"><![CDATA[現インストールバージョン]]></value>
<value xml:lang="zh-CN"><![CDATA[现用版本]]></value>
<value xml:lang="zh-TW"><![CDATA[版本]]></value>
<value xml:lang="zh-TW"><![CDATA[目前版本]]></value>
<value xml:lang="fr"><![CDATA[Version Courante]]></value>
<value xml:lang="es"><![CDATA[Versión actual]]></value>
<value xml:lang="tr"><![CDATA[Sürüm]]></value>
@ -156,7 +158,7 @@
<value xml:lang="en"><![CDATA[If FTP is unavailable, you should manually download and extract it into the target path. (If the target path is ./modules/board, extract it to ./modules)]]></value>
<value xml:lang="jp"><![CDATA[FTPの利用ができない場合は、直接ダウンロードし、サーバー上の該当パスにてインストールしてください。 (一つ上の階層にて解凍します。 ./modules/board の場合 ./modulesに tarを解凍してください。)]]></value>
<value xml:lang="zh-CN"><![CDATA[无法使用FTP时需得自行下载安装到指定路径。]]></value>
<value xml:lang="zh-TW"><![CDATA[如果 FTP無法使用的話,必須要手動下載並解壓縮到目標路徑。(假設目標路徑為 ./modules/board 的話,將檔案解壓縮到 ./modules就可以了)]]></value>
<value xml:lang="zh-TW"><![CDATA[如果 FTP 無法使用的話,必須要手動下載並解壓縮到目標路徑。(假設目標路徑為 ./modules/board 的話,將檔案解壓縮到 ./modules就可以了)]]></value>
<value xml:lang="ru"><![CDATA[If FTP is unavailable, you should manually download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)]]></value>
<value xml:lang="tr"><![CDATA[Eğer FTP kullanılamaz durumduysa, indirmeyi kendiniz yapmanız ve dosyaları hedef dizine çıkartmanız gerekmektedir. (eğer hedef yol ./modules/board ise, çıkarma işlemini ./modules yoluna yapınız)]]></value>
<value xml:lang="vi"><![CDATA[Khi FTP không được mở, bạn nên tải về và giả nén, sau đó Upload theo đường dẫn. (Nếu đường dẫn là ./modules/board, thì giải nén vào ./modules)]]></value>
@ -193,11 +195,13 @@
<value xml:lang="ko"><![CDATA[배포 버전]]></value>
<value xml:lang="en"><![CDATA[Distribute version]]></value>
<value xml:lang="jp"><![CDATA[配布バージョン]]></value>
<value xml:lang="zh-TW"><![CDATA[發布版本]]></value>
</item>
<item name="run">
<value xml:lang="ko"><![CDATA[실행]]></value>
<value xml:lang="en"><![CDATA[Run]]></value>
<value xml:lang="jp"><![CDATA[実行]]></value>
<value xml:lang="zh-TW"><![CDATA[執行]]></value>
</item>
<item name="rate">
<value xml:lang="ko"><![CDATA[%s점]]></value>
@ -213,26 +217,31 @@
<value xml:lang="ko"><![CDATA[섬네일]]></value>
<value xml:lang="en"><![CDATA[Thumbnail]]></value>
<value xml:lang="jp"><![CDATA[サムネイル]]></value>
<value xml:lang="zh-TW"><![CDATA[縮圖]]></value>
</item>
<item name="name">
<value xml:lang="ko"><![CDATA[이름]]></value>
<value xml:lang="en"><![CDATA[Name]]></value>
<value xml:lang="jp"><![CDATA[名前]]></value>
<value xml:lang="zh-TW"><![CDATA[名稱]]></value>
</item>
<item name="about_depending_programs">
<value xml:lang="ko"><![CDATA[이 패키지 사용을 위해서는 아래 프로그램이 설치되어 있어야 합니다.]]></value>
<value xml:lang="en"><![CDATA[To use this package, the following program should have been installed.]]></value>
<value xml:lang="jp"><![CDATA[このパッケージを使用するには、下記のプログラムがインストールされていなければなりません。]]></value>
<value xml:lang="zh-TW"><![CDATA[使用此 package將會安裝下列 program]]></value>
</item>
<item name="ftp_password">
<value xml:lang="ko"><![CDATA[FTP 비밀번호]]></value>
<value xml:lang="en"><![CDATA[FTP password]]></value>
<value xml:lang="jp"><![CDATA[FTP パスワード]]></value>
<value xml:lang="zh-TW"><![CDATA[FTP 密碼]]></value>
</item>
<item name="msg_dependency_package">
<value xml:lang="ko"><![CDATA[이 패키지를 의존하고 있는 다른 패키지가 있기 때문에 삭제할 수 없습니다.]]></value>
<value xml:lang="en"><![CDATA[Cannot remove this package because there exists another packages dependent on this.]]></value>
<value xml:lang="jp"><![CDATA[このパッケージに依存している他のパッケージがあるため、削除できません。]]></value>
<value xml:lang="zh-TW"><![CDATA[無法刪除此 package因為有其他 package用到。]]></value>
</item>
<item name="dependant_list">
<value xml:lang="ko"><![CDATA[이 패키지에 의존하는 패키지 목록]]></value>
@ -247,20 +256,75 @@
<value xml:lang="ko"><![CDATA[이 항목의 새로운 버전이 있습니다.]]></value>
<value xml:lang="en"><![CDATA[There is new version for this item.]]></value>
<value xml:lang="jp"><![CDATA[この項目の新しいバージョンがあります。]]></value>
<value xml:lang="zh-TW"><![CDATA[本項目有新版本。]]></value>
</item>
<item name="msg_do_you_like_update">
<value xml:lang="ko"><![CDATA[업데이트 하시겠습니까?]]></value>
<value xml:lang="en"><![CDATA[Would you like to update?]]></value>
<value xml:lang="jp"><![CDATA[アップデートしますか?]]></value>
<value xml:lang="zh-TW"><![CDATA[確定要更新嗎?]]></value>
</item>
<item name="msg_connection_fail">
<value xml:lang="ko"><![CDATA[서버 접속이 원활하지 않습니다.]]></value>
<value xml:lang="en"><![CDATA[Failed to connect to server.]]></value>
<value xml:lang="jp"><![CDATA[サーバに接続できませんでした。]]></value>
<value xml:lang="zh-TW"><![CDATA[主機連線錯誤。]]></value>
</item>
<item name="msg_not_match_server">
<value xml:lang="ko"><![CDATA[서버 설정이 올바르지 않습니다.]]></value>
<value xml:lang="en"><![CDATA[Server settings are incorrect.]]></value>
<value xml:lang="jp"><![CDATA[サーバー設定が正しくありません。]]></value>
<value xml:lang="zh-TW"><![CDATA[主機設定不正確。]]></value>
</item>
<item name="msg_ftp_invalid_auth_info">
<value xml:lang="ko"><![CDATA[입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Cannot log in with the FTP password you entered. Please check if it is correct.]]></value>
<value xml:lang="jp"><![CDATA[このFTP情報ではログインできません。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정보를 확인해주세요]]></valuevalue 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_not_connected">
<value xml:lang="ko"><![CDATA[%s로의 FTP 접속 오류가 발생했습니다. FTP 포트 번호를 확인해주시거나 FTP 서비스가 가능한지 확인해주세요.]]></value>
<value xml:lang="en"><![CDATA[Connection to the %s via FTP failed. Please check the port number and whether the FTP service is available.]]></value>
<value xml:lang="jp"><![CDATA[%sへのFTP接続エラーが発生しました。FTPポート(port)番号をはじめ、FTPサービスが可能であるかを確認してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[发生本地(%s)FTP连接错误。请确认ftp端口号及支持ftp服务与否。]]></value>
<value xml:lang="zh-TW"><![CDATA[本地(%s) FTP連線錯誤。請檢查 FTP 埠口並確認是否支援 FTP 功能。]]></value>
<value xml:lang="fr"><![CDATA[%s로의 FTP 접속 오류가 발생하였습니다. ftp 포트 번호를 확인해주시거나 ftp 서비스가 가능한지 확인해주세요]]></value>
<value xml:lang="de"><![CDATA[Ein Verbindungsfehler des FTPs an %s ist aufgetreten. Bitte FTP_Port checken, oder ob FTP_Service möglich ist.]]></value>
<value xml:lang="ru"><![CDATA[Connection to %s 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 %s. 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[%s-ын FTP холболт амжилтгvй боллоо. FTP дугаараа шалгах буюу эсвэл FTP vйлчилгээг ашиглах боломжтой эсэхээ шалгана уу.]]></value>
</item>
<item name="msg_delete_file_failed">
<value xml:lang="ko"><![CDATA[파일 삭제가 실패했습니다. %s.]]></value>
<value xml:lang="en"><![CDATA[Failed to delete the file. %s.]]></value>
<value xml:lang="jp"><![CDATA[ファイルを削除できませんでした。]]></value>
</item>
<item name="msg_delete_dir_failed">
<value xml:lang="ko"><![CDATA[디렉터리 삭제가 실패했습니다. %s]]></value>
<value xml:lang="en"><![CDATA[Failed to delete the directory. %s]]></value>
<value xml:lang="jp"><![CDATA[ディレクトリを削除できませんでした。]]></value>
</item>
<item name="msg_ftp_password_input">
<value xml:lang="ko"><![CDATA[입력된 비밀번호가 없습니다.]]></value>
<value xml:lang="en"><![CDATA[No password entered.]]></value>
<value xml:lang="jp"><![CDATA[パスワードを入力してください。]]></value>
</item>
<item name="msg_sftp_not_supported">
<value xml:lang="ko"><![CDATA[SFTP 지원이 되지 않는 환경입니다.]]></value>
<value xml:lang="en"><![CDATA[SFTP is not supported.]]></value>
<value xml:lang="jp"><![CDATA[SFTP非対応環境です。]]></value>
</item>
<item name="msg_does_not_support_delete">
<value xml:lang="ko"><![CDATA[이 패키지가 삭제를 지원하지 않습니다(모듈 클래스에 moduleUninstall()이 없음).]]></value>
<value xml:lang="en"><![CDATA[Cannot delete this package (no moduleUninstall() in the module class).]]></value>
<value xml:lang="jp"><![CDATA[このパッケージは、削除をサポートしません(モジュールクラスにmoduleUninstall()がありません)。]]></value>
</item>
</lang>

View file

@ -7,7 +7,7 @@
<input type="hidden" name="act" value="procAutoinstallAdminUpdateinfo" />
<p>
<block cond="$show_ftp_note">
{@$ftp_link = sprintf('<a href="%s#ftpSetup">%s</a>', getUrl('', 'module', 'admin', 'act', 'dispAdminConfig'), $lang->ftp_setup)}
{@$ftp_link = sprintf('<a href="%s">%s</a>', getUrl('', 'module', 'admin', 'act', 'dispAdminConfigFtp'), $lang->ftp_setup)}
{sprintf($lang->description_ftp_note, $ftp_link)}
</block>
{@$btnUpdate = sprintf('<input type="submit" value="%s" class="text" />', $lang->status_update)}

View file

@ -20,7 +20,7 @@
<block cond="!$package->installed || $package->need_update">
<block cond="$show_ftp_note">
<p>{$lang->description_download}. (<a href="{getUrl('', 'module', 'admin', 'act', 'dispAdminConfig')}#ftpSetup">FTP Setup</a>)</p>
<p>{$lang->description_download}. (<a href="{getUrl('', 'module', 'admin', 'act', 'dispAdminConfigFtp')}">FTP Setup</a>)</p>
<p>{$lang->path}: {$package->path}</p>
<p><a href="{_XE_DOWNLOAD_SERVER_}?module=resourceapi&act=procResourceapiDownload&package_srl={$package->package_srl}">{$lang->cmd_download}</a>
</block>

View file

@ -31,18 +31,18 @@
</caption>
<thead>
<tr>
<th scope="col">{$lang->category}</th>
<th scope="col" class="nowr">{$lang->category}</th>
<th scope="col">{$lang->thumbnail}</th>
<th scope="col" class="title">{$lang->name}</th>
<th scope="col">{$lang->distribute_version}</th>
<th scope="col">{$lang->current_version}</th>
<th scope="col">{$lang->run}</th>
<th scope="col" class="nowr">{$lang->distribute_version}</th>
<th scope="col" class="nowr">{$lang->current_version}</th>
<th scope="col" class="nowr">{$lang->run}</th>
</tr>
</thead>
<tbody>
<tr loop="$item_list => $key, $item">
{@ $target_url = $original_site."?mid=download&package_srl=".$item->package_srl; }
<td>{$item->category}</td>
<td class="nowr">{$item->category}</td>
<td><img src="{str_replace('./', $uri, $item->item_screenshot_url)}" alt="" width="100" height="100" /></td>
<td class="title">
<p><a href="{$target_url}">{htmlspecialchars($item->title)}</a></p>
@ -64,9 +64,9 @@
<li loop="$item->deps => $package_srl">{$installed[$package_srl]->title}</li>
</ul>
</td>
<td>{htmlspecialchars($item->item_version)}</td>
<td>{htmlspecialchars($item->current_version)}</td>
<td>
<td class="nowr">{htmlspecialchars($item->item_version)}</td>
<td class="nowr">{htmlspecialchars($item->current_version)}</td>
<td class="nowr">
<a cond="!$item->current_version" href="{getUrl('act','dispAutoinstallAdminInstall','package_srl',$item->package_srl)}">{$lang->install}</a>
<a cond="!$show_ftp_note && $item->current_version && $item->avail_remove" href="{getUrl('act','dispAutoinstallAdminUninstall','package_srl',$item->package_srl)}">{$lang->cmd_delete}</a>
<a cond="$item->current_version && $item->need_update == 'Y'" href="{getUrl('act','dispAutoinstallAdminInstall','package_srl',$item->package_srl)}">{$lang->update}</a>

View file

@ -31,7 +31,8 @@
</block>
<block cond="!$package->avail_remove">
<div class="message error">
<p>{$lang->msg_dependency_package}</p>
<p cond="$package->deps">{$lang->msg_dependency_package}</p>
<p cond="!$package->deps">{$lang->msg_does_not_support_delete}</p>
</div>
<p cond="$package->deps">{$lang->dependant_list}:</p>
<ul cond="$package->deps">

View file

@ -12,7 +12,143 @@
**/
function init() {
}
/**
* @brief Modify comment(s) status to publish/unpublish if calling module is using Comment Approval System
* @return Object
*/
function procCommentAdminChangePublishedStatusChecked()
{ // Error display if none is selected
$cart = Context::get('cart');
if(!is_array($cart))
{
$comment_srl_list= explode('|@|', $cart);
}
else
{
$comment_srl_list = $cart;
}
$this->procCommentAdminChangeStatus();
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispCommentAdminList', 'search_keyword', '');
header('location:'.$returnUrl);
return;
}
}
function procCommentAdminChangeStatus()
{
$will_publish = Context::get('will_publish');
// Error display if none is selected
$cart = Context::get('cart');
if(!$cart)
{
return $this->stop('msg_cart_is_null');
}
if(!is_array($cart))
{
$comment_srl_list= explode('|@|', $cart);
}
else
{
$comment_srl_list = $cart;
}
$args->status = $will_publish;
$args->comment_srls_list = $comment_srl_list;
$output = executeQuery('comment.updatePublishedStatus', $args);
if(!$output->toBool())
{
return $output;
}
else
{
//update comment count for document
$updated_documents_arr = array();
// create the controller object of the document
$oDocumentController = &getController('document');
// create the model object of the document
$oDocumentModel = &getModel('document');
// create the comment model object
$oCommentModel = &getModel('comment');
//get admin info
$logged_info = Context::get('logged_info');
//$oMemberModule = &getModel("member");
//$logged_info = $oMemberModule->getMemberInfoByMemberSrl($logged_member_srl);
$new_status = ($will_publish) ? "published" : "unpublished";
foreach($comment_srl_list as $comment_srl)
{
// check if comment already exists
$comment = $oCommentModel->getComment($comment_srl);
if($comment->comment_srl != $comment_srl) return new Object(-1, 'msg_invalid_request');
$document_srl = $comment->document_srl;
if (!in_array($document_srl,$updated_documents_arr))
{
$updated_documents_arr[] = $document_srl;
// update the number of comments
$comment_count = $oCommentModel->getCommentCount($document_srl);
// update comment count of the article posting
$output = $oDocumentController->updateCommentCount($document_srl, $comment_count, null, false);
$oDocument = $oDocumentModel->getDocument($document_srl);
$author_email=$oDocument->variables['email_address'];
$oModuleModel = &getModel("module");
$module_info = $oModuleModel->getModuleInfoByModuleSrl($comment->module_srl);
$already_sent = array();
// send email to comment's author, all admins and thread(document) subscribers - START
// -------------------------------------------------------
$oMail = new Mail();
$mail_title = "[XE - ".$module_info->mid."] comment(s) status changed to ".$new_status." on document: \"".$oDocument->getTitleText()."\"";
$oMail->setTitle($mail_title);
$mail_content = "
The comment #".$comment_srl." on document \"".$oDocument->getTitleText()."\" has been ".$new_status." by admin of <strong><i>". strtoupper($module_info->mid)."</i></strong> module.
<br />
<br />Comment content:
".$comment->content."
<br />
";
$oMail->setContent($mail_content);
$oMail->setSender($logged_info->user_name, $logged_info->email_address);
$document_author_email = $oDocument->variables['email_address'];
//mail to author of thread - START
if($document_author_email != $comment->email_address && $logged_info->email_address != $document_author_email) {
$oMail->setReceiptor($document_author_email, $document_author_email);
$oMail->send();
$already_sent[] = $document_author_email;
}
//mail to author of thread - STOP
//mail to all emails set for administrators - START
if($module_info->admin_mail)
{
$target_mail = explode(',',$module_info->admin_mail);
for($i=0;$i<count($target_mail);$i++) {
$email_address = trim($target_mail[$i]);
if(!$email_address) continue;
if($author_email != $email_address) {
$oMail->setReceiptor($email_address, $email_address);
$oMail->send();
}
}
}
//mail to all emails set for administrators - STOP
}
// ----------------------------------------------------------
// send email to comment's author, all admins and thread(document) subscribers - STOP
}
// call a trigger for calling "send mail to subscribers" (for moment just for forum)
ModuleHandler::triggerCall("comment.procCommentAdminChangeStatus","after",$comment_srl_list);
}
}
/**
* @brief Delete the selected comment from the administrator page
**/

View file

@ -25,18 +25,35 @@
$args->sort_index = 'list_order'; // /< Sorting values
$args->module_srl = Context::get('module_srl');
/*
$search_target = Context::get('search_target');
$search_keyword = Context::get('search_keyword');
if ($search_target == 'is_published' && $search_keyword == 'Y')
{
$args->status = 1;
}
if ($search_target == 'is_published' && $search_keyword == 'N')
{
$args->status = 0;
}
*/
// get a list by using comment->getCommentList.
$oCommentModel = &getModel('comment');
$secretNameList = $oCommentModel->getSecretNameList();
$columnList = array('comment_srl', 'document_srl', 'is_secret', 'content', 'comments.member_srl', 'comments.nick_name', 'comments.regdate', 'ipaddress');
$columnList = array('comment_srl', 'document_srl', 'is_secret', 'status', 'content', 'comments.member_srl', 'comments.nick_name', 'comments.regdate', 'ipaddress');
$output = $oCommentModel->getTotalCommentList($args, $columnList);
$oCommentModel = &getModel("comment");
$modules = $oCommentModel->getDistinctModules();
$modules_list = $modules;
// set values in the return object of comment_model:: getTotalCommentList() in order to use a template.
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('comment_list', $output->data);
Context::set('modules_list', $modules_list);
Context::set('page_navigation', $output->page_navigation);
Context::set('secret_name_list', $secretNameList);
// set the template

View file

@ -57,7 +57,16 @@
if (!$oDB->isIndexExists("comments", "idx_module_list_order"))
return true;
//2012. 02. 24 add comment published status column and index
if(!$oDB->isColumnExists("comments", "status"))
{
return true;
}
if (!$oDB->isIndexExists("comments", "idx_status"))
{
return true;
}
return false;
}
@ -93,7 +102,7 @@
}
if(!$oDB->isColumnExists("comment_voted_log", "point"))
$oDB->addColumn('comment_voted_log', 'point', 'number', 11, 0, true);
if (!$oDB->isIndexExists("comments", "idx_module_list_order"))
$oDB->addIndex
(
@ -103,6 +112,19 @@
true
);
//2012. 02. 24 add comment published status column and index
if(!$oDB->isColumnExists("comments", "status")) {
$oDB->addColumn("comments", "status", "number", 1, 1, true);
}
if (!$oDB->isIndexExists("comments", "idx_status"))
$oDB->addIndex
(
"comments",
"idx_status",
array("status", "comment_srl", "module_srl", "document_srl"),
true
);
return new Object(0, 'success_updated');
}

View file

@ -98,11 +98,62 @@
$_SESSION['own_comment'][$comment_srl] = true;
}
/**
*@brief Check if module is using comment validation system
* @param number $document_srl
* @return boolean
*/
function isModuleUsingPublishValidation($document_srl=null, $module_srl=null)
{
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
$module_part_config = $oModuleModel->getModulePartConfig('comment',$module_info->module_srl);
$use_validation = false;
if (isset($module_part_config->use_comment_validation) && $module_part_config->use_comment_validation == "Y")
{
$use_validation = true;
}
return $use_validation;
}
/**
* @brief Enter comments
**/
function insertComment($obj, $manual_inserted = false) {
$obj->__isupdate = false;
// check if comment's module is using comment validation and set the publish status to 0 (false)
// for inserting query, otherwise default is 1 (true - means comment is published)
$using_validation = $this->isModuleUsingPublishValidation($obj->module_srl);
if(Context::get('is_logged'))
{
$logged_info = Context::get('logged_info');
if ($logged_info->is_admin == 'Y')
{
$is_admin = true;
}
else
{
$is_admin = false;
}
}
if (!$using_validation)
{
$obj->status = 1;
}
else
{
if ($is_admin)
{
$obj->status = 1;
}
else
{
$obj->status = 0;
}
}
$obj->__isupdate = false;
// call a trigger (before)
$output = ModuleHandler::triggerCall('comment.insertComment', 'before', $obj);
if(!$output->toBool()) return $output;
@ -195,7 +246,7 @@
}
}
$output = executeQuery('comment.insertCommentList', $list_args);
if(!$output->toBool()) return $output;
// insert comment
@ -211,7 +262,17 @@
// create the controller object of the document
$oDocumentController = &getController('document');
// Update the number of comments in the post
$output = $oDocumentController->updateCommentCount($document_srl, $comment_count, $obj->nick_name, true);
if (!$using_validation)
{
$output = $oDocumentController->updateCommentCount($document_srl, $comment_count, $obj->nick_name, true);
}
else
{
if ($is_admin)
{
$output = $oDocumentController->updateCommentCount($document_srl, $comment_count, $obj->nick_name, true);
}
}
// grant autority of the comment
$this->addGrant($obj->comment_srl);
// call a trigger(after)
@ -238,6 +299,8 @@
}
}
$this->sendEmailToAdminAfterInsertComment($obj);
$output->add('comment_srl', $obj->comment_srl);
//remove from cache
@ -249,7 +312,128 @@
}
return $output;
}
/**
* @brief Send email to module's admins after a new comment was interted successfully
* if Comments Approval System is used
* @param type $obj
*/
function sendEmailToAdminAfterInsertComment($obj)
{
$using_validation = $this->isModuleUsingPublishValidation($obj->module_srl);
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($obj->document_srl);
$oMemberModel = &getModel("member");
if (isset($obj->member_srl) && !is_null($obj->member_srl))
{
$member_info = $oMemberModel->getMemberInfoByMemberSrl($obj->member_srl);
}
else
{
$member_info->is_admin = "N";
$member_info->nick_name = $obj->nick_name;
$member_info->user_name = $obj->user_name;
$member_info->email_address = $obj->email_address;
}
$oCommentModel = &getModel("comment");
$nr_comments_not_approved = $oCommentModel->getCommentAllCount(null,false);
$oModuleModel = &getModel("module");
$module_info = $oModuleModel->getModuleInfoByDocumentSrl($obj->document_srl);
// If there is no problem to register comment then send an email to all admin were set in module admin panel
if($module_info->admin_mail && $member_info->is_admin != 'Y')
{
$oMail = new Mail();
$oMail->setSender($obj->email_address, $obj->email_address);
$mail_title = "[XE - ".Context::get('mid')."] A new comment was posted on document: \"".$oDocument->getTitleText()."\"";
$oMail->setTitle($mail_title);
if ($using_validation)
{
$url_approve = getFullUrl('','module','comment','act','procCommentAdminChangePublishedStatusChecked','cart[]',$obj->comment_srl,'will_publish','1','search_target','is_published','search_keyword','N');
$url_trash = getFullUrl('','module','comment','act','procCommentAdminDeleteChecked','cart[]',$obj->comment_srl,'search_target','is_trash','search_keyword','true');
$mail_content = "
A new comment on the document \"".$oDocument->getTitleText()."\" is waiting for your approval.
<br />
<br />
Author: ".$member_info->nick_name."
<br />Author e-mail: ".$member_info->email_address."
<br />Comment:
<br />\"".$obj->content."\"
<br />
<br />
Approve it: <a href=\"".$url_approve."\">".$url_approve."</a>
<br />Trash it: <a href=\"".$url_trash."\">".$url_trash."</a>
<br />Currently ".$nr_comments_not_approved." comments on \"".Context::get('mid')."\" module are waiting for approval. Please visit the moderation panel:
<br /><a href=\"".getFullUrl('','module','admin','act','dispCommentAdminList','search_target','module','search_keyword',$obj->module_srl)."\">".getFullUrl('','module','admin','act','dispCommentAdminList','search_target','module','search_keyword',$obj->module_srl)."</a>
";
$oMail->setContent($mail_content);
}
else
{
$mail_content = "
Author: ".$member_info->nick_name."
<br />Author e-mail: ".$member_info->email_address."
<br />Comment:
<br />\"".$obj->content."\"
";
$oMail->setContent($mail_content);
// get email of thread's author
$document_author_email = $oDocument->variables['email_address'];
//get admin info
$logged_info = Context::get('logged_info');
//mail to author of thread - START
if($document_author_email != $obj->email_address && $logged_info->email_address != $document_author_email) {
$oMail->setReceiptor($document_author_email, $document_author_email);
$oMail->send();
}
// mail to author of thread - STOP
}
// get all admins emails
$admins_emails = $module_info->admin_mail;
$target_mail = explode(',',$admins_emails);
// send email to all admins - START
for($i=0;$i<count($target_mail);$i++)
{
$email_address = trim($target_mail[$i]);
if(!$email_address) continue;
$oMail->setReceiptor($email_address, $email_address);
$oMail->send();
}
// send email to all admins - STOP
}
$comment_srl_list = array(0 => $obj->comment_srl);
// call a trigger for calling "send mail to subscribers" (for moment just for forum)
ModuleHandler::triggerCall("comment.sendEmailToAdminAfterInsertComment","after",$comment_srl_list);
/*
// send email to author - START
$oMail = new Mail();
$mail_title = "[XE - ".Context::get('mid')."] your comment on document: \"".$oDocument->getTitleText()."\" have to be approved";
$oMail->setTitle($mail_title);
//$mail_content = sprintf("From : <a href=\"%s?document_srl=%s&comment_srl=%s#comment_%d\">%s?document_srl=%s&comment_srl=%s#comment_%d</a><br/>\r\n%s ", getFullUrl(''),$comment->document_srl,$comment->comment_srl,$comment->comment_srl, getFullUrl(''),$comment->document_srl,$comment->comment_srl,$comment->comment_srl,$comment>content);
$mail_content = "
Your comment #".$obj->comment_srl." on document \"".$oDocument->getTitleText()."\" have to be approved by admin of <strong><i>". strtoupper($module_info->mid)."</i></strong> module before to be publish.
<br />
<br />Comment content:
".$obj->content."
<br />
";
$oMail->setContent($mail_content);
$oMail->setSender($obj->email_address, $obj->email_address);
$oMail->setReceiptor($obj->email_address, $obj->email_address);
$oMail->send();
// send email to author - START
*/
return;
}
/**
* @brief fix the comment
**/
@ -403,15 +587,15 @@
return $output;
}
/**
* @brief remove all comment relation log
**/
function deleteCommentLog()
{
$this->_deleteDeclaredComments($args);
$this->_deleteVotedComments($args);
return new Object(0, 'success');
}
/**
* @brief remove all comment relation log
**/
function deleteCommentLog()
{
$this->_deleteDeclaredComments($args);
$this->_deleteVotedComments($args);
return new Object(0, 'success');
}
/**
* @brief remove all comments of the article
@ -636,7 +820,10 @@
$comment_config->use_vote_down = Context::get('use_vote_down');
if(!$comment_config->use_vote_down) $comment_config->use_vote_down = 'Y';
$comment_config->use_comment_validation = Context::get('use_comment_validation');
if(!$comment_config->use_comment_validation) $comment_config->use_comment_validation = 'N';
for($i=0;$i<count($module_srl);$i++) {
$srl = trim($module_srl[$i]);
if(!$srl) continue;
@ -658,35 +845,35 @@
return new Object();
}
/**
* @brief get comment all list
**/
function procCommentGetList()
{
if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
$commentSrls = Context::get('comment_srls');
if($commentSrls) $commentSrlList = explode(',', $commentSrls);
/**
* @brief get comment all list
**/
function procCommentGetList()
{
if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
$commentSrls = Context::get('comment_srls');
if($commentSrls) $commentSrlList = explode(',', $commentSrls);
if(count($commentSrlList) > 0) {
$oCommentModel = &getModel('comment');
$commentList = $oCommentModel->getComments($commentSrlList);
if(count($commentSrlList) > 0) {
$oCommentModel = &getModel('comment');
$commentList = $oCommentModel->getComments($commentSrlList);
if(is_array($commentList))
if(is_array($commentList))
{
foreach($commentList AS $key=>$value)
{
foreach($commentList AS $key=>$value)
{
$value->content = strip_tags($value->content);
}
$value->content = strip_tags($value->content);
}
}
else
{
global $lang;
$commentList = array();
$this->setMessage($lang->no_documents);
}
$this->add('comment_list', $commentList);
}
else
{
global $lang;
$commentList = array();
$this->setMessage($lang->no_documents);
}
$this->add('comment_list', $commentList);
}
}
?>

View file

@ -183,12 +183,17 @@
}
// if additional information which can access contents is set
if($add_content_info) {
$memberSrl = $this->get('member_srl');
if($memberSrl < 0)
{
$memberSrl = 0;
}
$content = sprintf(
'<!--BeforeComment(%d,%d)--><div class="comment_%d_%d xe_content">%s</div><!--AfterComment(%d,%d)-->',
$this->comment_srl, $this->get('member_srl'),
$this->comment_srl, $this->get('member_srl'),
$this->comment_srl, $memberSrl,
$this->comment_srl, $memberSrl,
$content,
$this->comment_srl, $this->get('member_srl')
$this->comment_srl, $memberSrl
);
// xe_content class name should be specified although content access is not necessary.
} else {

View file

@ -119,7 +119,7 @@
if(is_array($comment_srl_list)) $comment_srls = implode(',',$comment_srl_list);
// fetch from a database
$args->comment_srls = $comment_srls;
$output = executeQuery('comment.getComments', $args, $columnList);
$output = executeQuery('comment.getComments', $args, $columnList);
if(!$output->toBool()) return;
$comment_list = $output->data;
if(!$comment_list) return;
@ -143,6 +143,23 @@
**/
function getCommentCount($document_srl) {
$args->document_srl = $document_srl;
// get the number of comments on the document module
$oDocumentModel = &getModel('document');
$columnList = array('document_srl', 'module_srl');
$oDocument = $oDocumentModel->getDocument($document_srl, false, true, $columnList);
// return if no doc exists.
if(!$oDocument->isExists()) return;
// get a list of comments
$module_srl = $oDocument->get('module_srl');
//check if module is using validation system
$oCommentController = &getController('comment');
$using_validation = $oCommentController->isModuleUsingPublishValidation($module_srl);
if($using_validation)
{
$args->status = 1;
}
$output = executeQuery('comment.getCommentCount', $args);
$total_count = $output->data->count;
return (int)$total_count;
@ -164,14 +181,52 @@
/**
* @brief get the total number of comments in corresponding with module_srl.
**/
function getCommentAllCount($module_srl) {
function getCommentAllCount($module_srl,$published=null) {
$args->module_srl = $module_srl;
if(is_null($published))
{
// check if module is using comment validation system
$oCommentController = &getController("comment");
$is_using_validation = $oCommentController->isModuleUsingPublishValidation($module_srl);
if($is_using_validation)
{
$args->status = 1;
}
}
else
{
if ($published)
{
$args->status = 1;
}
else
{
$args->status = 0;
}
}
$output = executeQuery('comment.getCommentCount', $args);
$total_count = $output->data->count;
return (int)$total_count;
}
function getDistinctModules()
{
$output = executeQuery('comment.getDistinctModules');
$module_srls = $output->data;
$oModuleModel = &getModel('module');
$result = array();
if($module_srls)
{
foreach($module_srls as $module)
{
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module->module_srl);
$result[$module->module_srl] = $module_info->mid;
}
}
return $result;
}
/**
* @brief get the comment in corresponding with mid.
@ -195,6 +250,17 @@
$output = $oCacheHandler->get($cache_key);
}
if(!$output){
if(strpos($args->module_srl,",")===false)
{
// check if module is using comment validation system
$oCommentController = &getController("comment");
$is_using_validation = $oCommentController->isModuleUsingPublishValidation($obj->module_srl);
if($is_using_validation)
{
$args->status = 1;
}
}
$output = executeQuery('comment.getNewestCommentList', $args, $columnList);
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output);
}
@ -255,6 +321,16 @@
$args->list_count = $comment_count;
$args->page = $page;
$args->page_count = 10;
//check if module is using validation system
$oCommentController = &getController('comment');
$using_validation = $oCommentController->isModuleUsingPublishValidation($module_srl);
if($using_validation)
{
$args->status = 1;
}
$output = executeQueryArray('comment.getCommentPageList', $args);
// return if an error occurs in the query results
if(!$output->toBool()) return;
@ -366,6 +442,15 @@
$args->page_count = $obj->page_count?$obj->page_count:10;
$args->s_module_srl = $obj->module_srl;
$args->exclude_module_srl = $obj->exclude_module_srl;
// check if module is using comment validation system
$oCommentController = &getController("comment");
$is_using_validation = $oCommentController->isModuleUsingPublishValidation($obj->module_srl);
if ($is_using_validation)
{
$args->s_is_published = 1;
}
// Search options
$search_target = $obj->search_target?$obj->search_target:trim(Context::get('search_target'));
$search_keyword = $obj->search_keyword?$obj->search_keyword:trim(Context::get('search_keyword'));
@ -408,7 +493,20 @@
break;
case 'is_secret' :
$args->s_is_secret= $search_keyword;
break;
case 'is_published' :
if($search_keyword == 'Y')
{
$args->s_is_published = 1;
}
if($search_keyword == 'N')
{
$args->s_is_published = 0;
}
break;
case 'module':
$args->s_module_srl = (int)$search_keyword;
break;
case 'member_srl' :
$args->{"s_".$search_target} = (int)$search_keyword;
break;

View file

@ -7,7 +7,7 @@
<title xml:lang="vi">Bình luận</title>
<title xml:lang="es">Commentarios</title>
<title xml:lang="ru">Комментарии</title>
<title xml:lang="zh-TW">評論</title>
<title xml:lang="zh-TW">回覆</title>
<title xml:lang="tr">Yorum</title>
<description xml:lang="ko">게시판이나 블로그등의 댓글을 관리하는 모듈입니다.</description>
<description xml:lang="jp">掲示板やブログなどのコメントを管理するモジュールです。</description>
@ -16,7 +16,7 @@
<description xml:lang="vi">Module quản lý bình luận của bài viết và sổ lưu niệm</description>
<description xml:lang="es">Es el módulo para manejar commentarios en blog o boletínes.</description>
<description xml:lang="ru">Модуль для управления комментариями форума/блога.</description>
<description xml:lang="zh-TW">管理討論板或部落格評論的模組。</description>
<description xml:lang="zh-TW">管理討論板或部落格回覆的模組。</description>
<description xml:lang="tr">Pano ve blog yorumlarını yönetme modülü</description>
<version>0.1</version>
<date>2007-02-28</date>

View file

@ -1,24 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants />
<permissions>
<grants />
<permissions>
<permission action="procCommentAdminAddCart" target="manager" />
<permission action="procCommentGetList" target="manager" />
</permissions>
<actions>
<action name="getCommentMenu" type="model" standalone="true" />
<action name="dispCommentAdminList" type="view" admin_index="true" standalone="true" menu_name="comment" menu_index="true" />
<action name="dispCommentAdminDeclared" type="view" standalone="true" menu_name="comment" />
<action name="procCommentVoteUp" type="controller" standalone="true" />
<action name="procCommentVoteDown" type="controller" standalone="true" />
<action name="procCommentDeclare" type="controller" standalone="true" />
<action name="getCommentVotedMemberList" type="model" standalone="true" />
<action name="procCommentInsertModuleConfig" type="controller" standalone="true" ruleset="insertCommentModuleConfig" />
<action name="procCommentAdminDeleteChecked" type="controller" standalone="true" ruleset="deleteChecked" />
<action name="procCommentAdminCancelDeclare" type="controller" standalone="true" />
<action name="procCommentAdminAddCart" type="controller" standalone="true" />
<action name="procCommentGetList" type="controller" standalone="true" />
</actions>
</permissions>
<actions>
<action name="getCommentMenu" type="model" standalone="true" />
<action name="dispCommentAdminList" type="view" admin_index="true" standalone="true" menu_name="comment" menu_index="true" />
<action name="dispCommentAdminDeclared" type="view" standalone="true" menu_name="comment" />
<action name="procCommentVoteUp" type="controller" standalone="true" />
<action name="procCommentVoteDown" type="controller" standalone="true" />
<action name="procCommentDeclare" type="controller" standalone="true" />
<action name="getCommentVotedMemberList" type="model" standalone="true" />
<action name="procCommentInsertModuleConfig" type="controller" standalone="true" ruleset="insertCommentModuleConfig" />
<action name="procCommentAdminDeleteChecked" type="controller" standalone="true" ruleset="deleteChecked" />
<action name="procCommentAdminChangeStatus" type="controller" standalone="true"/>
<action name="procCommentAdminChangePublishedStatusChecked" type="controller" standalone="true" />
<action name="isModuleUsingPublishValidation" type="controller" standalone="true" />
<action name="procCommentAdminCancelDeclare" type="controller" standalone="true" />
<action name="procCommentAdminAddCart" type="controller" standalone="true" />
<action name="procCommentGetList" type="controller" standalone="true" />
</actions>
<menus>
<menu name="comment">
<title xml:lang="en">Comment</title>
@ -28,7 +31,7 @@
<title xml:lang="es">Comment</title>
<title xml:lang="ru">Comment</title>
<title xml:lang="fr">Comment</title>
<title xml:lang="zh-TW">Comment</title>
<title xml:lang="zh-TW">回覆</title>
<title xml:lang="vi">Comment</title>
<title xml:lang="mn">Comment</title>
<title xml:lang="tr">Comment</title>

View file

@ -5,7 +5,7 @@
<value xml:lang="en"><![CDATA[I want to]]></value>
<value xml:lang="jp"><![CDATA[このコメントを…]]></value>
<value xml:lang="zh-CN"><![CDATA[将把此评论..]]></value>
<value xml:lang="zh-TW"><![CDATA[將此評論..]]></value>
<value xml:lang="zh-TW"><![CDATA[將此回覆..]]></value>
<value xml:lang="fr"><![CDATA[Vous voudriez...]]></value>
<value xml:lang="ru"><![CDATA[Эту запись...]]></value>
<value xml:lang="es"><![CDATA[Usted ...]]></value>
@ -17,7 +17,7 @@
<value xml:lang="en"><![CDATA[Comments List]]></value>
<value xml:lang="jp"><![CDATA[コメントリスト]]></value>
<value xml:lang="zh-CN"><![CDATA[评论列表]]></value>
<value xml:lang="zh-TW"><![CDATA[評論列表]]></value>
<value xml:lang="zh-TW"><![CDATA[回覆列表]]></value>
<value xml:lang="fr"><![CDATA[Liste des Commentaires]]></value>
<value xml:lang="ru"><![CDATA[Список записей]]></value>
<value xml:lang="es"><![CDATA[Comentarios Lista]]></value>
@ -29,7 +29,7 @@
<value xml:lang="en"><![CDATA[Invert Selection]]></value>
<value xml:lang="jp"><![CDATA[選択項目の反転]]></value>
<value xml:lang="zh-CN"><![CDATA[反选]]></value>
<value xml:lang="zh-TW"><![CDATA[反]]></value>
<value xml:lang="zh-TW"><![CDATA[反向選擇]]></value>
<value xml:lang="fr"><![CDATA[Renverser les choisis]]></value>
<value xml:lang="ru"><![CDATA[Изменить выбранное]]></value>
</item>
@ -49,18 +49,20 @@
<value xml:lang="ko"><![CDATA[휴지통]]></value>
<value xml:lang="en"><![CDATA[Recycle Bin]]></value>
<value xml:lang="jp"><![CDATA[ゴミ箱]]></value>
<value xml:lang="zh-TW"><![CDATA[回收桶]]></value>
</item>
<item name="cmd_trash">
<value xml:lang="ko"><![CDATA[휴지통으로 이동]]></value>
<value xml:lang="en"><![CDATA[Move to Recycle Bin]]></value>
<value xml:lang="jp"><![CDATA[ゴミ箱へ移動]]></value>
<value xml:lang="zh-TW"><![CDATA[移至回收桶]]></value>
</item>
<item name="comment_count">
<value xml:lang="ko"><![CDATA[댓글 수]]></value>
<value xml:lang="en"><![CDATA[Number of Comments]]></value>
<value xml:lang="jp"><![CDATA[コメント数]]></value>
<value xml:lang="zh-CN"><![CDATA[每页评论数]]></value>
<value xml:lang="zh-TW"><![CDATA[每頁評論數]]></value>
<value xml:lang="zh-TW"><![CDATA[每頁回覆數]]></value>
<value xml:lang="fr"><![CDATA[Limite de Commentaires]]></value>
<value xml:lang="de"><![CDATA[Kommentare]]></value>
<value xml:lang="ru"><![CDATA[Количество ответов]]></value>
@ -73,7 +75,7 @@
<value xml:lang="en"><![CDATA[Display comments and if the number of them is over a specified number, move to the comment list.]]></value>
<value xml:lang="jp"><![CDATA[コメントを指定した数だけ表示し、それ以上はリスト化します。]]></value>
<value xml:lang="zh-CN"><![CDATA[可以指定要显示的每页评论数。]]></value>
<value xml:lang="zh-TW"><![CDATA[可以指定要顯示的每頁評論數。]]></value>
<value xml:lang="zh-TW"><![CDATA[可以指定要顯示的每頁回覆數。]]></value>
<value xml:lang="fr"><![CDATA[Quand il y a plus de commentaires, ils seront bougés sur le liste.]]></value>
<value xml:lang="ru"><![CDATA[Отображается указанное количество ответов, после превышения этого количества производится переход к списку.]]></value>
<value xml:lang="tr"><![CDATA[Yorumları, kullanıcının girdiği rakam kadar gösterin. Eğer yorum sayısı belirlenen sayıyı aşarsa, yorum Liste'ye taşınır.]]></value>
@ -84,7 +86,7 @@
<value xml:lang="en"><![CDATA[Please select an article to delete.]]></value>
<value xml:lang="jp"><![CDATA[削除するコメントを選択してください。]]></value>
<value xml:lang="zh-CN"><![CDATA[请选择要删除的评论。]]></value>
<value xml:lang="zh-TW"><![CDATA[請選擇要刪除的評論。]]></value>
<value xml:lang="zh-TW"><![CDATA[請選擇要刪除的回覆。]]></value>
<value xml:lang="fr"><![CDATA[Choisissez un article à supprimer, S.V.P.]]></value>
<value xml:lang="ru"><![CDATA[Пожалуйста, выберите записи для удаления.]]></value>
<value xml:lang="es"><![CDATA[Selecciona el commentario que desea eliminar]]></value>
@ -96,7 +98,7 @@
<value xml:lang="en"><![CDATA[%d comment(s) is(are) successfully deleted.]]></value>
<value xml:lang="jp"><![CDATA[%d個のコメントを削除しました。]]></value>
<value xml:lang="zh-CN"><![CDATA[已删除%d个评论。]]></value>
<value xml:lang="zh-TW"><![CDATA[已刪除%d個評論。]]></value>
<value xml:lang="zh-TW"><![CDATA[已刪除 %d 個回覆。]]></value>
<value xml:lang="fr"><![CDATA[%d commentaire(s) est(sont) supprimé(s) avec succés.]]></value>
<value xml:lang="ru"><![CDATA[%d записьуспешно удалена]]></value>
<value xml:lang="es"><![CDATA[%d comentario eliminado correctamente.]]></value>
@ -211,7 +213,7 @@
<value xml:lang="en"><![CDATA[IP Address]]></value>
<value xml:lang="jp"><![CDATA[IPアドレス]]></value>
<value xml:lang="zh-CN"><![CDATA[IP 地址]]></value>
<value xml:lang="zh-TW"><![CDATA[IP位址]]></value>
<value xml:lang="zh-TW"><![CDATA[IP 位址]]></value>
<value xml:lang="fr"><![CDATA[Adresse IP]]></value>
<value xml:lang="ru"><![CDATA[IP-адрес]]></value>
<value xml:lang="es"><![CDATA[Dirección IP]]></value>
@ -222,12 +224,14 @@
<value xml:lang="ko"><![CDATA[상태]]></value>
<value xml:lang="en"><![CDATA[Status]]></value>
<value xml:lang="jp"><![CDATA[状態]]></value>
<value xml:lang="zh-TW"><![CDATA[狀態]]></value>
</item>
</item>
<item name="no_text_comment">
<value xml:lang="ko"><![CDATA[글자가 없는 댓글입니다.]]></value>
<value xml:lang="en"><![CDATA[No text in this comment.]]></value>
<value xml:lang="jp"><![CDATA[テキストのないコメントです。]]></value>
<value xml:lang="zh-TW"><![CDATA[此回覆無內容。]]></value>
<value xml:lang="tr"><![CDATA[Bu yorumda herhangi bir metin yok.]]></value>
</item>
<item name="secret_name_list" type="array">
@ -235,21 +239,48 @@
<value xml:lang="ko"><![CDATA[비밀]]></value>
<value xml:lang="en"><![CDATA[Secret]]></value>
<value xml:lang="jp"><![CDATA[非公開]]></value>
<value xml:lang="zh-TW"><![CDATA[秘密]]></value>
</item>
<item name="N">
<value xml:lang="ko"><![CDATA[공개]]></value>
<value xml:lang="en"><![CDATA[Public]]></value>
<value xml:lang="jp"><![CDATA[公開]]></value>
<value xml:lang="zh-TW"><![CDATA[公開]]></value>
</item>
</item>
<item name="published_name_list" type="array">
<item name="Y">
<value xml:lang="en"><![CDATA[Published]]></value>
</item>
<item name="N">
<value xml:lang="en"><![CDATA[Unpublished]]></value>
</item>
</item>
<item name="comment_manager">
<value xml:lang="ko"><![CDATA[선택한 댓글 관리]]></value>
<value xml:lang="en"><![CDATA[Manage Selected Comment]]></value>
<value xml:lang="jp"><![CDATA[選択コメントを管理]]></value>
<value xml:lang="zh-TW"><![CDATA[管理所選回覆]]></value>
</item>
<item name="selected_comment">
<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>
</item>
<item name="cmd_comment_validation">
<value xml:lang="en"><![CDATA[Use comment validation]]></value>
</item>
<item name="about_comment_validation">
<value xml:lang="en"><![CDATA[If you want to use comment validation before displaying on your module frontend select USE, otherwise select NOT USE.]]></value>
</item>
<item name="published">
<value xml:lang="en"><![CDATA[Publish status]]></value>
</item>
<item name="cmd_publish">
<value xml:lang="en"><![CDATA[Publish]]></value>
</item>
<item name="cmd_unpublish">
<value xml:lang="en"><![CDATA[Unpublish]]></value>
</item>
</lang>

View file

@ -6,7 +6,8 @@
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" filter="number" />
<condition operation="equal" column="status" var="status" />
<condition operation="equal" column="document_srl" var="document_srl" filter="number" pipe="and" />
<condition operation="in" column="module_srl" var="module_srl" filter="number" pipe="and" />
<condition operation="like_prefix" column="regdate" var="regDate" pipe="and" />
</conditions>

View file

@ -8,12 +8,14 @@
<column name="comments_list.depth" alias="depth" />
</columns>
<conditions>
<condition operation="equal" column="comments_list.document_srl" var="document_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="comments.status" var="status" pipe="and" />
<condition operation="equal" column="comments_list.document_srl" var="document_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="comments_list.comment_srl" var="comments.comment_srl" filter="number" pipe="and" />
<condition operation="more" column="comments_list.head" default="0" pipe="and" />
<condition operation="more" column="comments_list.arrange" default="0" pipe="and" />
</conditions>
<navigation>
<index var="list_order" default="comments.status" order="desc" />
<index var="list_order" default="comments_list.head" order="asc" />
<index var="list_order" default="comments_list.arrange" order="asc" />
<list_count var="list_count" default="list_count" />

View file

@ -0,0 +1,8 @@
<query id="getDistinctModules" action="select">
<tables>
<table name="comments" />
</tables>
<columns>
<column name="DISTINCT(module_srl)" />
</columns>
</query>

View file

@ -6,9 +6,11 @@
<column name="*" />
</columns>
<conditions>
<condition operation="in" column="module_srl" var="module_srl" filter="number" />
<condition operation="equal" column="status" var="status" pipe="and" />
<condition operation="in" column="module_srl" var="module_srl" filter="number" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="status" order="desc" />
<index var="sort_index" default="list_order" order="asc" />
<list_count var="list_count" default="20" />
</navigation>

View file

@ -9,6 +9,7 @@
<condition operation="in" column="module_srl" var="s_module_srl" />
<condition operation="notin" column="module_srl" var="exclude_module_srl" pipe="and" />
<condition operation="equal" column="is_secret" var="s_is_secret" pipe="and" />
<condition operation="equal" column="status" var="s_is_published" pipe="and" />
<group pipe="and">
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />

View file

@ -17,12 +17,13 @@
<column name="user_id" var="user_id" default="" />
<column name="user_name" var="user_name" default="" />
<column name="member_srl" var="member_srl" default="0" filter="number" />
<column name="email_address" var="email_address" filter="email" maxlength="250" />
<column name="homepage" var="homepage" filter="homepage" maxlength="250" />
<column name="email_address" var="email_address" filter="email" maxlength="250" default="" />
<column name="homepage" var="homepage" filter="homepage" maxlength="250" default="" />
<column name="uploaded_count" var="uploaded_count" default="0" />
<column name="regdate" var="regdate" default="curdate()" />
<column name="last_update" var="last_update" default="curdate()" />
<column name="ipaddress" var="ipaddress" default="ipaddress()" />
<column name="list_order" var="list_order" default="0" />
<column name="status" var="status" notnull="notnull" default="0" />
</columns>
</query>

View file

@ -0,0 +1,12 @@
<query id="updatePublishedStatus" action="update">
<tables>
<table name="comments" />
</tables>
<columns>
<column name="status" var="status" notnull="notnull" />
</columns>
<conditions>
<condition operation="in" column="comment_srl" var="comment_srls_list" notnull="notnull" pipe="or" />
<condition operation="in" column="parent_srl" var="comment_srls_list" notnull="notnull" pipe="or" />
</conditions>
</query>

View file

@ -20,4 +20,5 @@
<column name="last_update" type="date" index="idx_last_update" />
<column name="ipaddress" type="varchar" size="128" notnull="notnull" index="idx_ipaddress" />
<column name="list_order" type="number" size="11" notnull="notnull" index="idx_list_order" />
<column name="status" type="number" size="1" default="1" notnull="notnull" index="idx_status" />
</table>

View file

@ -1,3 +1,4 @@
<!--#include("header.html")-->
<script type="text/javascript">
xe.lang.msg_empty_search_target = '{$lang->msg_empty_search_target}';
xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
@ -10,9 +11,21 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<h1 class="h1">{$lang->comment}</h1>
<div class="table even">
<div class="cnb">
<a href="{getUrl('','act','dispCommentAdminList', 'Y')}" <!--@if($search_keyword == '')-->class="active"<!--@end-->>{$lang->all}</a>
<a href="{getUrl('search_keyword','','act','dispCommentAdminList', 'Y')}" <!--@if($search_keyword == '')-->class="active"<!--@end-->>{$lang->all}</a>
| <a href="{getUrl('search_target','is_secret','search_keyword', 'N')}" <!--@if($search_target == 'is_secret' && $search_keyword == 'N')-->class="active"<!--@end-->>{$secret_name_list['N']}</a>
| <a href="{getUrl('search_target','is_secret','search_keyword', 'Y')}" <!--@if($search_target == 'is_secret' && $search_keyword == 'Y')-->class="active"<!--@end-->>{$secret_name_list['Y']}</a>
| <a href="{getUrl('search_target','is_published','search_keyword', 'N')}" <!--@if($search_target == 'is_published' && $search_keyword == 'N')-->class="active"<!--@end-->>{$lang->published_name_list['N']}</a>
| <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">
<option></option>
<!--@foreach($modules_list as $key => $node)-->
<option value="{$key}"<!--@if($key==$search_keyword)-->selected<!--@end-->>{$node}</option>
<!--@end-->
</select></label>
</block>
</div>
<table width="100%" border="1" cellspacing="0" id="commentListTable">
<caption>
@ -22,6 +35,10 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
{$secret_name_list['N']}
<!--@elseif($search_target == 'is_secret' && $search_keyword == 'Y')-->
{$secret_name_list['Y']}
<!--@elseif($search_target == 'is_published' && $search_keyword == 'N')-->
{$published_name_list['N']}
<!--@elseif($search_target == 'is_published' && $search_keyword == 'Y')-->
{$published_name_list['Y']}
<!--@end-->
({number_format($total_count)})
<div class="side">
@ -31,22 +48,24 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<thead>
<tr>
<th scope="col" class="text">{$lang->comment}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->cmd_vote}(+/-)</th>
<th scope="col">{$lang->date}</th>
<th scope="col">{$lang->ipaddress}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr">{$lang->date}</th>
<th scope="col" class="nowr">{$lang->ipaddress}</th>
<th scope="col" class="nowr">{$lang->status}</th>
<th scope="col">{$lang->published}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</thead>
<tfoot>
<tr>
<th scope="col" class="text">{$lang->comment}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->cmd_vote}(+/-)</th>
<th scope="col">{$lang->date}</th>
<th scope="col">{$lang->ipaddress}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr">{$lang->date}</th>
<th scope="col" class="nowr">{$lang->ipaddress}</th>
<th scope="col" class="nowr">{$lang->status}</th>
<th scope="col">{$lang->published}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</tfoot>
@ -55,11 +74,12 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
{@ $comment = cut_str(trim(strip_tags($val->content)), 200, '...')}
<tr>
<td class="text"><a href="{getUrl('','document_srl',$val->document_srl)}#comment_{$val->comment_srl}" target="_blank"><!--@if(strlen($comment))-->{$comment}<!--@else--><em>{$lang->no_text_comment}</em><!--@end--></a></td>
<td><a href="#popup_menu_area" class="member_{$val->member_srl}">{$val->nick_name}</a></td>
<td>0/0</td>
<td>{(zdate($val->regdate,"Y-m-d\nH:i:s"))}</td>
<td><a href="{getUrl('search_target','ipaddress','search_keyword',$val->ipaddress)}">{$val->ipaddress}</a></td>
<td><!--@if($val->isSecret())-->{$secret_name_list['Y']}<!--@else-->{$secret_name_list['N']}<!--@end--></td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$val->member_srl}">{$val->nick_name}</a></td>
<td class="nowr">0/0</td>
<td class="nowr">{(zdate($val->regdate,"Y-m-d\nH:i:s"))}</td>
<td class="nowr"><a href="{getUrl('search_target','ipaddress','search_keyword',$val->ipaddress)}">{$val->ipaddress}</a></td>
<td class="nowr"><!--@if($val->isSecret())-->{$secret_name_list['Y']}<!--@else-->{$secret_name_list['N']}<!--@end--></td>
<td class="nowr"><!--@if($val->status)-->{$lang->published_name_list['Y']}<!--@else-->{$lang->published_name_list['N']}<!--@end--></td>
<td><input type="checkbox" name="cart" value="{$val->comment_srl}" /></td>
</tr>
<!--@end-->
@ -76,6 +96,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<input type="hidden" name="act" value="procCommentAdminDeleteChecked" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="is_trash" value="false" />
<input type="hidden" name="will_publish" value="0" />
<input type="hidden" name="search_target" value="{$search_target}" />
<input type="hidden" name="search_keyword" value="{$search_keyword}" />
<h2 class="h2">{$lang->comment_manager}</h2>
@ -87,8 +108,9 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<thead>
<tr>
<th scope="col" class="title">{$lang->comment}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->status}</th>
<th scope="col">{$lang->published}</th>
</tr>
</thead>
<tbody>
@ -97,9 +119,17 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</div>
<p class="q"><label for="message">{$lang->message_notice}</label></p>
<p>
<textarea cols="42" rows="3" name="message_content" id="message" style="width:98%"></textarea>
<textarea rows="8" cols="42" name="message_content" id="message" style="width:98%"></textarea>
</p>
<div class="btnArea">
<!--@if ($search_target=='is_published' && $search_keyword=="N")-->
<span class="btn"><button type="submit" name="will_publish" value="1" onclick="doChangePublishedStatus(this.value);">{$lang->cmd_publish}</button></span>
<!--@elseif ($search_target=='is_published' && $search_keyword=="Y")-->
<span class="btn"><button type="submit" name="will_publish" value="0" onclick="doChangePublishedStatus(this.value);">{$lang->cmd_unpublish}</button></span>
<!--@else-->
<span class="btn"><button type="submit" name="will_publish" value="1" onclick="doChangePublishedStatus(this.value);">{$lang->cmd_publish}</button></span>
<span class="btn"><button type="submit" name="will_publish" value="0" onclick="doChangePublishedStatus(this.value);">{$lang->cmd_unpublish}</button></span>
<!--@end-->
<span class="btn"><button type="submit" name="is_trash" value="true">{$lang->cmd_trash}</button></span>
<span class="btn"><button type="submit" name="is_trash" value="false">{$lang->cmd_delete}</button></span>
</div>

View file

@ -32,6 +32,16 @@
<option value="N" selected="selected"|cond="$comment_config->use_vote_down=='N'">{$lang->notuse}</option>
</select>
</td>
</tr>
<tr>
<th scope="row"><label for="use_comment_validation">{$lang->cmd_comment_validation}</label></th>
<td>
<select name="use_comment_validation">
<option value="N" selected="selected"|cond="$comment_config->use_comment_validation=='N'">{$lang->notuse}</option>
<option value="Y" selected="selected"|cond="$comment_config->use_comment_validation=='Y'">{$lang->use}</option>
</select>
<p>{$lang->about_comment_validation}</p>
</td>
</tr>
</table>
</div>

View file

@ -2,7 +2,7 @@
<h3 class="xeAdmin">{$lang->comment} <span class="gray">{$lang->cmd_management}</span></h3>
<div class="header4 gap1">
<div class="header4">
<ul class="localNavigation">
<li <!--@if($act=='dispCommentAdminList')-->class="on"<!--@end-->><a href="{getUrl('act','dispCommentAdminList')}">{$lang->comment_list}</a></li>
<li <!--@if($act=='dispCommentAdminDeclared')-->class="on"<!--@end-->><a href="{getUrl('act','dispCommentAdminDeclared')}">{$lang->cmd_declared_list}</a></li>

View file

@ -40,7 +40,7 @@ function completeGetCommentList(ret_obj, response_tags)
{
var htmlListBuffer = '';
var statusNameList = {"N":"Public", "Y":"Secret"};
var publishedStatusList = {0:'Unpublished', 1:'Published'};
if(ret_obj['comment_list'] == null)
{
htmlListBuffer = '<tr>' +
@ -56,8 +56,9 @@ function completeGetCommentList(ret_obj, response_tags)
var objComment = comment_list[x];
htmlListBuffer += '<tr>' +
'<td class="title">'+ objComment.content +'</td>' +
'<td>'+ objComment.nick_name +'</td>' +
'<td>'+ statusNameList[objComment.is_secret] +'</td>' +
'<td class="nowr">'+ objComment.nick_name +'</td>' +
'<td class="nowr">'+ statusNameList[objComment.is_secret] +'</td>' +
'<td>'+ publishedStatusList[objComment.status] +'</td>' +
'</tr>' +
'<input type="hidden" name="cart[]" value="'+objComment.comment_srl+'" />';
}
@ -66,6 +67,16 @@ function completeGetCommentList(ret_obj, response_tags)
jQuery('#commentManageListTable>tbody').html(htmlListBuffer);
}
function doChangePublishedStatus(new_status)
{
container_div = jQuery("#listManager");
var act = container_div.find("input[name=act]");
var will_publish = container_div.find("input[name=will_publish]");
var action = "procCommentAdminChangePublishedStatusChecked";
will_publish.val(new_status);
act.val(action);
}
function checkSearch(form)
{
if(form.search_target.value == '')

View file

@ -63,7 +63,7 @@
if($logged_info->is_admin != 'Y') {
if($receiver_member_info->allow_message == 'F') {
if(!$oCommunicationModel->isFriend($receiver_member_info->member_srl)) return new object(-1, 'msg_allow_message_to_friend');
} elseif($receiver_member_info->allow_messge == 'N') {
} elseif($receiver_member_info->allow_message == 'N') {
return new object(-1, 'msg_disallow_message');
}
}

View file

@ -34,6 +34,11 @@
// 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 = Context::get('message_type');
@ -106,8 +111,13 @@
if(!Context::get('is_logged')) return $this->stop('msg_not_logged');
$logged_info = Context::get('logged_info');
// get receipient's information
// check inalid request
$receiver_srl = Context::get('receiver_srl');
if(!$receiver_srl || $logged_info->member_srl == $receiver_srl) return $this->stop('msg_not_logged');
if(!$receiver_srl) return $this->stop('msg_invalid_request');
// check receiver and sender are same
if($logged_info->member_srl == $receiver_srl) return $this->stop('msg_cannot_send_to_yourself');
// get message_srl of the original message if it is a reply
$message_srl = Context::get('message_srl');
if($message_srl) {
@ -120,6 +130,11 @@
}
$receiver_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl);
if(!$receiver_info)
{
return $this->stop('msg_invalid_request');
}
Context::set('receiver_info', $receiver_info);
// set a signiture by calling getEditor of the editor module
$oEditorModel = &getModel('editor');

View file

@ -277,6 +277,11 @@
<value xml:lang="tr"><![CDATA[Mesaj yok]]></value>
<value xml:lang="vi"><![CDATA[Không có tin nhắn nào.]]></value>
</item>
<item name="msg_cannot_send_to_yourself">
<value xml:lang="ko"><![CDATA[자기 자신에게 쪽지를 보낼 수 없습니다.]]></value>
<value xml:lang="en"><![CDATA[Cannot send a message to yourself.]]></value>
<value xml:lang="jp"><![CDATA[自分自身へのメッセージ送信はできません。]]></value>
</item>
<item name="message_received">
<value xml:lang="ko"><![CDATA[쪽지가 왔습니다.]]></value>
<value xml:lang="en"><![CDATA[You have a new message.]]></value>
@ -354,4 +359,4 @@
<value xml:lang="en"><![CDATA[Send a message to the author about this. If you don't write a message, it is not sent.]]></value>
<value xml:lang="jp"><![CDATA[作成者にメッセージを送信し、知らせます。作成しなければ送信されません。]]></value>
</item>
</lang>
</lang>

View file

@ -24,7 +24,7 @@
<option value="{$val->friend_group_srl}" <!--@if($val->friend_group_srl == $friend_group_srl)-->selected="selected"<!--@end--> >{$val->title}</option>
<!--@end-->
</select>
<button type="button" onclick="doRenameFriendGroup();return false;">{$lang->cmd_modify}</button>
<button type="button" onclick="doRenameFriendGroup();return false;">{$lang->cmd_modify}...</button>
<button type="button" onclick="doDeleteFriendGroup();return false;">{$lang->cmd_delete}</button>
<a href="{getUrl('','module','communication','act','dispCommunicationAddFriendGroup')}" onclick="popopen(this.href);return false;">{$lang->cmd_add_friend_group}</a>
</div>

View file

@ -60,7 +60,7 @@
</th>
<th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->readed_date}</th>
<th scope="col"><input name="check_all" type="checkbox" onclick="XE.checkboxToggleAll('message_srl_list', { wrap:'fo_message_list' });" /></th>
<th scope="col"><input name="check_all" type="checkbox" onclick="XE.checkboxToggleAll('message_srl_list[]', { wrap:'fo_message_list' }); return false;" /></th>
</tr>
</thead>
<tbody>

View file

@ -3,7 +3,7 @@
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="sendMessage" action="./" method="get">
<form ruleset="sendMessage" action="./" method="post">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationSendMessage" />
<input type="hidden" name="content" value="{htmlspecialchars($source_message->content)}" />

View file

@ -69,7 +69,7 @@
<title xml:lang="es">Document</title>
<title xml:lang="ru">Document</title>
<title xml:lang="fr">Document</title>
<title xml:lang="zh-TW">Document</title>
<title xml:lang="zh-TW">文章</title>
<title xml:lang="vi">Document</title>
<title xml:lang="mn">Document</title>
<title xml:lang="tr">Document</title>

View file

@ -183,6 +183,31 @@
$oDB = &DB::getInstance();
$oDB->begin();
$triggerObj->document_srls = implode(',',$document_srl_list);
$triggerObj->module_srl = $module_srl;
$triggerObj->category_srl = $category_srl;
// Call a trigger (before)
$output = ModuleHandler::triggerCall('document.copyDocumentModule', 'before', $triggerObj);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$extraVarsList = $oDocumentModel->getDocumentExtraVarsFromDB($document_srl_list);
$extraVarsListByDocumentSrl = array();
if(is_array($extraVarsList->data))
{
foreach($extraVarsList->data AS $key=>$value)
{
if(!isset($extraVarsListByDocumentSrl[$value->document_srl]))
{
$extraVarsListByDocumentSrl[$value->document_srl] = array();
}
array_push($extraVarsListByDocumentSrl[$value->document_srl], $value);
}
}
for($i=count($document_srl_list)-1;$i>=0;$i--) {
$document_srl = $document_srl_list[$i];
$oDocument = $oDocumentModel->getDocument($document_srl);
@ -190,6 +215,18 @@
$obj = null;
$obj = $oDocument->getObjectVars();
$extraVars = $extraVarsListByDocumentSrl[$document_srl];
if($module_srl == $obj->module_srl)
{
if(is_array($extraVars))
{
foreach($extraVars as $extraItem)
{
if($extraItem->var_idx >= 0) $obj->{'extra_vars'.$extraItem->var_idx} = $extraItem->value;
}
}
}
$obj->module_srl = $module_srl;
$obj->document_srl = getNextSequence();
$obj->category_srl = $category_srl;
@ -224,6 +261,24 @@
$oDB->rollback();
return $output;
}
// copy multi language contents
if(is_array($extraVars))
{
foreach($extraVars AS $key=>$value)
{
if($value->idx >= 0 && $value->lang_code == Context::getLangType())
{
continue;
}
if( $value->var_idx < 0 || ($module_srl == $value->module_srl && $value->var_idx >= 0) )
{
$oDocumentController->insertDocumentExtraVar($value->module_srl, $obj->document_srl, $value->var_idx, $value->value, $value->eid, $value->lang_code);
}
}
}
// Move the comments
if($oDocument->getCommentCount()) {
$oCommentModel = &getModel('comment');
@ -293,6 +348,14 @@
$copied_srls[$document_srl] = $obj->document_srl;
}
// Call a trigger (before)
$output = ModuleHandler::triggerCall('document.copyDocumentModule', 'after', $triggerObj);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$oDB->commit();
$output = new Object();

View file

@ -112,6 +112,9 @@
// 2011. 10. 25 status index check
if(!$oDB->isIndexExists("documents", "idx_module_status")) return true;
// 2012. 02. 27 Add a trigger to copy extra keys when the module is copied
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after')) return true;
return false;
}
@ -293,6 +296,12 @@
if(!$oDB->isIndexExists("documents", "idx_module_status"))
$oDB->addIndex("documents", "idx_module_status", array("module_srl","status"));
// 2012. 02. 27 Add a trigger to copy extra keys when the module is copied
if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after'))
{
$oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'document', 'controller', 'triggerCopyModuleExtraKeys', 'after');
}
return new Object(0,'success_updated');
}

View file

@ -113,8 +113,8 @@ class documentController extends document {
$oDocumentController = &getController('document');
$output = $oDocumentController->deleteModuleCategory($module_srl);
if(!$output->toBool()) return $output;
// Delete extra variable
$this->deleteDocumentExtraVars($module_srl);
// Delete extra key and variable, because module deleted
$this->deleteDocumentExtraKeys($module_srl);
// remove aliases
$this->deleteDocumentAliasByModule($module_srl);
@ -166,6 +166,10 @@ class documentController extends document {
// Set to 0 if the category_srl doesn't exist
if($obj->category_srl) {
$category_list = $oDocumentModel->getCategoryList($obj->module_srl);
if(!$category_list[$obj->category_srl]->grant)
{
return new Object(-1, 'msg_not_permitted');
}
if(!$category_list[$obj->category_srl]) $obj->category_srl = 0;
}
// Set the read counts and update order.
@ -707,10 +711,41 @@ class documentController extends document {
if(!$module_srl) return new Object(-1,'msg_invalid_request');
$obj->module_srl = $module_srl;
if(!is_null($var_idx)) $obj->var_idx = $var_idx;
$output = executeQuery('document.deleteDocumentExtraKeys', $obj);
if(!$output->toBool()) return $output;
return executeQuery('document.deleteDocumentExtraVars', $obj);
$oDB = DB::getInstance();
$oDB->begin();
$output = $oDB->executeQuery('document.deleteDocumentExtraKeys', $obj);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
$output = $oDB->executeQuery('document.updateDocumentExtraKeyIdxOrder', $obj);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
$output = executeQuery('document.deleteDocumentExtraVars', $obj);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
$output = $oDB->executeQuery('document.updateDocumentExtraVarIdxOrder', $obj);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
$oDB->commit();
return new Object();
}
/**
@ -1107,7 +1142,7 @@ class documentController extends document {
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' && $logged_info->is_admin != 'Y') $js_code[] = sprintf('validator.cast("ADD_EXTRA_FIELD", ["extra_vars%s", { required:true }]);', $val->idx);
if($val->is_required == 'Y') $js_code[] = sprintf('validator.cast("ADD_EXTRA_FIELD", ["extra_vars%s", { required:true }]);', $val->idx);
}
$js_code[] = '})(jQuery);';
@ -1598,7 +1633,7 @@ class documentController extends document {
* @brief Move/ Delete the document in the seession
**/
function procDocumentManageCheckedDocument() {
set_time_limit(50);
set_time_limit(0);
if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
$type = Context::get('type');
@ -1831,5 +1866,26 @@ class documentController extends document {
if(!$obj->status && $obj->is_secret == 'Y') $obj->status = $this->getConfigStatus('secret');
if(!$obj->status && $obj->is_secret != 'Y') $obj->status = $this->getConfigStatus('public');
}
/**
* @brief copy extra keys when module copied
**/
function triggerCopyModuleExtraKeys(&$obj)
{
$oDocumentModel = &getModel('document');
$documentExtraKeys = $oDocumentModel->getExtraKeys($obj->originModuleSrl);
if(is_array($documentExtraKeys) && is_array($obj->moduleSrlList))
{
$oDocumentController=&getController('document');
foreach($obj->moduleSrlList AS $key=>$value)
{
foreach($documentExtraKeys AS $extraItem)
{
$oDocumentController->insertDocumentExtraKey($value, $extraItem->idx, $extraItem->name, $extraItem->type, $extraItem->is_required , $extraItem->search , $extraItem->default , $extraItem->desc, $extraItem->eid) ;
}
}
}
}
}
?>

View file

@ -14,6 +14,7 @@
var $columnList = array();
var $allowscriptaccessList = array();
var $allowscriptaccessKey = 0;
var $uploadedFiles = array();
function documentItem($document_srl = 0, $load_extra_vars = true, $columnList = array()) {
$this->document_srl = $document_srl;
@ -338,13 +339,18 @@
}
// If additional content information is set
if($add_content_info) {
$memberSrl = $this->get('member_srl');
if($memberSrl < 0)
{
$memberSrl = 0;
}
$content = sprintf(
'<!--BeforeDocument(%d,%d)--><div class="document_%d_%d xe_content">%s</div><!--AfterDocument(%d,%d)-->',
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $memberSrl,
$this->document_srl, $memberSrl,
$content,
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $this->get('member_srl')
$this->document_srl, $memberSrl,
$this->document_srl, $memberSrl
);
// Add xe_content class although accessing content is not required
} else {
@ -474,7 +480,7 @@
function getExtraValueHTML($idx) {
$extra_vars = $this->getExtraVars();
if(array_key_exists($idx,$extra_vars)){
if(is_array($extra_vars) && array_key_exists($idx,$extra_vars)){
return $extra_vars[$idx]->getValueHTML();
}else{
return '';
@ -518,7 +524,14 @@
if(!$this->getCommentCount()) return;
if(!$this->isGranted() && $this->isSecret()) return;
// cpage is a number of comment pages
$cpage = Context::get('cpage');
$cpageStr = sprintf('%d_cpage', $this->document_srl);
$cpage = Context::get($cpageStr);
if(!$cpage)
{
$cpage = Context::get('cpage');
}
// Get a list of comments
$oCommentModel = &getModel('comment');
$output = $oCommentModel->getCommentList($this->document_srl, $cpage, $is_admin);
@ -526,6 +539,7 @@
// Create commentItem object from a comment list
// If admin priviledge is granted on parent posts, you can read its child posts.
$accessible = array();
$comment_list = array();
foreach($output->data as $key => $val) {
$oCommentItem = new commentItem();
$oCommentItem->setAttribute($val);
@ -538,6 +552,7 @@
$comment_list[$val->comment_srl] = $oCommentItem;
}
// Variable setting to be displayed on the skin
Context::set($cpageStr, $output->page_navigation->cur_page);
Context::set('cpage', $output->page_navigation->cur_page);
if($output->total_page>1) $this->comment_page_navigation = $output->page_navigation;
@ -725,16 +740,21 @@
return $this->get('uploaded_count')? true : false;
}
function getUploadedFiles() {
if(!$this->document_srl) return;
function getUploadedFiles($sortIndex = 'file_srl')
{
if(!$this->document_srl) return;
if($this->isSecret() && !$this->isGranted()) return;
if(!$this->get('uploaded_count')) return;
if($this->isSecret() && !$this->isGranted()) return;
if(!$this->get('uploaded_count')) return;
$oFileModel = &getModel('file');
$file_list = $oFileModel->getFiles($this->document_srl, $is_admin);
return $file_list;
}
if(!$this->uploadedFiles[$sortIndex])
{
$oFileModel = &getModel('file');
$this->uploadedFiles[$sortIndex] = $oFileModel->getFiles($this->document_srl, array(), $sortIndex);
}
return $this->uploadedFiles[$sortIndex];
}
/**
* @brief Return Editor html
@ -831,5 +851,23 @@
}
return false;
}
function getTranslationLangCodes()
{
$obj->document_srl = $this->document_srl;
// -2 is an index for content. We are interested if content has other translations.
$obj->var_idx = -2;
$output = executeQueryArray('document.getDocumentTranslationLangCodes', $obj);
if (!$output->data)
{
$output->data = array();
}
// add original page's lang code as well
$origLangCode->lang_code = $this->getLangCode();
$output->data[] = $origLangCode;
return $output->data;
}
}
?>

View file

@ -19,6 +19,18 @@
return $_SESSION['own_document'][$document_srl];
}
function getDocumentExtraVarsFromDB($documentSrls)
{
if(!is_array($documentSrls) || count($documentSrls) == 0)
{
return new Object(-1, 'msg_invalid_request');
}
$args->document_srl = $documentSrls;
$output = executeQueryArray('document.getDocumentExtraVars', $args);
return $output;
}
/**
* @brief extra variables for each article will not be processed bulk select and apply the macro city
**/
@ -36,8 +48,8 @@
// If the document number, return detected
if(!count($document_srls)) return;
// Expand variables mijijeongdoen article about a current visitor to the extension of the language code, the search variable
$obj->document_srl = implode(',',$document_srls);
$output = executeQueryArray('document.getDocumentExtraVars', $obj);
//$obj->document_srl = implode(',',$document_srls);
$output = $this->getDocumentExtraVarsFromDB($document_srls);
if($output->toBool() && $output->data) {
foreach($output->data as $key => $val) {
if(!isset($val->value)) continue;
@ -60,6 +72,7 @@
// Expand the variable processing
if(count($extra_keys)) {
foreach($extra_keys as $idx => $key) {
$extra_keys[$idx] = clone($key);
$val = $vars[$idx];
if(isset($val[$user_lang_code])) $v = $val[$user_lang_code];
else if(isset($val[$document_lang_code])) $v = $val[$document_lang_code];
@ -329,7 +342,6 @@
}
// Return if no result or an error occurs
if(!$output->toBool()||!count($output->data)) return $output;
$idx = 0;
$data = $output->data;
unset($output->data);
@ -417,6 +429,51 @@
$obj->sort_index = 'var_idx';
$obj->order = 'asc';
$output = executeQueryArray('document.getDocumentExtraKeys', $obj);
// correcting index order
$isFixed = FALSE;
if(is_array($output->data))
{
$prevIdx = 0;
foreach($output->data as $no => $value)
{
// case first
if($prevIdx == 0 && $value->idx != 1)
{
$args = new stdClass();
$args->module_srl = $module_srl;
$args->var_idx = $value->idx;
$args->new_idx = 1;
executeQuery('document.updateDocumentExtraKeyIdx', $args);
executeQuery('document.updateDocumentExtraVarIdx', $args);
$prevIdx = 1;
$isFixed = TRUE;
continue;
}
// case others
if($prevIdx > 0 && $prevIdx + 1 != $value->idx)
{
$args = new stdClass();
$args->module_srl = $module_srl;
$args->var_idx = $value->idx;
$args->new_idx = $prevIdx + 1;
executeQuery('document.updateDocumentExtraKeyIdx', $args);
executeQuery('document.updateDocumentExtraVarIdx', $args);
$prevIdx += 1;
$isFixed = TRUE;
continue;
}
$prevIdx = $value->idx;
}
}
if($isFixed)
{
$output = executeQueryArray('document.getDocumentExtraKeys', $obj);
}
$oExtraVar->setExtraVarKeys($output->data);
$keys = $oExtraVar->getExtraVars();
if(!$keys) $keys = array();
@ -572,6 +629,7 @@
else $args->regdate = $oDocument->get('regdate');
break;
case 'voted_count' :
case 'blamed_count' :
case 'readed_count' :
case 'comment_count' :
case 'title' :
@ -586,6 +644,34 @@
$args->sort_index = $opt->sort_index;
$args->order_type = $opt->order_type;
if($opt->statusList) $args->statusList = $opt->statusList;
else
{
$logged_info = Context::get('logged_info');
if($logged_info->is_admin == 'Y' && !$args->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($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);
}
}
// Guhanhu total number of the article search page
$output = executeQuery('document.getDocumentPage', $args);
$count = $output->data->count;
@ -816,7 +902,7 @@
$extra_keys = $this->getExtraKeys($module_srl);
Context::set('extra_keys', $extra_keys);
$security = new Security();
$security->encodeHTML('extra_keys..name','extra_keys..eid');
$security->encodeHTML('extra_keys..eid');
// Get information of module_grants
$oTemplate = &TemplateHandler::getInstance();
@ -880,7 +966,6 @@
// tpl template file directly compile and will return a variable and puts it on.
$oTemplate = &TemplateHandler::getInstance();
$tpl = $oTemplate->compile('./modules/document/tpl', 'category_info');
$tpl = str_replace("\n",'',$tpl);
// Changing user-defined language
$oModuleController = &getController('module');
$oModuleController->replaceDefinedLangCode($tpl);
@ -983,6 +1068,7 @@
case 'member_srl' :
case 'readed_count' :
case 'voted_count' :
case 'blamed_count' :
case 'comment_count' :
case 'trackback_count' :
case 'uploaded_count' :
@ -1065,7 +1151,7 @@
{
$sortIndex = $obj->sort_index;
$isExtraVars = false;
if(!in_array($sortIndex, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl')))
if(!in_array($sortIndex, array('list_order','regdate','last_update','update_order','readed_count','voted_count','blamed_count','comment_count','trackback_count','uploaded_count','title','category_srl')))
{
// get module_srl extra_vars list
if ($load_extra_vars)
@ -1145,6 +1231,9 @@
case 'uploaded_count' :
$args->{"s_".$search_target} = (int)$search_keyword;
break;
case 'blamed_count' :
$args->{"s_".$search_target} = (int)$search_keyword * -1;
break;
case 'regdate' :
case 'last_update' :
case 'ipaddress' :

View file

@ -5,7 +5,7 @@
<value xml:lang="en"><![CDATA[Documents List]]></value>
<value xml:lang="jp"><![CDATA[ドキュメントリスト]]></value>
<value xml:lang="zh-CN"><![CDATA[主题列表]]></value>
<value xml:lang="zh-TW"><![CDATA[主題列表]]></value>
<value xml:lang="zh-TW"><![CDATA[文章列表]]></value>
<value xml:lang="fr"><![CDATA[Liste des Documents]]></value>
<value xml:lang="ru"><![CDATA[Список документов]]></value>
<value xml:lang="es"><![CDATA[Document list]]></value>
@ -28,7 +28,7 @@
<value xml:lang="en"><![CDATA[Crop (to a specific size)]]></value>
<value xml:lang="jp"><![CDATA[トリミングする]]></value>
<value xml:lang="zh-CN"><![CDATA[裁减(按指定大小裁剪图片)]]></value>
<value xml:lang="zh-TW"><![CDATA[裁]]></value>
<value xml:lang="zh-TW"><![CDATA[裁]]></value>
<value xml:lang="fr"><![CDATA[Rogner]]></value>
<value xml:lang="ru"><![CDATA[Обрезать]]></value>
<value xml:lang="tr"><![CDATA[Kırpılmış]]></value>
@ -248,7 +248,7 @@
<value xml:lang="en"><![CDATA[Invert Selection]]></value>
<value xml:lang="jp"><![CDATA[選択項目反転]]></value>
<value xml:lang="zh-CN"><![CDATA[反选]]></value>
<value xml:lang="zh-TW"><![CDATA[反]]></value>
<value xml:lang="zh-TW"><![CDATA[反向選擇]]></value>
<value xml:lang="fr"><![CDATA[Renverser les choisis]]></value>
<value xml:lang="ru"><![CDATA[Перевернуть выбранные объекты]]></value>
<value xml:lang="es"><![CDATA[Invertir los elementos seleccionados]]></value>
@ -272,7 +272,7 @@
<value xml:lang="en"><![CDATA[I want to]]></value>
<value xml:lang="jp"><![CDATA[この書き込みを..]]></value>
<value xml:lang="zh-CN"><![CDATA[将把此主题..]]></value>
<value xml:lang="zh-TW"><![CDATA[將此主題..]]></value>
<value xml:lang="zh-TW"><![CDATA[將此文章..]]></value>
<value xml:lang="fr"><![CDATA[Vous voudriez..]]></value>
<value xml:lang="ru"><![CDATA[Эту запись...]]></value>
<value xml:lang="es"><![CDATA[Usted ..]]></value>
@ -320,7 +320,7 @@
<value xml:lang="en"><![CDATA[%d article(s) was(were) deleted.]]></value>
<value xml:lang="jp"><![CDATA[%d個の書き込みが削除されました。]]></value>
<value xml:lang="zh-CN"><![CDATA[删除了%d个文章。]]></value>
<value xml:lang="zh-TW"><![CDATA[刪除%d個文章。]]></value>
<value xml:lang="zh-TW"><![CDATA[刪除 %d 個文章。]]></value>
<value xml:lang="fr"><![CDATA[%d article(s) est(sont) supprimé(s)]]></value>
<value xml:lang="ru"><![CDATA[%d записей удалено]]></value>
<value xml:lang="es"><![CDATA[Total de %d documentos han sido eliminados]]></value>
@ -489,12 +489,15 @@
<value xml:lang="tr"><![CDATA[Oylama Sayısı (over)]]></value>
<value xml:lang="vi"><![CDATA[Lượt bình chọn]]></value>
</item>
<item name="blamed_count">
<value xml:lang="ko"><![CDATA[비추천 수 (이상)]]></value>
</item>
<item name="comment_count ">
<value xml:lang="ko"><![CDATA[댓글 수 (이상)]]></value>
<value xml:lang="en"><![CDATA[Number of Comments (over)]]></value>
<value xml:lang="jp"><![CDATA[コメント数(以上)]]></value>
<value xml:lang="zh-CN"><![CDATA[评论数(以上)]]></value>
<value xml:lang="zh-TW"><![CDATA[評論數(以上)]]></value>
<value xml:lang="zh-TW"><![CDATA[回覆數(以上)]]></value>
<value xml:lang="fr"><![CDATA[Commentaires (surplus)]]></value>
<value xml:lang="ru"><![CDATA[Количество записей (свыше)]]></value>
<value xml:lang="es"><![CDATA[Número de comentarios (sobre)]]></value>
@ -554,7 +557,7 @@
<value xml:lang="en"><![CDATA[IP Address]]></value>
<value xml:lang="jp"><![CDATA[IPアドレス]]></value>
<value xml:lang="zh-CN"><![CDATA[IP 地址]]></value>
<value xml:lang="zh-TW"><![CDATA[IP位址]]></value>
<value xml:lang="zh-TW"><![CDATA[IP 位址]]></value>
<value xml:lang="fr"><![CDATA[Adresse IP]]></value>
<value xml:lang="ru"><![CDATA[IP-Адрес]]></value>
<value xml:lang="es"><![CDATA[Dirección IP]]></value>
@ -566,6 +569,7 @@
<value xml:lang="ko"><![CDATA[별칭(Alias)]]></value>
<value xml:lang="en"><![CDATA[Alias]]></value>
<value xml:lang="jp"><![CDATA[アリアスAlias]]></value>
<value xml:lang="zh-TW"><![CDATA[別名]]></value>
<value xml:lang="tr"><![CDATA[Diğer Adıyla]]></value>
<value xml:lang="vi"><![CDATA[Bí danh]]></value>
</item>
@ -604,7 +608,7 @@
<value xml:lang="en"><![CDATA[Recycle Bin]]></value>
<value xml:lang="jp"><![CDATA[ゴミ箱]]></value>
<value xml:lang="zh-CN"><![CDATA[回收箱]]></value>
<value xml:lang="zh-TW"><![CDATA[垃圾桶]]></value>
<value xml:lang="zh-TW"><![CDATA[回收桶]]></value>
<value xml:lang="ru"><![CDATA[Корзина]]></value>
<value xml:lang="tr"><![CDATA[Çöp Kutusu]]></value>
<value xml:lang="vi"><![CDATA[Thùng rác]]></value>
@ -634,7 +638,7 @@
<value xml:lang="en"><![CDATA[Recycle Bin]]></value>
<value xml:lang="jp"><![CDATA[ゴミ箱]]></value>
<value xml:lang="zh-CN"><![CDATA[回收箱]]></value>
<value xml:lang="zh-TW"><![CDATA[垃圾桶]]></value>
<value xml:lang="zh-TW"><![CDATA[回收桶]]></value>
<value xml:lang="ru"><![CDATA[Корзина]]></value>
<value xml:lang="tr"><![CDATA[Çöp Kutusu]]></value>
<value xml:lang="vi"><![CDATA[Thùng rác]]></value>
@ -778,7 +782,7 @@
<value xml:lang="en"><![CDATA[Successfully moved to Recycle Bin.]]></value>
<value xml:lang="jp"><![CDATA[ごみ箱に移動しました。]]></value>
<value xml:lang="zh-CN"><![CDATA[已成功移除到回收箱。]]></value>
<value xml:lang="zh-TW"><![CDATA[成功地移到垃圾桶]]></value>
<value xml:lang="zh-TW"><![CDATA[成功地移到回收桶]]></value>
<value xml:lang="tr"><![CDATA[Başarıyla silindi]]></value>
<value xml:lang="vi"><![CDATA[Đã chuyển tới thùng rác thành công.]]></value>
</item>
@ -786,72 +790,85 @@
<value xml:lang="ko"><![CDATA[선택된 문서가 없습니다.]]></value>
<value xml:lang="en"><![CDATA[There are no selected articles.]]></value>
<value xml:lang="jp"><![CDATA[選択された書き込みがありません。]]></value>
<value xml:lang="zh-TW"><![CDATA[尚未選擇主題]]></value>
<value xml:lang="zh-TW"><![CDATA[尚未選擇文章]]></value>
<value xml:lang="tr"><![CDATA[Hiçbir makale seçilmedi.]]></value>
</item>
<item name="status">
<value xml:lang="ko"><![CDATA[상태]]></value>
<value xml:lang="en"><![CDATA[Status]]></value>
<value xml:lang="jp"><![CDATA[状態]]></value>
<value xml:lang="zh-TW"><![CDATA[狀態]]></value>
</item>
<item name="status_name_list" type="array">
<item name="PRIVATE">
<value xml:lang="ko"><![CDATA[비공개]]></value>
<value xml:lang="en"><![CDATA[Private]]></value>
<value xml:lang="jp"><![CDATA[非公開]]></value>
<value xml:lang="zh-TW"><![CDATA[不公開]]></value>
</item>
<item name="PUBLIC">
<value xml:lang="ko"><![CDATA[공개]]></value>
<value xml:lang="en"><![CDATA[Public]]></value>
<value xml:lang="jp"><![CDATA[公開]]></value>
<value xml:lang="zh-TW"><![CDATA[公開]]></value>
</item>
<item name="SECRET">
<value xml:lang="ko"><![CDATA[비밀]]></value>
<value xml:lang="en"><![CDATA[Secret]]></value>
<value xml:lang="jp"><![CDATA[非公開]]></value>
<value xml:lang="zh-TW"><![CDATA[秘密]]></value>
</item>
<item name="TEMP">
<value xml:lang="ko"><![CDATA[임시]]></value>
<value xml:lang="en"><![CDATA[Temporary]]></value>
<value xml:lang="jp"><![CDATA[テンポラリ]]></value>
<value xml:lang="zh-TW"><![CDATA[暫存]]></value>
</item>
</item>
<item name="document_manager">
<value xml:lang="ko"><![CDATA[선택한 글 관리]]></value>
<value xml:lang="en"><![CDATA[Manage selected articles]]></value>
<value xml:lang="jp"><![CDATA[選択した書き込みを管理]]></value>
<value xml:lang="zh-TW"><![CDATA[管理所選主題]]></value>
</item>
<item name="selected_document">
<value xml:lang="ko"><![CDATA[선택한 글]]></value>
<value xml:lang="en"><![CDATA[Selected articles]]></value>
<value xml:lang="jp"><![CDATA[選択した書き込み]]></value>
<value xml:lang="zh-TW"><![CDATA[已選文章數]]></value>
</item>
<item name="selected_document_move">
<value xml:lang="ko"><![CDATA[선택한 글을 다음 위치로 옮기거나 복사할 수 있습니다.]]></value>
<value xml:lang="en"><![CDATA[You can move or copy the selected articles to the following position.]]></value>
<value xml:lang="jp"><![CDATA[選択した書き込みを次の位置へ移動したり、コピーしたりできます。]]></value>
<value xml:lang="zh-TW"><![CDATA[可移動或複製所選擇的文章到下列位置。]]></value>
</item>
<item name="select_module">
<value xml:lang="ko"><![CDATA[모듈을 선택하세요.]]></value>
<value xml:lang="en"><![CDATA[Select a module.]]></value>
<value xml:lang="jp"><![CDATA[モジュールを選択してください。]]></value>
<value xml:lang="zh-TW"><![CDATA[選擇模組]]></value>
</item>
<item name="select_module_id">
<value xml:lang="ko"><![CDATA[모듈 아이디를 선택하세요.]]></value>
<value xml:lang="en"><![CDATA[Select a module ID.]]></value>
<value xml:lang="jp"><![CDATA[モジュールIDを選択してください。]]></value>
<value xml:lang="zh-TW"><![CDATA[選擇模組 ID.]]></value>
</item>
<item name="select_category">
<value xml:lang="ko"><![CDATA[분류를 선택하세요.]]></value>
<value xml:lang="en"><![CDATA[Select a category.]]></value>
<value xml:lang="jp"><![CDATA[カテゴリを選択してください。]]></value>
<value xml:lang="zh-TW"><![CDATA[選擇分類]]></value>
</item>
<item name="category_description">
<value xml:lang="ko"><![CDATA[카테고리 설명]]></value>
<value xml:lang="en"><![CDATA[Category Description]]></value>
<value xml:lang="zh-TW"><![CDATA[分類說明]]></value>
</item>
<item name="no_title_document">
<value xml:lang="ko"><![CDATA[제목이 없는 문서입니다.]]></value>
<value xml:lang="en"><![CDATA[No title in this document.]]></value>
<value xml:lang="zh-TW"><![CDATA[此文章無標題。]]></value>
</item>
</lang>

View file

@ -24,6 +24,7 @@
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="and" />
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -25,6 +25,7 @@
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="and" />
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -28,6 +28,7 @@
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -1,4 +1,4 @@
<query id="getDocumentList" action="select">
<query id="getDocumentListExtraSort" action="select">
<tables>
<table name="documents" alias="d" />
<table name="document_extra_vars" alias="ev" />
@ -15,6 +15,7 @@
<condition operation="in" column="d.category_srl" var="category_srl" pipe="and" />
<condition operation="equal" column="d.is_notice" var="s_is_notice" pipe="and" />
<condition operation="equal" column="d.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="in" column="d.status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="more" column="d.list_order" var="division" pipe="and" />
<condition operation="below" column="d.list_order" var="last_division" pipe="and" />
@ -32,6 +33,7 @@
<condition operation="equal" column="d.member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="d.readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="d.voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="d.blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="d.comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="d.trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="d.uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -1,4 +1,4 @@
<query id="getDocumentList" action="select">
<query id="getDocumentListUseIndex" action="select">
<tables>
<table name="documents" />
</tables>
@ -12,6 +12,7 @@
<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" />
@ -28,6 +29,7 @@
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -12,6 +12,7 @@
<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" />
</conditions>
<navigation>

View file

@ -13,6 +13,7 @@
<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" />

View file

@ -9,7 +9,7 @@
<condition operation="equal" column="documents.member_srl" var="member.member_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="documents.module_srl" var="module_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" />
<condition operation="in" column="status" var="statusList" pipe="and" />
<condition operation="in" column="documents.status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="like" column="documents.title" var="s_title" />
<condition operation="like" column="documents.content" var="s_content" pipe="or" />
@ -22,6 +22,7 @@
<condition operation="equal" column="documents.member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="documents.readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="documents.voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="documents.blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="documents.comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="documents.trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="documents.uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -7,10 +7,13 @@
</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" />
@ -34,6 +37,7 @@
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -0,0 +1,12 @@
<query id="getDocumentTranslationLangCodes" action="select">
<tables>
<table name="document_extra_vars" />
</tables>
<columns>
<column name="DISTINCT(lang_code)" />
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" notnull="notnull" />
<condition operation="equal" column="var_idx" var="var_idx" default="-2" notnull="notnull" pipe="and" />
</conditions>
</query>

View file

@ -33,6 +33,7 @@
<condition operation="equal" column="documents.member_srl" var="s_member_srl" pipe="or" />
<condition operation="more" column="documents.readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="documents.voted_count" var="s_voted_count" pipe="or" />
<condition operation="less" column="documents.blamed_count" var="s_blamed_count" pipe="or" />
<condition operation="more" column="documents.comment_count" var="s_comment_count" pipe="or" />
<condition operation="more" column="documents.trackback_count" var="s_trackback_count" pipe="or" />
<condition operation="more" column="documents.uploaded_count" var="s_uploaded_count" pipe="or" />

View file

@ -4,7 +4,7 @@
</tables>
<columns>
<column name="title" var="title" />
<column name="description" var="description" />
<column name="description" var="description" default=""/>
<column name="list_order" var="list_order" />
<column name="last_update" var="last_update" default="curdate()" />
<column name="expand" var="expand" />

View file

@ -7,7 +7,7 @@
<column name="var_type" var="var_type" notnull="notnull" />
<column name="var_is_required" var="var_is_required" default="N" notnull="notnull" />
<column name="var_search" var="var_search" default="N" notnull="notnull" />
<column name="var_default" var="var_default" />
<column name="var_default" var="var_default" default="" />
<column name="var_desc" var="var_desc" />
<column name="eid" var="eid" notnull="notnull" />
</columns>

View file

@ -0,0 +1,12 @@
<query id="updateDocumentExtraKeyIdxOrder" action="update">
<tables>
<table name="document_extra_keys" />
</tables>
<columns>
<column name="var_idx" default="minus(1)" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
<condition operation="excess" column="var_idx" var="var_idx" filter="number" notnull="notnull" pipe="and" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="updateDocumentExtraVarIdxOrder" action="update">
<tables>
<table name="document_extra_vars" />
</tables>
<columns>
<column name="var_idx" default="minus(1)" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
<condition operation="excess" column="var_idx" var="var_idx" filter="number" notnull="notnull" pipe="and" />
</conditions>
</query>

View file

@ -22,7 +22,7 @@
<tr>
<th scope="row">{$lang->category_color}</th>
<td>
<input type="text" name="category_color" value="{htmlspecialchars($category_info->color)}" class="color-indicator inputTypeText" />
<input type="text" name="category_color" value="{htmlspecialchars($category_info->color)}" class="color-indicator" />
<p>{$lang->about_category_color}</p>
</td>
</tr>
@ -30,7 +30,7 @@
<tr>
<th scope="row">{$lang->category_description}</th>
<td >
<textarea name="category_description" id="category_description" >{htmlspecialchars($category_info->description)}</textarea>
<textarea name="category_description" id="category_description" rows="8" cols="42">{htmlspecialchars($category_info->description)}</textarea>
<a href="{getUrl('','module','module','act','dispModuleAdminLangcode','target','category_description')}" onclick="popopen(this.href);return false;" class="buttonSet buttonSetting"><span>{$lang->cmd_find_langcode}</span></a>
<p>{$lang->about_category_description}</p>
</td>

View file

@ -5,7 +5,6 @@
<!--%load_js_plugin("ui.tree")-->
<load target="js/document_category.js" usecdn="true" />
<load target="css/document.css" usecdn="true" />
<!--%load_js_plugin("ui.colorpicker")-->
<script type="text/javascript">
var category_title = "{$lang->category}";

View file

@ -1,6 +1,5 @@
<!--%import("filter/manage_checked_document.xml")-->
<load target="js/document_admin.js" usecdn="true" />
<load target="css/document.css" usecdn="true" />
<h1 class="h1">{$lang->cmd_manage_document}</h1>
<form action="./" method="get" id="fo_management">
<input type="hidden" name="module" value="document" />
@ -39,7 +38,7 @@
<tr>
<th scope="row">{$lang->cmd_send_message}</th>
<td>
<textarea name="message_content" cols="45" rows="5"></textarea>
<textarea name="message_content" rows="8" cols="42"></textarea>
</td>
</tr>
</table>

View file

@ -28,22 +28,22 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<thead>
<tr>
<th scope="col" class="title">{$lang->title}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->cmd_declare}</th>
<th scope="col">{$lang->readed_count}</th>
<th scope="col">{$lang->cmd_vote}(+/-)</th>
<th scope="col">{$lang->date}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->cmd_declare}</th>
<th scope="col" class="nowr">{$lang->readed_count}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr">{$lang->date}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</thead>
<tfoot>
<tr>
<th scope="col" class="title">{$lang->title}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->cmd_declare}</th>
<th scope="col">{$lang->readed_count}</th>
<th scope="col">{$lang->cmd_vote}(+/-)</th>
<th scope="col">{$lang->date}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->cmd_declare}</th>
<th scope="col" class="nowr">{$lang->readed_count}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr">{$lang->date}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</tfoot>
@ -51,11 +51,11 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<!--@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><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
<td>{$oDocument->get('declared_count')}</td>
<td>{$oDocument->get('readed_count')}</td>
<td>{$oDocument->get('voted_count')}/{$oDocument->get('blamed_count')}</td>
<td>{$oDocument->getRegdate("Y-m-d H:i")}</td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
<td class="nowr">{$oDocument->get('declared_count')}</td>
<td class="nowr">{$oDocument->get('readed_count')}</td>
<td class="nowr">{$oDocument->get('voted_count')}/{$oDocument->get('blamed_count')}</td>
<td class="nowr">{$oDocument->getRegdate("Y-m-d H:i")}</td>
<td><input type="checkbox" name="cart" value="{$oDocument->document_srl}" /></td>
</tr>
<!--@end-->
@ -79,8 +79,8 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<thead>
<tr>
<th scope="col" class="title">{$lang->title}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->status}</th>
</tr>
</thead>
<tbody>
@ -109,7 +109,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</div>
<p class="q"><label for="message">{$lang->message_notice}</label></p>
<p>
<textarea cols="42" rows="3" name="message_content" id="message" style="width:98%"></textarea>
<textarea rows="8" cols="42" name="message_content" id="message" style="width:98%"></textarea>
</p>
<div class="btnArea">
<span class="btn"><button type="submit" name="type" value="trash">{$lang->cmd_trash}</button></span>

View file

@ -1,5 +1,4 @@
<!--#include("header.html")-->
<load target="css/document.css" usecdn="true" />
<!--%import("filter/delete_alias.xml")-->
<form ruleset="deleteAlias" id="deleteForm" action="./" method="post">

View file

@ -37,24 +37,24 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<thead>
<tr>
<th scope="col" class="title">{$lang->title}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->readed_count}</th>
<th scope="col">{$lang->cmd_vote}(+/-)</th>
<th scope="col">{$lang->date}</th>
<th scope="col">{$lang->ipaddress}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->readed_count}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr">{$lang->date}</th>
<th scope="col" class="nowr">{$lang->ipaddress}</th>
<th scope="col" class="nowr">{$lang->status}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</thead>
<tfoot>
<tr>
<th scope="col" class="title">{$lang->title}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->readed_count}</th>
<th scope="col">{$lang->cmd_vote}(+/-)</th>
<th scope="col">{$lang->date}</th>
<th scope="col">{$lang->ipaddress}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->readed_count}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr">{$lang->date}</th>
<th scope="col" class="nowr">{$lang->ipaddress}</th>
<th scope="col" class="nowr">{$lang->status}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</tfoot>
@ -62,12 +62,12 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<!--@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><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
<td>{$oDocument->get('readed_count')}</td>
<td>{$oDocument->get('voted_count')}/{$oDocument->get('blamed_count')}</td>
<td>{$oDocument->getRegdate("Y-m-d H:i")}</td>
<td><a href="{getUrl('search_target','ipaddress','search_keyword',$oDocument->get('ipaddress'))}">{$oDocument->get('ipaddress')}</a></td>
<td>{$status_name_list[$oDocument->get('status')]}</td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
<td class="nowr">{$oDocument->get('readed_count')}</td>
<td class="nowr">{$oDocument->get('voted_count')}/{$oDocument->get('blamed_count')}</td>
<td class="nowr">{$oDocument->getRegdate("Y-m-d H:i")}</td>
<td class="nowr"><a href="{getUrl('search_target','ipaddress','search_keyword',$oDocument->get('ipaddress'))}">{$oDocument->get('ipaddress')}</a></td>
<td class="nowr">{$status_name_list[$oDocument->get('status')]}</td>
<td><input type="checkbox" name="cart" value="{$oDocument->document_srl}" /></td>
</tr>
<!--@end-->
@ -91,8 +91,8 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<thead>
<tr>
<th scope="col" class="title">{$lang->title}</th>
<th scope="col">{$lang->writer}</th>
<th scope="col">{$lang->status}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->status}</th>
</tr>
</thead>
<tbody>
@ -121,7 +121,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</div>
<p class="q"><label for="message">{$lang->message_notice}</label></p>
<p>
<textarea cols="42" rows="3" name="message_content" id="message" style="width:98%"></textarea>
<textarea rows="8" cols="42" name="message_content" id="message" style="width:98%"></textarea>
</p>
<div class="btnArea">
<span class="btn"><button type="submit" name="type" value="trash">{$lang->cmd_trash}</button></span>

View file

@ -29,7 +29,7 @@
<tr>
<th>{$lang->column_name}</th>
<td >
<input type="text" name="name" value="{$selected_var->name}" id="name" /><a href="{getUrl('','module','module','act','dispModuleAdminLangcode','target','name')}" onclick="popopen(this.href);return false;" class="buttonSet buttonSetting"><span>{$lang->cmd_find_langcode}</span></a>
<input type="text" name="name" value="{htmlspecialchars($selected_var->name)}" id="name" /><a href="{getUrl('','module','module','act','dispModuleAdminLangcode','target','name')}" onclick="popopen(this.href);return false;" class="buttonSet buttonSetting"><span>{$lang->cmd_find_langcode}</span></a>
</td>
</tr>
<tr>
@ -99,7 +99,7 @@
<td rowspan="3">
<!--@if($val->idx>1)--><a href="#" onclick="moveVar('up','{$module_srl}','{$val->idx}'); return false;" class="buttonSet buttonUp"><span>{$lang->cmd_move_up}</span></a><!--@end-->
<a cond="count($extra_keys) > $val->idx" href="#" onclick="moveVar('down','{$module_srl}','{$val->idx}');return false;" class="buttonSet buttonDown">{$lang->cmd_move_down}</a>
<a href="{getUrl('selected_var_idx',$val->idx)}" class="buttonSet buttonSetting"><span>{$lang->cmd_modify}</span></a>
<a href="{getUrl('selected_var_idx',$val->idx)}" class="buttonSet buttonSetting"><span>{$lang->cmd_modify}...</span></a>
<a href="#" onclick="return doDeleteExtraKey('{$module_srl}','{$val->idx}');" class="buttonSet buttonDelete"><span>{$lang->cmd_delete}</span></a>
</td>
</tr>

View file

@ -22,7 +22,7 @@ function doManageDocument(type) {
/* 선택된 글의 삭제 또는 이동 후 */
function completeManageDocument(ret_obj) {
if(opener) {
opener.window.location.href = opener.window.current_url.setQuery('document_srl','');
opener.window.location.href = opener.window.current_url.setQuery('document_srl', '');
}
alert(ret_obj['message']);
window.close();
@ -141,8 +141,8 @@ function completeGetDocumentList(ret_obj, response_tags)
var objDocument = document_list[x];
htmlListBuffer += '<tr>' +
'<td class="title">'+ objDocument.variables.title +'</td>' +
'<td>'+ objDocument.variables.nick_name +'</td>' +
'<td>'+ statusNameList[objDocument.variables.status] +'</td>' +
'<td class="nowr">'+ objDocument.variables.nick_name +'</td>' +
'<td class="nowr">'+ statusNameList[objDocument.variables.status] +'</td>' +
'</tr>'+
'<input type="hidden" name="cart[]" value="'+objDocument.document_srl+'" />';
}

View file

@ -1,5 +1,4 @@
<load target="./js/document_admin.js" usecdn="true" />
<load target="./css/document.css" usecdn="true" />
{$content}
<div class="btnArea">
<span class="btn"><button type="button" onclick="window.close();return false;">{$lang->cmd_close}</button></span>

View file

@ -1,5 +1,4 @@
<load target="./js/document_admin.js" usecdn="true" />
<load target="./css/document.css" usecdn="true" />
<h1 class="h1">{$oDocument->getTitleText()}</h1>
<a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->get('nick_name')}</a>
{$oDocument->getRegdate()}

View file

@ -1,4 +1,3 @@
<load target="css/default.css" usecdn="true" />
<h1 class="h1">{$lang->cmd_view_saved_document}</h1>
<!-- 목록 -->
<div class="table">

View file

@ -110,6 +110,13 @@ var slideShow = xe.createPlugin('slideShow', {
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 > iwidth - 20) {
w2 = iwidth - 20;
scale = w2 / w1;

View file

@ -3,7 +3,7 @@
* @brief Slideshow type image gallery plugin
* @author NHN (developers@xpressengine.com)
**/
(function(k){var m=xe.createPlugin("slideShow",{_holders:{},_thumbs:{},_current:{},init:function(){this._holders={};this._thumbs={};this._current={}},API_SHOW_SLIDE:function(g,e){var b=this,a=e[0],c="@"+a,d,f,j,i,h,l;d=this.cast("GET_IMAGES",[a]);if(d.length){f=k("#zone_slide_gallery_"+a);i=f.find(".slide_gallery_placeholder").css("overflow","hidden");f.find(".slide_gallery_loading_text").remove();j=f.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()});f.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,e){var b,a;b=this.cast("GET_IMAGES",[g]);b.length&&
(a=this._current["@"+g]+e,a<0?a=b.length-1:a>=b.length&&(a=0),this.cast("SET_SLIDE",[g,a]))},API_NEXT_SLIDE:function(g,e){this._showSideSlide(e[0],1)},API_PREV_SLIDE:function(g,e){this._showSideSlide(e[0],-1)},API_SET_SLIDE:function(g,e){var b=e[0],a=e[1],c,d,f;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"),f=d.$obj.prop("height"),a>c-20&&(c-=20,f=Math.floor(f*(c/a)),a=c,d.$obj.css("cursor","pointer"),d.$obj.attr("rel","xe_gallery")),d.$obj.css({width:a,height:f,margin:"0 10px"}),b.empty().append(d.$obj)}}),i=xe.getApp("Gallery")[0];i&&i.registerPlugin(new m)})(jQuery);
(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}),
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

@ -81,10 +81,10 @@
var border = parseInt($form.find('#image_border').val(), 10);
var margin = parseInt($form.find('#image_margin').val(), 10);
if($form.find('#align_normal').attr('checked') == true) align = '';
else if($form.find('#align_left').attr('checked') == true) align = 'left';
else if($form.find('#align_middle').attr('checked') == true) align = 'middle';
else if($form.find('#align_right').attr('checked') == true) align = 'right';
if($form.find('#align_normal').attr('checked') == 'checked') align = '';
else if($form.find('#align_left').attr('checked') == 'checked') align = 'left';
else if($form.find('#align_middle').attr('checked') == 'checked') align = 'middle';
else if($form.find('#align_right').attr('checked') == 'checked') align = 'right';
var width = $form.find('#width').val();
var height = $form.find('#height').val();

View file

@ -120,14 +120,7 @@
$this->setMessage('success_updated');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
global $lang;
htmlHeader();
alertScript($lang->success_updated);
reload(true);
closePopupScript();
htmlFooter();
Context::close();
exit;
$this->setRedirectUrl(Context::get('error_return_url'));
}
}

View file

@ -157,7 +157,6 @@
**/
function triggerEditorComponentCompile(&$content) {
if(Context::getResponseMethod()!='HTML') return new Object();
if(Mobile::isFromMobilePhone()) return new Object();
$module_info = Context::get('module_info');
$module_srl = $module_info->module_srl;
@ -183,7 +182,7 @@
$buff = '<style type="text/css"> .xe_content { ';
if($content_font) $buff .= 'font-family:'.$content_font.';';
if($content_font_size) $buff .= 'font-size:'.$content_font_size.';';
$buff .= ' }; </style>';
$buff .= ' }</style>';
Context::addHtmlHeader($buff);
}
}

View file

@ -195,6 +195,10 @@
* Editor's default options
**/
// Option setting to allow file upload
if($upload_target_srl)
{
$option->editor_sequence = $upload_target_srl;
}
if(!$option->allow_fileupload) $allow_fileupload = false;
else $allow_fileupload = true;
// content_style setting
@ -248,8 +252,8 @@
**/
if($option->editor_sequence) $editor_sequence = $option->editor_sequence;
else {
if(!$GLOBALS['_editor_sequence_']) $GLOBALS['_editor_sequence_'] = 1;
$editor_sequence = $GLOBALS['_editor_sequence_'] ++;
if(!$_SESSION['_editor_sequence_']) $_SESSION['_editor_sequence_'] = 1;
$editor_sequence = $_SESSION['_editor_sequence_'] ++;
}
/**

View file

@ -130,7 +130,6 @@
$oModuleModel = &getModel('module');
$skin_info = $oModuleModel->loadSkinInfo($this->module_path,$skin);
$colorset = $skin_info->colorset;
Context::set('colorset', $colorset);
}

View file

@ -1449,14 +1449,14 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành
<value xml:lang="vi"><![CDATA[Phím nóng]]></value>
</item>
<item name="lineheight">
<value xml:lang="ko"><![CDATA[줄 간격]]></value>
<value xml:lang="ko"><![CDATA[줄간격]]></value>
<value xml:lang="en"><![CDATA[Line Height]]></value>
<value xml:lang="jp"><![CDATA[行間]]></value>
<value xml:lang="zh-CN"><![CDATA[行间距]]></value>
<value xml:lang="zh-TW"><![CDATA[行距]]></value>
<value xml:lang="fr"><![CDATA[줄간격]]></value>
<value xml:lang="fr"><![CDATA[Line Height]]></value>
<value xml:lang="ru"><![CDATA[Высота строки]]></value>
<value xml:lang="es"><![CDATA[줄간격]]></value>
<value xml:lang="es"><![CDATA[Line Height]]></value>
<value xml:lang="tr"><![CDATA[Satır Yüksekliği]]></value>
<value xml:lang="vi"><![CDATA[Chiều cao dòng]]></value>
</item>
@ -1908,6 +1908,11 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành
<value xml:lang="tr"><![CDATA[Düzen Formunun Boyutunu Ayarla]]></value>
<value xml:lang="vi"><![CDATA[Đặt kích thước mẫu]]></value>
</item>
<item name="edit_height_auto">
<value xml:lang="ko"><![CDATA[입력창 크기 자동조절]]></value>
<value xml:lang="en"><![CDATA[Auto-resize editor]]></value>
<value xml:lang="jp"><![CDATA[入力ボックスサイズの自動調節]]></value>
</item>
<item name="merge_cells">
<value xml:lang="ko"><![CDATA[셀 병합]]></value>
<value xml:lang="en"><![CDATA[Merge Table Cells]]></value>

View file

@ -89,9 +89,9 @@
.wArea .buttonArea .info{ display:inline; padding:0 0 0 15px; color:#777;}
.wArea .inputTitle{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:14px; margin-bottom:10px;}
.wArea .inputLink{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:11px; margin-bottom:10px;}
.wArea .inputText{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:12px; margin-bottom:10px;}
.wArea .iText{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:12px; margin-bottom:10px;}
.wArea .inputFile{ width:100%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:29px; font-size:12px; margin-bottom:10px;}
.wArea .inputTextarea{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:10px 0 0 10px; height:150px; font-size:12px; line-height:1.5; margin-bottom:10px;}
.wArea .iTextArea{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:10px 0 0 10px; height:150px; font-size:12px; line-height:1.5; margin-bottom:10px;}
.wArea .inputRadio{ width:13px; height:13px; vertical-align:middle;}
.wArea .hr{ border-top:1px solid #e6e6e6; border-bottom:1px solid #fff; font-size:0; line-height:0; overflow:hidden; height:0; margin:15px -20px;}

View file

@ -3,7 +3,7 @@
<div class="wArea fold">
<fieldset>
<legend>{$lang->edit->fold}</legend>
<input name="" type="text" class="inputText" value="" title="{$lang->edit->fold_default}" />
<input name="" type="text" class="iText" value="" title="{$lang->edit->fold_default}" />
<div class="buttonArea">
<span class="buttonGray medium strong"><button type="button"><img src="iconCheckSmall.gif" width="12" height="8" alt="" class="icon" />{$lang->cmd_confirm}</button></span>
<span class="buttonGray medium"><button type="button"><img src="buttonCloseLayerX.gif" width="7" height="7" alt="" class="icon" />{$lang->cmd_cancel}</button></span>

View file

@ -282,9 +282,9 @@
<!-- class="wArea link" | class="wArea link open" -->
<fieldset>
<legend>{$lang->edit->link}</legend>
<input name="" type="text" class="inputText" value="" title="{$lang->edit->insert_site_name}" />
<input name="" type="text" class="iText" value="" title="{$lang->edit->insert_site_name}" />
<input name="" type="text" class="inputLink" value="" title="http://" />
<input name="" type="text" class="inputText" value="" title="{$lang->edit->insert_explain}" />
<input name="" type="text" class="iText" value="" title="{$lang->edit->insert_explain}" />
<div class="buttonArea">
<span class="buttonGray medium strong"><button type="button" title="Ctrl+Enter"><img src="img/iconCheckSmall.gif" width="12" height="8" alt="" class="icon" />{$lang->cmd_confirm}</button></span>
<span class="buttonGray medium"><button type="button" title="ESC"><img src="img/buttonCloseLayerX.gif" width="7" height="7" alt="" class="icon" />{$lang->cmd_cancel}</button></span>
@ -327,8 +327,8 @@
<!-- class="wArea blockquote" | class="wArea blockquote open" -->
<fieldset>
<legend>{$lang->edit->blockquote}</legend>
<textarea name="" cols="50" rows="5" class="inputTextarea" title="{$lang->edit->insert_blockquote}"></textarea>
<input name="" type="text" class="inputText" value="" title="{$lang->edit->insert_cite}" />
<textarea name="" rows="8" cols="42" class="iTextArea" title="{$lang->edit->insert_blockquote}"></textarea>
<input name="" type="text" class="iText" value="" title="{$lang->edit->insert_cite}" />
<div class="buttonArea">
<span class="buttonGray medium strong"><button type="button" title="Ctrl+Enter"><img src="img/iconCheckSmall.gif" width="12" height="8" alt="" class="icon" />{$lang->cmd_confirm}</button></span>
<span class="buttonGray medium"><button type="button" title="ESC"><img src="img/buttonCloseLayerX.gif" width="7" height="7" alt="" class="icon" />{$lang->cmd_cancel}</button></span>
@ -368,7 +368,7 @@
</dl>
<p class="resizeError">{$lang->edit->resize_error}</p>
</div>
<input name="" type="text" class="inputText desc" value="" title="{$lang->edit->insert_image_explain}" />
<input name="" type="text" class="iText desc" value="" title="{$lang->edit->insert_image_explain}" />
<div class="buttonArea">
<span class="buttonGray medium strong"><button type="button" title="Ctrl+Enter"><img src="img/iconCheckSmall.gif" width="12" height="8" alt="" class="icon" />{$lang->cmd_confirm}</button></span>
<span class="buttonGray medium"><button type="button" title="ESC"><img src="img/buttonCloseLayerX.gif" width="7" height="7" alt="" class="icon" />{$lang->cmd_cancel}</button></span>
@ -384,9 +384,9 @@
<!-- class="wArea mov" | class="wArea mov open" -->
<fieldset>
<legend>{$lang->edit->mov}</legend>
<textarea name="" cols="50" rows="5" class="inputTextarea" title="{$lang->edit->insert_mov}"></textarea>
<textarea name="" cols="50" rows="5" class="inputTextarea" title="{$lang->edit->insert_mov_explain}"></textarea>
<input name="" type="text" class="inputText" value="" title="{$lang->edit->insert_cite}" />
<textarea name="" rows="8" cols="42" class="iTextArea" title="{$lang->edit->insert_mov}"></textarea>
<textarea name="" rows="8" cols="42" class="iTextArea" title="{$lang->edit->insert_mov_explain}"></textarea>
<input name="" type="text" class="iText" value="" title="{$lang->edit->insert_cite}" />
<div class="buttonArea">
<span class="buttonGray medium strong"><button type="button" title="Ctrl+Enter"><img src="img/iconCheckSmall.gif" width="12" height="8" alt="" class="icon" />{$lang->cmd_confirm}</button></span>
<span class="buttonGray medium"><button type="button" title="ESC"><img src="img/buttonCloseLayerX.gif" width="7" height="7" alt="" class="icon" />{$lang->cmd_cancel}</button></span>
@ -431,8 +431,8 @@
</dl>
<p class="summary">{$lang->edit->file_total} <em class="filesize">{total_filesize}</em></p>
<div class="hr"></div>
<input name="" type="text" class="inputText" value="" title="{$lang->edit->insert_file_explain}" />
<input name="" type="text" class="inputText" value="" title="{$lang->edit->insert_cite}" />
<input name="" type="text" class="iText" value="" title="{$lang->edit->insert_file_explain}" />
<input name="" type="text" class="iText" value="" title="{$lang->edit->insert_cite}" />
<div class="buttonArea">
<span class="buttonGray medium strong"><button type="button" title="Ctrl+Enter"><img src="img/iconCheckSmall.gif" width="12" height="8" alt="" class="icon" />{$lang->cmd_confirm}</button></span>
<span class="buttonGray medium"><button type="button" title="ESC"><img src="img/buttonCloseLayerX.gif" width="7" height="7" alt="" class="icon" />{$lang->cmd_cancel}</button></span>

View file

@ -17,7 +17,7 @@
.xpress-editor li{list-style:none}
/* Layout Selector */
.xpress-editor{position:relative;background:transparent}
.xpress-editor #smart_content{position:relative;clear:both;margin:0 0 10px 0;border:1px solid #c2c2c2;*zoom:1;z-index:5;background:#fff}
.xpress-editor #smart_content{position:relative;clear:both;margin:0 0 10px 0;border:1px solid #c2c2c2;*zoom:1;z-index:1;background:#fff}
.xpress-editor.black #smart_content {background:transparent}
.xpress-editor #smart_footer{position:relative;text-align:center;padding:10px 0}
/* Footer */
@ -28,7 +28,7 @@
.xpress-editor #smart_footer input{margin:0}
.xpress-editor #smart_footer input.reset{width:67px;height:25px;border:0;background:url(../img/btn_cancel.gif) no-repeat;cursor:pointer;margin-left:5px}
/* Content > Input Area */
.xpress-editor a.skip{position:relative;display:block;top:0;right:0;width:0;height:0;overflow:hidden;clear:both;zoom:1}
.xpress-editor a.skip{position:absolute;display:block;top:0;right:0;width:1px;height:1px;overflow:hidden;clear:both;zoom:1}
.xpress-editor a.skip:hover,
.xpress-editor a.skip:active,
.xpress-editor a.skip:focus{position:relative;display:block;padding:5px;right:0;z-index:60;width:auto;height:auto;text-align:right;white-space:nowrap;color:#000;text-decoration:none;letter-spacing:-1px;_zoom:1}
@ -37,8 +37,12 @@
.xpress-editor .input_area textarea{display:block;width:100% !important;position:relative;height:100%;border:0 !important;padding:0 !important;overflow:auto}
.xpress-editor .input_area textarea{*margin:0 -10px;_margin-bottom:-2px}
.xpress-editor .input_area textarea.blind{display:none}
.xpress-editor .input_control{position:relative;display:block;width:100%;clear:both;text-align:center;background:#fbfbfb url(../img/btn_expand.gif) no-repeat center center;cursor:n-resize}
.xpress-editor .input_control span{display:block;height:10px;visibility:hidden;overflow:visible;font-size:0;line-height:200%;white-space:nowrap;color:#fff}
.xpress-editor .input_control{position:relative;display:block;width:100%;clear:both;text-align:center;border-top:1px solid #ccc;background:#f8f8f8 url(../img/btn_expand.gif) no-repeat center center;cursor:n-resize}
.xpress-editor .input_control span{display:block;height:21px;visibility:hidden;overflow:visible;font-size:0;line-height:200%;white-space:nowrap;color:#fff}
.xpress-editor .input_auto{position:relative;z-index:2;display:inline-block;margin:-20px 0 0 0;padding:3px 0 0 8px;zoom:1}
.xpress-editor .input_auto.line{height:17px;margin:0;display:block;border-top:1px solid #ccc;padding:4px 0 0 8px;background:#f8f8f8}
.xpress-editor .input_auto input{margin:0;padding:0;width:13px;height:13px;vertical-align:middle;margin:0 4px 0 0}
.xpress-editor .input_auto label{font-size:11px;vertical-align:middle;line-height:13px;color:#666}
.xpress-editor.black .input_control {background:#111 url(../img/btn_expand.black.gif) no-repeat center center}
.xpress-editor.black .input_control span{border-top:1px solid #333; color:#000}
.xpress-editor .tool{position:relative;overflow:visible;padding:5px 10px 6px 10px;*padding:5px 10px 8px 10px;z-index:40;clear:both;background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom;border:0;*zoom:1}
@ -56,7 +60,7 @@
.xpress-editor .tool ul.extra3{float:left;width:auto;z-index:1;margin-right:1px}
.xpress-editor .tool ul.extra3 li{margin-right:4px}
.xpress-editor .tool li{position:relative;float:left;margin:0 !important;padding:0 !important;border:0 !important}
.xpress-editor .tool li button{width:21px;height:21px;background:url(../img/btn_set.gif) no-repeat 0 0;vertical-align:top}
.xpress-editor .tool li button{width:21px;height:21px;background:url(../img/btn_set.gif) no-repeat 0 0;vertical-align:top;float:left}
.xpress-editor.black .tool li button{width:21px;height:21px;background:url(../img/btn_set.black.gif) no-repeat 0 0;vertical-align:top}
.xpress-editor .tool li button span{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;visibility:hidden}
.xpress-editor .tool li.extensions span.exButton,
@ -77,7 +81,8 @@
.xpress-editor .tool li.html span button,
.xpress-editor .tool li.preview span button{left:2px;height:21px;background-position:right top;font:11px/21px Tahoma, Sans-serif;padding:0 4px;*overflow:visible;*line-height:20px}
.xpress-editor .tool ul.type li{float:none;display:inline;*top:1px}
.xpress-editor .tool ul.type li select{height:21px;width:62px}
.xpress-editor .tool ul.type li select{height:21px;width:64px;white-space:nowrap}
.xpress-editor .tool ul.type li option{white-space:nowrap}
.xpress-editor.black .tool ul.type li select{color:#fff;background-color:#000}
/* Content > Tool > Button Default */
.xpress-editor .tool li.undo button{width:22px;background-position:0 0}
@ -214,7 +219,7 @@
.xpress-editor .tool .layer{display:none;position:absolute;left:0;top:20px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f}
.xpress-editor .tool .layer li{float:none;left:0}
.xpress-editor .tool .layer button,
.xpress-editor.black .tool .layer button{margin:0 !important;width:auto;height:auto;background:none}
.xpress-editor.black .tool .layer button{margin:0 !important;width:auto;height:auto;background:none;float:none}
.xpress-editor .tool .layer button span{position:absolute;width:0;height:0;font-size:0;line-height:0;overflow:hidden;visibility:hidden}
.xpress-editor .tool .btn_area{position:relative;clear:both;text-align:center !important;padding:7px 0 12px 0;width:100%;white-space:nowrap;*zoom:1}
.xpress-editor .tool .btn_area *{vertical-align:top}
@ -225,27 +230,27 @@
.xpress-editor .tool .layer .btn_area button.cancel{width:38px;height:21px;background:url(../img/btn_layer_cancel.gif) no-repeat}
.xpress-editor .tool li.fcolor .layer{width:218px !important;height:auto !important;background-image:none !important;overflow:hidden}
.xpress-editor .tool .layer .palette{width:210px;position:relative;left:7px;padding:8px 0 7px 0;margin:0}
.xpress-editor .tool .layer .palette li{float:left;margin:0 1px 1px 0;font-size:0;line-height:0}
.xpress-editor .tool .layer .palette li{float:left;margin:0 1px 1px 0 !important;font-size:0;line-height:0}
.xpress-editor .tool .layer .palette button{position:relative;overflow:hidden;width:11px !important;height:11px !important}
.xpress-editor .tool li.bcolor .layer {width:218px;overflow:hidden}
.xpress-editor .tool .layer .background{width:210px;position:relative;left:7px;margin:0 0 -2px 0;padding:8px 0 0 0;*padding-bottom:8px;_padding-bottom:4px}
.xpress-editor .tool .layer .background li{float:left;margin:0 5px 2px 0}
.xpress-editor .tool .layer .background li{float:left;margin:0 5px 2px 0 !important}
.xpress-editor .tool .layer .background button{position:relative;overflow:hidden;width:65px;height:19px;text-align:left;padding:4px}
.xpress-editor .tool .layer .background button span{position:relative;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto}
.xpress-editor .tool li.style .layer{padding:4px 2px;_overflow:hidden;filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2)}
.xpress-editor .tool li.style .layer li{position:relative;background:#fbfbfb}
.xpress-editor .tool li.style .layer li button{display:block;width:134px;position:relative}
.xpress-editor .tool li.style .layer li button span{display:block;width:130px;text-align:left;letter-spacing:normal}
.xpress-editor .tool li.style .layer li.h3 button span{padding:3px 0 1px 4px;height:15px;_height /**/:19px;font-size:16px;font-weight:bold}
.xpress-editor .tool li.style .layer li.h4 button span{padding:3px 0 2px 4px;height:13px;_height /**/:18px;font-size:14px;font-weight:bold}
.xpress-editor .tool li.style .layer li.h5 button span{padding:3px 0 1px 4px;height:11px;_height /**/:15px;font-size:12px;font-weight:bold}
.xpress-editor .tool li.style .layer li.h6 button span{padding:3px 0 1px 4px;height:11px;_height /**/:15px;font-size:12px}
.xpress-editor .tool li.style .layer li.p button span{padding:3px 0 1px 4px;height:11px;_height /**/:15px;font-size:12px;color:#5d5d5d}
.xpress-editor .tool li.style .layer li.h3 button span{padding:3px 0 1px 4px;height:15px;font-size:16px;font-weight:bold}
.xpress-editor .tool li.style .layer li.h4 button span{padding:3px 0 2px 4px;height:13px;font-size:14px;font-weight:bold}
.xpress-editor .tool li.style .layer li.h5 button span{padding:3px 0 1px 4px;height:11px;font-size:12px;font-weight:bold}
.xpress-editor .tool li.style .layer li.h6 button span{padding:3px 0 1px 4px;height:11px;font-size:12px}
.xpress-editor .tool li.style .layer li.p button span{padding:3px 0 1px 4px;height:11px;font-size:12px;color:#5d5d5d}
.xpress-editor .tool li.style .layer li button.hover{background:#c1f471;*height:1%}
.xpress-editor .tool li.blockquote .layer{padding:6px 5px 6px 7px;left:0;width:288px}
.xpress-editor .tool li.blockquote .layer{padding:6px 0 6px 7px;left:0;width:294px}
.xpress-editor .tool li.blockquote .layer ul{*zoom:1;margin:0}
.xpress-editor .tool li.blockquote .layer ul:after{content:"";display:block;clear:both}
.xpress-editor .tool li.blockquote .layer li{position:relative;float:left;overflow:hidden;width:32px;height:34px;margin:0 2px 0 0;border:1px solid #cdcecc;background-image:url(../img/btn_qmark.gif);background-repeat:no-repeat}
.xpress-editor .tool li.blockquote .layer li{position:relative;float:left;overflow:hidden;width:32px;height:34px;margin:0 2px 0 0 !important;border:1px solid #cdcecc !important;background-image:url(../img/btn_qmark.gif);background-repeat:no-repeat}
.xpress-editor .tool li.blockquote .layer li.q1{background-position:0 0}
.xpress-editor .tool li.blockquote .layer li.q2{background-position:-32px 0}
.xpress-editor .tool li.blockquote .layer li.q3{background-position:-64px 0}
@ -302,14 +307,14 @@
.xpress-editor .tool li.character .layer ul{margin:0}
.xpress-editor .tool li.character .layer h3{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}
.xpress-editor .tool li.character .layer .nav{position:absolute;top:11px;left:-1px;overflow:hidden;white-space:nowrap}
.xpress-editor .tool li.character .layer .nav li{display:inline;margin:0 -4px 0 0;padding:0 8px;background:url(../img/vr_layer_character.gif) no-repeat 0 0}
.xpress-editor .tool li.character .layer .nav li{display:inline;margin:0 -4px 0 0;padding:0 8px !important;background:url(../img/vr_layer_character.gif) no-repeat 0 0}
.xpress-editor .tool li.character .layer .nav li a{color:#444;text-decoration:none;letter-spacing:-1px}
.xpress-editor .tool li.character .layer .nav li a:hover,
.xpress-editor .tool li.character .layer .nav li a:active,
.xpress-editor .tool li.character .layer .nav li a:focus{text-decoration:underline}
.xpress-editor .tool li.character .layer .nav li a.on{font-weight:bold;color:#004790;display:inline}
.xpress-editor .tool li.character .layer .list{position:absolute;left:7px;top:30px;width:421px;height:172px;background:url(../img/bx_character.gif) no-repeat}
.xpress-editor .tool li.character .layer .list li{position:relative;top:1px;left:1px;float:left;width:20px;height:18px;margin:0 1px 1px 0}
.xpress-editor .tool li.character .layer .list li{position:relative;top:1px;left:1px;float:left;width:20px;height:18px;margin:0 1px 1px 0 !important}
.xpress-editor .tool li.character .layer .list li button{width:20px;height:18px}
.xpress-editor .tool li.character .layer .list li button.hover{border:2px solid #27c11a}
.xpress-editor .tool li.character .layer .list li button span{overflow:visible;font-size:12px;width:auto;height:auto;position:relative;visibility:visible;line-height:normal}

File diff suppressed because one or more lines are too long

View file

@ -16,7 +16,7 @@
<div class="xeTextEditor {$editor_class}">
<input type="hidden" id="htm_{$editor_sequence}" value="<!--@if($colorset == "white_text_nohtml" || $colorset == "black_text_nohtml")-->n<!--@end--><!--@if($colorset == "white_texteditor" || $colorset == "white_texteditor")-->br<!--@end-->" />
<textarea id="editor_{$editor_sequence}" style="height:{$editor_height}px;" cols="50" rows="5" class="inputTextarea"></textarea>
<textarea id="editor_{$editor_sequence}" style="height:{$editor_height}px;" rows="8" cols="42" class="iTextArea"></textarea>
</div>
<script type="text/javascript">//<![CDATA[
editorStartTextarea({$editor_sequence}, "{$editor_content_key_name}", "{$editor_primary_key_name}");
@ -422,8 +422,6 @@
<li class="html"><span><button class="xpress_xeditor_mode_toggle_button" type="button" title="{$lang->edit->html_editor}">{$lang->edit->html_editor}</button></span></li>
<!--// li class="preview"><span><button type="button" class="xpress_xeditor_preview_button" title="{$lang->cmd_preview}">{$lang->cmd_preview}</button></span></li-->
</ul>
</div>
<!--@else-->
<div class="tool off disable"></div>
@ -431,7 +429,7 @@
<!-- 에디터 출력 -->
<div id="xe-editor-container-{$editor_sequence}" class="input_area xpress_xeditor_editing_area_container">
<textarea id="xpress-editor-{$editor_sequence}" cols="10" rows="10"></textarea>
<textarea id="xpress-editor-{$editor_sequence}" rows="8" cols="42"></textarea>
</div>
<!--@if($enable_autosave)-->
@ -440,7 +438,7 @@
<!-- /입력 -->
<button type="button" class="input_control xpress_xeditor_editingArea_verticalResizer" title="{$lang->edit->edit_height_control}"><span>{$lang->edit->edit_height_control}</span></button>
<span class="input_auto xpress_xeditor_ui_editorresize"><input type="checkbox" id="editorresize"><label for="editorresize">{$lang->edit->edit_height_auto}</label></span>
</div>
<div id="fileUploader_{$editor_sequence}" class="fileUploader" cond="$allow_fileupload"><!--File upload zone-->

View file

@ -1370,16 +1370,17 @@ xe.XpressRange = $.Class({
oParentNode = xe.DOMFix.parentNode(oNode);
if(oParentNode.tagName == "SPAN"){
var parentText = $(oParentNode).html();
// check if the SPAN element is fully contained
// do quick checks before trying indexOf() because indexOf() function is very slow
oTmpNode = this._getVeryFirstRealChild(oParentNode);
if(oTmpNode == oNode) iSIdx = 1;
else iSIdx = arAllBottmNodes.indexOf(oTmpNode);
else iSIdx = parentText.indexOf(oTmpNode);
if(iSIdx != -1){
oTmpNode = this._getVeryLastRealChild(oParentNode);
if(oTmpNode == oNode) iEIdx = 1;
else iEIdx = arAllBottmNodes.indexOf(oTmpNode);
else iEIdx = parentText.indexOf(oTmpNode);
}
if(iSIdx != -1 && iEIdx != -1){
@ -5047,6 +5048,44 @@ xe.XE_EditingModeToggler = $.Class({
}
}
});
xe.XE_Editorresize = $.Class({
name : "XE_Editorresize",
$init : function(elAppContainer, oWYSIWYGIFrame){
this.inputArea = $('.xpress_xeditor_editing_area_container', elAppContainer).get(0);
this.oVerticalResizer = $('.xpress_xeditor_editingArea_verticalResizer', elAppContainer).get(0);
this.oCheckBox = $('#editorresize', elAppContainer).get(0);
this.oIframe = oWYSIWYGIFrame;
var self = this;
$(oWYSIWYGIFrame).load(function(){
self.oIframeBody = $(oWYSIWYGIFrame).contents().find('body');
});
},
$ON_MSG_APP_READY : function(){
this.oApp.registerBrowserEvent(this.oCheckBox, 'change', 'XE_TOGGLE_EDITOR_RESIZE');
},
$ON_XE_TOGGLE_EDITOR_RESIZE : function(){
if(this.oCheckBox.checked == true){
if(this._prevHeight == undefined)
this._prevHeight = this.inputArea.style.height;
this.oVerticalResizer.style.display = 'none';
this.oApp.registerBrowserEvent(this.oIframeBody, 'keydown', 'XE_EDITOR_RESIZE');
this.inputArea.style.height = this.oIframe.style.height = this.oIframeBody[0].scrollHeight + 'px';
}else{
$(this.oIframeBody).unbind('keydown');
this.oVerticalResizer.style.display = 'block';
this.inputArea.style.height = this._prevHeight;
this.oIframe.style.height = this._prevHeight;
}
},
$ON_XE_EDITOR_RESIZE : function(){
this.inputArea.style.height = this.oIframe.style.height = this.oIframeBody[0].scrollHeight + 'px';
}
});
//}
/**
* @fileOverview This file contains a message mapping(Korean), which is used to map the message code to the actual message
@ -5105,7 +5144,6 @@ xe.XE_XHTMLFormatter = $.Class({
TO_IR : function(sContent) {
var stack = [];
// remove xeHandled attrs
/*
sContent = sContent.replace(/xeHandled="YES"/ig,'');
@ -5172,19 +5210,26 @@ xe.XE_XHTMLFormatter = $.Class({
return '<'+tag+' '+$.trim(attrs)+'>';
} else {
stack[stack.length] = {tag:tag, state:state};
stack.push({tag:tag, state:state});
}
} else {
var tags = [], t = '';
// remove unnecessary closing tag
if (!stack.length) return '';
if (!stack.length){
return '';
}
do {
t = stack.pop();
if (t.tag != tag) continue;
if (t.state != 'deleted') tags.push('</'+t.tag+'>');
} while(stack.length && t.tag != tag);
t = stack[stack.length-1];
if (t.tag != tag){
continue;
}
if (t.state != 'deleted'){
tags.push('</'+t.tag+'>');
}
stack.pop();
} while(stack.length && t.tag == tag);
return tags.join('');
}
@ -5199,8 +5244,13 @@ xe.XE_XHTMLFormatter = $.Class({
t = stack.pop();
if (t.state != 'deleted') sContent += '</'+t.tag+'>';
} while(stack.length);
}
// add new line after </p>
regex = /<\/p>[ \t]*(\n)?/ig;
sContent = sContent.replace(regex, "</p>\n");
return sContent;
},
@ -5248,7 +5298,7 @@ xe.XE_Extension = $.Class({
$(doc).find('img,div[editor_component]').each(function(){
var obj = $(this);
if(this.nodeName == 'IMG' && !obj.attr('editor_component')) {
if(this.nodeName == 'IMG' && !obj.attr('editor_component') && !obj.attr('widget')) {
obj.attr('editor_component','image_link');
}
if(this.last_doc != doc) {
@ -5763,4 +5813,15 @@ xe.XE_Table = $.Class({
}
}).extend(xe.XE_Table);
// Auto Resize Checkbox Toggle Class
$('.input_auto>input').change(function(){
setTimeout(function(){
if($('.input_control').is(':hidden')){
$('.input_auto').addClass('line');
} else {
$('.input_auto').removeClass('line');
}
},1);
});
})(jQuery);

View file

@ -11,8 +11,8 @@ function editorStart_xe(editor_sequence, primary_key, content_key, editor_height
var target_src = request_uri+'modules/editor/styles/'+content_style+'/editor.html';
var textarea = jQuery("#xpress-editor-"+editor_sequence);
var iframe = jQuery('<iframe id="editor_iframe_'+editor_sequence+'" allowTransparency="true" frameborder="0" src="'+target_src+'" scrolling="yes" style="width:100%;height:'+editor_height+'px">');
var htmlsrc = jQuery('<textarea rows="10" cols="20" class="input_syntax '+colorset+'" style="display:none"></textarea>');
var iframe = jQuery('<iframe id="editor_iframe_'+editor_sequence+'" allowTransparency="true" frameborder="0" src="'+target_src+'" scrolling="yes" style="width:100%;height:'+editor_height+'px"></iframe>');
var htmlsrc = jQuery('<textarea rows="8" cols="42" class="input_syntax '+colorset+'" style="display:none"></textarea>');
var form = textarea.get(0).form;
form.setAttribute('editor_sequence', editor_sequence);
textarea.css("display","none");
@ -63,7 +63,7 @@ function editorStart_xe(editor_sequence, primary_key, content_key, editor_height
oEditor.registerPlugin(new xe.XE_PreservTemplate(jQuery("#xpress-editor-"+editor_sequence).val()));
oEditor.registerPlugin(new xe.StringConverterManager());
oEditor.registerPlugin(new xe.XE_EditingAreaManager("WYSIWYG", oIRTextarea, {nHeight:parseInt(editor_height), nMinHeight:205}, null, elAppContainer));
oEditor.registerPlugin(new xe.XE_EditingAreaManager("WYSIWYG", oIRTextarea, {nHeight:parseInt(editor_height), nMinHeight:100}, null, elAppContainer));
oEditor.registerPlugin(new xe.XE_EditingArea_HTMLSrc(oHTMLSrcTextarea));
oEditor.registerPlugin(new xe.XE_EditingAreaVerticalResizer(elAppContainer));
oEditor.registerPlugin(new xe.Utils());
@ -101,7 +101,9 @@ function editorStart_xe(editor_sequence, primary_key, content_key, editor_height
oEditor.registerPlugin(new xe.XE_EditingModeToggler(elAppContainer));
}
if(jQuery("#editorresize").length) {
oEditor.registerPlugin(new xe.XE_Editorresize(elAppContainer, oWYSIWYGIFrame));
}
//oEditor.registerPlugin(new xe.XE_Preview(elAppContainer));
if (!jQuery.browser.msie && !jQuery.browser.opera) {
@ -119,6 +121,7 @@ function editorStart_xe(editor_sequence, primary_key, content_key, editor_height
if (doc.location == 'about:blank') throw 'blank';
// get innerHTML
doc.body.innerHTML = doc.body.innerHTML.trim();
str = doc.body.innerHTML;
// register plugin

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