Merge branch 'develop' into pr/member-phone-number

This commit is contained in:
Kijin Sung 2019-07-27 23:47:24 +09:00
commit c09d2a773d
2041 changed files with 23045 additions and 18189 deletions

View file

@ -1,5 +1,5 @@
<div class="x_page-header">
<h1>{$lang->installed_addons} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_advanced_installed_addon" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->installed_addons}</h1>
</div>
<p>{$lang->about_installed_addon}</p>
<form action="./" method="post">
@ -13,7 +13,7 @@
</div>
<table class="x_table x_table-striped x_table-hover dsTg">
<caption>
<strong>All({$addon_count})</strong>
<strong>{lang('all')} ({$addon_count})</strong>
<div class="x_pull-right x_btn-group">
<button type="button" class="x_btn x_active __simple">{$lang->simple_view}</button>
<button type="button" class="x_btn __detail">{$lang->detail_view}</button>
@ -23,8 +23,8 @@
<tr>
<th class="title">{$lang->addon_name}</th>
<th class="nowr">{$lang->version}</th>
<th class="nowr">{$lang->author}</th>
<th class="nowr">{$lang->installed_path}</th>
<th class="nowr rx_detail_marks">{$lang->author}</th>
<th class="nowr rx_detail_marks">{$lang->installed_path}</th>
<th class="nowr">{$lang->cmd_setup}</th>
<th class="nowr">PC</th>
<th class="nowr">Mobile</th>
@ -41,18 +41,18 @@
</p>
</td>
<td><span style="color:#aaa"|cond="$addon->isBlacklisted">{$addon->version}</span></td>
<td class="nowr">
<td class="nowr rx_detail_marks">
<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><span style="color:#aaa"|cond="$addon->isBlacklisted">{$addon->path}</span></td>
<td class="rx_detail_marks"><span style="color:#aaa"|cond="$addon->isBlacklisted">{$addon->path}</span></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, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" checked="checked"|cond="$addon->activated && !$addon->isBlacklisted" disabled="disabled"|cond="$addon->isBlacklisted" /></td>
<td><input type="checkbox" name="mobile_on[]" title="Mobile" value="{htmlspecialchars($addon->addon_name, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" checked="checked"|cond="$addon->mactivated && !$addon->isBlacklisted" disabled="disabled"|cond="$addon->isBlacklisted" /></td>
<td><input type="checkbox" name="pc_on[]" title="PC" value="{escape($addon->addon_name, false)}" checked="checked"|cond="$addon->activated && !$addon->isBlacklisted" disabled="disabled"|cond="$addon->isBlacklisted" /></td>
<td><input type="checkbox" name="mobile_on[]" title="Mobile" value="{escape($addon->addon_name, false)}" checked="checked"|cond="$addon->mactivated && !$addon->isBlacklisted" disabled="disabled"|cond="$addon->isBlacklisted" /></td>
<td><a cond="$addon->remove_url" href="{$addon->remove_url}&amp;return_url={urlencode(getRequestUriByServerEnviroment())}">{$lang->cmd_delete}</a></td>
</tr>
</tbody>

View file

@ -55,8 +55,8 @@
<div class="x_control-group">
<label class="x_control-label" for="{$var->name}"|cond="$var->type != 'textarea'" for="lang_{$var->name}"|cond="$var->type == 'textarea'">{$var->title}</label>
<div class="x_controls">
<input cond="$var->type == 'text'" type="text" name="{$var->name}" id="{$var->name}" value="{htmlspecialchars($var->value, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}">
<textarea cond="$var->type == 'textarea'" name="{$var->name}" id="{$var->name}" class="lang_code" rows="8" cols="42">{htmlspecialchars($var->value, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}</textarea>
<input cond="$var->type == 'text'" type="text" name="{$var->name}" id="{$var->name}" value="{escape($var->value)}">
<textarea cond="$var->type == 'textarea'" name="{$var->name}" id="{$var->name}" class="lang_code" rows="8" cols="42">{escape($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

@ -18,11 +18,9 @@ class adminAdminController extends admin
function init()
{
// forbit access if the user is not an administrator
$oMemberModel = getModel('member');
$logged_info = $oMemberModel->getLoggedInfo();
if($logged_info->is_admin != 'Y')
if (!$this->user->isAdmin())
{
return $this->stop("admin.msg_is_not_administrator");
throw new Rhymix\Framework\Exceptions\NotPermitted('admin.msg_is_not_administrator');
}
}
@ -35,7 +33,7 @@ class adminAdminController extends admin
$menuSrl = Context::get('menu_srl');
if(!$menuSrl)
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oMenuAdminController = getAdminController('menu');
@ -382,57 +380,15 @@ class adminAdminController extends admin
*/
function procAdminUpdateConfig()
{
$adminTitle = Context::get('adminTitle');
$file = $_FILES['adminLogo'];
$oModuleModel = getModel('module');
$oAdminConfig = $oModuleModel->getModuleConfig('admin');
if(!is_object($oAdminConfig))
{
$oAdminConfig = new stdClass();
}
if($file['tmp_name'])
{
$target_path = 'files/attach/images/admin/';
FileHandler::makeDir($target_path);
// Get file information
list($width, $height, $type, $attrs) = @getimagesize($file['tmp_name']);
if($type == 3)
{
$ext = 'png';
}
elseif($type == 2)
{
$ext = 'jpg';
}
else
{
$ext = 'gif';
}
$target_filename = sprintf('%s%s.%s.%s', $target_path, 'adminLogo', date('YmdHis'), $ext);
@move_uploaded_file($file['tmp_name'], $target_filename);
$oAdminConfig->adminLogo = $target_filename;
}
if($adminTitle)
{
$oAdminConfig->adminTitle = strip_tags($adminTitle);
}
else
{
unset($oAdminConfig->adminTitle);
}
if($oAdminConfig)
{
$oModuleController = getController('module');
$oModuleController->insertModuleConfig('admin', $oAdminConfig);
}
$oModuleController = getController('module');
$oModuleController->insertModuleConfig('admin', $oAdminConfig);
$this->setMessage('success_updated', 'info');
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAdminSetup');
@ -519,7 +475,7 @@ class adminAdminController extends admin
}
else
{
return $this->setError('fail_to_delete');
throw new Rhymix\Framework\Exception('fail_to_delete');
}
$this->setMessage('success_deleted');
}
@ -543,7 +499,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('use_sso', $vars->use_sso === 'Y');
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -563,19 +519,19 @@ class adminAdminController extends admin
// Validate the mail sender's information.
if (!$vars->mail_default_name)
{
return $this->setError('msg_advanced_mailer_sender_name_is_empty');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_sender_name_is_empty');
}
if (!$vars->mail_default_from)
{
return $this->setError('msg_advanced_mailer_sender_email_is_empty');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_sender_email_is_empty');
}
if (!Mail::isVaildMailAddress($vars->mail_default_from))
{
return $this->setError('msg_advanced_mailer_sender_email_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_sender_email_is_invalid');
}
if ($vars->mail_default_reply_to && !Mail::isVaildMailAddress($vars->mail_default_reply_to))
{
return $this->setError('msg_advanced_mailer_reply_to_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_reply_to_is_invalid');
}
// Validate the mail driver.
@ -583,7 +539,7 @@ class adminAdminController extends admin
$mail_driver = $vars->mail_driver;
if (!array_key_exists($mail_driver, $mail_drivers))
{
return $this->setError('msg_advanced_mailer_sending_method_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_sending_method_is_invalid');
}
// Validate the mail driver settings.
@ -593,7 +549,7 @@ class adminAdminController extends admin
$conf_value = $vars->{'mail_' . $mail_driver . '_' . $conf_name} ?: null;
if (!$conf_value)
{
return $this->setError('msg_advanced_mailer_smtp_host_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_smtp_host_is_invalid');
}
$mail_driver_config[$conf_name] = $conf_value;
}
@ -603,7 +559,7 @@ class adminAdminController extends admin
$sms_driver = $vars->sms_driver;
if (!array_key_exists($sms_driver, $sms_drivers))
{
return $this->setError('msg_advanced_mailer_sending_method_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_sending_method_is_invalid');
}
// Validate the SMS driver settings.
@ -613,7 +569,7 @@ class adminAdminController extends admin
$conf_value = $vars->{'sms_' . $sms_driver . '_' . $conf_name} ?: null;
if (!$conf_value)
{
return $this->setError('msg_advanced_mailer_smtp_host_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_smtp_host_is_invalid');
}
$sms_driver_config[$conf_name] = $conf_value;
}
@ -652,7 +608,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set("sms.allow_split.lms", toBool($vars->allow_split_lms));
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -707,7 +663,7 @@ class adminAdminController extends admin
return $item !== '';
}));
if (!Rhymix\Framework\Filters\IpFilter::validateRanges($allowed_ip)) {
return $this->setError('msg_invalid_ip');
throw new Rhymix\Framework\Exception('msg_invalid_ip');
}
$denied_ip = array_map('trim', preg_split('/[\r\n]/', $vars->admin_denied_ip));
@ -715,13 +671,13 @@ class adminAdminController extends admin
return $item !== '';
}));
if (!Rhymix\Framework\Filters\IpFilter::validateRanges($denied_ip)) {
return $this->setError('msg_invalid_ip');
throw new Rhymix\Framework\Exception('msg_invalid_ip');
}
$oMemberAdminModel = getAdminModel('member');
if (!$oMemberAdminModel->getMemberAdminIPCheck($allowed_ip, $denied_ip))
{
return $this->setError('msg_current_ip_will_be_denied');
throw new Rhymix\Framework\Exception('msg_current_ip_will_be_denied');
}
Rhymix\Framework\Config::set('admin.allow', array_values($allowed_ip));
@ -729,11 +685,13 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('session.use_keys', $vars->use_session_keys === 'Y');
Rhymix\Framework\Config::set('session.use_ssl', $vars->use_session_ssl === 'Y');
Rhymix\Framework\Config::set('session.use_ssl_cookies', $vars->use_cookies_ssl === 'Y');
Rhymix\Framework\Config::set('security.check_csrf_token', $vars->check_csrf_token === 'Y');
Rhymix\Framework\Config::set('security.nofollow', $vars->use_nofollow === 'Y');
// Save
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -776,7 +734,7 @@ class adminAdminController extends admin
}
if (!Rhymix\Framework\Cache::getDriverInstance($vars->object_cache_type, $cache_servers))
{
return $this->setError('msg_cache_handler_not_supported');
throw new Rhymix\Framework\Exception('msg_cache_handler_not_supported');
}
Rhymix\Framework\Config::set('cache', array(
'type' => $vars->object_cache_type,
@ -827,6 +785,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('use_rewrite', $vars->use_rewrite === 'Y');
Rhymix\Framework\Config::set('session.delay', $vars->delay_session === 'Y');
Rhymix\Framework\Config::set('session.use_db', $vars->use_db_session === 'Y');
Rhymix\Framework\Config::set('view.manager_layout', $vars->manager_layout ?: 'module');
Rhymix\Framework\Config::set('view.minify_scripts', $vars->minify_scripts ?: 'common');
Rhymix\Framework\Config::set('view.concat_scripts', $vars->concat_scripts ?: 'none');
Rhymix\Framework\Config::set('view.server_push', $vars->use_server_push === 'Y');
@ -835,7 +794,7 @@ class adminAdminController extends admin
// Save
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -849,13 +808,18 @@ class adminAdminController extends admin
{
$vars = Context::getRequestVars();
// Save display type settings
$display_type = array_values(array_filter($vars->debug_display_type, function($str) {
return in_array($str, ['panel', 'comment', 'file']);
}));
// Debug settings
Rhymix\Framework\Config::set('debug.enabled', $vars->debug_enabled === 'Y');
Rhymix\Framework\Config::set('debug.log_slow_queries', max(0, floatval($vars->debug_log_slow_queries)));
Rhymix\Framework\Config::set('debug.log_slow_triggers', max(0, floatval($vars->debug_log_slow_triggers)));
Rhymix\Framework\Config::set('debug.log_slow_widgets', max(0, floatval($vars->debug_log_slow_widgets)));
Rhymix\Framework\Config::set('debug.log_slow_remote_requests', max(0, floatval($vars->debug_log_slow_remote_requests)));
Rhymix\Framework\Config::set('debug.display_type', strval($vars->debug_display_type) ?: 'comment');
Rhymix\Framework\Config::set('debug.display_type', $display_type);
Rhymix\Framework\Config::set('debug.display_to', strval($vars->debug_display_to) ?: 'admin');
Rhymix\Framework\Config::set('debug.write_error_log', strval($vars->debug_write_error_log) ?: 'fatal');
@ -873,15 +837,15 @@ class adminAdminController extends admin
), $log_filename);
if (file_exists(RX_BASEDIR . $log_filename_today) && !is_writable(RX_BASEDIR . $log_filename_today))
{
return $this->setError('msg_debug_log_filename_not_writable');
throw new Rhymix\Framework\Exception('msg_debug_log_filename_not_writable');
}
if (!file_exists(dirname(RX_BASEDIR . $log_filename)) && !FileHandler::makeDir(dirname(RX_BASEDIR . $log_filename)))
{
return $this->setError('msg_debug_log_filename_not_writable');
throw new Rhymix\Framework\Exception('msg_debug_log_filename_not_writable');
}
if (!is_writable(dirname(RX_BASEDIR . $log_filename)))
{
return $this->setError('msg_debug_log_filename_not_writable');
throw new Rhymix\Framework\Exception('msg_debug_log_filename_not_writable');
}
Rhymix\Framework\Config::set('debug.log_filename', $log_filename);
@ -891,14 +855,14 @@ class adminAdminController extends admin
return $item !== '';
}));
if (!Rhymix\Framework\Filters\IpFilter::validateRanges($allowed_ip)) {
return $this->setError('msg_invalid_ip');
throw new Rhymix\Framework\Exception('msg_invalid_ip');
}
Rhymix\Framework\Config::set('debug.allow', array_values($allowed_ip));
// Save
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -931,7 +895,7 @@ class adminAdminController extends admin
// Save
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -952,7 +916,7 @@ class adminAdminController extends admin
if (!Rhymix\Framework\Filters\IpFilter::validateRanges($allowed_ip))
{
return $this->setError('msg_invalid_ip');
throw new Rhymix\Framework\Exception('msg_invalid_ip');
}
Rhymix\Framework\Config::set('lock.locked', $vars->sitelock_locked === 'Y');
@ -961,7 +925,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('lock.allow', array_values($allowed_ip));
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -982,7 +946,7 @@ class adminAdminController extends admin
$domain_info = getModel('module')->getSiteInfo($domain_srl);
if ($domain_info->domain_srl != $domain_srl)
{
return $this->setError('msg_domain_not_found');
throw new Rhymix\Framework\Exception('msg_domain_not_found');
}
}
@ -991,7 +955,7 @@ class adminAdminController extends admin
$vars->subtitle = utf8_trim($vars->subtitle);
if ($vars->title === '')
{
return $this->setError('msg_site_title_is_empty');
throw new Rhymix\Framework\Exception('msg_site_title_is_empty');
}
// Validate the domain.
@ -1009,12 +973,12 @@ class adminAdminController extends admin
}
if (!$vars->domain)
{
return $this->setError('msg_invalid_domain');
throw new Rhymix\Framework\Exception('msg_invalid_domain');
}
$existing_domain = getModel('module')->getSiteInfoByDomain($vars->domain);
if ($existing_domain && $existing_domain->domain == $vars->domain && (!$domain_info || $existing_domain->domain_srl != $domain_info->domain_srl))
{
return $this->setError('msg_domain_already_exists');
throw new Rhymix\Framework\Exception('msg_domain_already_exists');
}
// Validate the ports.
@ -1028,11 +992,11 @@ class adminAdminController extends admin
}
if ($vars->http_port !== 0 && ($vars->http_port < 1 || $vars->http_port > 65535 || $vars->http_port == 443))
{
return $this->setError('msg_invalid_http_port');
throw new Rhymix\Framework\Exception('msg_invalid_http_port');
}
if ($vars->https_port !== 0 && ($vars->https_port < 1 || $vars->https_port > 65535 || $vars->https_port == 80))
{
return $this->setError('msg_invalid_https_port');
throw new Rhymix\Framework\Exception('msg_invalid_https_port');
}
// Validate the security setting.
@ -1046,7 +1010,7 @@ class adminAdminController extends admin
$module_info = getModel('module')->getModuleInfoByModuleSrl(intval($vars->index_module_srl));
if (!$module_info || $module_info->module_srl != $vars->index_module_srl)
{
return $this->setError('msg_invalid_index_module_srl');
throw new Rhymix\Framework\Exception('msg_invalid_index_module_srl');
}
// Validate the index document setting.
@ -1055,11 +1019,11 @@ class adminAdminController extends admin
$oDocument = getModel('document')->getDocument($vars->index_document_srl);
if (!$oDocument || !$oDocument->isExists())
{
return $this->setError('msg_invalid_index_document_srl');
throw new Rhymix\Framework\Exception('msg_invalid_index_document_srl');
}
if (intval($oDocument->get('module_srl')) !== intval($vars->index_module_srl))
{
return $this->setError('msg_invalid_index_document_srl_module_srl');
throw new Rhymix\Framework\Exception('msg_invalid_index_document_srl_module_srl');
}
}
else
@ -1071,14 +1035,14 @@ class adminAdminController extends admin
$enabled_lang = Rhymix\Framework\Config::get('locale.enabled_lang');
if (!in_array($vars->default_lang, $enabled_lang))
{
return $this->setError('msg_lang_is_not_enabled');
throw new Rhymix\Framework\Exception('msg_lang_is_not_enabled');
}
// Validate the default time zone.
$timezone_list = Rhymix\Framework\DateTime::getTimezoneList();
if (!isset($timezone_list[$vars->default_timezone]))
{
return $this->setError('msg_invalid_timezone');
throw new Rhymix\Framework\Exception('msg_invalid_timezone');
}
// Clean up the header and footer scripts.
@ -1201,16 +1165,16 @@ class adminAdminController extends admin
$domain_srl = strval(Context::get('domain_srl'));
if ($domain_srl === '')
{
return $this->setError('msg_domain_not_found');
throw new Rhymix\Framework\Exception('msg_domain_not_found');
}
$domain_info = getModel('module')->getSiteInfo($domain_srl);
if ($domain_info->domain_srl != $domain_srl)
{
return $this->setError('msg_domain_not_found');
throw new Rhymix\Framework\Exception('msg_domain_not_found');
}
if ($domain_info->is_default_domain === 'Y')
{
return $this->setError('msg_cannot_delete_default_domain');
throw new Rhymix\Framework\Exception('msg_cannot_delete_default_domain');
}
// Delete the domain.
@ -1243,19 +1207,19 @@ class adminAdminController extends admin
{
if (!($conn = @ftp_connect($vars->ftp_host, $vars->ftp_port, 3)))
{
return $this->setError('msg_ftp_not_connected');
throw new Rhymix\Framework\Exception('msg_ftp_not_connected');
}
if (!@ftp_login($conn, $vars->ftp_user, $vars->ftp_pass))
{
return $this->setError('msg_ftp_invalid_auth_info');
throw new Rhymix\Framework\Exception('msg_ftp_invalid_auth_info');
}
if (!@ftp_pasv($conn, $vars->ftp_pasv === 'Y'))
{
return $this->setError('msg_ftp_cannot_set_passive_mode');
throw new Rhymix\Framework\Exception('msg_ftp_cannot_set_passive_mode');
}
if (!@ftp_chdir($conn, $vars->ftp_path))
{
return $this->setError('msg_ftp_invalid_path');
throw new Rhymix\Framework\Exception('msg_ftp_invalid_path');
}
ftp_close($conn);
}
@ -1263,23 +1227,23 @@ class adminAdminController extends admin
{
if (!function_exists('ssh2_connect'))
{
return $this->setError('disable_sftp_support');
throw new Rhymix\Framework\Exception('disable_sftp_support');
}
if (!($conn = ssh2_connect($vars->ftp_host, $vars->ftp_port)))
{
return $this->setError('msg_ftp_not_connected');
throw new Rhymix\Framework\Exception('msg_ftp_not_connected');
}
if (!@ssh2_auth_password($conn, $vars->ftp_user, $vars->ftp_pass))
{
return $this->setError('msg_ftp_invalid_auth_info');
throw new Rhymix\Framework\Exception('msg_ftp_invalid_auth_info');
}
if (!@($sftp = ssh2_sftp($conn)))
{
return $this->setError('msg_ftp_sftp_error');
throw new Rhymix\Framework\Exception('msg_ftp_sftp_error');
}
if (!@ssh2_sftp_stat($sftp, $vars->ftp_path . 'common/defaults/config.php'))
{
return $this->setError('msg_ftp_invalid_path');
throw new Rhymix\Framework\Exception('msg_ftp_invalid_path');
}
unset($sftp, $conn);
}
@ -1294,7 +1258,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('ftp.sftp', $vars->ftp_sftp === 'Y');
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_updated');
@ -1315,7 +1279,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('ftp.sftp', false);
if (!Rhymix\Framework\Config::save())
{
return $this->setError('msg_failed_to_save_config');
throw new Rhymix\Framework\Exception('msg_failed_to_save_config');
}
$this->setMessage('success_deleted');
@ -1348,7 +1312,7 @@ class adminAdminController extends admin
$image_filepath = 'files/attach/xeicon/';
if ($domain_srl)
{
$image_filepath .= intval($domain_srl) . '/';
$image_filepath .= ($virtual_site = intval($domain_srl) . '/');
}
if ($deleteIcon)

View file

@ -36,11 +36,9 @@ class adminAdminView extends admin
function init()
{
// forbit access if the user is not an administrator
$oMemberModel = getModel('member');
$logged_info = $oMemberModel->getLoggedInfo();
if($logged_info->is_admin != 'Y')
if (!$this->user->isAdmin())
{
return $this->stop("admin.msg_is_not_administrator");
throw new Rhymix\Framework\Exceptions\NotPermitted('admin.msg_is_not_administrator');
}
// change into administration layout
@ -81,6 +79,11 @@ class adminAdminView extends admin
config('crypto.session_key', Rhymix\Framework\Security::getRandom(64, 'alnum'));
$changed = true;
}
if (config('file.folder_structure') === null)
{
config('file.folder_structure', 1);
$changed = true;
}
// Save new configuration.
if ($changed)
@ -197,14 +200,6 @@ class adminAdminView extends admin
}
}
// Admin logo, title setup
$objConfig = $oModuleModel->getModuleConfig('admin');
$gnbTitleInfo = new stdClass();
$gnbTitleInfo->adminTitle = $objConfig->adminTitle ? $objConfig->adminTitle : 'Admin';
$gnbTitleInfo->adminLogo = $objConfig->adminLogo ? $objConfig->adminLogo : '';
$browserTitle = $gnbTitleInfo->adminTitle . ' - ' . ($subMenuTitle ? $subMenuTitle : 'Dashboard');
// Get list of favorite
$oAdminAdminModel = getAdminModel('admin');
$output = $oAdminAdminModel->getFavoriteList(0, true);
@ -255,7 +250,7 @@ class adminAdminView extends admin
Context::set('gnbUrlList', $menu->list);
Context::set('parentSrl', $parentSrl);
Context::set('gnb_title_info', $gnbTitleInfo);
Context::addBrowserTitle($browserTitle);
Context::addBrowserTitle($subMenuTitle ? $subMenuTitle : 'Dashboard');
}
/**
@ -454,6 +449,8 @@ class adminAdminView extends admin
Context::set('use_session_keys', Rhymix\Framework\Config::get('session.use_keys'));
Context::set('use_session_ssl', Rhymix\Framework\Config::get('session.use_ssl'));
Context::set('use_cookies_ssl', Rhymix\Framework\Config::get('session.use_ssl_cookies'));
Context::set('check_csrf_token', Rhymix\Framework\Config::get('security.check_csrf_token'));
Context::set('use_nofollow', Rhymix\Framework\Config::get('security.nofollow'));
$this->setTemplateFile('config_security');
}
@ -544,6 +541,7 @@ class adminAdminView extends admin
Context::set('use_ssl', Rhymix\Framework\Config::get('url.ssl'));
Context::set('delay_session', Rhymix\Framework\Config::get('session.delay'));
Context::set('use_db_session', Rhymix\Framework\Config::get('session.use_db'));
Context::set('manager_layout', Rhymix\Framework\Config::get('view.manager_layout'));
Context::set('minify_scripts', Rhymix\Framework\Config::get('view.minify_scripts'));
Context::set('concat_scripts', Rhymix\Framework\Config::get('view.concat_scripts'));
Context::set('use_server_push', Rhymix\Framework\Config::get('view.server_push'));
@ -565,7 +563,7 @@ class adminAdminView extends admin
Context::set('debug_log_slow_widgets', Rhymix\Framework\Config::get('debug.log_slow_widgets'));
Context::set('debug_log_slow_remote_requests', Rhymix\Framework\Config::get('debug.log_slow_remote_requests'));
Context::set('debug_log_filename', Rhymix\Framework\Config::get('debug.log_filename') ?: 'files/debug/YYYYMMDD.php');
Context::set('debug_display_type', Rhymix\Framework\Config::get('debug.display_type'));
Context::set('debug_display_type', (array)Rhymix\Framework\Config::get('debug.display_type'));
Context::set('debug_display_content', Rhymix\Framework\Config::get('debug.display_content'));
Context::set('debug_display_to', Rhymix\Framework\Config::get('debug.display_to'));
Context::set('debug_write_error_log', Rhymix\Framework\Config::get('debug.write_error_log'));
@ -636,7 +634,7 @@ class adminAdminView extends admin
$domain_info = getModel('module')->getSiteInfo($domain_srl);
if ($domain_info->domain_srl != $domain_srl)
{
return $this->setError('msg_domain_not_found');
throw new Rhymix\Framework\Exception('msg_domain_not_found');
}
}
Context::set('domain_info', $domain_info);
@ -708,7 +706,6 @@ class adminAdminView extends admin
function dispAdminSetup()
{
$oModuleModel = getModel('module');
$configObject = $oModuleModel->getModuleConfig('admin');
$oAdmin = getClass('admin');
$oMenuAdminModel = getAdminModel('menu');
@ -716,7 +713,6 @@ class adminAdminView extends admin
Context::set('menu_srl', $output->menu_srl);
Context::set('menu_title', $output->title);
Context::set('config_object', $configObject);
$this->setTemplateFile('admin_setup');
}

View file

@ -144,6 +144,11 @@ $lang->msg_invalid_timezone = 'The selected time zone is not usable on this serv
$lang->use_db_session = 'Store Session in DB';
$lang->about_db_session = 'Store PHP sessions in the database. This setting must be turned on if you want to see current users or get detailed statistics.<br>Unnecessary use may decrease server performance.';
$lang->qmail_compatibility = 'Enable Qmail';
$lang->manager_layout = 'Module Setting Screen';
$lang->cmd_manager_layout_module = 'Use module layout';
$lang->cmd_manager_layout_admin = 'Use admin layout';
$lang->view_in_manager_layout = 'View in admin screen';
$lang->about_manager_layout = 'Force module setting screen to use the admin layout instead of the module\'s own layout.';
$lang->minify_scripts = 'Minify scripts';
$lang->cmd_minify_all = 'All files';
$lang->cmd_minify_common = 'Common files only';
@ -158,13 +163,17 @@ $lang->about_concat_scripts = 'Automatically combine CSS and JS scripts into as
$lang->use_server_push = 'Use HTTP/2 Server Push';
$lang->use_gzip = 'gzip Compression';
$lang->delay_session = 'Delay session start';
$lang->about_delay_session = 'To improve performance when using a caching proxy server such as Varnish, do not issue sessions to visitors until they log in.<br>Selecting this option may cause view counts and visitor counts to become inaccurate.';
$lang->about_delay_session = 'To improve performance when using a caching proxy server such as Varnish, do not issue sessions to visitors until they log in.<br>Selecting this option may interfere with autologin, and visitor counts may become inaccurate.';
$lang->use_session_keys = 'Use session security keys';
$lang->about_use_session_keys = 'Use additional security keys to guard against session theft. This setting is highly recommended if you don\'t use SSL-only sessions.<br>This setting may cause some users to become logged out.';
$lang->use_session_ssl = 'Use SSL-only session';
$lang->about_use_session_ssl = 'Force the session to be SSL-only.<br>This helps improve security if your site always uses SSL.';
$lang->use_cookies_ssl = 'Use SSL-only cookies';
$lang->about_use_cookies_ssl = 'Force all cookies to be SSL-only.';
$lang->check_csrf_token = 'Use CSRF tokens';
$lang->about_check_csrf_token = 'Use CSRF tokens to validate requests. This is more secure but may break some functionality.<br>If not selected, Rhymix will use only the Referer header to defend against CSRF attacks.';
$lang->use_nofollow = 'Use nofollow attribute';
$lang->about_use_nofollow = 'Add rel=&quot;nofollow&quot; to all links submitted by users in order to reduce the effectiveness of spamming.<br>This does not apply to content submitted by the administrator.';
$lang->use_object_cache = 'Use Cache';
$lang->cache_default_ttl = 'Cache default TTL';
$lang->cache_host = 'Host';

View file

@ -145,6 +145,11 @@ $lang->msg_invalid_timezone = '사용할 수 없는 표준 시간대입니다.';
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '세션을 DB에 저장합니다. 현재 접속자를 파악하려면 이 기능을 켜야 합니다.<br>불필요하게 사용하면 서버 성능에 악영향을 줄 수 있으니 주의하십시오.';
$lang->qmail_compatibility = '큐메일(Qmail) 사용';
$lang->manager_layout = '모듈 설정 화면';
$lang->cmd_manager_layout_module = '해당 모듈 레이아웃 사용';
$lang->cmd_manager_layout_admin = '관리자 레이아웃 사용';
$lang->view_in_manager_layout = '관리자 화면에서 보기';
$lang->about_manager_layout = '배경이 어두운 레이아웃 등에서 모듈 설정 화면을 이용하기 어려울 경우 관리자 레이아웃을 강제 적용할 수 있습니다.';
$lang->minify_scripts = '스크립트 자동 압축';
$lang->cmd_minify_all = '모든 파일을 압축';
$lang->cmd_minify_common = '공통 파일만 압축';
@ -159,13 +164,17 @@ $lang->about_concat_scripts = 'CSS, JS 파일들을 하나로 합쳐서 전송
$lang->use_server_push = 'Server Push 사용';
$lang->use_gzip = 'gzip 압축';
$lang->delay_session = '세션 시작 지연';
$lang->about_delay_session = 'Varnish 등의 프록시 캐싱 서버 사용시 성능 개선을 위해, 로그인하지 않은 사용자에게는 인증 세션을 부여하지 않습니다.<br>이 옵션을 선택할 경우 방문자 수 및 조회수 집계가 정확하게 이루어지지 않을 수 있습니다.';
$lang->about_delay_session = 'Varnish 등의 프록시 캐싱 서버 사용시 성능 개선을 위해, 로그인하지 않은 사용자에게는 인증 세션을 부여하지 않습니다.<br>이 옵션을 사용하면 자동 로그인이 되지 않으며, 방문자 수 집계가 정확하게 이루어지지 않을 수 있습니다.';
$lang->use_session_keys = '세션 보안키 사용';
$lang->about_use_session_keys = '세션 탈취를 방지하기 위한 보안키를 사용합니다. SSL 전용 세션을 사용하지 않을 경우 반드시 보안키를 사용하시기를 권장합니다.<br>사용자 환경에 따라 로그인이 풀리는 문제가 발생할 수 있습니다.';
$lang->use_session_ssl = 'SSL 전용 세션 사용';
$lang->about_use_session_ssl = '세션을 SSL 전용으로 지정하여 SSL이 아닌 페이지에서는 사용할 수 없도록 합니다.<br>SSL을 항상 사용하도록 설정되어 있는 경우에만 활성화됩니다.';
$lang->use_cookies_ssl = 'SSL 전용 쿠키 사용';
$lang->about_use_cookies_ssl = '세션뿐 아니라 모든 쿠키를 SSL 전용으로 지정합니다.<br>SSL을 항상 사용하도록 설정되어 있는 경우에만 활성화됩니다.';
$lang->check_csrf_token = 'CSRF 토큰 사용';
$lang->about_check_csrf_token = 'CSRF 토큰을 사용하여 정상적인 요청 여부를 확인합니다. 보안이 향상되지만, 일부 서드파티 자료와 호환되지 않을 수 있습니다.<br>사용하지 않을 경우 리퍼러 헤더 확인만으로 CSRF 공격에 방어합니다.';
$lang->use_nofollow = 'Nofollow 속성 사용';
$lang->about_use_nofollow = '사용자들이 작성한 글에 포함된 모든 링크에 rel=&quot;nofollow&quot; 속성을 추가하여 스팸으로 인한 사이트 신뢰도 저하를 방지합니다.<br>관리자가 작성한 글에는 적용되지 않습니다.';
$lang->use_object_cache = '캐시 사용';
$lang->cache_default_ttl = '캐시 기본 TTL';
$lang->cache_host = '호스트';
@ -334,7 +343,7 @@ $lang->msg_php_warning_notice = '이 서버는 안전하지 않은 PHP 버전을
$lang->msg_php_warning_notice_explain = '<li>매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.</li><li>Rhymix 최신 버전을 사용할 수 없습니다.</li><li>Rhymix 최신 버전 이상에서 지원하는 확장 기능을 사용할 수 없습니다.</li><li>일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.</li>';
$lang->msg_php_warning_now_version = '이 서버의 PHP 버전';
$lang->msg_php_warning_latest_version_check = 'PHP 최신 안정버전 확인하기';
$lang->admin_setup = '관리자 설정';
$lang->admin_setup = '관리자 화면 설정';
$lang->open_all = '모두 펼치기';
$lang->close_all = '모두 접기';
$lang->desktop_settings = 'PC 설정';

View file

@ -0,0 +1,9 @@
<config autoescape="on" />
<load target="css/admin.bootstrap.css" />
<load target="css/admin.iefix.css" />
<load target="./../../../common/css/xeicon/xeicon.css" />
<load target="css/admin.css" />
<load target="js/admin.js" />
<load target="js/jquery.tmpl.js" />
<load target="js/jquery.jstree.js" />

View file

@ -1,3 +1,4 @@
<config autoescape="on" />
<load target="js/dashboard_counter.js" />
<div>

View file

@ -1,3 +1,5 @@
<config autoescape="on" />
<div>
<section class="member">
<h2>{$lang->member}</h2>
@ -12,7 +14,7 @@
<dl>
<dt>{$lang->menu_gnb['user']}: </dt><dd><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminList')}">{number_format($status->member->totalCount)} (<!--@if($status->member->todayCount > 0)-->+<!--@end-->{number_format($status->member->todayCount)})</a></dd>
</dl>
<a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminList')}"><i>&rsaquo;</i> {$lang->more}</a>
<a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminList')}"><i class="xi-angle-right"></i><span>{$lang->more}</span></a>
</div>
</section>
</div>
@ -40,7 +42,7 @@
<dl>
<dt>{$lang->menu_gnb_sub['document']}: </dt><dd><a href="{getUrl('', 'module', 'admin', 'act', 'dispDocumentAdminList')}">{number_format($status->document->totalCount)} (<!--@if($status->document->todayCount > 0)-->+<!--@end-->{number_format($status->document->todayCount)})</a></dd>
</dl>
<a href="{getUrl('', 'module', 'admin', 'act', 'dispDocumentAdminList')}"><i>&rsaquo;</i> {$lang->more}</a>
<a href="{getUrl('', 'module', 'admin', 'act', 'dispDocumentAdminList')}"><i class="xi-angle-right"></i><span>{$lang->more}</span></a>
</div>
</section>
<section class="reply">
@ -60,7 +62,7 @@
</li>
<li cond="!is_array($latestCommentList) || count($latestCommentList) < 1">{$lang->no_data}</li>
</ul>
<p class="more"><a href="{getUrl('', 'module', 'admin', 'act', 'dispCommentAdminList')}"><i>&rsaquo;</i> {$lang->more}</a></p>
<p class="more"><a href="{getUrl('', 'module', 'admin', 'act', 'dispCommentAdminList')}"><i class="xi-angle-right"></i><span>{$lang->more}</span></a></p>
</section>
</div>

View file

@ -1,20 +1,22 @@
<config autoescape="on" />
</div>
<!-- /BODY -->
<footer class="footer">
<footer class="footer" cond="$this->user->isAdmin()">
<p class="power">
Powered by <strong>Rhymix {__XE_VERSION__}</strong>
Powered by <strong>Rhymix {\RX_VERSION}</strong>
<!--@if(isset($released_version))-->
<span class="vr">|</span> Latest version: <a href="{htmlspecialchars(html_entity_decode($download_link), ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" target="_blank">{$released_version}</a>
<span class="vr">|</span> Latest version: <a href="{$download_link}" target="_blank">{$released_version}</a>
<!--@end-->
</p>
<p class="cache">
<button type="button" class="x_btn-link" onclick="doResetAdminMenu();">{$lang->cmd_admin_menu_reset}</button> <span class="vr">|</span>
<button type="button" class="x_btn-link" onclick="doRecompileCacheFile();">{$lang->cmd_remake_cache}</button> <span class="vr">|</span>
<button type="button" class="x_btn-link" onclick="doClearSession();">{$lang->cmd_clear_session}</button> <span class="vr">|</span>
<a href="./index.php?module=admin&act=dispAdminViewServerEnv" style="vertical-align:middle">{$lang->cmd_view_server_env}</a> <span class="vr">|</span>
<a href="https://github.com/rhymix/rhymix/issues" target="_blank" style="vertical-align:middle">{$lang->bug_report}</a>
<button type="button" class="x_btn-link" onclick="doResetAdminMenu();">{lang('admin.cmd_admin_menu_reset')}</button> <span class="vr">|</span>
<button type="button" class="x_btn-link" onclick="doRecompileCacheFile();">{lang('common.cmd_remake_cache')}</button> <span class="vr">|</span>
<button type="button" class="x_btn-link" onclick="doClearSession();">{lang('admin.cmd_clear_session')}</button> <span class="vr">|</span>
<a href="./index.php?module=admin&act=dispAdminViewServerEnv" style="vertical-align:middle">{lang('admin.cmd_view_server_env')}</a> <span class="vr">|</span>
<a href="https://github.com/rhymix/rhymix/issues" target="_blank" style="vertical-align:middle">{lang('admin.bug_report')}</a>
</p>
<load target="../../session/tpl/js/session.js" />
</footer>
</div>
<load target="./js/config.js" usecdn="true" />
<load target="../../session/tpl/js/session.js" usecdn="true" />
<load target="./js/config.js" />

View file

@ -1,10 +1,7 @@
<load target="css/admin.bootstrap.css" />
<load target="css/admin.iefix.css" />
<load target="css/admin.css" />
<load target="js/admin.js" />
<load target="js/jquery.tmpl.js" />
<load target="js/jquery.jstree.js" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<config autoescape="on" />
<include target="./_admin_common.html" />
{Context::addMetaTag("viewport", "width=device-width, user-scalable=yes")}
<script>
var admin_menu_srl = "{$admin_menu_srl}";
xe.cmd_find = "{$lang->cmd_find}";
@ -14,17 +11,33 @@
xe.lang.confirm_run = "{$lang->confirm_run}";
xe.lang.confirm_reset_admin_menu = "{$lang->confirm_reset_admin_menu}";
</script>
{@ $module_manager = $current_module_info->module !== 'admin'}
<div class="x">
<p class="skipNav"><a href="#content">{$lang->skip_to_content}</a></p>
<header class="header">
<!--@if($module_manager)-->
<h1>
<a href="{getUrl('','module','admin')}"><img cond="$gnb_title_info->adminLogo" src="{getUrl('')}{$gnb_title_info->adminLogo}" alt="{$gnb_title_info->adminTitle}" /> {$gnb_title_info->adminTitle}</a>
<a class="default_header" href="javascript:void()"><i class="xi xi-cog"></i></a>
</h1>
<p class="site"><a href="{$xe_default_url}">{$xe_default_url}</a></p>
<p class="site" cond="$this->user->isAdmin()">
<a href="{getUrl('module', 'admin', 'act', $act, 'module_srl', $module_info->module_srl, 'mid', '')}">{lang('admin.view_in_manager_layout')}</a>
</p>
<!--@else-->
<h1>
<a class="default_header" href="{getUrl('','module','admin')}"><i class="xi xi-cog"></i></a>
<a class="mobile_menu_open" href="#gnbNav"><i class="xi xi-bars"></i></a>
</h1>
<p class="site"><a href="{$xe_default_url}">{$site_module_info->settings->title ?: $xe_default_url|autolang}</a></p>
<!--@end-->
<div class="account">
<ul>
<li><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminInfo', 'is_admin', 'Y', 'member_srl', $logged_info->member_srl)}">{$logged_info->email_address}</a></li>
<li><a href="{getUrl('', 'module','admin','act','procAdminLogout')}">{$lang->cmd_logout}</a></li>
<!--@if($module_manager)-->
<li><a href="{getUrl('', 'mid', $mid, 'act', 'dispMemberInfo')}">{$logged_info->nick_name}</a></li>
<li><a href="{getUrl('', 'mid', $mid, 'act', 'dispMemberLogout')}">{$lang->cmd_logout}</a></li>
<!--@else-->
<li><a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminInfo', 'member_srl', $logged_info->member_srl)}">{$logged_info->nick_name}</a></li>
<li><a href="{getUrl('', 'module', 'admin', 'act', 'procAdminLogout')}">{$lang->cmd_logout}</a></li>
<!--@end-->
<li><a href="#lang" class="lang" data-toggle>{$lang_supported[$lang_type]}</a>
<ul id="lang" class="x_dropdown-menu">
<li loop="$lang_supported=>$key,$val" class="x_active"|cond="$key==$lang_type"><a href="{getUrl('l',$key)}" data-langcode="{$key}" onclick="doChangeLangType('{$key}'); return false;">{$val}</a></li>
@ -34,9 +47,9 @@
</div>
</header>
<!-- BODY -->
<div class="body <!--@if($_COOKIE['__xe_admin_gnb_status'] == 'close')-->wide<!--@end-->">
<div class="body <!--@if($_COOKIE['__xe_admin_gnb_status'] == 'close')-->wide<!--@end-->" style="padding-left:0"|cond="$module_manager">
<!-- GNB -->
<nav class="gnb <!--@if($_COOKIE['__xe_admin_gnb_status'] == 'open')-->open<!--@end-->" id="gnb">
<nav class="gnb <!--@if($_COOKIE['__xe_admin_gnb_status'] == 'open')-->open<!--@end-->" id="gnb" cond="!$module_manager">
<a href="#gnbNav"><i class="x_icon-align-justify x_icon-white"></i><b></b> Menu Open/Close</a>
<ul id="gnbNav" class="ex">
<script>
@ -66,7 +79,7 @@
</ul>
</li>
<!--@end-->
<li class="<!--@if($parentSrl==$key || $value['href']=='index.php?module=admin' && !$mid && !$act)-->active open<!--@elseif($_COOKIE['__xe_admin_gnb_tx_' . md5($value['href'])] == 'open')-->open<!--@end-->">
<li class="<!--@if(($parentSrl==$key || $value['href']=='index.php?module=admin') && !$mid && !$act)-->active open<!--@elseif($_COOKIE['__xe_admin_gnb_tx_' . md5($value['href'])] == 'open')-->open<!--@end-->">
<script>
__xe_admin_gnb_txs.push('{'__xe_admin_gnb_tx_' . md5($value['href'])}');
</script>

View file

@ -1,42 +1,12 @@
<config autoescape="on" />
<load target="./js/menu_setup.js" usecdn="true" />
<div class="x_page-header">
<h1>{$lang->admin_setup} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_config_admin" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->admin_setup}</h1>
</div>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/admin_setup/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<section class="section">
<h1>{$lang->admin_title}</h1>
<form action="./" method="post" enctype="multipart/form-data" class="x_form-horizontal">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procAdminUpdateConfig" />
<input type="hidden" name="xe_validator_id" value="modules/admin/tpl/admin_setup/1" />
<div class="x_control-group">
<label class="x_control-label">{$lang->admin_logo}</label>
<div class="x_controls">
<!--@if($config_object->adminLogo)-->
<img src="{getUrl('').$config_object->adminLogo}" />
<button type="submit" value="procAdminDeleteLogo" name="act" class="x_btn">{$lang->cmd_delete}</button>
<!--@else-->
<img src="{getUrl('')}{$gnb_title_info->adminLogo}" />
<!--@end-->
<input type="file" name="adminLogo" id="adminLogo" />
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="adminTitle">{$lang->admin_title}</label>
<div class="x_controls">
<input type="text" name="adminTitle" id="adminTitle" value="{$config_object->adminTitle}" placeholder="Rhymix Admin" />
</div>
</div>
<div class="x_clearfix btnArea">
<div class="x_pull-right">
<button type="submit" class="x_btn x_btn-primary">{$lang->cmd_save}</button>
</div>
</div>
</fieldset>
</form>
</section>
<section class="section">
<h1>{$lang->admin_menu_setup}</h1>
<form id="listForm" action="./" method="post" class="adminMap">

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_advanced/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -163,6 +166,15 @@
<p class="x_help-block">{$lang->about_cache_truncate_method}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->manager_layout}</label>
<div class="x_controls">
<label for="manager_layout_module" class="x_inline"><input type="radio" name="manager_layout" id="manager_layout_module" value="module" checked="checked"|cond="$manager_layout != 'admin'" /> {$lang->cmd_manager_layout_module}</label>
<label for="manager_layout_admin" class="x_inline"><input type="radio" name="manager_layout" id="manager_layout_admin" value="admin" checked="checked"|cond="$manager_layout == 'admin'" /> {$lang->cmd_manager_layout_admin}</label>
<br />
<p class="x_help-block">{$lang->about_manager_layout}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->minify_scripts}</label>
<div class="x_controls">

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_debug/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -45,9 +48,9 @@
<div class="x_control-group">
<label class="x_control-label" for="debug_log_slow_widgets">{$lang->debug_display_type}</label>
<div class="x_controls">
<label for="debug_display_type_comment" class="x_inline"><input type="radio" name="debug_display_type" id="debug_display_type_comment" value="comment" checked="checked"|cond="$debug_display_type=='comment'" /> {$lang->debug_display_type_comment}</label>
<label for="debug_display_type_panel" class="x_inline"><input type="radio" name="debug_display_type" id="debug_display_type_panel" value="panel" checked="checked"|cond="$debug_display_type=='panel'" /> {$lang->debug_display_type_panel}</label>
<label for="debug_display_type_file" class="x_inline"><input type="radio" name="debug_display_type" id="debug_display_type_file" value="file" checked="checked"|cond="$debug_display_type=='file'" /> {$lang->debug_display_type_file}</label>
<label for="debug_display_type_comment" class="x_inline"><input type="checkbox" name="debug_display_type[]" id="debug_display_type_comment" value="comment" checked="checked"|cond="in_array('comment', $debug_display_type)" /> {$lang->debug_display_type_comment}</label>
<label for="debug_display_type_panel" class="x_inline"><input type="checkbox" name="debug_display_type[]" id="debug_display_type_panel" value="panel" checked="checked"|cond="in_array('panel', $debug_display_type)" /> {$lang->debug_display_type_panel}</label>
<label for="debug_display_type_file" class="x_inline"><input type="checkbox" name="debug_display_type[]" id="debug_display_type_file" value="file" checked="checked"|cond="in_array('file', $debug_display_type)" /> {$lang->debug_display_type_file}</label>
</div>
</div>
<div class="x_control-group">

View file

@ -1,34 +1,43 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_domains/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<section class="section">
<table id="domain_list" class="x_table x_table-striped x_table-hover">
<table id="domain_list" class="x_table x_table-striped x_table-hover dsTg">
<caption>
<div class="x_pull-right x_btn-group">
<button class="x_btn x_active __simple">{$lang->simple_view}</button>
<button class="x_btn __detail">{$lang->detail_view}</button>
</div>
</caption>
<thead>
<tr>
<th scope="col" class="nowr">{$lang->site_title}</th>
<th scope="col" class="nowr">{$lang->domain}</th>
<th scope="col" class="nowr">{$lang->use_ssl}</th>
<th scope="col" class="nowr">{$lang->cmd_index_module_srl}</th>
<th scope="col" class="nowr">{$lang->cmd_index_document_srl}</th>
<th scope="col" class="nowr rx_detail_marks">{$lang->use_ssl}</th>
<th scope="col" class="nowr rx_detail_marks">{$lang->cmd_index_module_srl}</th>
<th scope="col" class="nowr rx_detail_marks">{$lang->cmd_index_document_srl}</th>
<th scope="col" class="nowr">{$lang->cmd_modify} / {$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
<tr loop="$domain_list->data => $domain">
<td class="nowr">
{$domain->settings->title}
{$domain->settings->title|autolang}
<i cond="$domain->is_default_domain === 'Y'" class="x_icon-home" title="{$lang->cmd_is_default_domain}">{$lang->cmd_is_default_domain}</i>
</td>
<td class="nowr">{$domain->domain}</td>
<td class="nowr">{preg_replace('/\\(.+$/', '', $lang->ssl_options[$domain->security ?: 'none'])}</td>
<td class="nowr">
<td class="nowr rx_detail_marks">{preg_replace('/\\(.+$/', '', $lang->ssl_options[$domain->security ?: 'none'])}</td>
<td class="nowr rx_detail_marks">
<a href="{getSiteUrl($domain->domain, '', 'mid', $module_list[$domain->index_module_srl]->mid)}" cond="$domain->index_module_srl && $module_list[$domain->index_module_srl]" target="_blank">
{($domain->index_module_srl && $module_list[$domain->index_module_srl]) ? $module_list[$domain->index_module_srl]->browser_title : ''}
</a>
</td>
<td class="nowr">
<td class="nowr rx_detail_marks">
<a href="{getSiteUrl($domain->domain, '', 'mid', $module_list[$domain->index_module_srl]->mid, 'document_srl', $domain->index_document_srl)}" cond="$domain->index_document_srl" target="_blank">
{$domain->index_document_srl ?: ''}
</a>
@ -115,7 +124,7 @@
event.preventDefault();
var domain = $(this).data("domain");
var domain_srl = $(this).data("domain-srl");
if (confirm({$lang->cmd_delete_domain|json} + "\n" + domain)) {
if (confirm({$lang->cmd_delete_domain|json|noescape} + "\n" + domain)) {
exec_json('admin.procAdminDeleteDomain', { domain_srl: domain_srl }, function() {
window.location.reload();
});

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_domains_edit/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -8,7 +11,6 @@
<input type="hidden" name="act" value="procAdminInsertDomain" />
<input type="hidden" name="xe_validator_id" value="modules/admin/tpl/config_domains_edit/1" />
<input type="hidden" name="domain_srl" value="{$domain_info ? $domain_info->domain_srl : ''}" />
<div class="x_control-group">
<label class="x_control-label">{$lang->site_title}</label>
<div class="x_controls">

View file

@ -1,7 +1,10 @@
<config autoescape="on" />
<load target="./js/config.js" />
<load target="../../session/tpl/js/session.js" />
<div class="x_page-header">
<h1>{$lang->menu_gnb_sub['adminConfigurationFtp']} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_config_ftp" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->menu_gnb_sub['adminConfigurationFtp']}</h1>
</div>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_ftp/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>

View file

@ -1,7 +1,9 @@
<config autoescape="on" />
<load target="./js/config.js" />
<load target="../../session/tpl/js/session.js" />
<div class="x_page-header">
<h1>{$lang->menu_gnb_sub['adminConfigurationGeneral']} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_config_general" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->menu_gnb_sub['adminConfigurationGeneral']}</h1>
</div>
<ul class="x_nav x_nav-tabs">
<li class="x_active"|cond="$act == 'dispAdminConfigGeneral' || preg_match('/^dispAdmin.+Domain/', $act)"><a href="{getUrl('', 'module', 'admin', 'act', 'dispAdminConfigGeneral')}">{$lang->subtitle_site_info}</a></li>

View file

@ -1,5 +1,8 @@
<config autoescape="on" />
<include target="config_header.html" />
<load target="js/notification_config.js" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_notification/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -23,7 +26,7 @@
<div class="x_controls">
<input type="text" name="mail_default_name" id="mail_default_name" value="{escape($member_config->webmaster_name) ?: $module_config->siteTitle}" />
<br />
<p class="x_help-block">{$lang->cmd_admin_default_from_name_help}</p>
<p class="x_help-block" style="margin-top:10px">{$lang->cmd_admin_default_from_name_help}</p>
</div>
</div>
@ -37,7 +40,7 @@
{$lang->cmd_admin_force_default_sender}
</label>
<br />
<p class="x_help-block">{$lang->cmd_admin_default_from_email_help}</p>
<p class="x_help-block" style="margin-top:10px">{$lang->cmd_admin_default_from_email_help}</p>
</div>
</div>
@ -46,7 +49,7 @@
<div class="x_controls">
<input type="text" name="mail_default_reply_to" id="mail_default_reply_to" value="{escape($advanced_mailer_config->reply_to ?: config('mail.default_reply_to'))}" />
<br />
<p class="x_help-block">{$lang->cmd_admin_default_reply_to_help}</p>
<p class="x_help-block" style="margin-top:10px">{$lang->cmd_admin_default_reply_to_help}</p>
</div>
</div>
@ -58,9 +61,12 @@
<option value="{$driver_name}" selected="selected"|cond="$mail_driver === $driver_name">{$driver_definition['name']}</option>
<!--@end-->
</select>
<p class="x_help-block hidden-by-default show-for-dummy">
<p class="x_help-block hidden-by-default show-for-dummy" style="margin-top:10px">
{$lang->msg_advanced_mailer_about_dummy}<br />{$lang->msg_advanced_mailer_about_dummy_exceptions}
</p>
<p class="x_help-block hidden-by-default show-for-mailfunction" style="margin-top:10px">
{$lang->msg_advanced_mailer_about_mailfunction}
</p>
</div>
</div>
@ -213,7 +219,7 @@
{$lang->cmd_admin_force_default_sender}
</label>
<br />
<p class="x_help-block">{$lang->cmd_admin_default_from_phone_help}</p>
<p class="x_help-block" style="margin-top:10px">{$lang->cmd_admin_default_from_phone_help}</p>
</div>
</div>
@ -225,7 +231,7 @@
<option value="{$driver_name}" selected="selected"|cond="$sms_driver === $driver_name">{$driver_definition['name']}</option>
<!--@end-->
</select>
<p class="x_help-block hidden-by-default show-for-dummy">
<p class="x_help-block hidden-by-default show-for-dummy" style="margin-top:10px">
{$lang->cmd_admin_sms_dummy_driver_help}
</p>
</div>
@ -289,7 +295,6 @@
<label class="x_control-label" for="sms_{$driver_name}_sender_key">{$lang->cmd_advanced_mailer_sender_key}</label>
<div class="x_controls">
<input type="password" name="sms_{$driver_name}_sender_key" id="sms_{$driver_name}_sender_key" value="{$conf_value}" />
<br />
<p class="x_help-block">{$lang->cmd_admin_sms_sender_key_help}</p>
</div>
</div>

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_security/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -66,6 +69,24 @@
<p class="x_help-block">{$lang->about_use_cookies_ssl}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->check_csrf_token}</label>
<div class="x_controls">
<label for="check_csrf_token_y" class="x_inline"><input type="radio" name="check_csrf_token" id="check_csrf_token_y" value="Y" checked="checked"|cond="$check_csrf_token" /> {$lang->cmd_yes}</label>
<label for="check_csrf_token_n" class="x_inline"><input type="radio" name="check_csrf_token" id="check_csrf_token_n" value="N" checked="checked"|cond="!$check_csrf_token" /> {$lang->cmd_no}</label>
<br />
<p class="x_help-block">{$lang->about_check_csrf_token}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->use_nofollow}</label>
<div class="x_controls">
<label for="use_nofollow_y" class="x_inline"><input type="radio" name="use_nofollow" id="use_nofollow_y" value="Y" checked="checked"|cond="$use_nofollow" /> {$lang->cmd_yes}</label>
<label for="use_nofollow_n" class="x_inline"><input type="radio" name="use_nofollow" id="use_nofollow_n" value="N" checked="checked"|cond="!$use_nofollow" /> {$lang->cmd_no}</label>
<br />
<p class="x_help-block">{$lang->about_use_nofollow}</p>
</div>
</div>
<div class="x_clearfix btnArea">
<div class="x_pull-right">
<button type="submit" class="x_btn x_btn-primary">{$lang->cmd_save}</button>

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_seo/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="config_header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/admin/tpl/config_sitelock/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
@ -9,7 +12,7 @@
<input type="hidden" name="xe_validator_id" value="modules/admin/tpl/config_sitelock/1" />
<div class="x_control-group">
<label class="x_control-label">{$lang->use_sitelock} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_config_general_sitelock" target="_blank">{$lang->help}</a></label>
<label class="x_control-label">{$lang->use_sitelock}</label>
<div class="x_controls">
<label for="sitelock_locked_y" class="x_inline"><input type="radio" name="sitelock_locked" id="sitelock_locked_y" value="Y" checked="checked"|cond="$sitelock_locked" /> {$lang->cmd_yes}</label>
<label for="sitelock_locked_n" class="x_inline"><input type="radio" name="sitelock_locked" id="sitelock_locked_n" value="N" checked="checked"|cond="!$sitelock_locked" /> {$lang->cmd_no}</label>
@ -17,7 +20,7 @@
</div>
<div class="x_control-group">
<label class="x_control-label" for="sitelock_allowed_ip">{$lang->sitelock_whitelist} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_config_general_sitelock_whitelist" target="_blank">{$lang->help}</a></label>
<label class="x_control-label" for="sitelock_allowed_ip">{$lang->sitelock_whitelist}</label>
<div class="x_controls">
<textarea name="sitelock_allowed_ip" id="sitelock_allowed_ip" rows="4" cols="42" style="margin-right:10px">{$sitelock_allowed_ip}</textarea>
<span class="x_help-block">{$lang->your_ip} : {$remote_addr}</span>

View file

@ -87,7 +87,7 @@
.x .x_clearfix:after{clear:both}
.x .x_hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
.x .x_input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
.x a{color:#0088cc;text-decoration:none}
.x a{color:#1a87ff;text-decoration:none}
.x a:hover{color:#005580;text-decoration:underline}
.x .x_img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}
.x .x_img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1)}
@ -524,7 +524,7 @@
.x .x_control-group.x_info .x_input-append .x_add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}
.x input:focus:invalid,
.x textarea:focus:invalid,
.x select:focus:invalid{color:#b94a48;border-color:#ee5f5b}
.x select:focus:invalid{color:#b94a48;border-color:#ff534a}
.x input:focus:invalid:focus,
.x textarea:focus:invalid:focus,
.x select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}
@ -748,8 +748,36 @@
.x .x_table-hover tbody tr.x_error:hover td{background-color:#ebcccc}
.x .x_table-hover tbody tr.x_warning:hover td{background-color:#faf2cc}
.x .x_table-hover tbody tr.x_info:hover td{background-color:#c4e3f3}
@font-face {
font-family: 'xeicon';
src:url('../../../../../common/css/xeicon/fonts/xeicon.eot?v=1.0.4');
src:url('../../../../../common/css/xeicon/fonts/xeicon.eot?#iefix&v=1.0.4') format('embedded-opentype'),
url('../../../../../common/css/xeicon/fonts/xeicon.woff2?v=1.0.4') format('woff2'),
url('../../../../../common/css/xeicon/fonts/xeicon.woff?v=1.0.4') format('woff'),
url('../../../../../common/css/xeicon/fonts/xeicon.ttf?v=1.0.4') format('truetype'),
url('../../../../../common/css/xeicon/fonts/xeicon.svg?v=1.0.4#xeicon') format('svg');
font-weight: normal;
font-style: normal;
}
.x [class^="x_icon-"],
.x [class*=" x_icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}
.x [class*=" x_icon-"]{
display:inline-block;
width:14px;
height:14px;
font-size:14px;
font-family: 'xeicon'!important;
background: transparent !important;
speak: none;
text-indent:0;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #000;
}
/* White icons with optional class, or on hover/active states of certain elements */
#gnb.gnb.open .x_icon-white,
.x .x_nav-pills>.x_active>a>[class^="x_icon-"],
@ -763,147 +791,153 @@
.x .x_dropdown-menu>.x_active>a>[class^="x_icon-"],
.x .x_dropdown-menu>.x_active>a>[class*=" x_icon-"],
.x .x_dropdown-submenu:hover>a>[class^="x_icon-"],
.x .x_dropdown-submenu:hover>a>[class*=" x_icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}
.x .x_icon-glass{background-position:0 0}
.x .x_icon-music{background-position:-24px 0}
.x .x_icon-search{background-position:-48px 0}
.x .x_icon-envelope{background-position:-72px 0}
.x .x_icon-heart{background-position:-96px 0}
.x .x_icon-star{background-position:-120px 0}
.x .x_icon-star-empty{background-position:-144px 0}
.x .x_icon-user{background-position:-168px 0}
.x .x_icon-film{background-position:-192px 0}
.x .x_icon-th-large{background-position:-216px 0}
.x .x_icon-th{background-position:-240px 0}
.x .x_icon-th-list{background-position:-264px 0}
.x .x_icon-ok{background-position:-288px 0}
.x .x_icon-remove{background-position:-312px 0}
.x .x_icon-zoom-in{background-position:-336px 0}
.x .x_icon-zoom-out{background-position:-360px 0}
.x .x_icon-off{background-position:-384px 0}
.x .x_icon-signal{background-position:-408px 0}
.x .x_icon-cog{background-position:-432px 0}
.x .x_icon-trash{background-position:-456px 0}
.x .x_icon-home{background-position:0 -24px}
.x .x_icon-file{background-position:-24px -24px}
.x .x_icon-time{background-position:-48px -24px}
.x .x_icon-road{background-position:-72px -24px}
.x .x_icon-download-alt{background-position:-96px -24px}
.x .x_icon-download{background-position:-120px -24px}
.x .x_icon-upload{background-position:-144px -24px}
.x .x_icon-inbox{background-position:-168px -24px}
.x .x_icon-play-circle{background-position:-192px -24px}
.x .x_icon-repeat{background-position:-216px -24px}
.x .x_icon-refresh{background-position:-240px -24px}
.x .x_icon-list-alt{background-position:-264px -24px}
.x .x_icon-lock{background-position:-287px -24px}
.x .x_icon-flag{background-position:-312px -24px}
.x .x_icon-headphones{background-position:-336px -24px}
.x .x_icon-volume-off{background-position:-360px -24px}
.x .x_icon-volume-down{background-position:-384px -24px}
.x .x_icon-volume-up{background-position:-408px -24px}
.x .x_icon-qrcode{background-position:-432px -24px}
.x .x_icon-barcode{background-position:-456px -24px}
.x .x_icon-tag{background-position:0 -48px}
.x .x_icon-tags{background-position:-25px -48px}
.x .x_icon-book{background-position:-48px -48px}
.x .x_icon-bookmark{background-position:-72px -48px}
.x .x_icon-print{background-position:-96px -48px}
.x .x_icon-camera{background-position:-120px -48px}
.x .x_icon-font{background-position:-144px -48px}
.x .x_icon-bold{background-position:-167px -48px}
.x .x_icon-italic{background-position:-192px -48px}
.x .x_icon-text-height{background-position:-216px -48px}
.x .x_icon-text-width{background-position:-240px -48px}
.x .x_icon-align-left{background-position:-264px -48px}
.x .x_icon-align-center{background-position:-288px -48px}
.x .x_icon-align-right{background-position:-312px -48px}
.x .x_icon-align-justify{background-position:-336px -48px}
.x .x_icon-list{background-position:-360px -48px}
.x .x_icon-indent-left{background-position:-384px -48px}
.x .x_icon-indent-right{background-position:-408px -48px}
.x .x_icon-facetime-video{background-position:-432px -48px}
.x .x_icon-picture{background-position:-456px -48px}
.x .x_icon-pencil{background-position:0 -72px}
.x .x_icon-map-marker{background-position:-24px -72px}
.x .x_icon-adjust{background-position:-48px -72px}
.x .x_icon-tint{background-position:-72px -72px}
.x .x_icon-edit{background-position:-96px -72px}
.x .x_icon-share{background-position:-120px -72px}
.x .x_icon-check{background-position:-144px -72px}
.x .x_icon-move{background-position:-168px -72px}
.x .x_icon-step-backward{background-position:-192px -72px}
.x .x_icon-fast-backward{background-position:-216px -72px}
.x .x_icon-backward{background-position:-240px -72px}
.x .x_icon-play{background-position:-264px -72px}
.x .x_icon-pause{background-position:-288px -72px}
.x .x_icon-stop{background-position:-312px -72px}
.x .x_icon-forward{background-position:-336px -72px}
.x .x_icon-fast-forward{background-position:-360px -72px}
.x .x_icon-step-forward{background-position:-384px -72px}
.x .x_icon-eject{background-position:-408px -72px}
.x .x_icon-chevron-left{background-position:-432px -72px}
.x .x_icon-chevron-right{background-position:-456px -72px}
.x .x_icon-plus-sign{background-position:0 -96px}
.x .x_icon-minus-sign{background-position:-24px -96px}
.x .x_icon-remove-sign{background-position:-48px -96px}
.x .x_icon-ok-sign{background-position:-72px -96px}
.x .x_icon-question-sign{background-position:-96px -96px}
.x .x_icon-info-sign{background-position:-120px -96px}
.x .x_icon-screenshot{background-position:-144px -96px}
.x .x_icon-remove-circle{background-position:-168px -96px}
.x .x_icon-ok-circle{background-position:-192px -96px}
.x .x_icon-ban-circle{background-position:-216px -96px}
.x .x_icon-arrow-left{background-position:-240px -96px}
.x .x_icon-arrow-right{background-position:-264px -96px}
.x .x_icon-arrow-up{background-position:-289px -96px}
.x .x_icon-arrow-down{background-position:-312px -96px}
.x .x_icon-share-alt{background-position:-336px -96px}
.x .x_icon-resize-full{background-position:-360px -96px}
.x .x_icon-resize-small{background-position:-384px -96px}
.x .x_icon-plus{background-position:-408px -96px}
.x .x_icon-minus{background-position:-433px -96px}
.x .x_icon-asterisk{background-position:-456px -96px}
.x .x_icon-exclamation-sign{background-position:0 -120px}
.x .x_icon-gift{background-position:-24px -120px}
.x .x_icon-leaf{background-position:-48px -120px}
.x .x_icon-fire{background-position:-72px -120px}
.x .x_icon-eye-open{background-position:-96px -120px}
.x .x_icon-eye-close{background-position:-120px -120px}
.x .x_icon-warning-sign{background-position:-144px -120px}
.x .x_icon-plane{background-position:-168px -120px}
.x .x_icon-calendar{background-position:-192px -120px}
.x .x_icon-random{width:16px;background-position:-216px -120px}
.x .x_icon-comment{background-position:-240px -120px}
.x .x_icon-magnet{background-position:-264px -120px}
.x .x_icon-chevron-up{background-position:-288px -120px}
.x .x_icon-chevron-down{background-position:-313px -119px}
.x .x_icon-retweet{background-position:-336px -120px}
.x .x_icon-shopping-cart{background-position:-360px -120px}
.x .x_icon-folder-close{background-position:-384px -120px}
.x .x_icon-folder-open{width:16px;background-position:-408px -120px}
.x .x_icon-resize-vertical{background-position:-432px -119px}
.x .x_icon-resize-horizontal{background-position:-456px -118px}
.x .x_icon-hdd{background-position:0 -144px}
.x .x_icon-bullhorn{background-position:-24px -144px}
.x .x_icon-bell{background-position:-48px -144px}
.x .x_icon-certificate{background-position:-72px -144px}
.x .x_icon-thumbs-up{background-position:-96px -144px}
.x .x_icon-thumbs-down{background-position:-120px -144px}
.x .x_icon-hand-right{background-position:-144px -144px}
.x .x_icon-hand-left{background-position:-168px -144px}
.x .x_icon-hand-up{background-position:-192px -144px}
.x .x_icon-hand-down{background-position:-216px -144px}
.x .x_icon-circle-arrow-right{background-position:-240px -144px}
.x .x_icon-circle-arrow-left{background-position:-264px -144px}
.x .x_icon-circle-arrow-up{background-position:-288px -144px}
.x .x_icon-circle-arrow-down{background-position:-312px -144px}
.x .x_icon-globe{background-position:-336px -144px}
.x .x_icon-wrench{background-position:-360px -144px}
.x .x_icon-tasks{background-position:-384px -144px}
.x .x_icon-filter{background-position:-408px -144px}
.x .x_icon-briefcase{background-position:-432px -144px}
.x .x_icon-fullscreen{background-position:-456px -144px}
.x .x_dropdown-submenu:hover>a>[class*=" x_icon-"]{color: #fff;}
.x .x_icon-glass::before{content: "\e872";}
.x .x_icon-music::before{content: "\e744";}
.x .x_icon-search::before{content: "\e63b";}
.x .x_icon-envelope::before{content: "\e6cc";}
.x .x_icon-heart::before{content: "\e6ff";}
.x .x_icon-star::before{content: "\e6fe";}
.x .x_icon-star-empty::before{content: "\e6fe";}
.x .x_icon-user::before{content: "\e68a";}
.x .x_icon-film::before{content: "\e733";}
.x .x_icon-th-large::before{content: "\e697";}
.x .x_icon-th::before{content: "\e6b2";}
.x .x_icon-th-list::before{content: "\e6a5";}
.x .x_icon-ok::before{content: "\e6e0";}
.x .x_icon-remove::before{content: "\e616";}
.x .x_icon-zoom-in::before{content: "\e63d";}
.x .x_icon-zoom-out::before{content: "\e65e";}
.x .x_icon-off::before{content: "\e643";}
.x .x_icon-signal::before{content: "\e66a";}
.x .x_icon-cog::before{content: "\e686";}
.x .x_icon-trash::before{content: "\e662";}
.x .x_icon-home::before{content: "\e606";}
.x .x_icon-file::before{content: "\e7b1";}
.x .x_icon-time::before{content: "\e790";}
.x .x_icon-road::before{content: "\e752";}
.x .x_icon-download-alt::before{content: "\e622";}
.x .x_icon-download::before{content: "\e651";}
.x .x_icon-upload::before{content: "\e652";}
.x .x_icon-inbox::before{content: "\e655";}
.x .x_icon-play-circle::before{content: "\e71d";}
.x .x_icon-repeat::before{content: "\e671";}
.x .x_icon-refresh::before{content: "\e642";}
.x .x_icon-list-alt::before{content: "\e6af";}
.x .x_icon-lock::before{content: "\e66b";}
.x .x_icon-flag::before{content: "\e750";}
.x .x_icon-headphones::before{content: "\e736";}
.x .x_icon-volume-off::before{content: "\e740";}
.x .x_icon-volume-down::before{content: "\e73c";}
.x .x_icon-volume-up::before{content: "\e73a";}
.x .x_icon-qrcode::before{content: "\e857";}
.x .x_icon-barcode::before{content: "\e803";}
.x .x_icon-tag::before{content: "\e70a";}
.x .x_icon-tags::before{content: "\e70b";}
.x .x_icon-book::before{content: "\e70f";}
.x .x_icon-bookmark::before{content: "\e70d";}
.x .x_icon-print::before{content: "\e785";}
.x .x_icon-camera::before{content: "\e72c";}
.x .x_icon-font::before{content: "\e66d";}
.x .x_icon-bold::before{content: "\e69e";}
.x .x_icon-italic::before{content: "\e6a0";}
.x .x_icon-text-height::before{content: "\e688";}
.x .x_icon-text-width::before{content: "\e63e";}
.x .x_icon-align-left::before{content: "\e691";}
.x .x_icon-align-center::before{content: "\e692";}
.x .x_icon-align-right::before{content: "\e693";}
.x .x_icon-align-justify::before{content: "\e690";}
.x .x_icon-list::before{content: "\e6a4";}
.x .x_icon-indent-left::before{content: "\e706";}
.x .x_icon-indent-right::before{content: "\e705";}
.x .x_icon-facetime-video::before{content: "\e72a";}
.x .x_icon-picture::before{content: "\e729";}
.x .x_icon-pencil::before{content: "\e673";}
.x .x_icon-map-marker::before{content: "\e763";}
.x .x_icon-adjust::before{content: "\e72d";}
.x .x_icon-tint::before{
content: "\e60f";
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.x .x_icon-edit::before{content: "\e67a";}
.x .x_icon-share::before{content: "\e664";}
.x .x_icon-check::before{content: "\e6e2";}
.x .x_icon-move::before{content: "\e639";}
.x .x_icon-step-backward::before{content: "\e705";}
.x .x_icon-fast-backward::before{content: "\e707";}
.x .x_icon-backward::before{content: "\e720";}
.x .x_icon-play::before{content: "\e71d";}
.x .x_icon-pause::before{content: "\e72e";}
.x .x_icon-stop::before{content: "\e709";}
.x .x_icon-forward::before{content: "\e71f";}
.x .x_icon-fast-forward::before{content: "\e708";}
.x .x_icon-step-forward::before{content: "\e706";}
.x .x_icon-eject::before{content: "\e72f";}
.x .x_icon-chevron-left::before{content: "\e60b";}
.x .x_icon-chevron-right::before{content: "\e60d";}
.x .x_icon-plus-sign::before{content: "\e611";}
.x .x_icon-minus-sign::before{content: "\e614";}
.x .x_icon-remove-sign::before{content: "\e617";}
.x .x_icon-ok-sign::before{content: "\e6e4";}
.x .x_icon-question-sign::before{content: "\e719";}
.x .x_icon-info-sign::before{content: "\e727";}
.x .x_icon-screenshot::before{content: "\e68f";}
.x .x_icon-remove-circle::before{content: "\e617";}
.x .x_icon-ok-circle::before{content: "\e6e3";}
.x .x_icon-ban-circle::before{content: "\e60a";}
.x .x_icon-arrow-left::before{content: "\e625";}
.x .x_icon-arrow-right::before{content: "\e626";}
.x .x_icon-arrow-up::before{content: "\e627";}
.x .x_icon-arrow-down::before{content: "\e628";}
.x .x_icon-share-alt::before{content: "\e64f";}
.x .x_icon-resize-full::before{content: "\e61c";}
.x .x_icon-resize-small::before{content: "\e63c";}
.x .x_icon-plus::before{content: "\e603";}
.x .x_icon-minus::before{content: "\e613";}
.x .x_icon-asterisk::before{content: "\e815";}
.x .x_icon-exclamation-sign::before{content: "\e71a";}
.x .x_icon-gift::before{content: "\e755";}
.x .x_icon-leaf::before{content: "\e894";}
.x .x_icon-fire::before{content: "\e874";}
.x .x_icon-eye-open::before{content: "\e64a";}
.x .x_icon-eye-close::before{content: "\e61f";}
.x .x_icon-warning-sign::before{content: "\e6f8";}
.x .x_icon-plane::before{content: "\e75d";}
.x .x_icon-calendar::before{content: "\e7a9";}
.x .x_icon-random{content: "\e60c";}
.x .x_icon-comment::before{content: "\e6de";}
.x .x_icon-magnet::before{content: "\e67d";}
.x .x_icon-chevron-up::before{content: "\e60e";}
.x .x_icon-chevron-down::before{content: "\e619";}
.x .x_icon-retweet::before{content: "\e670";}
.x .x_icon-shopping-cart::before{content: "\e7fe";}
.x .x_icon-folder-close::before{content: "\e7c2";}
.x .x_icon-folder-open{content: "\e7c3";}
.x .x_icon-resize-vertical::before{content: "\e63f";}
.x .x_icon-resize-horizontal::before{content: "\e63e";}
.x .x_icon-hdd::before{content: "\e78a";}
.x .x_icon-bullhorn::before{content: "\e608";}
.x .x_icon-bell::before{content: "\e798";}
.x .x_icon-certificate::before{content: "\e700";}
.x .x_icon-thumbs-up::before{content: "\e6fc";}
.x .x_icon-thumbs-down::before{content: "\e6fd";}
.x .x_icon-hand-right::before{content: "\e626";}
.x .x_icon-hand-left::before{content: "\e625";}
.x .x_icon-hand-up::before{content: "\e627";}
.x .x_icon-hand-down::before{content: "\e628";}
.x .x_icon-circle-arrow-right::before{content: "\e61d";}
.x .x_icon-circle-arrow-left::before{content: "\e61a";}
.x .x_icon-circle-arrow-up::before{content: "\e620";}
.x .x_icon-circle-arrow-down::before{content: "\e623";}
.x .x_icon-globe::before{content: "\e7f6";}
.x .x_icon-wrench::before{content: "\e68b";}
.x .x_icon-tasks::before{content: "\e607";}
.x .x_icon-filter::before{content: "\e7f7";}
.x .x_icon-briefcase::before{content: "\e7f9";}
.x .x_icon-fullscreen::before{content: "\e61c";}
.x .x_dropup,
.x .x_dropdown{position:relative}
.x .x_dropdown-toggle{*margin-bottom:-3px}
@ -917,9 +951,9 @@
.x .x_dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap}
.x .x_dropdown-menu li>a:hover,
.x .x_dropdown-menu li>a:focus,
.x .x_dropdown-submenu:hover>a{color:#ffffff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0077b3', GradientType=0)}
.x .x_dropdown-submenu:hover>a{color:#ffffff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top, #1a87ff, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#1a87ff), to(#0077b3));background-image:-webkit-linear-gradient(top, #1a87ff, #0077b3);background-image:-o-linear-gradient(top, #1a87ff, #0077b3);background-image:linear-gradient(to bottom, #1a87ff, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a87ff', endColorstr='#0077b3', GradientType=0)}
.x .x_dropdown-menu .x_active>a,
.x .x_dropdown-menu .x_active>a:hover{color:#ffffff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0077b3', GradientType=0)}
.x .x_dropdown-menu .x_active>a:hover{color:#ffffff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top, #1a87ff, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#1a87ff), to(#0077b3));background-image:-webkit-linear-gradient(top, #1a87ff, #0077b3);background-image:-o-linear-gradient(top, #1a87ff, #0077b3);background-image:linear-gradient(to bottom, #1a87ff, #0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a87ff', endColorstr='#0077b3', GradientType=0)}
.x .x_dropdown-menu .x_disabled>a,
.x .x_dropdown-menu .x_disabled>a:hover{color:#999999}
.x .x_dropdown-menu .x_disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
@ -987,47 +1021,47 @@
.x .x_btn-info.x_active,
.x .x_btn-inverse.x_active{color:rgba(255, 255, 255, 0.75)}
.x .x_btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25)}
.x .x_btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;*background-color:#0044cc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#007aff;background-image:-moz-linear-gradient(top, #1a87ff, #007aff);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#1a87ff), to(#007aff));background-image:-webkit-linear-gradient(top, #1a87ff, #007aff);background-image:-o-linear-gradient(top, #1a87ff, #007aff);background-image:linear-gradient(to bottom, #1a87ff, #007aff);background-repeat:repeat-x;border-color:#007aff #007aff #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a87ff', endColorstr='#007aff', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-primary:hover,
.x .x_btn-primary:active,
.x .x_btn-primary.x_active,
.x .x_btn-primary.x_disabled,
.x .x_btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3}
.x .x_btn-primary[disabled]{color:#ffffff;background-color:#007aff;*background-color:#003bb3}
.x .x_btn-primary:active,
.x .x_btn-primary.x_active{background-color:#003399 \9}
.x .x_btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ff9500;background-image:-moz-linear-gradient(top, #ffa01a, #ff9500);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffa01a), to(#ff9500));background-image:-webkit-linear-gradient(top, #ffa01a, #ff9500);background-image:-o-linear-gradient(top, #ffa01a, #ff9500);background-image:linear-gradient(to bottom, #ffa01a, #ff9500);background-repeat:repeat-x;border-color:#ff9500 #ff9500 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa01a', endColorstr='#ff9500', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-warning:hover,
.x .x_btn-warning:active,
.x .x_btn-warning.x_active,
.x .x_btn-warning.x_disabled,
.x .x_btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505}
.x .x_btn-warning[disabled]{color:#ffffff;background-color:#ff9500;*background-color:#df8505}
.x .x_btn-warning:active,
.x .x_btn-warning.x_active{background-color:#c67605 \9}
.x .x_btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ff3b30;background-image:-moz-linear-gradient(top, #ff534a, #ff3b30);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ff534a), to(#ff3b30));background-image:-webkit-linear-gradient(top, #ff534a, #ff3b30);background-image:-o-linear-gradient(top, #ff534a, #ff3b30);background-image:linear-gradient(to bottom, #ff534a, #ff3b30);background-repeat:repeat-x;border-color:#ff3b30 #ff3b30 #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff534a', endColorstr='#ff3b30', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-danger:hover,
.x .x_btn-danger:active,
.x .x_btn-danger.x_active,
.x .x_btn-danger.x_disabled,
.x .x_btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a}
.x .x_btn-danger[disabled]{color:#ffffff;background-color:#ff3b30;*background-color:#a9302a}
.x .x_btn-danger:active,
.x .x_btn-danger.x_active{background-color:#942a25 \9}
.x .x_btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#4cd964;background-image:-moz-linear-gradient(top, #61dd76, #4cd964);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#61dd76), to(#4cd964));background-image:-webkit-linear-gradient(top, #61dd76, #4cd964);background-image:-o-linear-gradient(top, #61dd76, #4cd964);background-image:linear-gradient(to bottom, #61dd76, #4cd964);background-repeat:repeat-x;border-color:#4cd964 #4cd964 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61dd76', endColorstr='#4cd964', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-success:hover,
.x .x_btn-success:active,
.x .x_btn-success.x_active,
.x .x_btn-success.x_disabled,
.x .x_btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249}
.x .x_btn-success[disabled]{color:#ffffff;background-color:#4cd964;*background-color:#499249}
.x .x_btn-success:active,
.x .x_btn-success.x_active{background-color:#408140 \9}
.x .x_btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0277BD;background-image:-moz-linear-gradient(top, #0288D1, #0277BD);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0288D1), to(#0277BD));background-image:-webkit-linear-gradient(top, #0288D1, #0277BD);background-image:-o-linear-gradient(top, #0288D1, #0277BD);background-image:linear-gradient(to bottom, #0288D1, #0277BD);background-repeat:repeat-x;border-color:#0277BD #0277BD #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0288D1', endColorstr='#0277BD', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-info:hover,
.x .x_btn-info:active,
.x .x_btn-info.x_active,
.x .x_btn-info.x_disabled,
.x .x_btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0}
.x .x_btn-info[disabled]{color:#ffffff;background-color:#0277BD;*background-color:#2a85a0}
.x .x_btn-info:active,
.x .x_btn-info.x_active{background-color:#24748c \9}
.x .x_btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;*background-color:#222222;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#444444', endColorstr='#222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#222222;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#444444', endColorstr='#222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
.x .x_btn-inverse:hover,
.x .x_btn-inverse:active,
.x .x_btn-inverse.x_active,
@ -1048,7 +1082,7 @@
.x .x_btn-link,
.x .x_btn-link:active,
.x .x_btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}
.x .x_btn-link{color:#0088cc;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.x .x_btn-link{color:#1a87ff;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.x .x_btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}
.x .x_btn-link[disabled]:hover{color:#333333;text-decoration:none}
.x .x_btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}
@ -1084,11 +1118,11 @@
.x .x_btn-group>.x_btn-large+.x_dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}
.x .x_btn-group.x_open .x_dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05)}
.x .x_btn-group.x_open .x_btn.x_dropdown-toggle{background-color:#e6e6e6}
.x .x_btn-group.x_open .x_btn-primary.x_dropdown-toggle{background-color:#0044cc}
.x .x_btn-group.x_open .x_btn-warning.x_dropdown-toggle{background-color:#f89406}
.x .x_btn-group.x_open .x_btn-danger.x_dropdown-toggle{background-color:#bd362f}
.x .x_btn-group.x_open .x_btn-success.x_dropdown-toggle{background-color:#51a351}
.x .x_btn-group.x_open .x_btn-info.x_dropdown-toggle{background-color:#2f96b4}
.x .x_btn-group.x_open .x_btn-primary.x_dropdown-toggle{background-color:#007aff}
.x .x_btn-group.x_open .x_btn-warning.x_dropdown-toggle{background-color:#ff9500}
.x .x_btn-group.x_open .x_btn-danger.x_dropdown-toggle{background-color:#ff3b30}
.x .x_btn-group.x_open .x_btn-success.x_dropdown-toggle{background-color:#4cd964}
.x .x_btn-group.x_open .x_btn-info.x_dropdown-toggle{background-color:#0277BD}
.x .x_btn-group.x_open .x_btn-inverse.x_dropdown-toggle{background-color:#222222}
.x .x_btn .x_caret{margin-top:8px;margin-left:0}
.x .x_btn-mini .x_caret,
@ -1109,7 +1143,7 @@
.x .x_btn-group-vertical>.x_btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}
.x .x_btn-group-vertical>.x_btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}
.x .x_btn-group-vertical>.x_btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}
.x .x_alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}
.x .x_alert{padding:6px 30px 6px 10px;margin-top:6px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}
.x .x_alert,
.x .x_alert h4{color:#c09853}
.x .x_alert h4{margin:0}
@ -1138,7 +1172,7 @@
.x .x_nav-list .x_nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5)}
.x .x_nav-list>li>a{padding:3px 15px}
.x .x_nav-list>.x_active>a,
.x .x_nav-list>.x_active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc}
.x .x_nav-list>.x_active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#1a87ff}
.x .x_nav-list [class^="x_icon-"],
.x .x_nav-list [class*=" x_icon-"]{margin-right:2px}
.x .x_nav-list .x_divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff}
@ -1162,7 +1196,7 @@
.x .x_nav-tabs>.x_active>a:hover{color:#555555;cursor:default;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent}
.x .x_nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}
.x .x_nav-pills>.x_active>a,
.x .x_nav-pills>.x_active>a:hover{color:#ffffff;background-color:#0088cc}
.x .x_nav-pills>.x_active>a:hover{color:#ffffff;background-color:#1a87ff}
.x .x_nav-stacked>li{float:none}
.x .x_nav-stacked>li>a{margin-right:0}
.x .x_nav-tabs.x_nav-stacked{border-bottom:0}
@ -1174,7 +1208,7 @@
.x .x_nav-pills.x_nav-stacked>li:last-child>a{margin-bottom:1px}
.x .x_nav-tabs .x_dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}
.x .x_nav-pills .x_dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}
.x .x_nav .x_dropdown-toggle .x_caret{margin-top:6px;border-top-color:#0088cc;border-bottom-color:#0088cc}
.x .x_nav .x_dropdown-toggle .x_caret{margin-top:6px;border-top-color:#1a87ff;border-bottom-color:#1a87ff}
.x .x_nav .x_dropdown-toggle:hover .x_caret{border-top-color:#005580;border-bottom-color:#005580}
/* move down carets for tabs */
.x .x_nav-tabs .x_dropdown-toggle .x_caret{margin-top:8px}
@ -1422,7 +1456,7 @@
.x .x_modal-header h3{margin:0;line-height:30px}
.x .x_modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}
.x .x_modal-form{margin-bottom:0}
.x .x_modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff}
.x .x_modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff}
.x .x_modal-footer:before,
.x .x_modal-footer:after{display:table;line-height:0;content:""}
.x .x_modal-footer:after{clear:both}
@ -1467,7 +1501,7 @@
.x .x_row-fluid .x_thumbnails{margin-left:0}
.x .x_thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}
.x .x_thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}
.x a.x_thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25)}
.x a.x_thumbnail:hover{border-color:#1a87ff;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25)}
.x .x_thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}
.x .x_thumbnail .x_caption{padding:9px;color:#555555}
.x .x_media,
@ -1493,7 +1527,7 @@
.x .x_label-important[href],
.x .x_badge-important[href]{background-color:#953b39}
.x .x_label-warning,
.x .x_badge-warning{background-color:#f89406}
.x .x_badge-warning{background-color:#ff9500}
.x .x_label-warning[href],
.x .x_badge-warning[href]{background-color:#c67605}
.x .x_label-success,
@ -1538,21 +1572,21 @@ to{background-position:0 0}
.x .x_progress-striped .x_bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}
.x .x_progress.x_active .x_bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}
.x .x_progress-danger .x_bar,
.x .x_progress .x_bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0)}
.x .x_progress .x_bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ff534a, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ff534a), to(#c43c35));background-image:-webkit-linear-gradient(top, #ff534a, #c43c35);background-image:-o-linear-gradient(top, #ff534a, #c43c35);background-image:linear-gradient(to bottom, #ff534a, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff534a', endColorstr='#c43c35', GradientType=0)}
.x .x_progress-danger.x_progress-striped .x_bar,
.x .x_progress-striped .x_bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-striped .x_bar-danger{background-color:#ff534a;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-success .x_bar,
.x .x_progress .x_bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0)}
.x .x_progress .x_bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #61dd76, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#61dd76), to(#57a957));background-image:-webkit-linear-gradient(top, #61dd76, #57a957);background-image:-o-linear-gradient(top, #61dd76, #57a957);background-image:linear-gradient(to bottom, #61dd76, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#61dd76', endColorstr='#57a957', GradientType=0)}
.x .x_progress-success.x_progress-striped .x_bar,
.x .x_progress-striped .x_bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-striped .x_bar-success{background-color:#61dd76;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-info .x_bar,
.x .x_progress .x_bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0)}
.x .x_progress .x_bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #0288D1, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0288D1), to(#339bb9));background-image:-webkit-linear-gradient(top, #0288D1, #339bb9);background-image:-o-linear-gradient(top, #0288D1, #339bb9);background-image:linear-gradient(to bottom, #0288D1, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0288D1', endColorstr='#339bb9', GradientType=0)}
.x .x_progress-info.x_progress-striped .x_bar,
.x .x_progress-striped .x_bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-striped .x_bar-info{background-color:#0288D1;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-warning .x_bar,
.x .x_progress .x_bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0)}
.x .x_progress .x_bar-warning{background-color:#E64A19;background-image:-moz-linear-gradient(top, #ffa01a, #ff9500);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffa01a), to(#ff9500));background-image:-webkit-linear-gradient(top, #ffa01a, #ff9500);background-image:-o-linear-gradient(top, #ffa01a, #ff9500);background-image:linear-gradient(to bottom, #ffa01a, #ff9500);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa01a', endColorstr='#ff9500', GradientType=0)}
.x .x_progress-warning.x_progress-striped .x_bar,
.x .x_progress-striped .x_bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_progress-striped .x_bar-warning{background-color:#ffa01a;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)}
.x .x_accordion{margin-bottom:20px}
.x .x_accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}
.x .x_accordion-heading{border-bottom:0}

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,5 @@
<config autoescape="on" />
<script>
<!--@if($msg)-->
parent.alertUploadMessage('{$msg}');

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<include target="./_header.html" />
<load target="./js/excanvas.min.js" targetie="lt IE 9" />
<load target="./js/jquery.jqplot.min.js" />
<load target="./js/jqplot.barRenderer.min.js" />
@ -8,7 +11,7 @@
<div class="content" id="content">
<div class="x_page-header">
<h1>{$lang->control_panel} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_dashboard" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->control_panel}</h1>
</div>
<div id="checkBrowserMessage" class="message error" style="display:none;">

View file

@ -91,7 +91,6 @@ jQuery(function($){
var $xBody = $('.x>.body');
var $xGnb = $xBody.find('>.gnb');
var $xContent = $xBody.children('#content.content');
$xContent.width('99.99%');
setTimeout(function(){
$xContent.removeAttr('style');
if($xGnb.height() > $xContent.height()){
@ -103,7 +102,7 @@ jQuery(function($){
$.fn.gnb = function(){
var $xBody = $('.x>.body');
var $xGnb = $xBody.find('>.gnb');
var $xGnb_li = $xGnb.find('>ul>li');
var $xGnb_li = $xGnb.find('>ul>li:not(.active_clone)');
var d365 = new Date();
d365.setTime(d365.getTime() + 60*60*24*356);
@ -115,8 +114,6 @@ jQuery(function($){
$xGnb_li.each(function(index){
$(this).attr('data-index', index+1);
});
var parentIndex = $xGnb_li.find('>ul>li.active_').closest('li.active').attr('data-index');
$xGnb_li.find('>ul>li.active_').clone().addClass('active').attr('data-index', parentIndex).prependTo('#gnbNav').find('>a').prepend('<i />');
// GNB Click toggle
$xGnb_li.find('>a').click(function(){
var $this = $(this);
@ -145,8 +142,17 @@ jQuery(function($){
}
});
// GNB Mobile Toggle
$("a.mobile_menu_open").click(function(){
$xGnb.toggleClass('open');
if($(this).parent('.gnb').hasClass('open')){
setCookie('__xe_admin_gnb_status', 'open', d365);
}else{
setCookie('__xe_admin_gnb_status', 'close', d365);
}
return false;
});
$xGnb.find('>a[href="#gnbNav"]').click(function(){
$(this).parent('.gnb').toggleClass('open');
$xGnb.toggleClass('open');
$xBody.toggleClass('wide');
if($(window).width() <= 980 && !$xGnb.hasClass('open')){
$('#gnbNav').removeClass('ex');
@ -1426,17 +1432,27 @@ jQuery(function($){
$t.addClass('tg').find('>*:not(:first-child)').hide();
}
});
var details = $('.x .dsTg td.tg>*:not(:first-child)');
simpleBtn.click(function(){
var details = $('.x .dsTg td.tg>*:not(:first-child), .x .dsTg .rx_detail_marks').hide();
var simples = $('.x .dsTg .rx_simple_marks').show();
var simpleBtnFn = function(){
details.hide();
simples.show();
detailBtn.removeClass('x_active');
simpleBtn.addClass('x_active');
});
detailBtn.click(function(){
};
var detailBtnFn = function(){
details.show();
simples.hide();
detailBtn.addClass('x_active');
simpleBtn.removeClass('x_active');
});
};
simpleBtn.click(simpleBtnFn);
detailBtn.click(detailBtnFn);
if($(window).width() > 980) {
detailBtnFn();
} else {
simpleBtnFn();
}
});
// Multilingual Window
@ -2042,7 +2058,7 @@ jQuery(function($){
$.xeMenuSelectorVar = {bMultiSelect: false};
$.template('menuSelector_menuTree', '<ul>{{html Nodes}}</ul>');
$.template('menuSelector_menuTreeNode', '<li> <a href="#" class="_nodeType_${NodeType} _menu_node _menu_url_${MenuUrl}" data-param=\'{ "sMenuId":"${MenuId}", "sMenuUrl":"${MenuUrl}", "sMenuTitle":"${MenuTitle}", "sType":"${MenuType}", "sModuleSrl":"${ModuleSrl}" }\'>${MenuTitle}</a> {{html SubTree}} </li>'); //data-param=\'{ "sMenuId":"${MenuId}", "sMenuUrl":"${MenuUrl}", "sMenuTitle":"${MenuTitle}" }\'
$.template('menuSelector_menuTreeNode', '<li> <a href="#" class="_nodeType_${NodeType} _menu_node _menu_url_${MenuUrl}" data-param=\'{ "sMenuId":"${MenuId}", "sMenuUrl":"${MenuUrl}", "sMenuTitle":"${eMenuTitle}", "sType":"${MenuType}", "sModuleSrl":"${ModuleSrl}" }\'>${MenuTitle}</a> {{html SubTree}} </li>'); //data-param=\'{ "sMenuId":"${MenuId}", "sMenuUrl":"${MenuUrl}", "sMenuTitle":"${MenuTitle}" }\'
function onSiteMapReceived(htData){
var $ = jQuery;
@ -2271,7 +2287,7 @@ jQuery(function($){
nNodeType = 3;
}
var $node = $.tmpl( sMenuTreeNode, {MenuTitleWithHome:sTextWithIcons,MenuTitle:sText,MenuId:sNodeSrl,MenuUrl:sURL,NodeType:nNodeType,MenuType:sModuleType,SubTree:sSubTree,Target:sTargetPanel,ModuleSrl:sModuleSrl} )
var $node = $.tmpl( sMenuTreeNode, {MenuTitleWithHome:sTextWithIcons,MenuTitle:sText,eMenuTitle:sText.replace(/\"/g, "\\\""),MenuId:sNodeSrl,MenuUrl:sURL,NodeType:nNodeType,MenuType:sModuleType,SubTree:sSubTree,Target:sTargetPanel,ModuleSrl:sModuleSrl} )
.data('sMenuId', sNodeSrl).data('sMenuUrl', sURL).data('sMenuTitle', sText).data('sMenuType', sModuleType);
//data-param=\'{ "sMenuId":"${MenuId}", "sMenuUrl":"${MenuUrl}", "sMenuTitle":"${MenuTitle}" }\'
//console.log($node);
@ -2373,7 +2389,7 @@ jQuery(function($){
for(var i=0; i<nLen; i++){
$SiteSelector.append($("<option>").val(aSiteList[i].site_srl).html(aSiteList[i].domain));
}
$SiteSelector.show();
$SiteSelector.hide();
}
$.xeShowMenuSelector($container, "0");
}

View file

@ -1,3 +1,5 @@
<config autoescape="on" />
<include target="./_header.html" />
<div class="content" id="content">
<div cond="Context::isBlacklistedPlugin($blacklisted_plugin_name = strtolower(preg_replace('/^disp([A-Z][a-z0-9_]+)[A-Z].+$/', '$1', $act)))" class="message error" style="margin-top:15px">
@ -6,7 +8,7 @@
{$lang->get('admin.msg_blacklisted_reason.'.$blacklisted_plugin_name)}
</p>
</div>
{$content}
{$content|noescape}
</div>
<include target="./_footer.html" />

View file

@ -1,12 +1,9 @@
<load target="css/admin.bootstrap.css" />
<load target="css/admin.iefix.css" />
<load target="css/admin.css" />
<load target="js/admin.js" />
<load target="js/jquery.tmpl.js" />
<load target="js/jquery.jstree.js" />
<config autoescape="on" />
<include target="./_admin_common.html" />
<div class="x">
<div class="content" id="content">
{$content}
{$content|noescape}
</div>
</div>
<script>opener.top.fullSetupWinLoaded();</script>

View file

@ -1,4 +1,7 @@
<config autoescape="on" />
<load target="./js/menu_setup.js" usecdn="true" />
<div class="x_page-header">
<h1>{$lang->server_env}</h1>
</div>

View file

@ -23,7 +23,7 @@ class adminloggingController extends adminlogging
$logged_info = $oMemberModel->getLoggedInfo();
if($logged_info->is_admin != 'Y')
{
return $this->stop("admin.msg_is_not_administrator");
throw new Rhymix\Framework\Exceptions\NotPermitted('admin.msg_is_not_administrator');
}
}

View file

@ -61,7 +61,7 @@ class Advanced_MailerAdminController extends Advanced_Mailer
{
if ($method !== 'default' && !isset($sending_methods[$method]))
{
return $this->setError('msg_advanced_mailer_sending_method_is_invalid');
throw new Rhymix\Framework\Exception('msg_advanced_mailer_sending_method_is_invalid');
}
if ($method !== 'default')
{
@ -69,7 +69,7 @@ class Advanced_MailerAdminController extends Advanced_Mailer
{
if (!Rhymix\Framework\Config::get("mail.$method.$conf_name"))
{
return $this->setError('msg_advanced_mailer_sending_method_is_not_configured', lang('cmd_advanced_mailer_sending_method_' . $method));
throw new Rhymix\Framework\Exception(sprintf('msg_advanced_mailer_sending_method_is_not_configured', lang('cmd_advanced_mailer_sending_method_' . $method)));
}
}
}
@ -155,11 +155,11 @@ class Advanced_MailerAdminController extends Advanced_Mailer
$clear_before_days = intval(Context::get('clear_before_days'));
if (!in_array($status, array('success', 'error')))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if ($clear_before_days < 0)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$obj = new stdClass();
@ -186,11 +186,11 @@ class Advanced_MailerAdminController extends Advanced_Mailer
$clear_before_days = intval(Context::get('clear_before_days'));
if (!in_array($status, array('success', 'error')))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if ($clear_before_days < 0)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$obj = new stdClass();

View file

@ -78,8 +78,9 @@ $lang->cmd_advanced_mailer_exception_group = 'Exception Group';
$lang->cmd_advanced_mailer_use_exceptions = 'Exception domains';
$lang->cmd_advanced_mailer_use_exceptions_yes = 'Test with exceptions as configured';
$lang->cmd_advanced_mailer_use_exceptions_no = 'Ignore exceptions and only test the default sending method';
$lang->msg_advanced_mailer_about_dummy = 'Dummy does not actually send any email. It only records them. Use this option for testing.';
$lang->msg_advanced_mailer_about_dummy_exceptions = 'Caution: if you have set up exception domains, email will be sent to those domains.';
$lang->msg_advanced_mailer_about_dummy = 'Dummy does not actually send any email, but logs them. Use this option for testing.';
$lang->msg_advanced_mailer_about_dummy_exceptions = 'Caution: if you have set up exception domains, unwanted email may be sent using other methods.';
$lang->msg_advanced_mailer_about_mailfunction = 'This method uses the mail() function that comes with PHP itself. It has very low deliverability.<br /><span style="color:red">This option may be deprecated in the future, so please use a different sending method if at all possible.</span>';
$lang->msg_advanced_mailer_sending_method_is_invalid = 'Please select a valid sending method.';
$lang->msg_advanced_mailer_sending_method_is_not_configured = 'The selected sending method (%s) has not been fully configured. Please return to General Settings and finish configuring it.';
$lang->msg_advanced_mailer_smtp_host_is_invalid = 'Please enter a valid SMTP server name.';
@ -125,4 +126,5 @@ $lang->cmd_advanced_mailer_country_code_help = 'Please leave the country code em
$lang->cmd_advanced_mailer_test_content = 'This is an SMS test from Rhymix.';
$lang->msg_advanced_mailer_recipient_number_is_empty = 'Please enter a phone number for the recipient.';
$lang->msg_advanced_mailer_content_is_empty = 'Please enter the content for your test SMS.';
$lang->msg_advanced_mailer_test_success_sms = 'The test was successful. Please check your SMS.';
$lang->msg_advanced_mailer_test_success_sms = 'The test was successful. Please check your SMS.';
$lang->cmd_advanced_mailer_not_rhymix = 'This module is for XE. It is incompatible with Rhymix. Please use the version included with Rhymix.';

View file

@ -78,8 +78,9 @@ $lang->cmd_advanced_mailer_exception_group = '예외 그룹';
$lang->cmd_advanced_mailer_use_exceptions = '예외 도메인 설정';
$lang->cmd_advanced_mailer_use_exceptions_yes = '예외 설정을 적용하여 테스트';
$lang->cmd_advanced_mailer_use_exceptions_no = '무시하고 기본 발송 방법만 테스트';
$lang->msg_advanced_mailer_about_dummy = '더미는 실제로 메일을 발송하지 않고 기록만 하는 옵션입니다. 테스트에 사용하십시오.';
$lang->msg_advanced_mailer_about_dummy_exceptions = '더미를 선택하더라도 예외 도메인을 지정한 경우 메일이 발송될 수 있으니 주의하십시오.';
$lang->msg_advanced_mailer_about_dummy = '메일을 발송하지 않고 로그 기록만 하도록 강제합니다. 테스트 중 원치 않는 메일이 발송되는 것을 막기 위해 사용할 수 있습니다.';
$lang->msg_advanced_mailer_about_dummy_exceptions = '이 옵션을 선택하더라도 예외 도메인을 지정한 경우 메일이 발송될 수 있으니 주의하십시오.';
$lang->msg_advanced_mailer_about_mailfunction = 'PHP에 내장된 mail() 함수를 사용합니다. 발송 성공률이 매우 낮습니다.<br/><span style="color:red">이 옵션은 추후 지원되지 않을 수 있으니, 가능하면 다른 방식을 선택하시기 바랍니다.</span>';
$lang->msg_advanced_mailer_sending_method_is_invalid = '올바른 발송 방법을 선택해 주십시오.';
$lang->msg_advanced_mailer_sending_method_is_not_configured = '선택한 발송 방법(%s)이 완전히 설정되지 않았습니다. 기본 설정 페이지로 돌아가서 설정을 마쳐 주십시오.';
$lang->msg_advanced_mailer_smtp_host_is_invalid = '올바른 SMTP 서버 이름을 입력해 주십시오.';
@ -125,4 +126,5 @@ $lang->cmd_advanced_mailer_country_code_help = '국내 번호로 발송하실
$lang->cmd_advanced_mailer_test_content = '라이믹스 SMS 발송 테스트입니다.';
$lang->msg_advanced_mailer_recipient_number_is_empty = '받는이 전화번호를 입력해 주십시오.';
$lang->msg_advanced_mailer_content_is_empty = 'SMS 내용을 입력해 주십시오.';
$lang->msg_advanced_mailer_test_success_sms = '테스트에 성공하였습니다. SMS를 확인해 보시기 바랍니다.';
$lang->msg_advanced_mailer_test_success_sms = '테스트에 성공하였습니다. SMS를 확인해 보시기 바랍니다.';
$lang->cmd_advanced_mailer_not_rhymix = '이 모듈은 XE용으로, 라이믹스와는 호환되지 않습니다. 라이믹스에 기본 포함된 버전을 사용하시기 바랍니다.';

View file

@ -414,7 +414,7 @@ class autoinstallAdminView extends autoinstall
if(!$updateDate)
{
return $this->stop('msg_connection_fail');
throw new Rhymix\Framework\Exception('msg_connection_fail');
}
$oModel = getModel('autoinstall');
@ -535,13 +535,13 @@ class autoinstallAdminView extends autoinstall
if(!$type || $type == "core")
{
return $this->stop("msg_invalid_request");
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$config_file = $oModel->getConfigFilePath($type);
if(!$config_file)
{
return $this->stop("msg_invalid_request");
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$output = $oAdminModel->checkUseDirectModuleInstall($installedPackage);
@ -579,7 +579,7 @@ class autoinstallAdminView extends autoinstall
}
else
{
return $this->stop('msg_connection_fail');
throw new Rhymix\Framework\Exception('msg_connection_fail');
}
}

View file

@ -1,5 +1,5 @@
<ul class="x_nav x_nav-tabs">
<li class="x_active"|cond="$act == 'dispAutoinstallAdminIndex'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminIndex')}">All({$tCount})</a></li>
<li class="x_active"|cond="$act == 'dispAutoinstallAdminIndex'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminIndex')}">{lang('all')} ({$tCount})</a></li>
<li class="x_active"|cond="$act == 'dispAutoinstallAdminInstalledPackages'"><a href="{getUrl('', 'module', 'admin', 'act', 'dispAutoinstallAdminInstalledPackages')}">Installed({$iCount})</a></li>
</ul>

View file

@ -1,4 +1,4 @@
<load target="./css/autoinstall.css" index="11" />
<div class="x_page-header">
<h1>{$lang->autoinstall} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_advanced_easyinstall" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->autoinstall}</h1>
</div>

View file

@ -168,7 +168,7 @@ class boardAdminController extends board {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if($module_info->mid != $mid)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$module_info->hide_category = Context::get('hide_category') == 'Y' ? 'Y' : 'N';

View file

@ -39,7 +39,10 @@ class boardAdminView extends board {
}
}
if($module_info && $module_info->module != 'board') return $this->stop("msg_invalid_request");
if($module_info && $module_info->module != 'board')
{
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// get the module category list
$module_category = $oModuleModel->getModuleCategories();

View file

@ -24,7 +24,7 @@ class boardController extends board
// check grant
if(!$this->grant->write_document)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
// setup variables
@ -35,14 +35,14 @@ class boardController extends board
// Return error if content is empty.
if (is_empty_html_content($obj->content))
{
return $this->setError('msg_empty_content');
throw new Rhymix\Framework\Exception('msg_empty_content');
}
// Return error if content is too large.
$document_length_limit = ($this->module_info->document_length_limit ?: 1024) * 1024;
if (strlen($obj->content) > $document_length_limit && !$this->grant->manager)
{
return $this->setError('msg_content_too_long');
throw new Rhymix\Framework\Exception('msg_content_too_long');
}
// unset document style if not manager
@ -107,14 +107,14 @@ class boardController extends board
{
if(!$oDocument->isGranted())
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
// Protect admin document
$member_info = getModel('member')->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return $this->setError('msg_admin_document_no_modify');
throw new Rhymix\Framework\Exception('msg_admin_document_no_modify');
}
// if document status is temp
@ -138,7 +138,7 @@ class boardController extends board
{
if($oDocument->get('comment_count') > 0 && !$this->grant->manager)
{
return $this->setError('msg_protect_update_content');
throw new Rhymix\Framework\Exception('msg_protect_update_content');
}
}
@ -147,7 +147,7 @@ class boardController extends board
{
if($oDocument->get('regdate') < date('YmdHis', strtotime('-' . $this->module_info->protect_document_regdate . ' day')))
{
return $this->setError(sprintf(lang('msg_protect_regdate_document'), $this->module_info->protect_document_regdate));
throw new Rhymix\Framework\Exception(sprintf(lang('msg_protect_regdate_document'), $this->module_info->protect_document_regdate));
}
}
@ -235,7 +235,7 @@ class boardController extends board
$logged_info = Context::get('logged_info');
if(!$update_id)
{
return $this->setError('msg_no_update_id');
throw new Rhymix\Framework\Exception('msg_no_update_id');
}
$oDocumentModel = getModel('document');
@ -247,13 +247,13 @@ class boardController extends board
$Exists_log = $oDocumentModel->getUpdateLogAdminisExists($update_log->document_srl);
if($Exists_log === true)
{
return $this->setError('msg_admin_update_log');
throw new Rhymix\Framework\Exception('msg_admin_update_log');
}
}
if(!$update_log)
{
return $this->setError('msg_no_update_log');
throw new Rhymix\Framework\Exception('msg_no_update_log');
}
$oDocument = $oDocumentModel->getDocument($update_log->document_srl);
@ -282,7 +282,7 @@ class boardController extends board
// if the document is not existed
if(!$document_srl)
{
return $this->setError('msg_invalid_document');
throw new Rhymix\Framework\Exception('msg_invalid_document');
}
$oDocumentModel = &getModel('document');
@ -292,7 +292,7 @@ class boardController extends board
{
if($oDocument->get('comment_count') > 0 && $this->grant->manager == false)
{
return $this->setError('msg_protect_delete_content');
throw new Rhymix\Framework\Exception('msg_protect_delete_content');
}
}
@ -302,7 +302,7 @@ class boardController extends board
{
$format = lang('msg_protect_regdate_document');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
// generate document module controller object
@ -356,7 +356,7 @@ class boardController extends board
// check grant
if(!$this->grant->write_comment)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$logged_info = Context::get('logged_info');
@ -367,14 +367,14 @@ class boardController extends board
// Return error if content is empty.
if (is_empty_html_content($obj->content))
{
return $this->setError('msg_empty_content');
throw new Rhymix\Framework\Exception('msg_empty_content');
}
// Return error if content is too large.
$comment_length_limit = ($this->module_info->comment_length_limit ?: 128) * 1024;
if (strlen($obj->content) > $comment_length_limit && !$this->grant->manager)
{
return $this->setError('msg_content_too_long');
throw new Rhymix\Framework\Exception('msg_content_too_long');
}
if(!$this->module_info->use_status) $this->module_info->use_status = 'PUBLIC';
@ -398,7 +398,7 @@ class boardController extends board
$oDocument = $oDocumentModel->getDocument($obj->document_srl);
if(!$oDocument->isExists())
{
return $this->setError('msg_not_founded');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
// For anonymous use, remove writer's information and notifying information
@ -436,7 +436,7 @@ class boardController extends board
$childs = $oCommentModel->getChildComments($obj->comment_srl);
if(count($childs) > 0)
{
return $this->setError('msg_board_update_protect_comment');
throw new Rhymix\Framework\Exception('msg_board_update_protect_comment');
}
}
}
@ -446,7 +446,7 @@ class boardController extends board
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return $this->setError('msg_admin_comment_no_modify');
throw new Rhymix\Framework\Exception('msg_admin_comment_no_modify');
}
// INSERT if comment_srl does not exist.
@ -461,7 +461,7 @@ class boardController extends board
$parent_comment = $oCommentModel->getComment($obj->parent_srl);
if(!$parent_comment->comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
if($parent_comment->isSecret() && $this->module_info->secret === 'Y')
{
@ -490,13 +490,13 @@ class boardController extends board
{
$format = lang('msg_protect_regdate_comment');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
// check the grant
if(!$comment->isGranted())
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$obj->parent_srl = $comment->parent_srl;
$output = $oCommentController->updateComment($obj, $this->grant->manager);
@ -530,7 +530,7 @@ class boardController extends board
if(!$comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oCommentModel = getModel('comment');
@ -540,7 +540,7 @@ class boardController extends board
$childs = $oCommentModel->getChildComments($comment_srl);
if(count($childs) > 0)
{
return $this->setError('msg_board_delete_protect_comment');
throw new Rhymix\Framework\Exception('msg_board_delete_protect_comment');
}
}
$comment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
@ -550,7 +550,7 @@ class boardController extends board
{
$format = lang('msg_protect_regdate_comment');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
// generate comment controller object
@ -662,13 +662,13 @@ class boardController extends board
$oComment = $oCommentModel->getComment($comment_srl);
if(!$oComment->isExists())
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
// compare the comment password and the user input password
if(!$oMemberModel->isValidPassword($oComment->get('password'),$password))
{
return $this->setError('msg_invalid_password');
throw new Rhymix\Framework\Exception('msg_invalid_password');
}
$oComment->setGrantForSession();
@ -678,13 +678,13 @@ class boardController extends board
$oDocument = $oDocumentModel->getDocument($document_srl);
if(!$oDocument->isExists())
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
// compare the document password and the user input password
if(!$oMemberModel->isValidPassword($oDocument->get('password'),$password))
{
return $this->setError('msg_invalid_password');
throw new Rhymix\Framework\Exception('msg_invalid_password');
}
$oDocument->setGrantForSession();

View file

@ -61,27 +61,9 @@ class boardMobile extends boardView
$this->consultation = false;
}
$oDocumentModel = getModel('document');
$extra_keys = $oDocumentModel->getExtraKeys($this->module_info->module_srl);
Context::set('extra_keys', $extra_keys);
if($this->module_info->mskin === '/USE_RESPONSIVE/')
{
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
if(!is_dir($template_path)||!$this->module_info->skin)
{
$template_path = sprintf("%sskins/%s/",$this->module_path, 'default');
}
}
else
{
$template_path = sprintf("%sm.skins/%s/",$this->module_path, $this->module_info->mskin);
if(!is_dir($template_path)||!$this->module_info->mskin)
{
$template_path = sprintf("%sm.skins/%s/",$this->module_path, 'default');
}
}
$this->setTemplatePath($template_path);
Context::addJsFilter($this->module_path.'tpl/filter', 'input_password.xml');
}

View file

@ -90,17 +90,6 @@ class boardView extends board
$this->consultation = FALSE;
}
/**
* setup the template path based on the skin
* the default skin is default
**/
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
if(!is_dir($template_path)||!$this->module_info->skin)
{
$template_path = sprintf("%sskins/%s/",$this->module_path, 'default');
}
$this->setTemplatePath($template_path);
/**
* use context::set to setup extra variables
**/
@ -262,7 +251,7 @@ class boardView extends board
// if the module srl is not consistent
if($oDocument->get('module_srl')!=$this->module_info->module_srl )
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
// check the manage grant
@ -383,7 +372,11 @@ class boardView extends board
if(is_array($file_module_config->download_grant) && $downloadGrantCount>0)
{
if(!Context::get('is_logged')) return $this->stop('msg_not_permitted_download');
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted('msg_not_permitted_download');
}
$logged_info = Context::get('logged_info');
if($logged_info->is_admin != 'Y')
{
@ -406,7 +399,10 @@ class boardView extends board
break;
}
}
if(!$is_permitted) return $this->stop('msg_not_permitted_download');
if(!$is_permitted)
{
throw new Rhymix\Framework\Exceptions\NotPermitted('msg_not_permitted_download');
}
}
}
}
@ -672,18 +668,18 @@ class boardView extends board
$document_srl = Context::get('document_srl');
if(!$document_srl)
{
return $this->setError("msg_invalid_request");
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if($this->grant->view == false || ($this->module_info->consultation == 'Y' && !$this->grant->manager && !$this->grant->consultation_read))
{
return $this->setError("msg_not_permitted");
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$oDocument = getModel('document')->getDocument($document_srl);
if(!$oDocument->isExists())
{
return $this->setError("msg_invalid_request");
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
Context::set('oDocument', $oDocument);
@ -780,20 +776,20 @@ class boardView extends board
{
$format = lang('msg_protect_regdate_document');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
if($this->module_info->protect_content == "Y" || $this->module_info->protect_update_content == 'Y')
{
if($oDocument->get('comment_count') > 0 && $this->grant->manager == false)
{
return $this->setError('msg_protect_update_content');
throw new Rhymix\Framework\Exception('msg_protect_update_content');
}
}
}
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return $this->setError('msg_admin_document_no_modify');
throw new Rhymix\Framework\Exception('msg_admin_document_no_modify');
}
// if the document is not granted, then back to the password input form
@ -913,7 +909,7 @@ class boardView extends board
{
$format = lang('msg_protect_regdate_document');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
@ -921,7 +917,7 @@ class boardView extends board
{
if($oDocument->get('comment_count')>0 && $this->grant->manager == false)
{
return $this->setError('msg_protect_delete_content');
throw new Rhymix\Framework\Exception('msg_protect_delete_content');
}
}
@ -953,7 +949,7 @@ class boardView extends board
$oDocument = $oDocumentModel->getDocument($document_srl);
if(!$oDocument->isExists())
{
return $this->dispBoardMessage('msg_invalid_request');
return $this->dispBoardMessage('msg_not_founded');
}
// Check allow comment
@ -998,7 +994,7 @@ class boardView extends board
// if the parent comment is not existed
if(!$parent_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// get the comment
@ -1008,11 +1004,11 @@ class boardView extends board
// if the comment is not existed, opoup an error message
if(!$oSourceComment->isExists())
{
return $this->dispBoardMessage('msg_invalid_request');
return $this->dispBoardMessage('msg_not_founded');
}
if(Context::get('document_srl') && $oSourceComment->get('document_srl') != Context::get('document_srl'))
{
return $this->dispBoardMessage('msg_invalid_request');
return $this->dispBoardMessage('msg_not_founded');
}
// Check allow comment
@ -1060,7 +1056,7 @@ class boardView extends board
// if the comment is not existed
if(!$comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// get comment information
@ -1075,7 +1071,7 @@ class boardView extends board
{
$format = lang('msg_protect_regdate_comment');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
if($this->module_info->protect_update_comment === 'Y' && $this->grant->manager == false)
@ -1083,19 +1079,19 @@ class boardView extends board
$childs = $oCommentModel->getChildComments($comment_srl);
if(count($childs) > 0)
{
return $this->setError('msg_board_update_protect_comment');
throw new Rhymix\Framework\Exception('msg_board_update_protect_comment');
}
}
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return $this->setError('msg_admin_comment_no_modify');
throw new Rhymix\Framework\Exception('msg_admin_comment_no_modify');
}
// if the comment is not exited, alert an error message
if(!$oComment->isExists())
{
return $this->dispBoardMessage('msg_invalid_request');
return $this->dispBoardMessage('msg_not_founded');
}
// if the comment is not granted, then back to the password input form
@ -1143,7 +1139,7 @@ class boardView extends board
{
$format = lang('msg_protect_regdate_comment');
$massage = sprintf($format, $this->module_info->protect_document_regdate);
return $this->setError($massage);
throw new Rhymix\Framework\Exception($massage);
}
}
@ -1153,7 +1149,7 @@ class boardView extends board
$childs = $oCommentModel->getChildComments($comment_srl);
if(count($childs) > 0)
{
return $this->setError('msg_board_delete_protect_comment');
throw new Rhymix\Framework\Exception('msg_board_delete_protect_comment');
}
}
@ -1233,7 +1229,7 @@ class boardView extends board
if($this->grant->update_view !== true)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$updatelog = $oDocumentModel->getDocumentUpdateLog($document_srl);
@ -1253,7 +1249,7 @@ class boardView extends board
if($this->grant->update_view !== true)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$update_log = $oDocumentModel->getUpdateLog($update_id);
@ -1289,7 +1285,7 @@ class boardView extends board
{
iF($this->grant->vote_log_view !== true)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$oMemberModel = getModel('member');
@ -1310,7 +1306,7 @@ class boardView extends board
}
else
{
return $this->setError('msg_not_target');
throw new Rhymix\Framework\Exception('msg_not_target');
}
$output = executeQueryArray($queryId, $args);

View file

@ -57,13 +57,13 @@
</grants>
<actions>
<action name="dispBoardContent" type="view" permission="list" standalone="false" index="true" />
<action name="dispBoardWrite" type="view" permission="write_document" standalone="false" />
<action name="dispBoardDelete" type="view" permission="write_document" standalone="false" />
<action name="dispBoardWriteComment" type="view" permission="write_comment" standalone="false" />
<action name="dispBoardReplyComment" type="view" permission="write_comment" standalone="false" />
<action name="dispBoardModifyComment" type="view" permission="write_comment" standalone="false" />
<action name="dispBoardDeleteComment" type="view" permission="write_comment" standalone="false" />
<action name="dispBoardDeleteTrackback" type="view" permission="list,view" standalone="false" />
<action name="dispBoardWrite" type="view" permission="write_document" standalone="false" meta-noindex="true" />
<action name="dispBoardDelete" type="view" permission="write_document" standalone="false" meta-noindex="true" />
<action name="dispBoardWriteComment" type="view" permission="write_comment" standalone="false" meta-noindex="true" />
<action name="dispBoardReplyComment" type="view" permission="write_comment" standalone="false" meta-noindex="true" />
<action name="dispBoardModifyComment" type="view" permission="write_comment" standalone="false" meta-noindex="true" />
<action name="dispBoardDeleteComment" type="view" permission="write_comment" standalone="false" meta-noindex="true" />
<action name="dispBoardDeleteTrackback" type="view" permission="list,view" standalone="false" meta-noindex="true" />
<action name="dispBoardContentList" type="view" permission="list" standalone="false" />
<action name="dispBoardContentView" type="view" permission="view" standalone="false" />
<action name="dispBoardUpdateLog" type="view" permission="update_view" standalone="false" />

View file

@ -88,8 +88,8 @@
<a cond="$oDocument->getVoted() > 0" href="#" onclick="doCallModuleAction('document','procDocumentVoteUpCancel','{$oDocument->document_srl}');return false;" class="voted"> <i class="xi-thumbs-up"></i><br>{$lang->cmd_vote} {$oDocument->get('voted_count')}</a>
</li>
<li>
<a cond="$oDocument->getVoted() === false || $oDocument->getVoted() > 0" herf="#" onclick="doCallModuleAction('document','procDocumentVoteDown','{$oDocument->document_srl}');return false;" class="voted"> <i class="xi-thumbs-down"></i><br>{$lang->cmd_vote_down} {$oDocument->get('blamed_count')}</a>
<a cond="$oDocument->getVoted() < 0" herf="#" onclick="doCallModuleAction('document','procDocumentVoteDownCancel','{$oDocument->document_srl}');return false;" class="voted"> <i class="xi-thumbs-down"></i><br>{$lang->cmd_vote_down} {$oDocument->get('blamed_count')}</a>
<a cond="$oDocument->getVoted() === false || $oDocument->getVoted() > 0" href="#" onclick="doCallModuleAction('document','procDocumentVoteDown','{$oDocument->document_srl}');return false;" class="voted"> <i class="xi-thumbs-down"></i><br>{$lang->cmd_vote_down} {$oDocument->get('blamed_count')}</a>
<a cond="$oDocument->getVoted() < 0" href="#" onclick="doCallModuleAction('document','procDocumentVoteDownCancel','{$oDocument->document_srl}');return false;" class="voted"> <i class="xi-thumbs-down"></i><br>{$lang->cmd_vote_down} {$oDocument->get('blamed_count')}</a>
</li>
</ul>
</div>

View file

@ -1,3 +1,4 @@
<config autoescape="on" />
<include target="header.html" />
<load target="../../module/tpl/js/multi_order.js" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/board/tpl/board_insert/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
@ -24,7 +25,7 @@
<div class="x_control-group">
<label class="x_control-label" for="lang_browser_title">{$lang->browser_title}</label>
<div class="x_controls">
<input type="text" name="browser_title" id="browser_title" value="<!--@if(strpos($module_info->browser_title, '$user_lang->') === false)-->{$module_info->browser_title}<!--@else-->{htmlspecialchars($module_info->browser_title)}<!--@end-->" class="lang_code" />
<input type="text" name="browser_title" id="browser_title" value="{$module_info->browser_title}" class="lang_code" />
<a href="#browser_title_help" class="x_icon-question-sign" data-toggle>{$lang->help}</a>
<p id="browser_title_help" class="x_help-block" hidden>{$lang->about_browser_title}</p>
</div>
@ -32,13 +33,13 @@
<div class="x_control-group">
<label class="x_control-label" for="lang_meta_keywords">{$lang->meta_keywords}</label>
<div class="x_controls">
<input type="text" name="meta_keywords" id="meta_keywords" value="<!--@if(strpos($module_info->meta_keywords, '$user_lang->') === false)-->{$module_info->meta_keywords}<!--@else-->{htmlspecialchars($module_info->meta_keywords)}<!--@end-->" class="lang_code" />
<input type="text" name="meta_keywords" id="meta_keywords" value="{$module_info->meta_keywords}" class="lang_code" />
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_meta_description">{$lang->meta_description}</label>
<div class="x_controls">
<input type="text" name="meta_description" id="meta_description" value="<!--@if(strpos($module_info->meta_description, '$user_lang->') === false)-->{$module_info->meta_description}<!--@else-->{htmlspecialchars($module_info->meta_description)}<!--@end-->" class="lang_code" />
<input type="text" name="meta_description" id="meta_description" value="{$module_info->meta_description}" class="lang_code" />
</div>
</div>
<div class="x_control-group">
@ -84,14 +85,14 @@
<div class="x_control-group">
<label class="x_control-label" for="lang_header_text">{$lang->header_text}</label>
<div class="x_controls">
<textarea name="header_text" id="header_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->header_text, '$user_lang->') === false)-->{$module_info->header_text}<!--@else-->{htmlspecialchars($module_info->header_text)}<!--@end--></textarea>
<textarea name="header_text" id="header_text" class="lang_code" rows="8" cols="42">{$module_info->header_text}</textarea>
<p id="header_text_help" class="x_help-block">{$lang->about_header_text}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_footer_text">{$lang->footer_text}</label>
<div class="x_controls">
<textarea name="footer_text" id="footer_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->footer_text}<!--@else-->{htmlspecialchars($module_info->footer_text)}<!--@end--></textarea>
<textarea name="footer_text" id="footer_text" class="lang_code" rows="8" cols="42">{$module_info->footer_text}</textarea>
<p id="footer_text_help" class="x_help-block">{$lang->about_footer_text}</p>
</div>
</div>
@ -149,14 +150,14 @@
<div class="x_control-group">
<label class="x_control-label" for="lang_mobile_header_text">{$lang->mobile_header_text}</label>
<div class="x_controls">
<textarea name="mobile_header_text" id="mobile_header_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->mobile_header_text}<!--@else-->{htmlspecialchars($module_info->mobile_header_text)}<!--@end--></textarea>
<textarea name="mobile_header_text" id="mobile_header_text" class="lang_code" rows="8" cols="42">{$module_info->mobile_header_text}</textarea>
<p id="mobile_header_text_help" class="x_help-block">{$lang->about_mobile_header_text}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_mobile_footer_text">{$lang->mobile_footer_text}</label>
<div class="x_controls">
<textarea name="mobile_footer_text" id="mobile_footer_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->mobile_footer_text}<!--@else-->{htmlspecialchars($module_info->mobile_footer_text)}<!--@end--></textarea>
<textarea name="mobile_footer_text" id="mobile_footer_text" class="lang_code" rows="8" cols="42">{$module_info->mobile_footer_text}</textarea>
<p id="mobile_footer_text_help" class="x_help-block">{$lang->about_mobile_footer_text}</p>
</div>
</div>
@ -358,7 +359,7 @@
<div class="x_control-group">
<label class="x_control-label" for="description">{$lang->description}</label>
<div class="x_controls">
<textarea name="description" id="description" rows="4" cols="42" placeholder="{$lang->about_description}" style="vertical-align:top">{htmlspecialchars($module_info->description)}</textarea>
<textarea name="description" id="description" rows="4" cols="42" placeholder="{$lang->about_description}" style="vertical-align:top">{$module_info->description}</textarea>
<a href="#description_help" class="x_icon-question-sign" data-toggle>{$lang->help}</a>
<p id="description_help" class="x_help-block" hidden>{$lang->about_description}</p>
</div>

View file

@ -64,7 +64,7 @@
</label>
<div class="x_controls">
<div class="x_input-append" style="margin-bottom:8px">
<select name="_admin_member" multiple="multiple" size="{count($admin_member)?count($admin_member):1}">
<select name="_admin_member" multiple="multiple" size="{countobj($admin_member) ?: 1}">
<option loop="$admin_member => $key, $val" value="{$val->email_address}"|cond="$member_config->identifier=='email_address'" value="{$val->user_id}"|cond="$member_config->identifier!='email_address'">
{$val->nick_name} (<block cond="$member_config->identifier=='email_address'">{$val->email_address}</block><block cond="$member_config->identifier!='email_address'">{$val->user_id}</block>)
</option>

View file

@ -56,7 +56,7 @@ class commentAdminController extends comment
$cart = Context::get('cart');
if(!$cart)
{
return $this->stop('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
if(!is_array($cart))
{
@ -96,7 +96,7 @@ class commentAdminController extends comment
$comment = $oCommentModel->getComment($comment_srl);
if($comment->comment_srl != $comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$document_srl = $comment->document_srl;
if(!in_array($document_srl, $updated_documents_arr))
@ -171,7 +171,7 @@ class commentAdminController extends comment
$cart = Context::get('cart');
if(!$cart)
{
return $this->stop('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
if(!is_array($cart))
{
@ -184,7 +184,7 @@ class commentAdminController extends comment
$comment_count = count($comment_srl_list);
if(!$comment_count)
{
return $this->stop('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
$oCommentController = getController('comment');
@ -220,7 +220,7 @@ class commentAdminController extends comment
continue;
}
$output = $oCommentController->deleteComment($comment_srl, TRUE, $isTrash);
$output = $oCommentController->deleteComment($comment_srl, TRUE, toBool($isTrash));
if(!$output->toBool())
{
$oDB->rollback();
@ -310,6 +310,16 @@ class commentAdminController extends comment
$oDB->rollback();
return $output;
}
$obj = new stdClass;
$obj->comment_srl = $oComment->get('comment_srl');
$obj->module_srl = $oComment->get('module_srl');
$obj->document_srl = $oComment->get('document_srl');
$obj->parent_srl = $oComment->get('parent_srl');
$obj->member_srl = $oComment->get('member_srl');
$obj->regdate = $oComment->get('regdate');
$obj->last_update = $oComment->get('last_update');
ModuleHandler::triggerCall('comment.moveCommentToTrash', 'after', $obj);
}
}
}
@ -329,7 +339,7 @@ class commentAdminController extends comment
$oCommentController = getController('comment');
$oComment = $oCommentModel->getComment($comment_srl, false);
if(!$oComment->isGranted()) return $this->stop('msg_not_permitted');
if(!$oComment->isGranted()) throw new Rhymix\Framework\Exceptions\NotPermitted;
$message_content = "";
$this->_moveCommentToTrash(array($comment_srl), $oCommentController, $oDB, $message_content);
@ -425,33 +435,18 @@ class commentAdminController extends comment
{
$originObject = (object) $originObject;
}
$obj = new stdClass();
$obj->document_srl = $originObject->document_srl;
$obj->comment_srl = $originObject->comment_srl;
$obj->parent_srl = $originObject->parent_srl;
$obj->content = $originObject->content;
$obj->password = $originObject->password;
$obj->nick_name = $originObject->nick_name;
$obj->member_srl = $originObject->member_srl;
$obj->email_address = $originObject->email_address;
$obj->homepage = $originObject->homepage;
$obj->is_secret = $originObject->is_secret;
$obj->notify_message = $originObject->notify_message;
$obj->module_srl = $originObject->module_srl;
$oCommentController = getController('comment');
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($originObject->comment_srl);
if($oComment->isExists())
{
$output = $oCommentController->updateCommentByRestore($obj);
$output = $oCommentController->updateCommentByRestore($originObject);
}
else
{
$output = $oCommentController->insertComment($obj, true);
$output = $oCommentController->insertComment($originObject, true);
}
return $output;

View file

@ -27,15 +27,18 @@ class commentController extends comment
*/
function procCommentVoteUp()
{
if(!Context::get('is_logged'))
if($this->module_info->non_login_vote !== 'Y')
{
return $this->setError('msg_invalid_request');
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$comment_srl = Context::get('target_srl');
if(!$comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oCommentModel = getModel('comment');
@ -43,14 +46,14 @@ class commentController extends comment
$module_srl = $oComment->get('module_srl');
if(!$module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oModuleModel = getModel('module');
$comment_config = $oModuleModel->getModulePartConfig('comment', $module_srl);
if($comment_config->use_vote_up == 'N')
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\FeatureDisabled;
}
$point = 1;
@ -61,16 +64,22 @@ class commentController extends comment
function procCommentVoteUpCancel()
{
if(!Context::get('logged_info')) return $this->setError('msg_invalid_request');
if($this->module_info->non_login_vote !== 'Y')
{
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$comment_srl = Context::get('target_srl');
if(!$comment_srl) return $this->setError('msg_invalid_request');
if(!$comment_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($comment_srl, FALSE, FALSE);
if($oComment->get('voted_count') <= 0)
{
return $this->setError('msg_comment_voted_cancel_not');
throw new Rhymix\Framework\Exception('failed_voted_canceled');
}
$point = 1;
$output = $this->updateVotedCountCancel($comment_srl, $oComment, $point);
@ -88,15 +97,18 @@ class commentController extends comment
*/
function procCommentVoteDown()
{
if(!Context::get('is_logged'))
if($this->module_info->non_login_vote !== 'Y')
{
return $this->setError('msg_invalid_request');
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$comment_srl = Context::get('target_srl');
if(!$comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oCommentModel = getModel('comment');
@ -104,14 +116,14 @@ class commentController extends comment
$module_srl = $oComment->get('module_srl');
if(!$module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oModuleModel = getModel('module');
$comment_config = $oModuleModel->getModulePartConfig('comment', $module_srl);
if($comment_config->use_vote_down == 'N')
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\FeatureDisabled;
}
$point = -1;
@ -122,16 +134,22 @@ class commentController extends comment
function procCommentVoteDownCancel()
{
if(!Context::get('logged_info')) return $this->setError('msg_invalid_request');
if($this->module_info->non_login_vote !== 'Y')
{
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$comment_srl = Context::get('target_srl');
if(!$comment_srl) return $this->setError('msg_invalid_request');
if(!$comment_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($comment_srl, FALSE, FALSE);
if($oComment->get('blamed_count') >= 0)
{
return $this->setError('msg_comment_blamed_cancel_not');
throw new Rhymix\Framework\Exception('failed_blamed_canceled');
}
$point = -1;
$output = $this->updateVotedCountCancel($comment_srl, $oComment, $point);
@ -145,19 +163,58 @@ class commentController extends comment
function updateVotedCountCancel($comment_srl, $oComment, $point)
{
$logged_info = Context::get('logged_info');
// Check if the current user has voted previously.
$args = new stdClass;
$args->comment_srl = $comment_srl;
$args->point = $point;
if($logged_info->member_srl)
{
$args->member_srl = $logged_info->member_srl;
}
else
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
}
$output = executeQuery('comment.getCommentVotedLogInfo', $args);
if(!$output->data->count)
{
return new BaseObject(-1, $point > 0 ? 'failed_voted_canceled' : 'failed_blamed_canceled');
}
// Call a trigger (before)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $oComment->get('member_srl');
$trigger_obj->module_srl = $oComment->get('module_srl');
$trigger_obj->document_srl = $oComment->get('document_srl');
$trigger_obj->comment_srl = $oComment->get('comment_srl');
$trigger_obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$trigger_obj->point = $point;
$trigger_obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$trigger_obj->after_point = $trigger_obj->before_point - $point;
$trigger_obj->cancel = true;
$trigger_output = ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
$args = new stdClass();
$d_args = new stdClass();
$args->comment_srl = $d_args->comment_srl = $comment_srl;
$d_args->member_srl = $logged_info->member_srl;
if($point > 0)
if ($trigger_obj->update_target === 'voted_count')
{
$args->voted_count = $oComment->get('voted_count') - $point;
$args->voted_count = $trigger_obj->after_point;
$output = executeQuery('comment.updateVotedCount', $args);
}
else
{
$args->blamed_count = $oComment->get('blamed_count') - $point;
$args->blamed_count = $trigger_obj->after_point;
$output = executeQuery('comment.updateBlamedCount', $args);
}
$d_output = executeQuery('comment.deleteCommentVotedLog', $d_args);
@ -165,22 +222,10 @@ class commentController extends comment
//session reset
$_SESSION['voted_comment'][$comment_srl] = false;
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
$obj = new stdClass();
$obj->member_srl = $oComment->get('member_srl');
$obj->module_srl = $oComment->get('module_srl');
$obj->comment_srl = $oComment->get('comment_srl');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
$obj->cancel = 1;
ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'after', $obj);
// Call a trigger (after)
ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'after', $trigger_obj);
$oDB->commit();
return $output;
}
@ -193,13 +238,13 @@ class commentController extends comment
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$comment_srl = Context::get('target_srl');
if(!$comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// if an user select message from options, message would be the option.
@ -297,7 +342,7 @@ class commentController extends comment
{
if(!$manual_inserted && !checkCSRF())
{
return new BaseObject(-1, 'msg_invalid_request');
return new BaseObject(-1, 'msg_security_violation');
}
if(!is_object($obj))
@ -348,6 +393,12 @@ class commentController extends comment
// Remove manual member info to prevent forgery. This variable can be set by triggers only.
unset($obj->manual_member_info);
// Sanitize variables
$obj->comment_srl = intval($obj->comment_srl);
$obj->module_srl = intval($obj->module_srl);
$obj->document_srl = intval($obj->document_srl);
$obj->parent_srl = intval($obj->parent_srl);
// call a trigger (before)
$output = ModuleHandler::triggerCall('comment.insertComment', 'before', $obj);
if(!$output->toBool())
@ -389,7 +440,7 @@ class commentController extends comment
if($obj->homepage)
{
$obj->homepage = removeHackTag($obj->homepage);
$obj->homepage = escape($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
@ -494,7 +545,7 @@ class commentController extends comment
// return if no parent comment exists
if(!$parent_output->toBool() || !$parent_output->data)
{
return $parent_output;
return new BaseObject(-1, 'parent comment does not exist');
}
$parent = $parent_output->data;
@ -544,14 +595,12 @@ class commentController extends comment
return $output;
}
// get the number of all comments in the posting
$comment_count = $oCommentModel->getCommentCount($document_srl);
// create the controller object of the document
$oDocumentController = getController('document');
// Update the number of comments in the post
if(!$using_validation || $is_admin)
$comment_count = $oCommentModel->getCommentCount($document_srl);
if($comment_count && (!$using_validation || $is_admin))
{
$output = $oDocumentController->updateCommentCount($document_srl, $comment_count, $obj->nick_name, $update_document);
}
@ -701,7 +750,7 @@ class commentController extends comment
{
if(!$manual_updated && !checkCSRF())
{
return new BaseObject(-1, 'msg_invalid_request');
return new BaseObject(-1, 'msg_security_violation');
}
if(!is_object($obj))
@ -713,7 +762,13 @@ class commentController extends comment
// Remove manual member info to prevent forgery. This variable can be set by triggers only.
unset($obj->manual_member_info);
// Sanitize variables
$obj->comment_srl = intval($obj->comment_srl);
$obj->module_srl = intval($obj->module_srl);
$obj->document_srl = intval($obj->document_srl);
$obj->parent_srl = intval($obj->parent_srl);
// call a trigger (before)
$output = ModuleHandler::triggerCall('comment.updateComment', 'before', $obj);
if(!$output->toBool())
@ -748,7 +803,7 @@ class commentController extends comment
if($obj->homepage)
{
$obj->homepage = removeHackTag($obj->homepage);
$obj->homepage = escape($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
@ -973,6 +1028,7 @@ class commentController extends comment
$document_srl = $comment->document_srl;
// call a trigger (before)
$comment->isMoveToTrash = $isMoveToTrash ? true : false;
$output = ModuleHandler::triggerCall('comment.deleteComment', 'before', $comment);
if(!$output->toBool())
{
@ -1080,7 +1136,6 @@ class commentController extends comment
}
// call a trigger (after)
$comment->isMoveToTrash = $isMoveToTrash;
ModuleHandler::triggerCall('comment.deleteComment', 'after', $comment);
unset($comment->isMoveToTrash);
@ -1136,9 +1191,8 @@ class commentController extends comment
return new BaseObject(-1, 'msg_admin_comment_no_move_to_trash');
}
$trash_args->module_srl = $oComment->variables['module_srl'];
$obj->module_srl = $oComment->variables['module_srl'];
$obj->module_srl = $oComment->get('module_srl');
$trash_args->module_srl = $obj->module_srl;
if($trash_args->module_srl === 0)
{
return new BaseObject(-1, 'msg_module_srl_not_exists');
@ -1214,6 +1268,11 @@ class commentController extends comment
executeQuery('file.updateFileValid', $args);
}
$obj->document_srl = $oComment->get('document_srl');
$obj->parent_srl = $oComment->get('parent_srl');
$obj->member_srl = $oComment->get('member_srl');
$obj->regdate = $oComment->get('regdate');
$obj->last_update = $oComment->get('last_update');
ModuleHandler::triggerCall('comment.moveCommentToTrash', 'after', $obj);
$oDB->commit();
@ -1341,12 +1400,10 @@ class commentController extends comment
if($point > 0)
{
$failed_voted = 'failed_voted';
$success_message = 'success_voted';
}
else
{
$failed_voted = 'failed_blamed';
$success_message = 'success_blamed';
}
// invalid vote if vote info exists in the session info.
@ -1355,23 +1412,24 @@ class commentController extends comment
return new BaseObject(-1, $failed_voted);
}
// Get the original comment
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($comment_srl, FALSE, FALSE);
// invalid vote if both ip addresses between author's and the current user are same.
// Pass if the author's IP address is as same as visitor's.
if($oComment->get('ipaddress') == $_SERVER['REMOTE_ADDR'])
{
$_SESSION['voted_comment'][$comment_srl] = false;
return new BaseObject(-1, $failed_voted);
}
// Create a member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// if the comment author is a member
if($oComment->get('member_srl'))
{
// create the member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// session registered if the author information matches to the current logged-in user's.
if($member_srl && $member_srl == abs($oComment->get('member_srl')))
{
@ -1380,9 +1438,8 @@ class commentController extends comment
}
}
$args = new stdClass();
// If logged-in, use the member_srl. otherwise use the ipaddress.
$args = new stdClass();
if($member_srl)
{
$args->member_srl = $member_srl;
@ -1391,61 +1448,72 @@ class commentController extends comment
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
}
$args->comment_srl = $comment_srl;
$output = executeQuery('comment.getCommentVotedLogInfo', $args);
// session registered if log info contains recommendation vote log.
// Pass after registering a session if log information has vote-up logs
if($output->data->count)
{
$_SESSION['voted_comment'][$comment_srl] = false;
return new BaseObject(-1, $failed_voted);
}
// Call a trigger (before)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $oComment->get('member_srl');
$trigger_obj->module_srl = $oComment->get('module_srl');
$trigger_obj->document_srl = $oComment->get('document_srl');
$trigger_obj->comment_srl = $oComment->get('comment_srl');
$trigger_obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$trigger_obj->point = $point;
$trigger_obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$trigger_obj->after_point = $trigger_obj->before_point + $point;
$trigger_obj->cancel = false;
$trigger_output = ModuleHandler::triggerCall('comment.updateVotedCount', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
// update the number of votes
if($point < 0)
// Update the voted count
if($trigger_obj->update_target === 'blamed_count')
{
// leave into session information
$_SESSION['voted_comment'][$comment_srl] = $point;
$args->blamed_count = $oComment->get('blamed_count') + $point;
$args->blamed_count = $trigger_obj->after_point;
$output = executeQuery('comment.updateBlamedCount', $args);
}
else
{
$_SESSION['voted_comment'][$comment_srl] = $point;
$args->voted_count = $oComment->get('voted_count') + $point;
$args->voted_count = $trigger_obj->after_point;
$output = executeQuery('comment.updateVotedCount', $args);
}
// leave logs
$args->point = $point;
$args->point = $trigger_obj->point;
$output = executeQuery('comment.insertCommentVotedLog', $args);
$obj = new stdClass();
$obj->member_srl = $oComment->get('member_srl');
$obj->module_srl = $oComment->get('module_srl');
$obj->comment_srl = $oComment->get('comment_srl');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
ModuleHandler::triggerCall('comment.updateVotedCount', 'after', $obj);
// Leave in the session information
$_SESSION['voted_comment'][$comment_srl] = $trigger_obj->point;
// Call a trigger (after)
ModuleHandler::triggerCall('comment.updateVotedCount', 'after', $trigger_obj);
$oDB->commit();
// Return the result
$output = new BaseObject(0, $success_message);
if($point > 0)
$output = new BaseObject();
if($trigger_obj->update_target === 'voted_count')
{
$output->add('voted_count', $obj->after_point);
$output->setMessage('success_voted');
$output->add('voted_count', $trigger_obj->after_point);
}
else
{
$output->add('blamed_count', $obj->after_point);
$output->setMessage('success_blamed');
$output->add('blamed_count', $trigger_obj->after_point);
}
return $output;
@ -1500,13 +1568,12 @@ class commentController extends comment
return new BaseObject(-1, 'failed_declared');
}
// Get currently logged in user.
$member_srl = intval($this->user->member_srl);
// if the comment author is a member
if($oComment->get('member_srl'))
{
// create the member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// session registered if the author information matches to the current logged-in user's.
if($member_srl && $member_srl == abs($oComment->get('member_srl')))
{
@ -1515,29 +1582,31 @@ class commentController extends comment
}
}
// If logged-in, use the member_srl. otherwise use the ipaddress.
// Pass after registering a sesson if reported/declared documents are in the logs.
$args = new stdClass;
$args->comment_srl = $comment_srl;
if($member_srl)
{
$args->member_srl = $member_srl;
}
else
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
$args->ipaddress = \RX_CLIENT_IP;
}
$args->comment_srl = $comment_srl;
$args->declare_message = $declare_message;
$log_output = executeQuery('comment.getCommentDeclaredLogInfo', $args);
// session registered if log info contains report log.
if($log_output->data->count)
{
$_SESSION['declared_comment'][$comment_srl] = TRUE;
return new BaseObject(-1, 'failed_declared');
}
// Fill in remaining information for logging.
$args->member_srl = $member_srl;
$args->ipaddress = \RX_CLIENT_IP;
$args->declare_message = $declare_message;
// begin transaction
$oDB = &DB::getInstance();
$oDB = DB::getInstance();
$oDB->begin();
// execute insert
@ -1655,13 +1724,13 @@ class commentController extends comment
$module_info = $oModuleModel->getModuleInfoByModuleSrl($srl);
if (!$module_info->module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$module_grant = $oModuleModel->getGrant($module_info, $logged_info);
if (!$module_grant->manager)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$module_srl[] = $srl;
@ -1729,7 +1798,7 @@ class commentController extends comment
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$commentSrls = Context::get('comment_srls');

View file

@ -287,12 +287,12 @@ class commentItem extends BaseObject
return;
}
if(strncasecmp('http://', $url, 7) !== 0)
if(!preg_match('@^[a-z]+://@i', $url))
{
$url = "http://" . $url;
$url = 'http://' . $url;
}
return htmlspecialchars($url, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
return escape($url, false);
}
function getMemberSrl()
@ -302,17 +302,17 @@ class commentItem extends BaseObject
function getUserID()
{
return htmlspecialchars($this->get('user_id'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
return escape($this->get('user_id'), false);
}
function getUserName()
{
return htmlspecialchars($this->get('user_name'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
return escape($this->get('user_name'), false);
}
function getNickName()
{
return htmlspecialchars($this->get('nick_name'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
return escape($this->get('nick_name'), false);
}
function getVote()
@ -388,7 +388,7 @@ class commentItem extends BaseObject
{
$content = $this->get('content');
}
if($strlen)
{
$content = trim(utf8_normalize_spaces(html_entity_decode(strip_tags($content))));

View file

@ -977,7 +977,7 @@ class commentModel extends comment
$comment_srl = Context::get('comment_srl');
if(!$comment_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$point = Context::get('point');
@ -991,7 +991,7 @@ class commentModel extends comment
$module_srl = $oComment->get('module_srl');
if(!$module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$oModuleModel = getModel('module');
@ -1003,7 +1003,7 @@ class commentModel extends comment
{
if($comment_config->use_vote_down != 'S')
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\FeatureDisabled;
}
$args->below_point = 0;
@ -1012,7 +1012,7 @@ class commentModel extends comment
{
if($comment_config->use_vote_up != 'S')
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\FeatureDisabled;
}
$args->more_point = 0;

View file

@ -73,7 +73,7 @@ class commentView extends comment
// A message appears if the user is not logged-in
if(!$oMemberModel->isLogged())
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
// Create the comment object.
@ -82,12 +82,12 @@ class commentView extends comment
$oComment = $oCommentModel->getComment($comment_srl);
if(!$oComment->isExists())
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
// Check permissions
if(!$oComment->isAccessible())
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
// Browser title settings

View file

@ -7,8 +7,6 @@ $lang->trash = '휴지통';
$lang->cmd_trash = '휴지통으로 이동';
$lang->comment_count = '댓글 수';
$lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고, 그 이상일 경우 페이지 번호를 표시해서 이동할 수 있게 합니다.';
$lang->msg_comment_voted_cancel_not = '추천수가 0이하일 경우 추천캔슬을 사용할 수 없습니다.';
$lang->msg_comment_blamed_cancel_not = '추천수가 0이하일 경우 비추천캔슬을 사용할 수 없습니다.';
$lang->msg_cart_is_null = '삭제할 글을 선택해주세요.';
$lang->msg_checked_comment_is_deleted = '%d개의 댓글을 삭제했습니다.';
$lang->search_target_list['content'] = '내용';

View file

@ -7,6 +7,7 @@
</columns>
<conditions>
<condition operation="equal" column="comment_srl" var="comment_srl" filter="number" notnull="notnull" />
<condition operation="equal" column="point" var="point" filter="number" />
<group pipe="and">
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="equal" column="ipaddress" var="ipaddress" pipe="and" />

View file

@ -12,8 +12,8 @@
<condition operation="equal" column="is_secret" var="s_is_secret" pipe="and" />
<group pipe="and">
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="equal" column="user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />

View file

@ -13,8 +13,8 @@
<condition operation="equal" column="comments.is_secret" var="s_is_secret" pipe="and" />
<group pipe="and">
<condition operation="like" column="comments.content" var="s_content" />
<condition operation="equal" column="comments.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="comments.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="comments.user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="comments.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="comments.email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="comments.homepage" var="s_homepage" pipe="or" />
<condition operation="like_prefix" column="comments.regdate" var="s_regdate" pipe="or" />

View file

@ -13,8 +13,8 @@
<condition operation="in" column="status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="equal" column="user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />

View file

@ -14,8 +14,8 @@
<condition operation="in" column="comments.status" var="statusList" pipe="and" />
<group pipe="and">
<condition operation="like" column="comments.content" var="s_content" />
<condition operation="equal" column="comments.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="comments.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="comments.user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="comments.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="comments.email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="comments.homepage" var="s_homepage" pipe="or" />
<condition operation="like_prefix" column="comments.regdate" var="s_regdate" pipe="or" />

View file

@ -7,7 +7,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form id="fo_list" action="./" method="post">
<table id="commentListTable" class="x_table x_table-striped x_table-hover">
<table id="commentListTable" class="x_table x_table-striped x_table-hover dsTg">
<caption>
<a href="{getUrl('','module','admin','act','dispCommentAdminList','Y')}" class="active"|cond="$search_keyword == ''">{$lang->all}<block cond="$search_keyword == ''">({number_format($total_count)})</block></a>
<i>|</i>
@ -22,7 +22,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<a href="{getUrl('', 'module', 'admin', 'act','dispCommentAdminDeclared')}">{$lang->cmd_declared_list}</a>
<i cond="$search_target == 'ipaddress'">|</i>
<a href="{getUrl('search_target', 'ipaddress')}" class="active" cond="$search_target == 'ipaddress'">{$lang->ipaddress}:{$search_keyword}({number_format($total_count)})</a>
<div class="x_btn-group x_pull-right">
<a href="#listManager" class="x_btn modalAnchor" data-value="true" data-name="is_trash">{$lang->trash}</a>
<a href="#listManager" class="x_btn modalAnchor" data-value="false" data-name="is_trash">{$lang->delete}</a>
@ -31,16 +31,20 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<a href="#listManager" class="x_btn modalAnchor" data-value="0" data-name="will_publish" cond="$search_target!='is_published'">{$lang->cmd_unpublish}</a>
<a href="#listManager" class="x_btn modalAnchor" data-value="1" data-name="will_publish" cond="$search_target!='is_published'">{$lang->cmd_publish}</a>
</div>
<div class="x_pull-right x_btn-group margin_after">
<button type="button" class="x_btn x_active __simple">{$lang->simple_view}</button>
<button type="button" class="x_btn __detail">{$lang->detail_view}</button>
</div>
</caption>
<thead>
<tr>
<th scope="col">{$lang->comment}</th>
<th scope="col" class="nowr">{$lang->writer}</th>
<th scope="col" class="nowr">{$lang->cmd_vote}(+/-)</th>
<th scope="col" class="nowr rx_detail_marks">{$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" class="nowr">{$lang->published}</th>
<th scope="col" class="nowr rx_detail_marks">{$lang->ipaddress}</th>
<th scope="col" class="nowr rx_detail_marks">{$lang->status}</th>
<th scope="col" class="nowr rx_detail_marks">{$lang->published}</th>
<th scope="col"><input type="checkbox" data-name="cart" title="Check All" /></th>
</tr>
</thead>
@ -58,11 +62,14 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<a href="#popup_menu_area" class="member_{abs($val->get('member_srl'))}" cond="$val->get('member_srl') < 0">({$member_nick_name[abs($val->get('member_srl'))]})</a>
<a href="#popup_menu_area" class="member_{$val->get('member_srl')}" cond="$val->get('member_srl') > 0">{$val->getNickName()}</a>
</td>
<td class="nowr">{number_format($val->get('voted_count'))}/{number_format($val->get('blamed_count'))}</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 class="nowr rx_detail_marks">{number_format($val->get('voted_count'))}/{number_format($val->get('blamed_count'))}</td>
<td class="nowr">
<span class="rx_detail_marks">{$val->getRegdate('Y-m-d H:i:s')}</span>
<span class="rx_simple_marks">{$val->getRegdate($val->getRegdateTime() > time() - 86400 ? 'H:i' : 'm-d')}</span>
</td>
<td class="nowr rx_detail_marks"><a href="{getUrl('search_target','ipaddress','search_keyword',$val->ipaddress)}">{$val->ipaddress}</a></td>
<td class="nowr rx_detail_marks"><!--@if($val->isSecret())-->{$secret_name_list['Y']}<!--@else-->{$secret_name_list['N']}<!--@end--></td>
<td class="nowr rx_detail_marks"><!--@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>
<tr cond="!$comment_list">

View file

@ -45,8 +45,8 @@
<div class="x_control-group">
<label class="x_control-label">{lang('document.cmd_declared_message')}</label>
<div class="x_controls">
<label class="x_inline" for="declared_message_admin"><input type="checkbox" name="declared_message[]" id="declared_message_admin" value="admin" checked="checked"|cond="in_array('admin', $comment_config->declared_message)" /> {$lang->cmd_declared_message_admin}</label>
<label class="x_inline" for="declared_message_manager"><input type="checkbox" name="declared_message[]" id="declared_message_manager" value="manager" checked="checked"|cond="in_array('manager', $comment_config->declared_message)" /> {$lang->cmd_declared_message_manager}</label>
<label class="x_inline" for="declared_message_admin"><input type="checkbox" name="declared_message[]" id="declared_message_admin" value="admin" checked="checked"|cond="$comment_config->declared_message && in_array('admin', $comment_config->declared_message)" /> {$lang->cmd_declared_message_admin}</label>
<label class="x_inline" for="declared_message_manager"><input type="checkbox" name="declared_message[]" id="declared_message_manager" value="manager" checked="checked"|cond="$comment_config->declared_message && in_array('manager', $comment_config->declared_message)" /> {$lang->cmd_declared_message_manager}</label>
</div>
</div>
<div class="x_clearfix btnArea">

View file

@ -1,4 +1,4 @@
<load target="js/comment_admin.js" usecdn="true" />
<div class="x_page-header">
<h1>{$lang->comment} {$lang->cmd_management} <a class="x_icon-question-sign" href="./common/manual/admin/index.html#UMAN_content_comment" target="_blank">{$lang->help}</a></h1>
<h1>{$lang->comment} {$lang->cmd_management}</h1>
</div>

View file

@ -24,7 +24,7 @@ class communicationController extends communication
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$args = new stdClass();
@ -54,7 +54,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -63,25 +63,19 @@ class communicationController extends communication
$receiver_srl = Context::get('receiver_srl');
if(!$receiver_srl)
{
return $this->setError('msg_not_exists_member');
throw new Rhymix\Framework\Exception('msg_not_exists_member');
}
$title = trim(Context::get('title'));
$title = trim(escape(Context::get('title')));
if(!$title)
{
return $this->setError('msg_title_is_null');
throw new Rhymix\Framework\Exception('msg_title_is_null');
}
$content = trim(Context::get('content'));
if(!$content)
{
return $this->setError('msg_content_is_null');
}
$send_mail = Context::get('send_mail');
if($send_mail != 'Y')
{
$send_mail = 'N';
throw new Rhymix\Framework\Exception('msg_content_is_null');
}
// Check if there is a member to receive a message
@ -91,13 +85,13 @@ class communicationController extends communication
if(!$oCommunicationModel->checkGrant($config->grant_send))
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$receiver_member_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl);
if($receiver_member_info->member_srl != $receiver_srl)
{
return $this->setError('msg_not_exists_member');
throw new Rhymix\Framework\Exception('msg_not_exists_member');
}
// check whether to allow to receive the message(pass if a top-administrator)
@ -107,12 +101,12 @@ class communicationController extends communication
{
if(!$oCommunicationModel->isFriend($receiver_member_info->member_srl))
{
return $this->setError('msg_allow_message_to_friend');
throw new Rhymix\Framework\Exception('msg_allow_message_to_friend');
}
}
else if($receiver_member_info->allow_message == 'N')
{
return $this->setError('msg_disallow_message');
throw new Rhymix\Framework\Exception('msg_disallow_message');
}
}
@ -124,21 +118,6 @@ class communicationController extends communication
return $output;
}
// send an e-mail
if($send_mail == 'Y')
{
$view_url = Context::getRequestUri();
$content = sprintf("%s<br /><br />From : <a href=\"%s\" target=\"_blank\">%s</a>", $content, $view_url, $view_url);
$oMail = new \Rhymix\Framework\Mail();
$oMail->setSubject($title);
$oMail->setBody(utf8_mbencode(removeHackTag($content)));
$oMail->setFrom(config('mail.default_from') ?: $logged_info->email_address, $logged_info->nick_name);
$oMail->setReplyTo($logged_info->email_address);
$oMail->addTo($receiver_member_info->email_address, $receiver_member_info->nick_name);
$oMail->send();
}
if(!in_array(Context::getRequestMethod(), array('XMLRPC', 'JSON')))
{
if(Context::get('is_popup') != 'Y')
@ -174,7 +153,7 @@ class communicationController extends communication
function sendMessage($sender_srl, $receiver_srl, $title, $content, $sender_log = TRUE)
{
// Encode the title and content.
$title = htmlspecialchars($title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
$title = escape($title, false);
$content = removeHackTag($content);
$title = utf8_mbencode($title);
$content = utf8_mbencode($content);
@ -269,7 +248,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -277,7 +256,7 @@ class communicationController extends communication
$message_srl = Context::get('message_srl');
if(!$message_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// get the message
@ -285,7 +264,7 @@ class communicationController extends communication
$message = $oCommunicationModel->getSelectedMessage($message_srl);
if(!$message || $message->message_type != 'R')
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$args = new stdClass();
@ -309,7 +288,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -319,7 +298,7 @@ class communicationController extends communication
$message_srl = Context::get('message_srl');
if(!$message_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Get the message
@ -327,7 +306,7 @@ class communicationController extends communication
$message = $oCommunicationModel->getSelectedMessage($message_srl);
if(!$message)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Check the grant
@ -336,14 +315,14 @@ class communicationController extends communication
case 'S':
if($message->sender_srl != $member_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
break;
case 'R':
if($message->receiver_srl != $member_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
break;
}
@ -369,7 +348,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -378,7 +357,7 @@ class communicationController extends communication
// check variables
if(!Context::get('message_srl_list'))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
$message_srl_list = Context::get('message_srl_list');
@ -389,13 +368,13 @@ class communicationController extends communication
if(!count($message_srl_list))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
$message_type = Context::get('message_type');
if(!$message_type || !in_array($message_type, array('R', 'S', 'T', 'N')))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$message_count = count($message_srl_list);
@ -412,7 +391,7 @@ class communicationController extends communication
}
if(!count($target))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
// Delete
@ -458,7 +437,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -466,11 +445,11 @@ class communicationController extends communication
$target_srl = (int) trim(Context::get('target_srl'));
if(!$target_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if($target_srl == $logged_info->member_srl)
{
return $this->setError('msg_no_self_friend');
throw new Rhymix\Framework\Exception('msg_no_self_friend');
}
// Check duplicate friend
@ -480,7 +459,7 @@ class communicationController extends communication
$output = executeQuery('communication.isAddedFriend', $args);
if($output->data->count)
{
return $this->setError('msg_already_friend');
throw new Rhymix\Framework\Exception('msg_already_friend');
}
// Variable
@ -520,7 +499,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -529,7 +508,7 @@ class communicationController extends communication
$friend_srl_list = Context::get('friend_srl_list');
if(!$friend_srl_list)
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
if(!is_array($friend_srl_list))
@ -539,7 +518,7 @@ class communicationController extends communication
if(!count($friend_srl_list))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
$friend_count = count($friend_srl_list);
@ -557,7 +536,7 @@ class communicationController extends communication
if(!count($target))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
// Variables
@ -587,7 +566,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -603,7 +582,7 @@ class communicationController extends communication
if(!count($friend_srl_list))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
$friend_count = count($friend_srl_list);
@ -622,7 +601,7 @@ class communicationController extends communication
if(!count($target))
{
return $this->setError('msg_cart_is_null');
throw new Rhymix\Framework\Exception('msg_cart_is_null');
}
// Delete
@ -650,7 +629,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -659,12 +638,11 @@ class communicationController extends communication
$args = new stdClass();
$args->friend_group_srl = trim(Context::get('friend_group_srl'));
$args->member_srl = $logged_info->member_srl;
$args->title = Context::get('title');
$args->title = htmlspecialchars($args->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
$args->title = escape(Context::get('title'));
if(!$args->title)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// modify if friend_group_srl exists.
@ -726,7 +704,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -735,12 +713,11 @@ class communicationController extends communication
$args = new stdClass();
$args->friend_group_srl = Context::get('friend_group_srl');
$args->member_srl = $logged_info->member_srl;
$args->title = Context::get('title');
$args->title = htmlspecialchars($args->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
$args->title = escape(Context::get('title'));
if(!$args->title)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$output = executeQuery('communication.renameFriendGroup', $args);
@ -761,7 +738,7 @@ class communicationController extends communication
// Check login information
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');

View file

@ -163,7 +163,7 @@ class communicationModel extends communication
$member_info = $oMemberModel->getMemberInfoByMemberSrl($message->sender_srl);
}
if($member_info)
if($member_info->member_srl)
{
foreach($member_info as $key => $val)
{
@ -176,6 +176,13 @@ class communicationModel extends communication
$message->{$key} = $val;
}
}
else
{
$message->member_srl = ($message->sender_srl == $logged_info->member_srl) ? $message->receiver_srl : $message->sender_srl;
$message->user_id = '';
$message->nick_name = lang('communication.cmd_message_from_non_member');
$message->user_name = $message->nick_name;
}
// change the status if is a received and not yet read message
if($message->message_type == 'R' && $message->readed != 'Y')
@ -210,6 +217,14 @@ class communicationModel extends communication
$oCommunicationController = getController('communication');
$oCommunicationController->setMessageReaded($message->message_srl);
if (!$message->member_srl)
{
$message->member_srl = $message->sender_srl;
$message->user_id = '';
$message->nick_name = lang('communication.cmd_message_from_non_member');
$message->user_name = $message->nick_name;
}
return $message;
}
@ -274,7 +289,22 @@ class communicationModel extends communication
$args->list_count = 20;
$args->page_count = 10;
return executeQueryArray($query_id, $args, $columnList);
// Get messages from DB
$output = executeQueryArray($query_id, $args, $columnList);
// Add placeholder for non-members
foreach ($output->data as $message)
{
if (!$message->member_srl)
{
$message->member_srl = ($message->sender_srl == $logged_info->member_srl) ? $message->receiver_srl : $message->sender_srl;
$message->user_id = '';
$message->nick_name = lang('communication.cmd_message_from_non_member');
$message->user_name = $message->nick_name;
}
}
return $output;
}
/**

View file

@ -52,13 +52,13 @@ class communicationView extends communication
{
if($this->config->enable_message == 'N')
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -86,28 +86,28 @@ class communicationView extends communication
case 'R':
if($message->receiver_srl != $logged_info->member_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
break;
case 'S':
if($message->sender_srl != $logged_info->member_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
break;
case 'T':
if($message->receiver_srl != $logged_info->member_srl && $message->sender_srl != $logged_info->member_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
break;
case 'N':
if($message->receiver_srl != $logged_info->member_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
break;
}
@ -151,13 +151,13 @@ class communicationView extends communication
if($this->config->enable_message == 'N')
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -190,17 +190,17 @@ class communicationView extends communication
if($this->config->enable_message == 'N')
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if(!getModel('communication')->checkGrant($this->config->grant_send))
{
return $this->stop('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
// Error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -210,13 +210,13 @@ class communicationView extends communication
$receiver_srl = Context::get('receiver_srl');
if(!$receiver_srl)
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// check receiver and sender are same
if($logged_info->member_srl == $receiver_srl)
{
return $this->stop('msg_cannot_send_to_yourself');
throw new Rhymix\Framework\Exception('msg_cannot_send_to_yourself');
}
$oCommunicationModel = getModel('communication');
@ -241,7 +241,7 @@ class communicationView extends communication
$receiver_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl);
if(!$receiver_info)
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
Context::set('receiver_info', $receiver_info);
@ -275,13 +275,13 @@ class communicationView extends communication
{
if($this->config->enable_friend == 'N')
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$oCommunicationModel = getModel('communication');
@ -339,13 +339,13 @@ class communicationView extends communication
if($this->config->enable_friend == 'N')
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');
@ -353,11 +353,11 @@ class communicationView extends communication
if(!$target_srl)
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
if($target_srl == $logged_info->member_srl)
{
return $this->stop('msg_no_self_friend');
throw new Rhymix\Framework\Exception('msg_no_self_friend');
}
// get information of the member
@ -367,7 +367,7 @@ class communicationView extends communication
if($communication_info->member_srl != $target_srl)
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
Context::set('target_info', $communication_info);
@ -390,13 +390,13 @@ class communicationView extends communication
if($this->config->enable_friend == 'N')
{
return $this->stop('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// error apprears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$logged_info = Context::get('logged_info');

View file

@ -2,13 +2,13 @@
<module>
<grants />
<actions>
<action name="dispCommunicationMessages" type="view" permission="member" />
<action name="dispCommunicationSendMessage" type="view" permission="member" />
<action name="dispCommunicationNewMessage" type="view" permission="member" />
<action name="dispCommunicationFriend" type="view" permission="member" />
<action name="dispCommunicationAddFriend" type="view" permission="member" />
<action name="dispCommunicationAddFriendGroup" type="view" permission="member" />
<action name="dispCommunicationMessageBoxList" type="mobile" permission="member" />
<action name="dispCommunicationMessages" type="view" permission="member" meta-noindex="true" />
<action name="dispCommunicationSendMessage" type="view" permission="member" meta-noindex="true" />
<action name="dispCommunicationNewMessage" type="view" permission="member" meta-noindex="true" />
<action name="dispCommunicationFriend" type="view" permission="member" meta-noindex="true" />
<action name="dispCommunicationAddFriend" type="view" permission="member" meta-noindex="true" />
<action name="dispCommunicationAddFriendGroup" type="view" permission="member" meta-noindex="true" />
<action name="dispCommunicationMessageBoxList" type="mobile" permission="member" meta-noindex="true" />
<action name="procCommunicationUpdateAllowMessage" type="controller" permission="member" />
<action name="procCommunicationSendMessage" type="controller" permission="member" ruleset="sendMessage" />

View file

@ -14,6 +14,7 @@ $lang->sender = 'From';
$lang->receiver = 'To';
$lang->friend_group = 'Friend Group';
$lang->default_friend_group = 'Unassigned Group';
$lang->cmd_message_from_non_member = 'Not a Member';
$lang->cmd_send_message = 'Send Message';
$lang->cmd_reply_message = 'Reply Message';
$lang->cmd_view_friend = 'Friends';

View file

@ -14,6 +14,7 @@ $lang->sender = '보낸이';
$lang->receiver = '받는이';
$lang->friend_group = '친구 그룹';
$lang->default_friend_group = '그룹 미지정';
$lang->cmd_message_from_non_member = '탈퇴한 회원';
$lang->cmd_send_message = '쪽지 보내기';
$lang->cmd_reply_message = '답장 보내기';
$lang->cmd_view_friend = '친구 보기';

View file

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

View file

@ -35,15 +35,12 @@
<input type="text" name="title" id="message_title" value="{$source_message->title}"/>
</li>
<li class="xe_content">
{$source_message->content}
{$source_message->content|noescape}
</li>
<li>
<label for="message_content">{$lang->content}</label>
<textarea id="message_content" name="new_content" rows="8" style="width:100%"></textarea>
</li>
<li>
<span id="message_send_mail"><input type="checkbox" value="Y" name="send_mail" /> {$lang->cmd_send_mail}</span>
</li>
</ul>
<div class="bna">
<span class="fl"><a href="{getUrl('act', 'dispCommunicationMessages')}" class="bn white">{$lang->cmd_back}</a></span>

View file

@ -7,7 +7,7 @@
<a href="popup_menu_area" class="member_{$message->member_srl}">{$message->nick_name}</a> / {zdate($message->regdate, "Y-m-d H:i")}
</div>
<div class="xe_content">
{$message->content}
{$message->content|noescape}
</div>
<div class="prn-anchor-buttons">
<a cond="$message->message_type != 'S' && $message->member_srl != $logged_info->member_srl" href="#" onclick="doSendMessage('{$message->sender_srl}','{$message->message_srl}');">{$lang->cmd_reply_message}</a>

View file

@ -27,14 +27,12 @@
<a id="message_receiver" href="#popup_menu_area" class="member_{$receiver_info->member_srl}">{$receiver_info->nick_name}</a>
<label for="message_title">{$lang->title}</label>
<input type="text" name="title" id="message_title" value="{$source_message->title}" />
<label for="message_send_mail"><input type="checkbox" value="Y" name="send_mail" id="message_send_mail" /> {$lang->cmd_send_mail}</label>
<div class="rx_prn-notice info">{$lang->msg_send_mail_privacy}</div>
</div>
{$editor}
{$editor|noescape}
<div class="control-group">
<input type="submit" value="{$lang->cmd_send_message}" />
</div>
</form>
</section>
</div>
<include target="./common_footer.html" />
<include target="./common_footer.html" />

View file

@ -1,7 +1,11 @@
<query id="getNewMessage" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" />
<table name="member" type="left join">
<conditions>
<condition operation="equal" column="member.member_srl" default="message.sender_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="*" />
@ -9,7 +13,6 @@
<conditions>
<condition operation="equal" column="message.receiver_srl" var="receiver_srl" notnull="notnull" />
<condition operation="equal" column="message.readed" var="readed" default="N" notnull="notnull" pipe="and" />
<condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
<condition operation="equal" column="message.message_type" var="message_type" default="R" pipe="and" />
</conditions>
<navigation>

View file

@ -1,7 +1,6 @@
<query id="getNewMessageCount" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" />
</tables>
<columns>
<column name="count(*)" alias="count" />
@ -9,7 +8,6 @@
<conditions>
<condition operation="equal" column="message.receiver_srl" var="receiver_srl" notnull="notnull" />
<condition operation="equal" column="message.readed" var="readed" default="N" notnull="notnull" pipe="and" />
<condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
<condition operation="equal" column="message.message_type" var="message_type" default="R" pipe="and" />
</conditions>
</query>

View file

@ -1,7 +1,11 @@
<query id="getReceivedMessages" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" alias="member" />
<table name="member" type="left join">
<conditions>
<condition operation="equal" column="member.member_srl" default="message.sender_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="message.*" />
@ -14,7 +18,6 @@
<condition operation="equal" column="message.readed" var="readed" notnull="notnull" />
<condition operation="equal" column="message.receiver_srl" var="member_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="message.message_type" var="message_type" default="R" pipe="and" />
<condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="message.list_order" order="asc" />

View file

@ -1,7 +1,11 @@
<query id="getReceivedMessages" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" alias="member" />
<table name="member" type="left join">
<conditions>
<condition operation="equal" column="member.member_srl" default="message.sender_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="message.*" />
@ -13,7 +17,6 @@
<conditions>
<condition operation="equal" column="message.receiver_srl" var="member_srl" notnull="notnull" />
<condition operation="equal" column="message.message_type" var="message_type" default="R" pipe="and" />
<condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="message.list_order" order="asc" />

View file

@ -1,7 +1,11 @@
<query id="getSendedMessages" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" alias="member" />
<table name="member" type="left join">
<conditions>
<condition operation="equal" column="member.member_srl" default="message.receiver_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="message.*" />
@ -13,7 +17,6 @@
<conditions>
<condition operation="equal" column="message.sender_srl" var="member_srl" notnull="notnull" />
<condition operation="equal" column="message.message_type" var="message_type" default="S" pipe="and" />
<condition operation="equal" column="message.receiver_srl" var="member.member_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="message.list_order" order="asc" />

View file

@ -1,7 +1,11 @@
<query id="getStoredMessages" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" alias="member" />
<table name="member" type="left join">
<conditions>
<condition operation="equal" column="member.member_srl" default="message.sender_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="message.*" />
@ -13,7 +17,6 @@
<conditions>
<condition operation="equal" column="message.receiver_srl" var="member_srl" notnull="notnull" />
<condition operation="equal" column="message.message_type" var="message_type" default="T" pipe="and" />
<condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="message.list_order" order="asc" />

View file

@ -29,7 +29,7 @@
</tr>
<tr>
<td class="xe_content">
{$message->content}
{$message->content|noescape}
</td>
</tr>
</table>

View file

@ -14,7 +14,7 @@
<td>{htmlspecialchars($message->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}</td>
</tr>
<tr>
<td colspan="2" class="xe_content">{$message->content}</td>
<td colspan="2" class="xe_content">{$message->content|noescape}</td>
</tr>
</table>
<div class="btnArea">

View file

@ -30,12 +30,8 @@
<th scope="row">{$lang->title}</th>
<td><input type="text" name="title" id="message_title" value="{$source_message->title}" style="width:90%" /></td>
</tr>
<tr>
<th scope="row">{$lang->cmd_option}</th>
<td><input type="checkbox" value="Y" name="send_mail" /> {$lang->cmd_send_mail} <span class="explanation">{$lang->msg_send_mail_privacy}</span></td>
</tr>
</table>
{$editor}
{$editor|noescape}
<div class="btnArea">
<input type="submit" value="{$lang->cmd_send_message}" class="btn btn-inverse" />
</div>

View file

@ -6,7 +6,7 @@
<a href="popup_menu_area" class="member_{$message->member_srl}">{$message->nick_name}</a> / {zdate($message->regdate, "Y-m-d H:i")}
</div>
<div class="xe_content">
{$message->content}
{$message->content|noescape}
</div>
<div class="sw-footer sw-anchor-buttons">
<a cond="$message->message_type != 'S' && $message->member_srl != $logged_info->member_srl" href="#" onclick="doSendMessage('{$message->sender_srl}','{$message->message_srl}');">{$lang->cmd_reply_message}</a>

View file

@ -16,8 +16,6 @@
<a id="message_receiver" href="#popup_menu_area" class="member_{$receiver_info->member_srl}">{$receiver_info->nick_name}</a>
<label for="message_title">{$lang->title}</label>
<input type="text" name="title" id="message_title" value="{$source_message->title}" />
<label for="message_send_mail"><input type="checkbox" value="Y" name="send_mail" id="message_send_mail" /> {$lang->cmd_send_mail}</label>
<div class="rx_member-notice info">{$lang->msg_send_mail_privacy}</div>
<div class="rx_member-notice info" cond="$logged_info->allow_message !== 'Y'">
{$lang->warning}
<br>
@ -29,7 +27,7 @@
<br>{$lang->msg_allow_message_please}
</div>
</div>
{$editor}
{$editor|noescape}
<div class="control-group">
<input type="submit" value="{$lang->cmd_send_message}" />
</div>

View file

@ -104,12 +104,9 @@
<label class="x_control-label" for="grant_send">{$lang->communication_send_message_grant}</label>
<div class="x_controls">
<select name="grant_send_default" class="grant_default" id="grant_send">
<option value="member" selected="selected"|cond="$config->grant_send['default'] == 'member'">
<option value="member" selected="selected"|cond="$config->grant_send['default'] == 'member' || $config->grant_send['default'] == 'site'">
{$lang->grant_to_login_user}
</option>
<option value="site" selected="selected"|cond="$config->grant_send['default'] == 'site'">
{$lang->grant_to_site_user}
</option>
<option value="manager" selected="selected"|cond="$config->grant_send['default'] == 'manager'">
{$lang->grant_to_admin}
</option>

View file

@ -2,11 +2,11 @@
<module>
<grants />
<actions>
<action name="dispDocumentPrint" type="view" />
<action name="dispDocumentPreview" type="view" />
<action name="dispTempSavedList" type="view" permission="member" />
<action name="dispDocumentDeclare" type="view" permission="member" />
<action name="dispDocumentManageDocument" type="view" permission="all-managers" />
<action name="dispDocumentPrint" type="view" meta-noindex="true"/>
<action name="dispDocumentPreview" type="view" meta-noindex="true"/>
<action name="dispTempSavedList" type="view" permission="member" meta-noindex="true"/>
<action name="dispDocumentDeclare" type="view" permission="member" meta-noindex="true" />
<action name="dispDocumentManageDocument" type="view" permission="all-managers" meta-noindex="true" />
<action name="getDocumentMenu" type="model" />
<action name="getDocumentCategories" type="model" permission="all-managers" />

View file

@ -27,10 +27,10 @@ class documentAdminController extends document
{
// error appears if no doc is selected
$cart = Context::get('cart');
if(!$cart) return $this->stop('msg_cart_is_null');
if(!$cart) throw new Rhymix\Framework\Exception('msg_cart_is_null');
$document_srl_list= explode('|@|', $cart);
$document_count = count($document_srl_list);
if(!$document_count) return $this->stop('msg_cart_is_null');
if(!$document_count) throw new Rhymix\Framework\Exception('msg_cart_is_null');
// Delete a doc
$oDocumentController = getController('document');
for($i=0;$i<$document_count;$i++)
@ -140,7 +140,7 @@ class documentAdminController extends document
$eid = Context::get('eid');
$obj = new stdClass();
if(!$module_srl || !$name || !$eid) return $this->setError('msg_invalid_request');
if(!$module_srl || !$name || !$eid) throw new Rhymix\Framework\Exceptions\InvalidRequest;
// set the max value if idx is not specified
if(!$var_idx)
{
@ -156,7 +156,7 @@ class documentAdminController extends document
$output = executeQuery('document.isExistsExtraKey', $obj);
if(!$output->toBool() || $output->data->count)
{
return $this->setError('msg_extra_name_exists');
throw new Rhymix\Framework\Exception('msg_extra_name_exists');
}
// insert or update
@ -178,7 +178,7 @@ class documentAdminController extends document
{
$module_srl = Context::get('module_srl');
$var_idx = Context::get('var_idx');
if(!$module_srl || !$var_idx) return $this->setError('msg_invalid_request');
if(!$module_srl || !$var_idx) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oDocumentController = getController('document');
$output = $oDocumentController->deleteDocumentExtraKeys($module_srl, $var_idx);
@ -197,26 +197,26 @@ class documentAdminController extends document
$module_srl = Context::get('module_srl');
$var_idx = Context::get('var_idx');
if(!$type || !$module_srl || !$var_idx) return $this->setError('msg_invalid_request');
if(!$type || !$module_srl || !$var_idx) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oModuleModel = getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if(!$module_info->module_srl) return $this->setError('msg_invalid_request');
if(!$module_info->module_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oDocumentModel = getModel('document');
$extra_keys = $oDocumentModel->getExtraKeys($module_srl);
if(!$extra_keys[$var_idx]) return $this->setError('msg_invalid_request');
if(!$extra_keys[$var_idx]) throw new Rhymix\Framework\Exceptions\InvalidRequest;
if($type == 'up') $new_idx = $var_idx-1;
else $new_idx = $var_idx+1;
if($new_idx<1) return $this->setError('msg_invalid_request');
if($new_idx<1) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$args = new stdClass();
$args->module_srl = $module_srl;
$args->var_idx = $new_idx;
$output = executeQuery('document.getDocumentExtraKeys', $args);
if (!$output->toBool()) return $output;
if (!$output->data) return $this->setError('msg_invalid_request');
if (!$output->data) throw new Rhymix\Framework\Exceptions\InvalidRequest;
unset($args);
// update immediately if there is no idx to change
@ -314,13 +314,16 @@ class documentAdminController extends document
$oDocumentModel = getModel('document');
$oDocumentController = getController('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
if(!$oDocument->isGranted()) return $this->stop('msg_not_permitted');
if(!$oDocument->isGranted())
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$oMemberModel = getModel('member');
$member_info = $oMemberModel->getMemberInfoByMemberSrl($oDocument->get('member_srl'));
if($member_info->is_admin == 'Y' && $logged_info->is_admin != 'Y')
{
return $this->setError('msg_admin_document_no_move_to_trash');
throw new Rhymix\Framework\Exception('msg_admin_document_no_move_to_trash');
}
$oModuleModel = getModel('module');
@ -407,9 +410,14 @@ class documentAdminController extends document
{
return;
}
if(!is_array($document_srl_list))
{
$document_srl_list = array_map('trim', explode(',', $document_srl_list));
}
$document_srl_list = array_map('intval', $document_srl_list);
$obj = new stdClass;
$obj->document_srls = implode(',', $document_srl_list);
$obj->document_srls = $document_srl_list;
$obj->list_count = count($document_srl_list);
$obj->document_list = executeQueryArray('document.getDocuments', $obj)->data;
$obj->module_srl = $target_module_srl;
@ -478,9 +486,9 @@ class documentAdminController extends document
$oDB->commit();
// remove from cache
foreach ($document_srl_list as $document_srl)
foreach($obj->document_list as $document)
{
Rhymix\Framework\Cache::delete('document_item:'. getNumberingPath($document_srl) . $document_srl);
Rhymix\Framework\Cache::delete('document_item:'. getNumberingPath($document->document_srl) . $document->document_srl);
}
return new BaseObject();
@ -499,9 +507,14 @@ class documentAdminController extends document
{
return;
}
if(!is_array($document_srl_list))
{
$document_srl_list = array_map('trim', explode(',', $document_srl_list));
}
$document_srl_list = array_map('intval', $document_srl_list);
$obj = new stdClass;
$obj->document_srls = implode(',', $document_srl_list);
$obj->document_srls = $document_srl_list;
$obj->list_count = count($document_srl_list);
$obj->document_list = executeQueryArray('document.getDocuments', $obj)->data;
$obj->module_srl = $target_module_srl;
@ -590,7 +603,7 @@ class documentAdminController extends document
{
$args = new stdClass;
$args->page = 0;
$args->module_srl = $module_srl;
$args->module_srl = intval($module_srl);
$document_list = executeQueryArray('document.getDocumentList', $args, array('document_srl'))->data;
// delete documents
@ -627,7 +640,7 @@ class documentAdminController extends document
//DB restore
$output = $oDocumentController->insertDocument($originObject, false, true, false);
if(!$output->toBool()) return $this->setError($output->getMessage());
if(!$output->toBool()) return $output;
//FILE restore
$oDocument = $oDocumentModel->getDocument($originObject->document_srl);

View file

@ -172,8 +172,8 @@ class documentAdminView extends document
// option for a list
$args = new stdClass();
$args->page = Context::get('page'); // /< Page
$args->list_count = 30; // /< the number of posts to display on a single page
$args->page = intval(Context::get('page')) ?: 1; // /< Page
$args->list_count = 20; // /< the number of posts to display on a single page
$args->page_count = 10; // /< the number of pages that appear in the page navigation
$args->order_type = strtolower(Context::get('order_type')) === 'asc' ? 'asc' : 'desc';
@ -192,6 +192,7 @@ class documentAdminView extends document
if ($declared_output->data && count($declared_output->data))
{
$args->document_srls = array_map(function($item) { return $item->document_srl; }, $declared_output->data);
unset($args->page);
$documents = executeQueryArray('document.getDocuments', $args);
$document_list = array();
foreach ($declared_output->data as $key => $declared_info)
@ -225,6 +226,7 @@ class documentAdminView extends document
if ($declared_output->data && count($declared_output->data))
{
$args->document_srls = array_map(function($item) { return $item->document_srl; }, $declared_output->data);
unset($args->page);
$declared_latest = executeQueryArray('document.getDeclaredLatest', $args);
$document_list = array();
foreach ($declared_output->data as $key => $document)

View file

@ -128,6 +128,9 @@ class document extends ModuleObject
// 2016. 3. 14 Add a column(document_upate_log) for admin
if(!$oDB->isColumnExists('document_update_log', 'is_admin')) return true;
// 2019. 3. 07 #1146
if(!$oDB->isColumnExists('document_update_log', 'reason_update')) return true;
// 2017.12.21 Add an index for nick_name
if(!$oDB->isIndexExists('documents', 'idx_nick_name')) return true;
@ -353,6 +356,12 @@ class document extends ModuleObject
$oDB->addIndex('document_update_log', 'idx_is_admin', array('is_admin'));
}
// 2019. 3. 07 #1146
if(!$oDB->isColumnExists('document_update_log', 'reason_update'))
{
$oDB->addColumn('document_update_log', 'reason_update', 'text', '', null, false, 'extra_vars');
}
// 2017.12.21 Add an index for nick_name
if(!$oDB->isIndexExists('documents', 'idx_nick_name'))
{

View file

@ -28,21 +28,21 @@ class documentController extends document
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$document_srl = Context::get('target_srl');
if(!$document_srl) return $this->setError('msg_invalid_request');
if(!$document_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
$module_srl = $oDocument->get('module_srl');
if(!$module_srl) return $this->setError('msg_invalid_request');
if(!$module_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oModuleModel = getModel('module');
$document_config = $oModuleModel->getModulePartConfig('document',$module_srl);
if($document_config->use_vote_up=='N') return $this->setError('msg_invalid_request');
if($document_config->use_vote_up=='N') throw new Rhymix\Framework\Exceptions\FeatureDisabled;
$point = 1;
$output = $this->updateVotedCount($document_srl, $point);
@ -60,18 +60,18 @@ class documentController extends document
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$document_srl = Context::get('target_srl');
if(!$document_srl) return $this->setError('msg_invalid_request');
if(!$document_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
if($oDocument->get('voted_count') <= 0)
{
return $this->setError('msg_document_voted_cancel_not');
throw new Rhymix\Framework\Exception('failed_voted_canceled');
}
$point = 1;
$output = $this->updateVotedCountCancel($document_srl, $oDocument, $point);
@ -114,21 +114,21 @@ class documentController extends document
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$document_srl = Context::get('target_srl');
if(!$document_srl) return $this->setError('msg_invalid_request');
if(!$document_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
$module_srl = $oDocument->get('module_srl');
if(!$module_srl) return $this->setError('msg_invalid_request');
if(!$module_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oModuleModel = getModel('module');
$document_config = $oModuleModel->getModulePartConfig('document',$module_srl);
if($document_config->use_vote_down=='N') return $this->setError('msg_invalid_request');
if($document_config->use_vote_down=='N') throw new Rhymix\Framework\Exceptions\FeatureDisabled;
$point = -1;
$output = $this->updateVotedCount($document_srl, $point);
@ -146,18 +146,18 @@ class documentController extends document
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
$document_srl = Context::get('target_srl');
if(!$document_srl) return $this->setError('msg_invalid_request');
if(!$document_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
if($oDocument->get('blamed_count') >= 0)
{
return $this->setError('msg_document_voted_cancel_not');
throw new Rhymix\Framework\Exception('failed_blamed_canceled');
}
$point = -1;
$output = $this->updateVotedCountCancel($document_srl, $oDocument, $point);
@ -181,42 +181,68 @@ class documentController extends document
function updateVotedCountCancel($document_srl, $oDocument, $point)
{
$logged_info = Context::get('logged_info');
$args = new stdClass();
$d_args = new stdClass();
$args->document_srl = $d_args->document_srl = $document_srl;
$d_args->member_srl = $logged_info->member_srl;
if($point > 0)
// Check if the current user has voted previously.
$args = new stdClass;
$args->document_srl = $document_srl;
$args->point = $point;
if($logged_info->member_srl)
{
$args->voted_count = $oDocument->get('voted_count') - $point;
$output = executeQuery('document.updateVotedCount', $args);
$args->member_srl = $logged_info->member_srl;
}
else
{
$args->blamed_count = $oDocument->get('blamed_count') - $point;
$output = executeQuery('document.updateBlamedCount', $args);
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
}
$output = executeQuery('document.getDocumentVotedLogInfo', $args);
if(!$output->data->count)
{
return new BaseObject(-1, $point > 0 ? 'failed_voted_canceled' : 'failed_blamed_canceled');
}
$d_output = executeQuery('document.deleteDocumentVotedLog', $d_args);
if(!$d_output->toBool()) return $d_output;
//session reset
$_SESSION['voted_document'][$document_srl] = false;
// Call a trigger (before)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $oDocument->get('member_srl');
$trigger_obj->module_srl = $oDocument->get('module_srl');
$trigger_obj->document_srl = $oDocument->get('document_srl');
$trigger_obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$trigger_obj->point = $point;
$trigger_obj->before_point = ($point < 0) ? $oDocument->get('blamed_count') : $oDocument->get('voted_count');
$trigger_obj->after_point = $trigger_obj->before_point - $point;
$trigger_obj->cancel = true;
$trigger_output = ModuleHandler::triggerCall('document.updateVotedCountCancel', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
$obj = new stdClass();
$obj->member_srl = $oDocument->get('member_srl');
$obj->module_srl = $oDocument->get('module_srl');
$obj->document_srl = $oDocument->get('document_srl');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oDocument->get('blamed_count') : $oDocument->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
$obj->cancel = 1;
$args = new stdClass();
$d_args = new stdClass();
$args->document_srl = $d_args->document_srl = $document_srl;
$d_args->member_srl = $logged_info->member_srl;
if ($trigger_obj->update_target === 'voted_count')
{
$args->voted_count = $trigger_obj->after_point;
$output = executeQuery('document.updateVotedCount', $args);
}
else
{
$args->blamed_count = $trigger_obj->after_point;
$output = executeQuery('document.updateBlamedCount', $args);
}
$d_output = executeQuery('document.deleteDocumentVotedLog', $d_args);
if(!$d_output->toBool()) return $d_output;
// session reset
$_SESSION['voted_document'][$document_srl] = false;
// Call a trigger (after)
ModuleHandler::triggerCall('document.updateVotedCountCancel', 'after', $trigger_obj);
ModuleHandler::triggerCall('document.updateVotedCountCancel', 'after', $obj);
$oDB->commit();
return $output;
}
@ -229,13 +255,13 @@ class documentController extends document
{
if(!Context::get('is_logged'))
{
return $this->setError('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
$document_srl = intval(Context::get('target_srl'));
if(!$document_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// if an user select message from options, message would be the option.
@ -347,7 +373,7 @@ class documentController extends document
{
if(!$manual_inserted && !checkCSRF())
{
return new BaseObject(-1, 'msg_invalid_request');
return new BaseObject(-1, 'msg_security_violation');
}
// begin transaction
@ -361,7 +387,7 @@ class documentController extends document
if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N';
if($obj->homepage)
{
$obj->homepage = removeHackTag($obj->homepage);
$obj->homepage = escape($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
@ -371,6 +397,12 @@ class documentController extends document
if($obj->notify_message != 'Y') $obj->notify_message = 'N';
if(!$obj->email_address) $obj->email_address = '';
if(!$isRestore) $obj->ipaddress = $_SERVER['REMOTE_ADDR'];
$obj->isRestore = $isRestore ? true : false;
// Sanitize variables
$obj->document_srl = intval($obj->document_srl);
$obj->category_srl = intval($obj->category_srl);
$obj->module_srl = intval($obj->module_srl);
// Default Status
if($obj->status)
@ -485,7 +517,10 @@ class documentController extends document
}
// Remove iframe and script if not a top adminisrator in the session.
if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);
if($logged_info->is_admin != 'Y')
{
$obj->content = removeHackTag($obj->content);
}
// An error appears if both log-in info and user name don't exist.
if(!$logged_info->member_srl && !$obj->nick_name) return new BaseObject(-1, 'msg_invalid_request');
@ -576,10 +611,18 @@ class documentController extends document
{
if(!$manual_updated && !checkCSRF())
{
return new BaseObject(-1, 'msg_invalid_request');
return new BaseObject(-1, 'msg_security_violation');
}
if(!$source_obj->document_srl || !$obj->document_srl) return new BaseObject(-1, 'msg_invalied_request');
if(!$source_obj->document_srl || !$obj->document_srl)
{
return new BaseObject(-1, 'msg_invalied_request');
}
// Sanitize variables
$obj->document_srl = intval($obj->document_srl);
$obj->category_srl = intval($obj->category_srl);
$obj->module_srl = intval($obj->module_srl);
// Default Status
if($obj->status)
@ -625,6 +668,8 @@ class documentController extends document
if(!isset($document_config->use_history)) $document_config->use_history = 'N';
$bUseHistory = $document_config->use_history == 'Y' || $document_config->use_history == 'Trace';
$logged_info = Context::get('logged_info');
if($bUseHistory)
{
$args = new stdClass;
@ -632,10 +677,10 @@ class documentController extends document
$args->document_srl = $obj->document_srl;
$args->module_srl = $obj->module_srl;
if($document_config->use_history == 'Y') $args->content = $source_obj->get('content');
$args->nick_name = $logged_info->nick_name;
$args->member_srl = $logged_info->member_srl;
$args->nick_name = $source_obj->get('nick_name');
$args->member_srl = $source_obj->get('member_srl');
$args->regdate = $source_obj->get('last_update');
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
$args->ipaddress = $source_obj->get('ipaddress');
$output = executeQuery("document.insertHistory", $args);
}
else
@ -650,7 +695,7 @@ class documentController extends document
if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N';
if($obj->homepage)
{
$obj->homepage = removeHackTag($obj->homepage);
$obj->homepage = escape($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
@ -693,7 +738,6 @@ class documentController extends document
}
// If an author is identical to the modifier or history is used, use the logged-in user's information.
$logged_info = Context::get('logged_info');
if(Context::get('is_logged') && !$manual_updated && !$obj->manual_member_info)
{
if($source_obj->get('member_srl')==$logged_info->member_srl)
@ -910,6 +954,7 @@ class documentController extends document
// Call a trigger (before)
$trigger_obj = new stdClass();
$trigger_obj->document_srl = $document_srl;
$trigger_obj->isEmptyTrash = $isEmptyTrash ? true : false;
$output = ModuleHandler::triggerCall('document.deleteDocument', 'before', $trigger_obj);
if(!$output->toBool()) return $output;
@ -966,6 +1011,7 @@ class documentController extends document
// Call a trigger (after)
$trigger_obj = $oDocument->getObjectVars();
$trigger_obj->isEmptyTrash = $isEmptyTrash ? true : false;
ModuleHandler::triggerCall('document.deleteDocument', 'after', $trigger_obj);
// declared document, log delete
@ -1127,6 +1173,10 @@ class documentController extends document
}
// Call a trigger (after)
$obj->module_srl = $oDocument->get('module_srl');
$obj->member_srl = $oDocument->get('member_srl');
$obj->regdate = $oDocument->get('regdate');
$obj->last_update = $oDocument->get('last_update');
ModuleHandler::triggerCall('document.moveDocumentToTrash', 'after', $obj);
// commit
@ -1391,20 +1441,24 @@ class documentController extends document
{
$failed_voted = 'failed_blamed';
}
// Return fail if session already has information about votes
if($_SESSION['voted_document'][$document_srl])
{
return new BaseObject(-1, $failed_voted);
}
// Get the original document
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
// Pass if the author's IP address is as same as visitor's.
if($oDocument->get('ipaddress') == $_SERVER['REMOTE_ADDR'])
{
$_SESSION['voted_document'][$document_srl] = false;
return new BaseObject(-1, $failed_voted);
}
// Create a member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
@ -1419,6 +1473,7 @@ class documentController extends document
return new BaseObject(-1, $failed_voted);
}
}
// Use member_srl for logged-in members and IP address for non-members.
$args = new stdClass();
if($member_srl)
@ -1431,47 +1486,57 @@ class documentController extends document
}
$args->document_srl = $document_srl;
$output = executeQuery('document.getDocumentVotedLogInfo', $args);
// Pass after registering a session if log information has vote-up logs
if($output->data->count)
{
$_SESSION['voted_document'][$document_srl] = false;
return new BaseObject(-1, $failed_voted);
}
// Call a trigger (before)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $oDocument->get('member_srl');
$trigger_obj->module_srl = $oDocument->get('module_srl');
$trigger_obj->document_srl = $oDocument->get('document_srl');
$trigger_obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$trigger_obj->point = $point;
$trigger_obj->before_point = ($point < 0) ? $oDocument->get('blamed_count') : $oDocument->get('voted_count');
$trigger_obj->after_point = $trigger_obj->before_point + $point;
$trigger_obj->cancel = false;
$trigger_output = ModuleHandler::triggerCall('document.updateVotedCount', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
// Update the voted count
if($point < 0)
if($trigger_obj->update_target === 'blamed_count')
{
$args->blamed_count = $oDocument->get('blamed_count') + $point;
// Leave in the session information
$_SESSION['voted_document'][$document_srl] = $point;
$args->blamed_count = $trigger_obj->after_point;
$output = executeQuery('document.updateBlamedCount', $args);
}
else
{
$args->voted_count = $oDocument->get('voted_count') + $point;
// Leave in the session information
$_SESSION['voted_document'][$document_srl] = $point;
$args->voted_count = $trigger_obj->after_point;
$output = executeQuery('document.updateVotedCount', $args);
}
if(!$output->toBool()) return $output;
// Leave in the session information
$_SESSION['voted_document'][$document_srl] = $trigger_obj->point;
// Leave logs
$args->point = $point;
$args->point = $trigger_obj->point;
$output = executeQuery('document.insertDocumentVotedLog', $args);
if(!$output->toBool()) return $output;
$obj = new stdClass;
$obj->member_srl = $oDocument->get('member_srl');
$obj->module_srl = $oDocument->get('module_srl');
$obj->document_srl = $oDocument->get('document_srl');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oDocument->get('blamed_count') : $oDocument->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
ModuleHandler::triggerCall('document.updateVotedCount', 'after', $obj);
// Call a trigger (after)
ModuleHandler::triggerCall('document.updateVotedCount', 'after', $trigger_obj);
$oDB->commit();
@ -1480,15 +1545,15 @@ class documentController extends document
// Return result
$output = new BaseObject();
if($point > 0)
if($trigger_obj->update_target === 'voted_count')
{
$output->setMessage('success_voted');
$output->add('voted_count', $obj->after_point);
$output->add('voted_count', $trigger_obj->after_point);
}
else
{
$output->setMessage('success_blamed');
$output->add('blamed_count', $obj->after_point);
$output->add('blamed_count', $trigger_obj->after_point);
}
return $output;
@ -1543,12 +1608,12 @@ class documentController extends document
return new BaseObject(-1, 'failed_declared');
}
// Get currently logged in user.
$member_srl = intval($this->user->member_srl);
// Check if document's author is a member.
if($oDocument->get('member_srl'))
{
// Create a member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// Pass after registering a session if author's information is same as the currently logged-in user's.
if($member_srl && $member_srl == abs($oDocument->get('member_srl')))
{
@ -1557,30 +1622,31 @@ class documentController extends document
}
}
// Use member_srl for logged-in members and IP address for non-members.
// Pass after registering a sesson if reported/declared documents are in the logs.
$args = new stdClass;
$args->document_srl = $document_srl;
if($member_srl)
{
$args->member_srl = $member_srl;
}
else
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
$args->ipaddress = \RX_CLIENT_IP;
}
$args->document_srl = $document_srl;
$args->declare_message = $declare_message;
$output = executeQuery('document.getDocumentDeclaredLogInfo', $args);
// Pass after registering a sesson if reported/declared documents are in the logs.
if($output->data->count)
{
$_SESSION['declared_document'][$document_srl] = true;
return new BaseObject(-1, 'failed_declared');
}
// Fill in remaining information for logging.
$args->member_srl = $member_srl;
$args->ipaddress = \RX_CLIENT_IP;
$args->declare_message = $declare_message;
// begin transaction
$oDB = &DB::getInstance();
$oDB = DB::getInstance();
$oDB->begin();
// Add the declared document
@ -2185,6 +2251,7 @@ class documentController extends document
function makeCategoryFile($module_srl)
{
// Return if there is no information you need for creating a cache file
$module_srl = intval($module_srl);
if(!$module_srl) return false;
// Get module information (to obtain mid)
$oModuleModel = getModel('module');
@ -2194,8 +2261,8 @@ class documentController extends document
if(!is_dir('./files/cache/document_category')) FileHandler::makeDir('./files/cache/document_category');
// Cache file's name
$xml_file = sprintf("./files/cache/document_category/%s.xml.php", $module_srl);
$php_file = sprintf("./files/cache/document_category/%s.php", $module_srl);
$xml_file = sprintf("./files/cache/document_category/%d.xml.php", $module_srl);
$php_file = sprintf("./files/cache/document_category/%d.php", $module_srl);
// Get a category list
$args = new stdClass();
$args->module_srl = $module_srl;
@ -2249,10 +2316,8 @@ class documentController extends document
$xml_body_buff = $this->getXmlTree($tree[0], $tree, $module_info->site_srl, $xml_header_buff);
$xml_buff = sprintf(
'<?php '.
'define(\'__XE__\', true); '.
'require_once(\''.FileHandler::getRealPath('./config/config.inc.php').'\'); '.
'$oContext = &Context::getInstance(); '.
'$oContext->init(); '.
'require_once(\''.FileHandler::getRealPath('./common/autoload.php').'\'); '.
'Context::init(); '.
'header("Content-Type: text/xml; charset=UTF-8"); '.
'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '.
'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '.
@ -2495,7 +2560,10 @@ class documentController extends document
*/
function procDocumentAddCart()
{
if(!Context::get('is_logged')) return $this->setError('msg_not_permitted');
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
// Get document_srl
$srls = explode(',',Context::get('srls'));
@ -2575,8 +2643,8 @@ class documentController extends document
$obj->type = Context::get('type');
$obj->document_list = array();
$obj->document_srl_list = array();
$obj->target_module_srl = intval(Context::get('module_srl') ?: Context::get('target_module'));
$obj->target_category_srl = Context::get('target_category');
$obj->target_module_srl = intval(Context::get('module_srl') ?: Context::get('target_module_srl'));
$obj->target_category_srl = intval(Context::get('target_category_srl'));
$obj->manager_message = Context::get('message_content') ? nl2br(escape(strip_tags(Context::get('message_content')))) : '';
$obj->send_message = $obj->manager_message || Context::get('send_default_message') == 'Y';
$obj->return_message = '';
@ -2587,12 +2655,12 @@ class documentController extends document
$module_info = getModel('module')->getModuleInfoByModuleSrl($obj->target_module_srl);
if (!$module_info->module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$module_grant = getModel('module')->getGrant($module_info, $logged_info);
if (!$module_grant->manager)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
}
@ -2608,7 +2676,7 @@ class documentController extends document
$obj->document_list = getModel('document')->getDocuments($obj->document_srl_list, false, false);
if(empty($obj->document_list))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Call a trigger (before)
@ -2623,7 +2691,7 @@ class documentController extends document
{
if(!$obj->target_module_srl)
{
return $this->setError('fail_to_move');
throw new Rhymix\Framework\Exception('fail_to_move');
}
$output = $oController->moveDocumentModule($obj->document_srl_list, $obj->target_module_srl, $obj->target_category_srl);
@ -2638,7 +2706,7 @@ class documentController extends document
{
if(!$obj->target_module_srl)
{
return $this->setError('fail_to_move');
throw new Rhymix\Framework\Exception('fail_to_move');
}
$output = $oController->copyDocumentModule($obj->document_srl_list, $obj->target_module_srl, $obj->target_category_srl);
@ -2695,7 +2763,7 @@ class documentController extends document
}
else
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
// Call a trigger (after)
@ -2764,13 +2832,13 @@ Content;
$module_info = $oModuleModel->getModuleInfoByModuleSrl($srl);
if (!$module_info->module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$module_grant = $oModuleModel->getGrant($module_info, $logged_info);
if (!$module_grant->manager)
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$module_srl[] = $srl;
@ -2811,7 +2879,7 @@ Content;
{
if(!$this->module_srl)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$obj = Context::getRequestVars();
@ -2834,12 +2902,12 @@ Content;
{
if(!$oDocument->isGranted())
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
if($oDocument->get('status') != $this->getConfigStatus('temp'))
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$output = $this->updateDocument($oDocument, $obj);
@ -2871,7 +2939,11 @@ Content;
*/
function procDocumentGetList()
{
if(!Context::get('is_logged')) return $this->setError('msg_not_permitted');
if(!Context::get('is_logged'))
{
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
$documentSrls = Context::get('document_srls');
if($documentSrls) $documentSrlList = explode(',', $documentSrls);

View file

@ -438,7 +438,7 @@ class documentItem extends BaseObject
$url = 'http://' . $url;
}
return $url;
return escape($url, false);
}
function getMemberSrl()
@ -570,7 +570,6 @@ class documentItem extends BaseObject
$content = $this->get('content');
$content = preg_replace_callback('/<(object|param|embed)[^>]*/is', array($this, '_checkAllowScriptAccess'), $content);
$content = preg_replace_callback('/<object[^>]*>/is', array($this, '_addAllowScriptAccess'), $content);
if($strlen)
{
$content = trim(utf8_normalize_spaces(html_entity_decode(strip_tags($content))));

View file

@ -448,7 +448,7 @@ class documentModel extends document
$oDocument = $oDocumentModel->getDocument($document_srl, false, false, $columnList);
$module_srl = $oDocument->get('module_srl');
$member_srl = $oDocument->get('member_srl');
if(!$module_srl) return $this->setError('msg_invalid_request');
if(!$module_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oModuleModel = getModel('module');
$document_config = $oModuleModel->getModulePartConfig('document',$module_srl);
@ -671,7 +671,8 @@ class documentModel extends document
function getCategoryList($module_srl, $columnList = array())
{
// Category of the target module file swollen
$filename = sprintf("%sfiles/cache/document_category/%s.php", _XE_PATH_, $module_srl);
$module_srl = intval($module_srl);
$filename = sprintf("%sfiles/cache/document_category/%d.php", _XE_PATH_, $module_srl);
// If the target file to the cache file regeneration category
if(!file_exists($filename))
{
@ -771,7 +772,8 @@ class documentModel extends document
*/
function getCategoryXmlFile($module_srl)
{
$xml_file = sprintf('files/cache/document_category/%s.xml.php',$module_srl);
$module_srl = intval($module_srl);
$xml_file = sprintf('files/cache/document_category/%d.xml.php',$module_srl);
if(!file_exists($xml_file))
{
$oDocumentController = getController('document');
@ -787,7 +789,8 @@ class documentModel extends document
*/
function getCategoryPhpFile($module_srl)
{
$php_file = sprintf('files/cache/document_category/%s.php',$module_srl);
$module_srl = intval($module_srl);
$php_file = sprintf('files/cache/document_category/%d.php',$module_srl);
if(!file_exists($php_file))
{
$oDocumentController = getController('document');
@ -855,8 +858,8 @@ class documentModel extends document
*/
function getDocumentCategories()
{
if(!Context::get('is_logged')) return $this->setError('msg_not_permitted');
$module_srl = Context::get('module_srl');
if(!Context::get('is_logged')) throw new Rhymix\Framework\Exceptions\NotPermitted;
$module_srl = intval(Context::get('module_srl'));
$categories= $this->getCategoryList($module_srl);
$lang = Context::get('lang');
// No additional category
@ -903,7 +906,7 @@ class documentModel extends document
$extra_keys = $this->getExtraKeys($module_srl);
Context::set('extra_keys', $extra_keys);
$security = new Security();
$security->encodeHTML('extra_keys..');
$security->encodeHTML('extra_keys..', 'selected_var_idx');
// Get information of module_grants
$oTemplate = &TemplateHandler::getInstance();
@ -950,13 +953,13 @@ class documentModel extends document
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
// Check permissions
$grant = $oModuleModel->getGrant($module_info, Context::get('logged_info'));
if(!$grant->manager) return $this->setError('msg_not_permitted');
if(!$grant->manager) throw new Rhymix\Framework\Exceptions\NotPermitted;
$category_srl = Context::get('category_srl');
$category_info = $this->getCategory($category_srl);
if(!$category_info)
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\InvalidRequest;
}
$this->add('category_info', $category_info);
@ -1138,7 +1141,7 @@ class documentModel extends document
{
$args = new stdClass;
$document_srl = Context::get('document_srl');
if(!$document_srl) return $this->setError('msg_invalid_request');
if(!$document_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$point = Context::get('point');
if($point != -1) $point = 1;
@ -1147,18 +1150,18 @@ class documentModel extends document
$columnList = array('document_srl', 'module_srl');
$oDocument = $oDocumentModel->getDocument($document_srl, false, false, $columnList);
$module_srl = $oDocument->get('module_srl');
if(!$module_srl) return $this->setError('msg_invalid_request');
if(!$module_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest;
$oModuleModel = getModel('module');
$document_config = $oModuleModel->getModulePartConfig('document',$module_srl);
if($point == -1)
{
if($document_config->use_vote_down!='S') return $this->setError('msg_invalid_request');
if($document_config->use_vote_down!='S') throw new Rhymix\Framework\Exceptions\FeatureDisabled;
$args->below_point = 0;
}
else
{
if($document_config->use_vote_up!='S') return $this->setError('msg_invalid_request');
if($document_config->use_vote_up!='S') throw new Rhymix\Framework\Exceptions\FeatureDisabled;
$args->more_point = 0;
}

View file

@ -36,9 +36,9 @@ class documentView extends document
$oDocumentModel = getModel('document');
// Creates an object for displaying the selected document
$oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager);
if(!$oDocument->isExists()) return $this->setError('msg_invalid_request');
if(!$oDocument->isExists()) throw new Rhymix\Framework\Exceptions\TargetNotFound;
// Check permissions
if(!$oDocument->isAccessible()) return $this->setError('msg_not_permitted');
if(!$oDocument->isAccessible()) throw new Rhymix\Framework\Exceptions\NotPermitted;
// Information setting module
//Context::set('module_info', $module_info); //module_info not use in UI
// Browser title settings
@ -58,7 +58,7 @@ class documentView extends document
{
if(!checkCSRF())
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\SecurityViolation;
}
$content = Context::get('content');
@ -87,8 +87,9 @@ class documentView extends document
*/
function dispDocumentManageDocument()
{
if(!Context::get('is_logged')) return $this->setError('msg_not_permitted');
if(!Context::get('is_logged')) throw new Rhymix\Framework\Exceptions\NotPermitted;
// Taken from a list of selected sessions
$document_srl_list = array();
$flag_list = $_SESSION['document_management'];
if(count($flag_list))
{
@ -105,14 +106,14 @@ class documentView extends document
$document_list = $oDocumentModel->getDocuments($document_srl_list, $this->grant->is_admin);
Context::set('document_list', $document_list);
}
else
{
Context::set('document_list', array());
}
$oModuleModel = getModel('module');
// The combination of module categories list and the list of modules
if(count($module_list)>1) Context::set('module_list', $module_categories);
$module_srl=Context::get('module_srl');
$module_srl = intval(Context::get('module_srl'));
Context::set('module_srl',$module_srl);
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
$module_info = getModel('module')->getModuleInfoByModuleSrl($module_srl);
Context::set('mid',$module_info->mid);
Context::set('browser_title',$module_info->browser_title);
@ -172,7 +173,10 @@ class documentView extends document
$oMemberModel = getModel('member');
// A message appears if the user is not logged-in
if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged');
if(!$oMemberModel->isLogged())
{
throw new Rhymix\Framework\Exceptions\MustLogin;
}
// Get the saved document (module_srl is set to member_srl instead)
$logged_info = Context::get('logged_info');
$args = new stdClass();
@ -206,7 +210,7 @@ class documentView extends document
// A message appears if the user is not logged-in
if(!$oMemberModel->isLogged())
{
return $this->stop('msg_not_logged');
throw new Rhymix\Framework\Exceptions\MustLogin;
}
// Create the document object. If the document module of basic data structures, write it all works .. -_-;
@ -215,12 +219,12 @@ class documentView extends document
$oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager, FALSE);
if(!$oDocument->isExists())
{
return $this->setError('msg_invalid_request');
throw new Rhymix\Framework\Exceptions\TargetNotFound;
}
// Check permissions
if(!$oDocument->isAccessible())
{
return $this->setError('msg_not_permitted');
throw new Rhymix\Framework\Exceptions\NotPermitted;
}
// Browser title settings

View file

@ -9,6 +9,7 @@ $lang->category_title = 'Category';
$lang->category_color = 'Category Font Color';
$lang->expand = 'Expand';
$lang->category_group_srls = 'Accessable Group';
$lang->cmd_document_module_config = 'Basic Settings';
$lang->cmd_make_child = 'Add Child Category';
$lang->cmd_pc_icon_setting = 'PC icon setting';
$lang->cmd_mobile_icon_setting = 'Mobile icon setting';
@ -27,7 +28,6 @@ $lang->msg_category_not_moved = 'Could not be moved';
$lang->msg_is_secret = 'This is a secret article.';
$lang->msg_checked_document_is_deleted = '%d article(s) was(were) deleted.';
$lang->msg_document_is_admin_not_permitted = 'You don\'t have permission to delete the posts of Top Admin.';
$lang->msg_document_voted_cancel_not = '';
$lang->move_target_module = 'Target module ';
$lang->search_target_list['title'] = 'Subject';
$lang->search_target_list['content'] = 'Content';

View file

@ -1,30 +1,31 @@
<?php
$lang->document_list = '문서 목록';
$lang->view_count_option = '조회수 설정';
$lang->view_count_option = '조회 수 설정';
$lang->view_count_option_all = '모두 계산';
$lang->view_count_option_some = '일부 계산';
$lang->view_count_option_once = '중복 금지';
$lang->view_count_option_none = '계산 안함';
$lang->view_count_option_none = '계산 안 함';
$lang->cmd_document_module_config = '기본 설정';
$lang->cmd_delete_all_thumbnail = '섬네일 모두 삭제';
$lang->cmd_pc_icon_setting = 'PC아이콘 설정';
$lang->cmd_pc_icon_setting = 'PC 아이콘 설정';
$lang->cmd_mobile_icon_setting = '모바일 아이콘 설정';
$lang->title_bold = '제목 굵게';
$lang->title_color = '제목 색깔';
$lang->new_document_count = '새 글';
$lang->parent_category_title = '상위 카테고리 명';
$lang->parent_category_title = '상위 분류 명';
$lang->category_title = '분류 명';
$lang->category_color = '분류 폰트색깔';
$lang->category_color = '분류 폰트 색깔';
$lang->expand = '펼침';
$lang->category_group_srls = '그룹 제한';
$lang->cmd_make_child = '하위 카테고리 추가';
$lang->cmd_enable_move_category = '카테고리 위치 변경 (선택 후 위 메뉴를 드래그하세요.)';
$lang->about_category_title = '카테고리 이름을 입력해주세요.';
$lang->about_view_count_option = '조회수설정에 따라 중복 조회수 카운트를 할 수 있도록 도와줍니다. 각 옵션에 따라 조회수 기록하는 방식이 달라집니다.';
$lang->cmd_make_child = '하위 분류 추가';
$lang->cmd_enable_move_category = '분류 위치 변경 (선택 후 위 메뉴를 드래그하세요.)';
$lang->about_category_title = '분류 이름을 입력해주세요.';
$lang->about_view_count_option = '조회 수 설정에 따라 중복 조회 수 카운트를 할 수 있도록 도와줍니다. 각 옵션에 따라 조회 수를 기록하는 방식이 달라집니다.';
$lang->about_expand = '선택하면 늘 펼쳐진 상태로 있게 합니다.';
$lang->about_category_group_srls = '선택한 그룹만 현재 카테고리를 지정할 수 있도록 합니다.';
$lang->about_category_color = '분류 폰트색깔을 지정합니다. 예) red 또는 #ff0000';
$lang->about_cmd_pc_icon_setting = '게시판 새로운 글 혹은 수정되었을 때 출력하는 아이콘입니다. 기본값은 default 입니다. 사용않함을 선택할 경우 default 스킨이 기본값으로 출력됩니다.';
$lang->about_cmd_mobile_icon_setting = '게시판 새로운 글 혹은 수정되었을 때 출력하는 아이콘입니다. 기본값은 default 입니다. 사용않함을 선택할 경우 default 스킨이 기본값으로 출력됩니다.';
$lang->about_category_group_srls = '선택한 그룹만 현재 분류를 지정할 수 있도록 합니다.';
$lang->about_category_color = '분류 폰트 색깔을 지정합니다. 예) red 또는 #ff0000';
$lang->about_cmd_pc_icon_setting = '새로운 글이 등록되었거나 수정되었을 때 출력하는 아이콘입니다. 기본값은 default입니다. 사용 안 함을 선택할 경우 default 스킨이 기본값으로 출력됩니다.';
$lang->about_cmd_mobile_icon_setting = '새로운 글이 등록되었거나 수정되었을 때 출력하는 아이콘입니다. 기본값은 default입니다. 사용 안 함을 선택할 경우 default 스킨이 기본값으로 출력됩니다.';
$lang->cmd_search_next = '계속 검색';
$lang->cmd_temp_save = '임시 저장';
$lang->cmd_toggle_checked_document = '선택항목 반전';
@ -34,8 +35,7 @@ $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.';
$lang->msg_category_not_moved = '이동할 수 없습니다.';
$lang->msg_is_secret = '비밀글입니다.';
$lang->msg_checked_document_is_deleted = '%d개의 글이 삭제되었습니다.';
$lang->msg_document_is_admin_not_permitted = '최고관리자의 게시글을 지울 권한이 없습니다.';
$lang->msg_document_voted_cancel_not = '추천수가 0이하일 경우 추천캔슬을 사용할 수 없습니다.';
$lang->msg_document_is_admin_not_permitted = '최고 관리자의 게시글을 삭제할 권한이 없습니다.';
$lang->move_target_module = '대상 페이지';
$lang->search_target_list['title'] = '제목';
$lang->search_target_list['content'] = '내용';
@ -59,16 +59,16 @@ $lang->search_target_list['last_update'] = '최근 수정일';
$lang->search_target_list['ipaddress'] = 'IP 주소';
$lang->alias = '별칭(Alias)';
$lang->history = '히스토리';
$lang->about_use_history = '히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우, 문서 수정 후 이전 수정판으로 복원할 수 있습니다.';
$lang->about_use_history = '히스토리 기능의 사용 여부를 지정합니다. 히스토리 기능을 사용할 경우, 문서 수정 후 이전 수정판으로 복원할 수 있습니다.';
$lang->trace_only = '흔적만 남김';
$lang->cmd_declared_message = '신고 알림 쪽지';
$lang->cmd_declared_message_admin = '최고관리자';
$lang->cmd_declared_message_admin = '최고 관리자';
$lang->cmd_declared_message_manager = '게시판 관리자';
$lang->cmd_trash = '휴지통';
$lang->cmd_restore = '복원';
$lang->cmd_restore_all = '모두 복원';
$lang->in_trash = '휴지통';
$lang->trash_nick_name = '옮긴사람';
$lang->trash_nick_name = '옮긴 사람';
$lang->trash_date = '삭제 날짜';
$lang->trash_description = '설명';
$lang->success_trashed = '휴지통으로 이동되었습니다.';
@ -84,9 +84,9 @@ $lang->selected_document_move = '선택한 글을 다음 위치로 옮기거나
$lang->select_module = '모듈을 선택하세요.';
$lang->select_module_id = '모듈 아이디를 선택하세요.';
$lang->select_category = '분류를 선택하세요.';
$lang->category_description = '카테고리 설명';
$lang->category_description = '분류 설명';
$lang->no_title_document = '제목이 없는 문서입니다.';
$lang->msg_admin_document_no_move_to_trash = '최고관리자의 게시물을 휴지통으로 이동시킬 권한이 없습니다.';
$lang->msg_admin_document_no_move_to_trash = '최고 관리자의 게시물을 휴지통으로 이동시킬 권한이 없습니다.';
$lang->send_default_message = '기본 내용으로만 쪽지 보내기';
$lang->default_message_format = '관리자에 의해 게시물이 %1$s되었습니다.';
$lang->default_message_verbs['move'] = '다른 게시판으로 이동';

View file

@ -19,9 +19,9 @@
<group pipe="and">
<condition operation="like" column="title" var="s_title" />
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="equal" column="user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="user_id" var="s_user_id" pipe="or" />
<condition operation="like_prefix" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="tags" var="s_tags" pipe="or" />

View file

@ -6,7 +6,7 @@
<columns>
<column name="d.*" />
</columns>
<index_hint name="idx_document_list_order" type="use" />
<index_hint name="idx_document_list_order" type="use" />
<conditions>
<condition operation="equal" column="ev.eid" var="sort_index" />
<condition operation="equal" column="ev.document_srl" default="d.document_srl" pipe="and" />
@ -23,9 +23,9 @@
<group pipe="and">
<condition operation="like" column="d.title" var="s_title" />
<condition operation="like" column="d.content" var="s_content" pipe="or" />
<condition operation="equal" column="d.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="d.user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="d.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="d.user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="d.user_id" var="s_user_id" pipe="or" />
<condition operation="like_prefix" column="d.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="d.email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="d.homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="d.tags" var="s_tags" pipe="or" />
@ -46,6 +46,9 @@
<condition operation="less" column="d.last_update" var="end_date" pipe="and" />
</group>
</conditions>
<groups>
<group column="d.document_srl" />
</groups>
<navigation>
<index var="ev.value" default="ev.value" order="order_type" />
<list_count var="list_count" default="20" />

View file

@ -19,9 +19,9 @@
<group pipe="and">
<condition operation="like" column="title" var="s_title" />
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="equal" column="user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="user_id" var="s_user_id" pipe="or" />
<condition operation="like_prefix" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_addres" pipe="or" />
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="tags" var="s_tags" pipe="or" />

View file

@ -22,9 +22,9 @@
<group pipe="and">
<condition operation="like" column="title" var="s_title" />
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="equal" column="user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="user_id" var="s_user_id" pipe="or" />
<condition operation="like_prefix" column="nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="tags" var="s_tags" pipe="or" />

View file

@ -27,9 +27,9 @@
<group pipe="and">
<condition operation="like" column="documents.title" var="s_title" />
<condition operation="like" column="documents.content" var="s_content" pipe="or" />
<condition operation="equal" column="documents.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="documents.user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="documents.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="documents.user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="documents.user_id" var="s_user_id" pipe="or" />
<condition operation="like_prefix" column="documents.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="documents.email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="documents.homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="documents.tags" var="s_tags" pipe="or" />

View file

@ -24,9 +24,9 @@
<group pipe="and">
<condition operation="like" column="d.title" var="s_title" />
<condition operation="like" column="d.content" var="s_content" pipe="or" />
<condition operation="equal" column="d.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="d.user_id" var="s_user_id" pipe="or" />
<condition operation="equal" column="d.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="d.user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="d.user_id" var="s_user_id" pipe="or" />
<condition operation="like_prefix" column="d.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="d.email_address" var="s_email_addres" pipe="or" />
<condition operation="like" column="d.homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="d.tags" var="s_tags" pipe="or" />
@ -52,6 +52,9 @@
<condition operation="equal" column="es.document_srl" default="d.document_srl" pipe="and" />
</group>
</conditions>
<groups>
<group column="d.document_srl" />
</groups>
<navigation>
<index var="ev.value" default="ev.value" order="order_type" />
<list_count var="list_count" default="20" />

View file

@ -13,8 +13,8 @@
<group pipe="and">
<condition operation="like" column="documents.title" var="s_title" />
<condition operation="like" column="documents.content" var="s_content" pipe="or" />
<condition operation="equal" column="documents.user_name" var="s_user_name" pipe="or" />
<condition operation="equal" column="documents.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like_prefix" column="documents.user_name" var="s_user_name" pipe="or" />
<condition operation="like_prefix" column="documents.nick_name" var="s_nick_name" pipe="or" />
<condition operation="like" column="documents.email_address" var="s_email_address" pipe="or" />
<condition operation="like" column="documents.homepage" var="s_homepage" pipe="or" />
<condition operation="like" column="documents.tags" var="s_tags" pipe="or" />

View file

@ -7,6 +7,7 @@
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
<condition operation="equal" column="point" var="point" filter="number" />
<group pipe="and">
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="equal" column="ipaddress" var="ipaddress" pipe="and" />

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