Merge pull request #7 from xpressengine/develop

point 브랜치
This commit is contained in:
BJRambo 2014-04-29 08:14:54 +09:00
commit 5cb5ad1359
113 changed files with 1409 additions and 548 deletions

25
CONTRIBUTING.md Normal file
View file

@ -0,0 +1,25 @@
# Contribution Guide
## Issue 작성
Issue 작성 시 참고해주세요.
* 작성하려는 이슈가 이미 있는지 검색 후 등록해주세요. 비슷한 이슈가 있다면 댓글로 추가 내용을 덧붙일 수 있습니다.
* 이슈에는 하나의 문제 또는 제안을 작성해주세요. 절대 하나의 이슈에 2개 이상의 내용을 적지마세요.
* 이슈는 가능한 상세하고 간결하게 작성해주세요
* 필요하다면 화면을 캡쳐하여 이미지를 업로드할 수 있습니다
## Pull request(PR)
* `master` 브랜치의 코드는 수정하지마세요
* PR은 `develop` 브랜치만 허용합니다.
* `develop` 브랜치를 부모로한 토픽 브랜치를 활용하면 편리합니다.
## Coding Guidelines
코드를 기여할 때 Coding conventions을 따라야합니다.
* 모든 text 파일의 charset은 BOM이 없는 UTF-8입니다
* newline은 UNIX type을 사용합니다. 일부 파일이 다른 type을 사용하더라도 절대 고치지 마세요!
* 들여쓰기는 1개의 탭으로 합니다
* class 선언과 function, if, foreach, for, while 등 중괄호의 `{}`는 다음 줄에 있어야 합니다
* 마찬가지로 선언 다음에는 공백을 두지 않습니다. ex) CORRECT `if(...)`, INCORRECT `if (...)`
* **Coding convention에 맞지 않는 코드를 발견 하더라도 목적과 관계 없는 코드는 절대 고치지 마세요**

View file

@ -1,21 +1,39 @@
# XpressEngine
XpressEngine
============
[![Build Status](https://travis-ci.org/xpressengine/xe-core.svg?branch=master)](https://travis-ci.org/xpressengine/xe-core)
[![License](http://img.shields.io/badge/license-GNU%20LGPL-brightgreen.svg)](http://www.gnu.org/licenses/gpl.html)
[![Latest release](http://img.shields.io/github/release/xpressengine/xe-core.svg)](https://github.com/xpressengine/xe-core/releases)
XpressEngine(XE)은 PHP로 작성한 CMS(Content Management System)입니다.
오픈소스 라이선스로 누구나 사용 또는 개작할 수 있으며, 개방형 프로젝트로서 누구나 개발에 참여할 수 있습니다.
## Supprot
* Official sitie (Korean) : http://www.xpressengine.com/
## Maintainers
@akasima @bnu @jhyeon1010 @khongchi @ngleader
## Authors
adrian.vasile.constantin, aerofleet, @akasima, @andreimarin, araste, @bnu, bradly1, buffkj, c2joy, @canto, cbrghost, @ccata17, @ChanMyeong, chinaskyking, chschy, clench, @devjin, @dionisrom, @dorami, @dragan-dan, ducduydaovn, duvent, @Eundong, @florinutz, @flourscent, @flyskyko, @ForPeople, FruitsHake, guny, @haneul, hankm2004, haojilin, heemin, ikko, johnsonshu, juanlee0, k10206, kagami, @khongchi, @lansi951, @largeden, liahona, lickawtl, mayoojin, mglclub, @misol, mmx900, mooo, mosmartin, @nagoon97, @ngleader, nicetwo, ovclas, risapapa, rokmcssu, royallin, rubyeye, ryin005, sanghunjun, @sejin7940, @SMaker, sspa3141, @stellar12, supershop, @taggon, @ucorina, unryong, venister, wdlee91, welcomeju, @YJSoft, ysnglee2000, zero
adrian.vasile.constantin, aerofleet, @akasima, @andreimarin, araste, @bnu, @bongkeun, bradly1, buffkj, c2joy, @canto, cbrghost, @ccata17, @ChanMyeong, chinaskyking, chschy, clench, @cometdev, @devdho, @devjin, @dionisrom, @dorami, @dragan-dan, ducduydaovn, duvent, @Eundong, @florinutz, @flourscent, @flyskyko, @ForPeople, FruitsHake, guny, @haneul, hankm2004, @hansim, haojilin, heemin, @hyeon0142, ikko, @izuzero, johnsonshu, juanlee0, k10206, kagami, @khongchi, @lansi951, @largeden, liahona, lickawtl, @mAKEkr, mayoojin, mglclub, @misol, mmx900, @mog422, mooo, mosmartin, @nagoon97, @ngleader, nicetwo, ovclas, @qw5414, @Rayyin, risapapa, rokmcssu, royallin, rubyeye, ryin005, @samswnlee, sanghunjun, @sejin7940, @smaker, @solidh, sspa3141, @stellar12, supershop, @taggon, @ucorina, unryong, venister, wdlee91, welcomeju, @YJSoft, ysnglee2000, zero
## Contribution Guide
`CONTRIBUTING.md`파일을 참고하세요.
## License
Copyright (C) NAVER <http://www.navercorp.com>
Copyright (C) NAVER Corp. <http://www.navercorp.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This library is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

View file

@ -9,7 +9,7 @@ if(!defined("__XE__")) exit();
* @brief Captcha for a particular action
* English alphabets and voice verification added
* */
if(!class_exists('AddonCaptcha'))
if(!class_exists('AddonCaptcha', false))
{
// On the mobile mode, XE Core does not load jquery and xe.js as normal.
Context::loadFile(array('./common/js/jquery.min.js', 'head', NULL, -100000), true);

View file

@ -9,7 +9,7 @@ if(!defined("__XE__")) exit();
* @brief Captcha for a particular action
* English alphabets and voice verification added
* */
if(!class_exists('AddonMemberCaptcha'))
if(!class_exists('AddonMemberCaptcha', false))
{
// On the mobile mode, XE Core does not load jquery and xe.js as normal.
Context::loadFile(array('./common/js/jquery.min.js', 'head', NULL, -100000), true);

View file

@ -261,7 +261,7 @@
success: function (data) {
var oembedData = $.extend({}, data);
oembedData.code = embedProvider.templateData(data);
success(oembedData, externalUrl, container);
if(oembedData.code) success(oembedData, externalUrl, container);
},
error: settings.onError.call(container, externalUrl, embedProvider)
}, settings.ajaxOptions || {});
@ -389,8 +389,8 @@
$.fn.oembed.getGenericCode = function (url, oembedData) {
var title = (oembedData.title !== null) ? oembedData.title : url,
code = '<a href="' + url + '">' + title + '</a>';
if(oembedData.html) code += "<div>" + oembedData.html + "</div>";
code = '';
if(oembedData.html) code += '<blockquote class="oembedall-blockquote"><strong>' + title + '</strong><br>' + jQuery(oembedData.html).text().substring(0,200) + '... <a href="'+url+'">more</a></blockquote>';
return code;
};
@ -849,7 +849,7 @@
templateData: function (data) {
if(!data.parse) return false;
var text = data.parse['text']['*'].replace(/href="\/wiki/g, 'href="http://en.wikipedia.org/wiki');
return '<div id="content"><h3><a class="nav-link" href="http://en.wikipedia.org/wiki/' + data.parse['displaytitle'] + '">' + data.parse['displaytitle'] + '</a></h3>' + text + '</div>';
return '<div id="content"><blockquote class="oembedall-blockquote"><strong>' + data.parse['displaytitle'] + '</strong><br>' +jQuery(text).text().substring(0,200) + '...</blockquote></div>';
}
}),
new $.fn.oembed.OEmbedProvider("imdb", "rich", ["imdb.com/title/.+"], "http://www.imdbapi.com/?i=$1&callback=?", {

File diff suppressed because one or more lines are too long

View file

@ -9,7 +9,7 @@ if(!defined('__XE__'))
* @author NAVER (developers@xpressengine.com)
* @brief Add-on to resize images in the body
*/
if($called_position == 'after_module_proc' && Context::getResponseMethod() == "HTML" || !isCrawler())
if($called_position == 'after_module_proc' && (Context::getResponseMethod() == "HTML" || !isCrawler()))
{
if(Mobile::isFromMobilePhone())
{

View file

@ -84,7 +84,7 @@ class CacheApc extends CacheBase
if($modified_time > 0 && $modified_time > $obj[0])
{
$this->delete($_key);
$this->delete($key);
return false;
}
@ -110,7 +110,7 @@ class CacheApc extends CacheBase
if($modified_time > 0 && $modified_time > $obj[0])
{
$this->delete($_key);
$this->delete($key);
return false;
}
@ -125,7 +125,8 @@ class CacheApc extends CacheBase
*/
function delete($key)
{
return apc_delete($key);
$_key = md5(_XE_PATH_ . $key);
return apc_delete($_key);
}
/**

View file

@ -30,11 +30,11 @@ class DBMssql extends DB
var $column_type = array(
'bignumber' => 'bigint',
'number' => 'int',
'varchar' => 'varchar',
'char' => 'char',
'text' => 'text',
'bigtext' => 'text',
'date' => 'varchar(14)',
'varchar' => 'nvarchar',
'char' => 'nchar',
'text' => 'ntext',
'bigtext' => 'ntext',
'date' => 'nvarchar(14)',
'float' => 'float',
);

View file

@ -85,9 +85,9 @@ class DBMysql extends DB
return;
}
// Error appears if the version is lower than 4.1
if(mysql_get_server_info($result) < "4.1")
if(version_compare(mysql_get_server_info($result), '4.1', '<'))
{
$this->setError(-1, "XE cannot be installed under the version of mysql 4.1. Current mysql version is " . mysql_get_server_info());
$this->setError(-1, 'XE cannot be installed under the version of mysql 4.1. Current mysql version is ' . mysql_get_server_info());
return;
}
// select db

View file

@ -164,12 +164,13 @@ class DisplayHandler extends Handler
array(
'Request / Response info >>> ' . $_SERVER['REQUEST_METHOD'] . ' / ' . Context::getResponseMethod(),
array(
array('Request URI', 'Request method', 'Response method', 'Response contents size'),
array('Request URI', 'Request method', 'Response method', 'Response contents size', 'Memory peak usage'),
array(
sprintf("%s:%s%s%s%s", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING'] ? '?' : '', $_SERVER['QUERY_STRING']),
$_SERVER['REQUEST_METHOD'],
Context::getResponseMethod(),
$this->content_size . ' byte'
$this->content_size . ' byte',
FileHandler::filesize(memory_get_peak_usage())
)
)
),

View file

@ -63,7 +63,7 @@ class HTMLDisplayHandler
// add .x div for adminitration pages
if(Context::getResponseMethod() == 'HTML')
{
if(Context::get('module') != 'admin' && strpos(Context::get('act'), 'Admin') > 0)
if(Context::get('module') != 'admin' && strpos(Context::get('act'), 'Admin') > 0 && Context::get('act') != 'dispPageAdminContentModify' && Context::get('act') != 'dispPageAdminMobileContentModify')
{
$output = '<div class="x">' . $output . '</div>';
}
@ -174,7 +174,7 @@ class HTMLDisplayHandler
$output = preg_replace_callback('!<meta(.*?)(?:\/|)>!is', array($this, '_moveMetaToHeader'), $output);
// change a meta fine(widget often put the tag like <!--Meta:path--> to the content because of caching)
$output = preg_replace_callback('/<!--(#)?Meta:([a-z0-9\_\/\.\@]+)-->/is', array($this, '_transMeta'), $output);
$output = preg_replace_callback('/<!--(#)?Meta:([a-z0-9\_\-\/\.\@]+)-->/is', array($this, '_transMeta'), $output);
// handles a relative path generated by using the rewrite module
if(Context::isAllowRewrite())
@ -394,7 +394,7 @@ class HTMLDisplayHandler
$lang_type = Context::getLangType();
// add common JS/CSS files
if(__DEBUG__)
if(__DEBUG__ || !__XE_VERSION_STABLE__)
{
$oContext->loadFile(array('./common/js/jquery-1.x.js', 'head', 'lt IE 9', -111000), true);
$oContext->loadFile(array('./common/js/jquery.js', 'head', 'gte IE 9', -110000), true);
@ -417,7 +417,7 @@ class HTMLDisplayHandler
// for admin page, add admin css
if(Context::get('module') == 'admin' || strpos(Context::get('act'), 'Admin') > 0)
{
if(__DEBUG__)
if(__DEBUG__ || !__XE_VERSION_STABLE__)
{
$oContext->loadFile(array('./modules/admin/tpl/css/admin.css', '', '', 10), true);
$oContext->loadFile(array("./modules/admin/tpl/css/admin_{$lang_type}.css", '', '', 10), true);
@ -449,7 +449,7 @@ class HTMLDisplayHandler
$lang_type = Context::getLangType();
// add common JS/CSS files
if(__DEBUG__)
if(__DEBUG__ || !__XE_VERSION_STABLE__)
{
$oContext->loadFile(array('./common/css/mobile.css', '', '', -1000000), true);
}

View file

@ -249,7 +249,7 @@ class ExtraItem
for($i = 0, $c = count($values); $i < $c; $i++)
{
$values[$i] = htmlspecialchars($values[$i], ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
$values[$i] = trim(htmlspecialchars($values[$i], ENT_COMPAT | ENT_HTML401, 'UTF-8', false));
}
return $values;
@ -263,10 +263,6 @@ class ExtraItem
{
$values = explode('|@|', $value);
}
elseif(strpos($value, ',') !== false)
{
$values = explode(',', $value);
}
else
{
$values = array($value);
@ -306,21 +302,15 @@ class ExtraItem
case 'textarea' :
return nl2br($value);
case 'checkbox' :
if(is_array($value))
{
return implode(', ', $value);
}
return $value;
case 'date' :
return zdate($value, "Y-m-d");
case 'checkbox' :
case 'select' :
case 'radio' :
if(is_array($value))
{
return implode(', ', $value);
return implode(',', $value);
}
return $value;
@ -430,7 +420,8 @@ class ExtraItem
Context::loadJavascriptPlugin('ui.datepicker');
$buff[] = '<input type="hidden" name="' . $column_name . '" value="' . $value . '" />';
$buff[] = '<input type="text" id="date_' . $column_name . '" value="' . zdate($value, 'Y-m-d') . '" class="date" /> <input type="button" value="' . Context::getLang('cmd_delete') . '" id="dateRemover_' . $column_name . '" />';
$buff[] = '<input type="text" id="date_' . $column_name . '" value="' . zdate($value, 'Y-m-d') . '" class="date" />';
$buff[] = '<input type="button" value="' . Context::getLang('cmd_delete') . '" class="btn" id="dateRemover_' . $column_name . '" />';
$buff[] = '<script type="text/javascript">';
$buff[] = '//<![CDATA[';
$buff[] = '(function($){';
@ -462,6 +453,8 @@ class ExtraItem
}
if($this->desc)
{
$oModuleController = getController('module');
$oModuleController->replaceDefinedLangCode($this->desc);
$buff[] = '<p>' . htmlspecialchars($this->desc, ENT_COMPAT | ENT_HTML401, 'UTF-8', false) . '</p>';
}

View file

@ -160,7 +160,7 @@ class FrontEndFileHandler extends Handler
if(strpos($file->filePath, '://') === FALSE)
{
if(!__DEBUG__)
if(!__DEBUG__ && __XE_VERSION_STABLE__)
{
// if no debug mode, load minifed file
$minifiedFileName = implode('.', array($file->fileNameNoExt, 'min', $file->fileExtension));

View file

@ -163,7 +163,7 @@ class XEHttpRequest
$chunk_size = hexdec(fgets($sock));
if($chunk_size)
{
$body .= fread($sock, $chunk_size);
$body .= fgets($sock, $chunk_size+1);
}
}
else

View file

@ -1025,7 +1025,7 @@ class ModuleHandler extends Handler
}
// Get base class name and load the file contains it
if(!class_exists($module))
if(!class_exists($module, false))
{
$high_class_file = sprintf('%s%s%s.class.php', _XE_PATH_, $class_path, $module);
if(!file_exists($high_class_file))
@ -1043,7 +1043,7 @@ class ModuleHandler extends Handler
// Create an instance with eval function
require_once($class_file);
if(!class_exists($instance_name))
if(!class_exists($instance_name, false))
{
return NULL;
}

View file

@ -15,10 +15,6 @@
<pattern>http://api.v.daum.net/</pattern>
<pattern>http://tvpot.daum.net/playlist/playlist.swf</pattern>
</domain>
<domain name="http://www.mncast.com" desc="엠엔캐스트">
<pattern>http://dory.mncast.com/mncHMovie.swf</pattern>
<pattern>http://dory.mncast.com/mncastPlayer.swf</pattern>
</domain>
<domain name="http://www.youtube.com" desc="Youtube">
<pattern>http://www.youtube.com/v/</pattern>
<pattern>http://www.youtube-nocookie.com/</pattern>

View file

@ -667,7 +667,7 @@ class Validator
}
// current language
$lang_type = class_exists('Context') ? Context::getLangType() : 'en';
$lang_type = class_exists('Context', false) ? Context::getLangType() : 'en';
// check the file
$filepath = $dir . '/' . md5($this->_version . ' ' . $this->_xml_path) . ".{$lang_type}.js";
@ -706,7 +706,7 @@ class Validator
list($ruleset) = explode('.', $ruleset);
// current language
$lang_type = class_exists('Context') ? Context::getLangType() : 'en';
$lang_type = class_exists('Context', false) ? Context::getLangType() : 'en';
// custom rulesets
$addrules = array();

View file

@ -45,6 +45,10 @@ a img {
}
}
.xe-widget-wrapper {
overflow: hidden;
}
/* Popup Menu Area */
#popup_menu_area {
position: absolute;

File diff suppressed because one or more lines are too long

View file

@ -29,7 +29,11 @@ define('__ZBXE__', __XE__);
/**
* Display XE's full version.
*/
define('__XE_VERSION__', '1.7.4');
define('__XE_VERSION__', '1.7.5-beta2');
define('__XE_VERSION_ALPHA__', (stripos(__XE_VERSION__, 'alpha') !== false));
define('__XE_VERSION_BETA__', (stripos(__XE_VERSION__, 'beta') !== false));
define('__XE_VERSION_RC__', (stripos(__XE_VERSION__, 'rc') !== false));
define('__XE_VERSION_STABLE__', (!__XE_VERSION_ALPHA__ && !__XE_VERSION_BETA__ && !__XE_VERSION_RC__));
/**
* @deprecated __ZBXE_VERSION__ will be removed. Use __XE_VERSION__ instead.

View file

@ -236,7 +236,46 @@ function executeQueryArray($query_id, $args = NULL, $arg_columns = NULL)
function getNextSequence()
{
$oDB = DB::getInstance();
return $oDB->getNextSequence();
$seq = $oDB->getNextSequence();
setUserSequence($seq);
return $seq;
}
/**
* Set Sequence number to session
*
* @param int $seq sequence number
* @return void
*/
function setUserSequence($seq)
{
$arr_seq = array();
if(isset($_SESSION['seq']))
{
$arr_seq = $_SESSION['seq'];
}
$arr_seq[] = $seq;
$_SESSION['seq'] = $arr_seq;
}
/**
* Check Sequence number grant
*
* @param int $seq sequence number
* @return boolean
*/
function checkUserSequence($seq)
{
if(!isset($_SESSION['seq']))
{
return false;
}
if(!in_array($seq, $_SESSION['seq']))
{
return false;
}
return true;
}
/**
@ -776,7 +815,7 @@ function debugPrint($debug_output = NULL, $display_option = TRUE, $file = '_debu
}
$type = FirePHP::INFO;
$label = sprintf('[%s:%d] %s() (m:%s)', $file_name, $line_num, $function, FileHandler::filesize(memory_get_usage()));
$label = sprintf('[%s:%d] %s() (Memory usage: current=%s, peak=%s)', $file_name, $line_num, $function, FileHandler::filesize(memory_get_usage()), FileHandler::filesize(memory_get_peak_usage()));
// Check a FirePHP option
if($display_option === 'TABLE')

View file

@ -19,7 +19,6 @@ class addon extends ModuleObject
$oAddonController = getAdminController('addon');
$oAddonController->doInsert('autolink', 0, 'site', 'Y');
$oAddonController->doInsert('blogapi');
$oAddonController->doInsert('counter', 0, 'site', 'Y');
$oAddonController->doInsert('member_communication', 0, 'site', 'Y');
$oAddonController->doInsert('member_extra_info', 0, 'site', 'Y');
$oAddonController->doInsert('mobile', 0, 'site', 'Y');

View file

@ -100,13 +100,13 @@
</div>
</div>
</block>
</block>
</section>
<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>
</block>
</section>
</form>
<script>
(function($){

View file

@ -95,6 +95,81 @@ class adminAdminModel extends admin
}
}
function getFTPPath()
{
$ftp_info = Context::getRequestVars();
if(!$ftp_info->ftp_host)
{
$ftp_info->ftp_host = "127.0.0.1";
}
if(!$ftp_info->ftp_port || !is_numeric($ftp_info->ftp_port))
{
$ftp_info->ftp_port = '22';
}
$connection = ftp_connect($ftp_info->ftp_host, $ftp_info->ftp_port);
if(!$connection)
{
return new Object(-1, sprintf(Context::getLang('msg_ftp_not_connected'), $ftp_host));
}
$login_result = @ftp_login($connection, $ftp_info->ftp_user, $ftp_info->ftp_password);
if(!$login_result)
{
ftp_close($connection);
return new Object(-1, 'msg_ftp_invalid_auth_info');
}
// create temp file
$pin = $_SERVER['REQUEST_TIME'];
FileHandler::writeFile('./files/cache/ftp_check', $pin);
// create path candidate
$xe_path = _XE_PATH_;
$path_info = array_reverse(explode('/', _XE_PATH_));
array_pop($path_info); // remove last '/'
$path_candidate = array();
$temp = '';
foreach($path_info as $path)
{
$temp = '/' . $path . $temp;
$path_candidate[] = $temp;
}
// try
foreach($path_candidate as $path)
{
// upload check file
if(!ftp_put($connection, $path . 'ftp_check.html', FileHandler::getRealPath('./files/cache/ftp_check'), FTP_BINARY))
{
continue;
}
// get check file
$result = FileHandler::getRemoteResource(getNotencodedFullUrl() . 'ftp_check.html');
// delete temp check file
ftp_delete($connection, $path . 'ftp_check.html');
// found
if($result == $pin)
{
$found_path = $path;
break;
}
}
FileHandler::removeFile('./files/cache/ftp_check', $pin);
if($found_path)
{
$this->add('found_path', $found_path);
}
}
/**
* Find XE installed path on ftp
*/
@ -130,6 +205,15 @@ class adminAdminModel extends admin
return $this->getSFTPPath();
}
if($ftp_info->ftp_pasv == 'N')
{
if(function_exists('ftp_connect'))
{
return $this->getFTPPath();
}
$ftp_info->ftp_pasv = "Y";
}
$oFTP = new ftp();
if(!$oFTP->ftp_connect($ftp_info->ftp_host, $ftp_info->ftp_port))
{

View file

@ -172,13 +172,11 @@ class adminAdminView extends admin
foreach($parentMenu['list'] as $childKey => $childMenu)
{
if($subMenuTitle == $childMenu['text'])
if($subMenuTitle == $childMenu['text'] && $parentSrl == 0)
{
$parentSrl = $childMenu['parent_srl'];
break;
}
}
if($parentSrl) break;
}
// Admin logo, title setup
@ -350,11 +348,26 @@ class adminAdminView extends admin
}
}
$site_module_info = Context::get('site_module_info');
$oAddonAdminModel = getAdminModel('addon');
$counterAddonActivated = $oAddonAdminModel->isActivatedAddon('counter', $site_module_info->site_srl );
if(!$counterAddonActivated)
{
$columnList = array('member_srl', 'nick_name', 'user_name', 'user_id', 'email_address');
$args = new stdClass;
$args->page = 1;
$args->list_count = 5;
$output = executeQuery('member.getMemberList', $args, $columnList);
Context::set('latestMemberList', $output->data);
unset($args, $output, $columnList);
}
Context::set('module_list', $module_list);
Context::set('needUpdate', $isUpdated);
Context::set('addTables', $addTables);
Context::set('needUpdate', $needUpdate);
Context::set('newVersionList', $needUpdateList);
Context::set('counterAddonActivated', $counterAddonActivated);
$oSecurity = new Security();
$oSecurity->encodeHTML('module_list..', 'module_list..author..', 'newVersionList..');

View file

@ -1590,8 +1590,8 @@
<value xml:lang="jp"><![CDATA[HTMLタグを使用できます。]]></value>
</item>
<item name="sitelock_warning_whitelist">
<value xml:lang="ko"><![CDATA[이곳에 관리자의 IP를 반드시 포함해야 합니다.<br />만약 접근이 차단된 경우 './files/config/db.config.php' 파일에서 `'use_sitelock' => '<strong>Y</strong>'`를 `'use_sitelock' => '<strong>N</strong>'`으로 변경하여 차단을 해제할 수 있습니다.]]></value>
<value xml:lang="jp"><![CDATA[ここに管理者のIPを必ず記入てください。<br />もし接近が遮断された場合、'./files/config/db.config.php' ファイルから `'use_sitelock' => '<strong>Y</strong>'`を `'use_sitelock' => '<strong>N</strong>'`へ変更すれば遮断が解除できます。]]></value>
<value xml:lang="ko"><![CDATA[이곳에 관리자의 IP를 반드시 포함해야 합니다.<br />만약 접근이 차단된 경우 './files/config/db.config.php' 파일에서 `'use_sitelock' => '<strong>Y</strong>'`를 `'use_sitelock' => '<strong>N</strong>'`으로 변경하여 차단을 해제할 수 있습니다.<br />사이트 잠금 디자인 파일의 위치는 './common/tpl/sitelock.html' 입니다.]]></value>
<value xml:lang="jp"><![CDATA[ここに管理者のIPを必ず記入てください。<br />もし接近が遮断された場合、'./files/config/db.config.php' ファイルから `'use_sitelock' => '<strong>Y</strong>'`を `'use_sitelock' => '<strong>N</strong>'`へ変更すれば遮断が解除できます。<br />サイトロックの設計ファイルの場所は、'./commo/tpl/sitelock.html' です。]]></value>
</item>
<item name="your_ip">
<value xml:lang="ko"><![CDATA[접속하신 IP]]></value>

View file

@ -0,0 +1,169 @@
<div>
<section class="status">
<h2>{$lang->uv}</h2>
<div style="margin:10px 15px;height:142px" id="visitors"></div>
<div class="more">
<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', 'dispCounterAdminIndex')}"><i>&rsaquo;</i> {$lang->details}</a>
</div>
</section>
<section class="status">
<h2>{$lang->pv}</h2>
<div style="margin:10px 15px;height:142px" id="page_views"></div>
<div class="more">
<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', 'dispCounterAdminIndex')}"><i>&rsaquo;</i> {$lang->details}</a>
</div>
</section>
<style scoped>.jqplot-table-legend{background:#fff;top:13px!important}</style>
</div>
<div>
<section class="document">
<h2>{$lang->latest_documents}</h2>
<ul>
<li loop="$latestDocumentList => $key,$value">
{@$document = $value->variables}
<a href="{getUrl('', 'document_srl', $document['document_srl'])}" target="_blank"><!--@if(trim($value->getTitle()))-->{$value->getTitle()}<!--@else--><strong>{$lang->no_title_document}</strong><!--@end--></a>
<span class="side">{$value->getNickName()}</span>
<form class="action" method="POST">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procDocumentManageCheckedDocument" />
<input type="hidden" name="cart[]" value="{$document['document_srl']}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" name="type" value="trash" class="x_icon-trash">{$lang->cmd_trash}</button>
<button type="submit" name="type" value="delete" class="x_icon-remove">{$lang->cmd_delete}</button>
</form>
</li>
<li cond="!is_array($latestDocumentList) || count($latestDocumentList) < 1">{$lang->no_data}</li>
</ul>
<p class="more"><a href="{getUrl('', 'module', 'admin', 'act', 'dispDocumentAdminList')}"><i>&rsaquo;</i> {$lang->more}</a></p>
</section>
<section class="reply">
<h2>{$lang->latest_comments}</h2>
<ul>
<li loop="$latestCommentList => $key,$value">
<a href="{getUrl('', 'document_srl', $value->document_srl)}#comment_{$value->comment_srl}" target="_blank"><!--@if(trim($value->content))-->{$value->getSummary()}<!--@else--><strong>{$lang->no_text_comment}</strong><!--@end--></a>
<span class="side">{$value->getNickName()}</span>
<form class="action">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procCommentAdminDeleteChecked" />
<input type="hidden" name="cart[]" value="{$value->comment_srl}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" name="is_trash" value="true" class="x_icon-trash">{$lang->cmd_trash}</button>
<button type="submit" name="is_trash" value="false" class="x_icon-remove">{$lang->cmd_delete}</button>
</form>
</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>
</section>
</div>
<script>
xe.lang.this_week = '{$lang->this_week}';
xe.lang.last_week = '{$lang->last_week}';
xe.lang.next_week = '{$lang->next_week}';
xe.lang.mon = '{$lang->mon}';
xe.lang.tue = '{$lang->tue}';
xe.lang.wed = '{$lang->wed}';
xe.lang.thu = '{$lang->thu}';
xe.lang.fri = '{$lang->fri}';
xe.lang.sat = '{$lang->sat}';
xe.lang.sun = '{$lang->sun}';
jQuery(function($)
{
// Dashboard portlet UI
$('.dashboard>div>section>ul>li')
.bind('mouseenter focusin', function(){
$(this).addClass('hover').find('>.action').show();
})
.bind('mouseleave focusout', function()
{
if(!$(this).find(':focus').length)
{
$(this).removeClass('hover').find('>.action').hide();
}
});
// check browser version
if($.browser.msie == true ) {
var arrBrowserVersion = $.browser.version.split('.');
if(parseInt(arrBrowserVersion[0]) <= 8) {
$('#checkBrowserMessage').show();
}
}
});
function obj2Array(htObj)
{
var aRes = [];
for(var x in htObj)
{
if(!htObj.hasOwnProperty(x)) continue;
aRes.push(htObj[x]);
}
return aRes;
}
jQuery(function ($)
{
$.exec_json("counter.getWeeklyUniqueVisitor", {}, function(htRes)
{
var aLastWeek = obj2Array(htRes.last_week.list);
var aThisWeek = obj2Array(htRes.this_week.list);
drawChart("visitors", "Weekly Visitors", aLastWeek, aThisWeek);
});
$.exec_json("counter.getWeeklyPageView", {}, function(htRes)
{
var aLastWeek = obj2Array(htRes.last_week.list);
var aThisWeek = obj2Array(htRes.this_week.list);
drawChart("page_views", "Weekly Page Views", aLastWeek, aThisWeek);
});
});
function drawChart(sContainerId, sTitle, aLastWeek, aThisWeek)
{
$ = jQuery;
var s1 = aLastWeek;
var s2 = aThisWeek;
// Can specify a custom tick Array.
// Ticks should match up one for each y value (category) in the series.
var ticks = [xe.lang.sun,xe.lang.mon,xe.lang.tue,xe.lang.wed,xe.lang.thu,xe.lang.fri,xe.lang.sat];
var plot1 = $.jqplot(sContainerId, [s1, s2], {
seriesDefaults:{
renderer:$.jqplot.BarRenderer,
rendererOptions: {fillToZero: true}
},
series:[
{label: xe.lang.last_week},
{label: xe.lang.this_week}
],
legend:
{
show: true,
placement: 'outsideGrid'
},
axes: {
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks
},
yaxis: {
min: 0, ticks: 1, pad: 1.05
}
}
});
};
</script>

View file

@ -0,0 +1,66 @@
<div>
<section class="member">
<h2>{$lang->member}</h2>
<ul>
<li loop="$latestMemberList => $key,$value">
{@$document = $value->variables}
<a href="{getUrl('', 'module', 'admin', 'act', 'dispMemberAdminInsert', 'member_srl', $value->member_srl)}" target="_blank">{$value->nick_name}</a>
</li>
<li cond="!is_array($latestMemberList) || count($latestMemberList) < 1">{$lang->no_data}</li>
</ul>
<div class="more">
<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>
</div>
</section>
</div>
<div>
<section class="document">
<h2>{$lang->latest_documents}</h2>
<ul>
<li loop="$latestDocumentList => $key,$value">
{@$document = $value->variables}
<a href="{getUrl('', 'document_srl', $document['document_srl'])}" target="_blank"><!--@if(trim($value->getTitle()))-->{$value->getTitle()}<!--@else--><strong>{$lang->no_title_document}</strong><!--@end--></a>
<span class="side">{$value->getNickName()}</span>
<form class="action" method="POST">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procDocumentManageCheckedDocument" />
<input type="hidden" name="cart[]" value="{$document['document_srl']}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" name="type" value="trash" class="x_icon-trash">{$lang->cmd_trash}</button>
<button type="submit" name="type" value="delete" class="x_icon-remove">{$lang->cmd_delete}</button>
</form>
</li>
<li cond="!is_array($latestDocumentList) || count($latestDocumentList) < 1">{$lang->no_data}</li>
</ul>
<div class="more">
<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>
</div>
</section>
<section class="reply">
<h2>{$lang->latest_comments}</h2>
<ul>
<li loop="$latestCommentList => $key,$value">
<a href="{getUrl('', 'document_srl', $value->document_srl)}#comment_{$value->comment_srl}" target="_blank"><!--@if(trim($value->content))-->{$value->getSummary()}<!--@else--><strong>{$lang->no_text_comment}</strong><!--@end--></a>
<span class="side">{$value->getNickName()}</span>
<form class="action">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procCommentAdminDeleteChecked" />
<input type="hidden" name="cart[]" value="{$value->comment_srl}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" name="is_trash" value="true" class="x_icon-trash">{$lang->cmd_trash}</button>
<button type="submit" name="is_trash" value="false" class="x_icon-remove">{$lang->cmd_delete}</button>
</form>
</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>
</section>
</div>

View file

@ -1421,6 +1421,9 @@ body>.x,
.x .dashboard>div>.status dl a {
color: #767676;
}
.x .dashboard>div>.member>h2:before {
background-position: -168px 0px;
}
.x .dashboard>div>.document>h2:before {
background-position: -264px -48px;
}
@ -1439,6 +1442,32 @@ body>.x,
.x .dashboard>div>section>.more i {
font: 12px Tahoma, Geneva, sans-serif;
}
.x .dashboard>div>section>.more dl {
color: #767676;
display: inline-block;
*display: inline;
zoom: 1;
margin: 0 8px 0 0;
padding: 1px 8px 0;
font: 11px/1 돋움, Dotum, Arial, Helvetica, sans-serif;
background: #fff;
box-shadow: 0 0 3px #999 inset;
border-radius: 3px;
min-width: 60px;
text-align: center;
}
.x .dashboard>div>section>.more dt {
display: inline;
font-weight: normal;
}
.x .dashboard>div>section>.more dd {
display: inline;
margin: 0;
}
.x .dashboard>div>section>.more dl a {
color: #767676;
}
.x .dashboard>div>section ul {
list-style: none;
margin: 10px;

File diff suppressed because one or more lines are too long

View file

@ -48,173 +48,13 @@
</div>
<div class="dashboard">
<div>
<section class="status">
<h2>{$lang->uv}</h2>
<div style="margin:10px 15px;height:142px" id="visitors"></div>
<div class="more">
<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', 'dispCounterAdminIndex')}"><i>&rsaquo;</i> {$lang->details}</a>
</div>
</section>
<section class="status">
<h2>{$lang->pv}</h2>
<div style="margin:10px 15px;height:142px" id="page_views"></div>
<div class="more">
<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', 'dispCounterAdminIndex')}"><i>&rsaquo;</i> {$lang->details}</a>
</div>
</section>
<style scoped>.jqplot-table-legend{background:#fff;top:13px!important}</style>
</div>
<div>
<section class="document">
<h2>{$lang->latest_documents}</h2>
<ul>
<li loop="$latestDocumentList => $key,$value">
{@$document = $value->variables}
<a href="{getUrl('', 'document_srl', $document['document_srl'])}" target="_blank"><!--@if(trim($value->getTitle()))-->{$value->getTitle()}<!--@else--><strong>{$lang->no_title_document}</strong><!--@end--></a>
<span class="side">{$value->getNickName()}</span>
<form class="action" method="POST">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procDocumentManageCheckedDocument" />
<input type="hidden" name="cart[]" value="{$document['document_srl']}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" name="type" value="trash" class="x_icon-trash">{$lang->cmd_trash}</button>
<button type="submit" name="type" value="delete" class="x_icon-remove">{$lang->cmd_delete}</button>
</form>
</li>
<li cond="!is_array($latestDocumentList) || count($latestDocumentList) < 1">{$lang->no_data}</li>
</ul>
<p class="more"><a href="{getUrl('', 'module', 'admin', 'act', 'dispDocumentAdminList')}"><i>&rsaquo;</i> {$lang->more}</a></p>
</section>
<section class="reply">
<h2>{$lang->latest_comments}</h2>
<ul>
<li loop="$latestCommentList => $key,$value">
<a href="{getUrl('', 'document_srl', $value->document_srl)}#comment_{$value->comment_srl}" target="_blank"><!--@if(trim($value->content))-->{$value->getSummary()}<!--@else--><strong>{$lang->no_text_comment}</strong><!--@end--></a>
<span class="side">{$value->getNickName()}</span>
<form class="action">
<input type="hidden" name="module" value="admin" />
<input type="hidden" name="act" value="procCommentAdminDeleteChecked" />
<input type="hidden" name="cart[]" value="{$value->comment_srl}" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin')}" />
<button type="submit" name="is_trash" value="true" class="x_icon-trash">{$lang->cmd_trash}</button>
<button type="submit" name="is_trash" value="false" class="x_icon-remove">{$lang->cmd_delete}</button>
</form>
</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>
</section>
</div>
<block cond="$counterAddonActivated">
<include target="./_dashboard_counter.html" />
</block>
<block cond="!$counterAddonActivated">
<include target="./_dashboard_default.html" />
</block>
</div>
</div>
<include target="./_footer.html" />
<script>
xe.lang.this_week = '{$lang->this_week}';
xe.lang.last_week = '{$lang->last_week}';
xe.lang.next_week = '{$lang->next_week}';
xe.lang.mon = '{$lang->mon}';
xe.lang.tue = '{$lang->tue}';
xe.lang.wed = '{$lang->wed}';
xe.lang.thu = '{$lang->thu}';
xe.lang.fri = '{$lang->fri}';
xe.lang.sat = '{$lang->sat}';
xe.lang.sun = '{$lang->sun}';
jQuery(function($)
{
// Dashboard portlet UI
$('.dashboard>div>section>ul>li')
.bind('mouseenter focusin', function(){
$(this).addClass('hover').find('>.action').show();
})
.bind('mouseleave focusout', function()
{
if(!$(this).find(':focus').length)
{
$(this).removeClass('hover').find('>.action').hide();
}
});
// check browser version
if($.browser.msie == true ) {
var arrBrowserVersion = $.browser.version.split('.');
if(parseInt(arrBrowserVersion[0]) <= 8) {
$('#checkBrowserMessage').show();
}
}
});
function obj2Array(htObj)
{
var aRes = [];
for(var x in htObj)
{
if(!htObj.hasOwnProperty(x)) continue;
aRes.push(htObj[x]);
}
return aRes;
}
jQuery(function ($)
{
$.exec_json("counter.getWeeklyUniqueVisitor", {}, function(htRes)
{
var aLastWeek = obj2Array(htRes.last_week.list);
var aThisWeek = obj2Array(htRes.this_week.list);
drawChart("visitors", "Weekly Visitors", aLastWeek, aThisWeek);
});
$.exec_json("counter.getWeeklyPageView", {}, function(htRes)
{
var aLastWeek = obj2Array(htRes.last_week.list);
var aThisWeek = obj2Array(htRes.this_week.list);
drawChart("page_views", "Weekly Page Views", aLastWeek, aThisWeek);
});
});
function drawChart(sContainerId, sTitle, aLastWeek, aThisWeek)
{
$ = jQuery;
var s1 = aLastWeek;
var s2 = aThisWeek;
// Can specify a custom tick Array.
// Ticks should match up one for each y value (category) in the series.
var ticks = [xe.lang.sun,xe.lang.mon,xe.lang.tue,xe.lang.wed,xe.lang.thu,xe.lang.fri,xe.lang.sat];
var plot1 = $.jqplot(sContainerId, [s1, s2], {
seriesDefaults:{
renderer:$.jqplot.BarRenderer,
rendererOptions: {fillToZero: true}
},
series:[
{label: xe.lang.last_week},
{label: xe.lang.this_week}
],
legend:
{
show: true,
placement: 'outsideGrid'
},
axes: {
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks
},
yaxis: {
min: 0, ticks: 1, pad: 1.05
}
}
});
};
</script>

View file

@ -55,7 +55,7 @@ class boardAdminView extends board {
// install order (sorting) options
foreach($this->order_target as $key) $order_target[$key] = Context::getLang($key);
$order_target['list_order'] = Context::getLang('document_srl');
$order_target['list_order'] = Context::getLang('regdate');
$order_target['update_order'] = Context::getLang('last_update');
Context::set('order_target', $order_target);
}

View file

@ -11,7 +11,7 @@ class board extends ModuleObject
{
var $search_option = array('title','content','title_content','comment','user_name','nick_name','user_id','tag'); ///< 검색 옵션
var $order_target = array('list_order', 'update_order', 'regdate', 'voted_count', 'blamed_count', 'readed_count', 'comment_count', 'title'); // 정렬 옵션
var $order_target = array('list_order', 'update_order', 'voted_count', 'blamed_count', 'readed_count', 'comment_count', 'title'); // 정렬 옵션
var $skin = "default"; ///< skin name
var $list_count = 20; ///< the number of documents displayed in a page

View file

@ -76,6 +76,15 @@ class boardController extends board
$bAnonymous = false;
}
if((!$obj->status && $obj->is_secret == 'Y') || strtoupper($obj->status == 'SECRET'))
{
$use_status = explode('|@|', $this->module_info->use_status);
if(!is_array($use_status) || !in_array('SECRET', $use_status))
{
$obj->status = 'PUBLIC';
}
}
// update the document if it is existed
if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl)
{

View file

@ -24,11 +24,29 @@ class boardMobile extends boardView
$this->module_info->secret = 'Y';
}
//If category are exsist, set value 'use_category' to 'Y'
if(count($oDocumentModel->getCategoryList($this->module_info->module_srl)))
$this->module_info->use_category = 'Y';
// use_category <=1.5.x, hide_category >=1.7.x
$count_category = count($oDocumentModel->getCategoryList($this->module_info->module_srl));
if($count_category)
{
if($this->module_info->hide_category)
{
$this->module_info->use_category = ($this->module_info->hide_category == 'Y') ? 'N' : 'Y';
}
else if($this->module_info->use_category)
{
$this->module_info->hide_category = ($this->module_info->use_category == 'Y') ? 'N' : 'Y';
}
else
{
$this->module_info->hide_category = 'N';
$this->module_info->use_category = 'Y';
}
}
else
{
$this->module_info->hide_category = 'Y';
$this->module_info->use_category = 'N';
}
/**
* check the consultation function, if the user is admin then swich off consultation function

View file

@ -18,8 +18,8 @@
<description xml:lang="ru">Модуль для функционирования форума. Также включает в себя функции администратора такие как создание/управление форумами.</description>
<description xml:lang="zh-TW">提供用戶相對應的討論板功能,包含建立/新增及管理等功能。</description>
<description xml:lang="tr">Pano yapılandırmaları için kullanılan modüldür. Ayrıca oluşturma/yönetme gibi yönetici özellikleri de içerir.</description>
<version>1.7.2-beta.3</version>
<date>2014-01-09</date>
<version>1.7.2</version>
<date>2014-03-20</date>
<category>service</category>
<author email_address="developers@xpressengine.com" link="http://xpressengine.com/">

View file

@ -11,9 +11,9 @@
<th scope="col" cond="$val->type=='nick_name' && $val->idx==-1"><span>{$lang->writer}</span></th>
<th scope="col" cond="$val->type=='user_id' && $val->idx==-1"><span>{$lang->user_id}</span></th>
<th scope="col" cond="$val->type=='user_name' && $val->idx==-1"><span>{$lang->user_name}</span></th>
<th scope="col" cond="$val->type=='regdate' && $val->idx==-1"><span><a href="{getUrl('sort_index','regdate','order_type',$order_type)}">{$lang->date}</a></span></th>
<th scope="col" cond="$val->type=='last_update' && $val->idx==-1"><span><a href="{getUrl('sort_index','last_update','order_type',$order_type)}">{$lang->last_update}</a></span></th>
<th scope="col" cond="$val->type=='last_post' && $val->idx==-1"><span><a href="{getUrl('sort_index','last_update','order_type',$order_type)}">{$lang->last_post}</a></span></th>
<th scope="col" cond="$val->type=='regdate' && $val->idx==-1"><span><a href="{getUrl('sort_index','list_order','order_type',$order_type)}">{$lang->date}</a></span></th>
<th scope="col" cond="$val->type=='last_update' && $val->idx==-1"><span><a href="{getUrl('sort_index','update_order','order_type',$order_type)}">{$lang->last_update}</a></span></th>
<th scope="col" cond="$val->type=='last_post' && $val->idx==-1"><span><a href="{getUrl('sort_index','update_order','order_type',$order_type)}">{$lang->last_post}</a></span></th>
<th scope="col" cond="$val->type=='readed_count' && $val->idx==-1"><span><a href="{getUrl('sort_index','readed_count','order_type',$order_type)}">{$lang->readed_count}</a></span></th>
<th scope="col" cond="$val->type=='voted_count' && $val->idx==-1"><span><a href="{getUrl('sort_index','voted_count','order_type',$order_type)}">{$lang->voted_count}</a></span></th>
<th scope="col" cond="$val->type=='blamed_count' && $val->idx==-1"><span><a href="{getUrl('sort_index','blamed_count','order_type',$order_type)}">{$lang->blamed_count}</a></span></th>

View file

@ -340,6 +340,35 @@ class commentAdminController extends comment
}
}
/**
* @fn procCommentAdminMoveToTrash
* @brief move a comment to trash
* @see commentModel::getCommentMenu
*/
function procCommentAdminMoveToTrash()
{
$oDB = DB::getInstance();
$oDB->begin();
$comment_srl = Context::get('comment_srl');
$oCommentModel = getModel('comment');
$oCommentController = getController('comment');
$oComment = $oCommentModel->getComment($comment_srl, false);
if(!$oComment->isGranted()) return $this->stop('msg_not_permitted');
$message_content = "";
$this->_moveCommentToTrash(array($comment_srl), $oCommentController, $oDB, $message_content);
$isTrash = true;
$output = $oCommentController->deleteComment($comment_srl, TRUE, $isTrash);
$oDB->commit();
$returnUrl = Context::get('cur_url');
$this->add('redirect_url', $returnUrl);
}
/**
* Cancel the blacklist of abused comments reported by other users
* @return void|object

View file

@ -52,7 +52,7 @@ class commentAdminView extends comment
// get a list by using comment->getCommentList.
$oCommentModel = getModel('comment');
$secretNameList = $oCommentModel->getSecretNameList();
$columnList = array('comment_srl', 'document_srl', 'is_secret', 'status', 'content', 'comments.member_srl', 'comments.nick_name', 'comments.regdate', 'ipaddress', 'voted_count', 'blamed_count');
$columnList = array('comment_srl', 'document_srl','module_srl','is_secret', 'status', 'content', 'comments.member_srl', 'comments.nick_name', 'comments.regdate', 'ipaddress', 'voted_count', 'blamed_count');
$output = $oCommentModel->getTotalCommentList($args, $columnList);
// $modules = $oCommentModel->getDistinctModules();
@ -66,6 +66,31 @@ class commentAdminView extends comment
// Context::set('modules_list', $modules_list);
Context::set('page_navigation', $output->page_navigation);
Context::set('secret_name_list', $secretNameList);
$oModuleModel = getModel('module');
$module_list = array();
$mod_srls = array();
foreach($output->data as $val)
{
$mod_srls[] = $val->module_srl;
}
$mod_srls = array_unique($mod_srls);
// Module List
$mod_srls_count = count($mod_srls);
if($mod_srls_count)
{
$columnList = array('module_srl', 'mid', 'browser_title');
$module_output = $oModuleModel->getModulesInfo($mod_srls, $columnList);
if($module_output && is_array($module_output))
{
foreach($module_output as $module)
{
$module_list[$module->module_srl] = $module;
}
}
}
Context::set('module_list', $module_list);
// set the template
$this->setTemplatePath($this->module_path . 'tpl');
$this->setTemplateFile('comment_list');

View file

@ -266,9 +266,13 @@ class commentController extends comment
return new Object(-1, 'msg_invalid_request');
}
if($obj->homepage && !preg_match('/^[a-z]+:\/\//i', $obj->homepage))
if($obj->homepage)
{
$obj->homepage = 'http://' . $obj->homepage;
$obj->homepage = removeHackTag($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
}
}
// input the member's information if logged-in
@ -296,6 +300,10 @@ class commentController extends comment
{
$obj->comment_srl = getNextSequence();
}
elseif(!checkUserSequence($obj->comment_srl))
{
return new Object(-1, 'msg_not_permitted');
}
// determine the order
$obj->list_order = getNextSequence() * -1;
@ -655,9 +663,13 @@ class commentController extends comment
$obj->password = md5($obj->password);
}
if($obj->homepage && !preg_match('/^[a-z]+:\/\//i', $obj->homepage))
if($obj->homepage)
{
$obj->homepage = 'http://' . $obj->homepage;
$obj->homepage = removeHackTag($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
}
}
// set modifier's information if logged-in and posting author and modifier are matched.
@ -835,18 +847,27 @@ class commentController extends comment
// call a trigger (after)
if($output->toBool())
{
$comment->isMoveToTrash = $isMoveToTrash;
$trigger_output = ModuleHandler::triggerCall('comment.deleteComment', 'after', $comment);
if(!$trigger_output->toBool())
{
$oDB->rollback();
return $trigger_output;
}
unset($comment->isMoveToTrash);
}
if(!$isMoveToTrash)
{
$this->_deleteDeclaredComments($args);
$this->_deleteVotedComments($args);
}
else
{
$args = new stdClass();
$args->upload_target_srl = $comment_srl;
$args->isvalid = 'N';
$output = executeQuery('file.updateFileValid', $args);
}
// commit

View file

@ -76,6 +76,13 @@ class commentModel extends comment
// call a trigger (after)
ModuleHandler::triggerCall('comment.getCommentMenu', 'after', $menu_list);
if($this->grant->manager){
$str_confirm = Context::getLang('confirm_move');
$url = sprintf("if(!confirm('%s')) return; var params = new Array(); params['comment_srl']='%s'; params['mid']=current_mid;params['cur_url']=current_url; exec_xml('comment', 'procCommentAdminMoveToTrash', params)", $str_confirm, $comment_srl);
$oCommentController->addCommentPopupMenu($url,'cmd_trash','','javascript');
}
// find a comment by IP matching if an administrator.
if($logged_info->is_admin == 'Y')
{

View file

@ -4,6 +4,7 @@
<permissions>
<permission action="procCommentAdminAddCart" target="manager" />
<permission action="procCommentGetList" target="manager" />
<permission action="procCommentAdminMoveToTrash" target="manager" />
</permissions>
<actions>
<action name="getCommentMenu" type="model" />
@ -21,6 +22,7 @@
<action name="procCommentAdminCancelDeclare" type="controller" />
<action name="procCommentAdminAddCart" type="controller" />
<action name="procCommentGetList" type="controller" />
<action name="procCommentAdminMoveToTrash" type="controller" />
</actions>
<menus>
<menu name="comment">

View file

@ -47,7 +47,12 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
<tbody>
<tr loop="$comment_list => $no, $val">
{@ $comment = $val->getContentText(200)}
<td><a href="{getUrl('','document_srl',$val->document_srl)}#comment_{$val->comment_srl}" target="_blank"><!--@if(strlen($comment))-->{$comment}<!--@else--><em>{$lang->no_text_comment}</em><!--@end--></a></td>
<td>
<block cond="isset($module_list[$val->module_srl])">
<a href="{getUrl('', 'mid', $module_list[$val->module_srl]->mid)}" target="_blank">{$module_list[$val->module_srl]->browser_title}</a> -
</block>
<a href="{getUrl('','document_srl',$val->document_srl)}#comment_{$val->comment_srl}" target="_blank"><!--@if(strlen($comment))-->{$comment}<!--@else--><em>{$lang->no_text_comment}</em><!--@end--></a>
</td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$val->member_srl}">{$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>

View file

@ -24,7 +24,7 @@ class communicationAdminController extends communication
function procCommunicationAdminInsertConfig()
{
// get the default information
$args = Context::gets('skin', 'colorset', 'editor_skin', 'sel_editor_colorset', 'mskin', 'mcolorset', 'layout_srl', 'mlayout_srl');
$args = Context::gets('skin', 'colorset', 'editor_skin', 'sel_editor_colorset', 'mskin', 'mcolorset', 'layout_srl', 'mlayout_srl', 'grant_write_default','grant_write_group');
$args->editor_colorset = $args->sel_editor_colorset;
unset($args->sel_editor_colorset);
@ -53,6 +53,11 @@ class communicationAdminController extends communication
$args->layout_srl = NULL;
}
$oCommunicationModel = getModel('communication');
$args->grant_write = $oCommunicationModel->getGrantArray($args->grant_write_default, $args->grant_write_group);
unset($args->grant_write_default);
unset($args->grant_write_group);
// create the module module Controller object
$oModuleController = getController('module');
$output = $oModuleController->insertModuleConfig('communication', $args);

View file

@ -58,6 +58,10 @@ class communicationAdminView extends communication
$security->encodeHTML('communication_skin_list..title');
$security->encodeHTML('communication_mobile_skin_list..title');
$oMemberModel = getModel('member');
$group_list = $oMemberModel->getGroups($this->site_srl);
Context::set('group_list', $group_list);
// specify a template
$this->setTemplatePath($this->module_path . 'tpl');
$this->setTemplateFile('index');

View file

@ -88,6 +88,12 @@ class communicationController extends communication
// Check if there is a member to receive a message
$oMemberModel = getModel('member');
$oCommunicationModel = getModel('communication');
$config = $oCommunicationModel->getConfig();
if(!$oCommunicationModel->checkGrant($config->grant_write))
{
return new Object(-1, 'msg_not_permitted');
}
$receiver_member_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl);
if($receiver_member_info->member_srl != $receiver_srl)

View file

@ -51,10 +51,102 @@ class communicationModel extends communication
{
$communication_config->mskin = 'default';
}
if(!$communication_config->grant_write)
{
$communication_config->grant_write = array('default_grant'=>'member');
}
return $communication_config;
}
/**
* @brief get grant array for insert to database. table module_config's config field
* @param string $default
* @param array $group
* @return array
*/
function getGrantArray($default, $group)
{
$grant = array();
if($default!="")
{
switch($default)
{
case "-2":
$grant = array("default_grant"=>"site");
break;
case "-3":
$grant = array("default_grant"=>"manager");
break;
default :
$grant = array("default_grant"=>"member");
break;
}
}
else if(is_array($group))
{
$oMemberModel = getModel('member');
$group_list = $oMemberModel->getGroups($this->site_srl);
$group_grant = array();
foreach($group as $group_srl)
{
$group_grant[$group_srl] = $group_list[$group_srl]->title;
}
$grant = array('group_grant'=>$group_grant);
}
return $grant;
}
/**
* @brief check member's grant
* @param object $member_info
* @param array $arrGrant
* @return boolean
*/
function checkGrant($arrGrant)
{
if(!$arrGrant)
return false;
$logged_info = Context::get('logged_info');
if(!$logged_info)
return false;
if($logged_info->is_admin == "Y")
return true;
if($arrGrant['default_grant'])
{
if($arrGrant['default_grant'] == "member" && $logged_info)
return true;
if($arrGrant['default_grant'] == "site" && $this->site_srl == $logged_info->site_srl)
return true;
if($arrGrant['default_grant'] == "manager" && $logged_info->is_admin == "Y")
return true;
}
if($arrGrant['group_grant'])
{
$group_grant = $arrGrant['group_grant'];
if(!is_array($group_grant))
return false;
foreach($logged_info->group_list as $group_srl=>$title)
{
if(isset($group_grant[$group_srl])&&$group_grant[$group_srl]==$title)
return true;
}
}
return false;
}
/**
* get the message contents
* @param int $message_srl

View file

@ -376,4 +376,12 @@
<value xml:lang="en"><![CDATA[Friends in a mobile environment is not supported. Please go to the PC page.]]></value>
<value xml:lang="jp"><![CDATA[モバイル環境では友達リストページをサポートしません。PC画面へ移動してください。]]></value>
</item>
<item name="cmd_write_communication">
<value xml:lang="ko"><![CDATA[작성 권한]]></value>
<value xml:lang="en"><![CDATA[Write Grant]]></value>
</item>
<item name="cmd_manage_base">
<value xml:lang="ko"><![CDATA[기본 정보]]></value>
<value xml:lang="en"><![CDATA[Basic infomation]]></value>
</item>
</lang>

View file

@ -1,6 +1,6 @@
<query id="getNewMessage" action="select">
<tables>
<table name="message" />
<table name="member_message" alias="message" />
<table name="member" />
</tables>
<columns>

View file

@ -1,4 +1,5 @@
<load target="js/communication_admin.js" usecdn="true" />
<load target="../../module/tpl/js/module_admin.js" />
<load target="../../editor/tpl/js/editor_module_config.js" usecdn="true" />
<div class="x_page-header">
@ -81,6 +82,24 @@
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="mlayout_srl">{$lang->cmd_write_communication}</label>
<div class="x_controls">
<select name="grant_write_default" class="grant_default">
<option value="-1" selected="selected"|cond="$communication_config->grant_write['default_grant']=='member'">{$lang->grant_to_login_user}</option>
<option value="-2" selected="selected"|cond="$communication_config->grant_write['default_grant']=='site'">{$lang->grant_to_site_user}</option>
<option value="-3" selected="selected"|cond="$communication_config->grant_write['default_grant']=='manager'">{$lang->grant_to_admin}</option>
<option value="" selected="selected"|cond="$communication_config->grant_write['default_grant']==''">{$lang->grant_to_group}</option>
</select>
<div id="zone_grant_write" hidden style="margin:8px 0 0 0">
<label loop="$group_list => $group_srl, $group_item" for="grant_write_group_{$group_srl}">
<input type="checkbox" class="checkbox" name="grant_write_group[]" value="{$group_item->group_srl}" id="grant_write_group_{$group_item->group_srl}" checked="checked"|cond="isset($communication_config->grant_write['group_grant'][$group_srl])&&$communication_config->grant_write['group_grant'][$group_srl]==$group_item->title"/>
{$group_item->title}
</label>
</div>
</div>
</div>
<div class="btnArea">
<button class="x_btn x_btn-primary" type="submit">{$lang->cmd_registration}</button>
</div>
@ -89,5 +108,7 @@
jQuery(function() {
doGetSkinColorset("{$communication_config->skin}", 'P');
doGetSkinColorset("{$communication_config->mskin}", 'M');
jQuery('.grant_default').change( function(event) { doShowGrantZone(); } );
doShowGrantZone()
});
</script>

View file

@ -50,7 +50,7 @@ class documentAdminView extends document
// get a list
$oDocumentModel = getModel('document');
$columnList = array('document_srl', 'title', 'member_srl', 'nick_name', 'readed_count', 'voted_count', 'blamed_count', 'regdate', 'ipaddress', 'status');
$columnList = array('document_srl', 'module_srl', 'title', 'member_srl', 'nick_name', 'readed_count', 'voted_count', 'blamed_count', 'regdate', 'ipaddress', 'status');
$output = $oDocumentModel->getDocumentList($args, false, true, $columnList);
// get Status name list
@ -72,6 +72,30 @@ class documentAdminView extends document
}
Context::set('search_option', $search_option);
$oModuleModel = getModel('module');
$module_list = array();
$mod_srls = array();
foreach($output->data as $oDocument)
{
$mod_srls[] = $oDocument->get('module_srl');
}
$mod_srls = array_unique($mod_srls);
// Module List
$mod_srls_count = count($mod_srls);
if($mod_srls_count)
{
$columnList = array('module_srl', 'mid', 'browser_title');
$module_output = $oModuleModel->getModulesInfo($mod_srls, $columnList);
if($module_output && is_array($module_output))
{
foreach($module_output as $module)
{
$module_list[$module->module_srl] = $module;
}
}
}
Context::set('module_list', $module_list);
// Specify a template
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile('document_list');

View file

@ -234,6 +234,7 @@ class documentController extends document
if(!$output->toBool()) return $output;
// Register it if no given document_srl exists
if(!$obj->document_srl) $obj->document_srl = getNextSequence();
elseif(!checkUserSequence($obj->document_srl)) return new Object(-1, 'msg_not_permitted');
$oDocumentModel = getModel('document');
// Set to 0 if the category_srl doesn't exist
@ -398,7 +399,15 @@ class documentController extends document
if(!$obj->commentStatus) $obj->commentStatus = 'DENY';
if($obj->commentStatus == 'DENY') $this->_checkCommentStatusForOldVersion($obj);
if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N';
if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage;
if($obj->homepage)
{
$obj->homepage = removeHackTag($obj->homepage);
if(!preg_match('/^[a-z]+:\/\//i',$obj->homepage))
{
$obj->homepage = 'http://'.$obj->homepage;
}
}
if($obj->notify_message != 'Y') $obj->notify_message = 'N';
// can modify regdate only manager
@ -510,7 +519,7 @@ class documentController extends document
{
foreach($extra_keys as $idx => $extra_item)
{
$value = '';
$value = NULL;
if(isset($obj->{'extra_vars'.$idx}))
{
$tmp = $obj->{'extra_vars'.$idx};
@ -520,7 +529,7 @@ class documentController extends document
$value = trim($tmp);
}
else if(isset($obj->{$extra_item->name})) $value = trim($obj->{$extra_item->name});
if(!isset($value)) continue;
if($value == NULL) continue;
$this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid);
}
}
@ -793,6 +802,8 @@ class documentController extends document
$oCacheHandler = CacheHandler::getInstance('object');
if($oCacheHandler->isSupport())
{
$cache_key = 'document_item:'. getNumberingPath($oDocument->document_srl) . $oDocument->document_srl;
$oCacheHandler->delete($cache_key);
}
return $output;
@ -808,9 +819,10 @@ class documentController extends document
$document_srl = $oDocument->document_srl;
$member_srl = $oDocument->get('member_srl');
$logged_info = Context::get('logged_info');
// Call a trigger when the read count is updated (after)
$output = ModuleHandler::triggerCall('document.updateReadedCount', 'after', $oDocument);
if(!$output->toBool()) return $output;
// Call a trigger when the read count is updated (before)
$trigger_output = ModuleHandler::triggerCall('document.updateReadedCount', 'before', $oDocument);
if(!$trigger_output->toBool()) return $trigger_output;
// Pass if read count is increaded on the session information
if($_SESSION['readed_document'][$document_srl]) return false;
@ -827,11 +839,25 @@ class documentController extends document
$_SESSION['readed_document'][$document_srl] = true;
return false;
}
$oDB = DB::getInstance();
$oDB->begin();
// Update read counts
$args = new stdClass;
$args->document_srl = $document_srl;
$output = executeQuery('document.updateReadedCount', $args);
// Call a trigger when the read count is updated (after)
$outptrigger_outputut = ModuleHandler::triggerCall('document.updateReadedCount', 'after', $oDocument);
if(!$trigger_output->toBool())
{
$oDB->rollback();
return $trigger_output;
}
$oDB->commit();
$oCacheHandler = CacheHandler::getInstance('object');
if($oCacheHandler->isSupport())
{

View file

@ -141,9 +141,8 @@ class documentItem extends Object
$oDocumentModel = getModel('document');
if($load_extra_vars)
{
$oDocumentModel->getDocumentExtraVarsFromDB($this->document_srl);
$this->add('title', $this->get('title'));
$this->add('content', $this->get('content'));
$GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl] = $this;
$oDocumentModel->setToAllDocumentExtraVars();
}
$GLOBALS['XE_DOCUMENT_LIST'][$this->document_srl] = $this;
}

View file

@ -520,6 +520,13 @@ class documentModel extends document
$oDocumentController->addDocumentPopupMenu($url,'cmd_print','','printDocument');
// Call a trigger (after)
ModuleHandler::triggerCall('document.getDocumentMenu', 'after', $menu_list);
if($this->grant->manager)
{
$str_confirm = Context::getLang('confirm_move');
$url = sprintf("if(!confirm('%s')) return; var params = new Array(); params['document_srl']='%s'; params['mid']=current_mid;params['cur_url']=current_url; exec_xml('document', 'procDocumentAdminMoveToTrash', params)", $str_confirm, $document_srl);
$oDocumentController->addDocumentPopupMenu($url,'cmd_trash','','javascript');
}
// If you are managing to find posts by ip
if($logged_info->is_admin == 'Y')
{
@ -528,10 +535,6 @@ class documentModel extends document
if($oDocument->isExists())
{
$str_confirm = Context::getLang('cmd_document_do') . Context::getLang('confirm_delete');
$url = sprintf("if(!confirm('%s')) return; var params = new Array(); params['document_srl']='%s'; params['mid']=current_mid;params['cur_url']=current_url; exec_xml('document', 'procDocumentAdminMoveToTrash', params)", $str_confirm, $document_srl);
$oDocumentController->addDocumentPopupMenu($url,'cmd_trash','','javascript');
// Find a post equivalent to ip address
$url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','ipaddress','search_keyword',$oDocument->getIpAddress());
$oDocumentController->addDocumentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress');

View file

@ -9,6 +9,7 @@
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" />
<condition operation="equal" column="extra_vars.var_idx" var="var_idx" notnull="notnull" pipe="and" />

View file

@ -9,6 +9,7 @@
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" />
<condition operation="in" column="documents.category_srl" var="category_srl" filter="number" pipe="and" />
<condition operation="equal" column="documents.member_srl" var="member_srl" filter="number" pipe="and" />
<condition operation="equal" column="extra_vars.module_srl" default="documents.module_srl" pipe="and" />
<condition operation="equal" column="extra_vars.document_srl" default="documents.document_srl" pipe="and" />
<condition operation="equal" column="extra_vars.var_idx" var="var_idx" notnull="notnull" pipe="and" />

View file

@ -48,7 +48,11 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
</thead>
<tbody>
<tr loop="$document_list => $no, $oDocument">
<td class="title"><a href="{getUrl('','document_srl',$oDocument->document_srl)}" target="_blank"><!--@if(trim($oDocument->getTitleText()))-->{htmlspecialchars($oDocument->getTitleText())}<!--@else--><em>{$lang->no_title_document}</em><!--@end--></a></td>
<td class="title">
<block cond="isset($module_list[$oDocument->get('module_srl')])">
<a href="{getUrl('', 'mid', $module_list[$oDocument->get('module_srl')]->mid)}" target="_blank">{$module_list[$oDocument->get('module_srl')]->browser_title}</a> -
</block>
<a href="{getUrl('','document_srl',$oDocument->document_srl)}" target="_blank"><!--@if(trim($oDocument->getTitleText()))-->{htmlspecialchars($oDocument->getTitleText())}<!--@else--><em>{$lang->no_title_document}</em><!--@end--></a></td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$oDocument->get('member_srl')}">{$oDocument->getNickName()}</a></td>
<td class="nowr">{$oDocument->get('readed_count')}</td>
<td class="nowr">{$oDocument->get('voted_count')}/{$oDocument->get('blamed_count')}</td>

File diff suppressed because one or more lines are too long

View file

@ -493,6 +493,8 @@ class editorModel extends editor
$oEditorController->deleteSavedDoc(false);
$oEditorController->doSaveDoc($saved_doc);
setUserSequence($saved_doc->document_srl);
return $saved_doc;
}

View file

@ -122,6 +122,7 @@ class fileAdminController extends file
$download_grant = Context::get('download_grant');
$file_config = new stdClass;
$file_config->allow_outlink = Context::get('allow_outlink');
$file_config->allow_outlink_format = Context::get('allow_outlink_format');
$file_config->allow_outlink_site = Context::get('allow_outlink_site');

View file

@ -92,7 +92,7 @@ class fileAdminModel extends file
if($_SESSION['file_management'][$file->file_srl]) $file->isCarted = true;
else $file->isCarted = false;
$file->download_url = $oFileModel->getDownloadUrl($file->file_srl, $file->sid);
$file->download_url = $oFileModel->getDownloadUrl($file->file_srl, $file->sid, $file->module_srl);
$output->data[$key] = $file;
}

View file

@ -160,6 +160,8 @@ class fileController extends file
{
$oFileModel = getModel('file');
if(isset($this->grant->access) && $this->grant->access !== true) return new Object(-1, 'msg_not_permitted');
$file_srl = Context::get('file_srl');
$sid = Context::get('sid');
$logged_info = Context::get('logged_info');
@ -518,6 +520,8 @@ class fileController extends file
$comment_srl = $obj->comment_srl;
if(!$comment_srl) return new Object();
if($obj->isMoveToTrash) return new Object();
$output = $this->deleteFiles($comment_srl);
return $output;
}

View file

@ -46,7 +46,7 @@ class fileModel extends file
$obj->source_filename = $file_info->source_filename;
$obj->file_size = $file_info->file_size;
$obj->disp_file_size = FileHandler::filesize($file_info->file_size);
if($file_info->direct_download=='N') $obj->download_url = $this->getDownloadUrl($file_info->file_srl, $file_info->sid);
if($file_info->direct_download=='N') $obj->download_url = $this->getDownloadUrl($file_info->file_srl, $file_info->sid, $file_info->module_srl);
else $obj->download_url = str_replace('./', '', $file_info->uploaded_filename);
$obj->direct_download = $file_info->direct_download;
$files[] = $obj;
@ -95,9 +95,9 @@ class fileModel extends file
* @param string $sid
* @return string Returns a url
*/
function getDownloadUrl($file_srl, $sid)
function getDownloadUrl($file_srl, $sid, $module_srl="")
{
return sprintf('?module=%s&amp;act=%s&amp;file_srl=%s&amp;sid=%s', 'file', 'procFileDownload', $file_srl, $sid);
return sprintf('?module=%s&amp;act=%s&amp;file_srl=%s&amp;sid=%s&amp;module_srl=%s', 'file', 'procFileDownload', $file_srl, $sid, $module_srl);
}
/**
@ -164,7 +164,7 @@ class fileModel extends file
if(count($output->data) == 1)
{
$file = $output->data[0];
$file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid);
$file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid, $file->module_srl);
return $file;
}
@ -177,7 +177,7 @@ class fileModel extends file
foreach($output->data as $key=>$value)
{
$file = $value;
$file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid);
$file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid, $file->module_srl);
$fileList[] = $file;
}
}
@ -211,7 +211,7 @@ class fileModel extends file
{
$file = $file_list[$i];
$file->source_filename = stripslashes($file->source_filename);
$file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid);
$file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid, $file->module_srl);
$file_list[$i] = $file;
}

View file

@ -1009,6 +1009,7 @@ class importerAdminController extends importer
$started = false;
$buff = null;
$file_obj = new stdClass;
while(!feof($fp))
{
$str = trim(fgets($fp, 1024));
@ -1017,7 +1018,6 @@ class importerAdminController extends importer
// If it starts with <attach>, collect attachments
if(trim($str) == '<attach>')
{
$file_obj = new stdClass;
$file_obj->file_srl = getNextSequence();
$file_obj->upload_target_srl = $upload_target_srl;
$file_obj->module_srl = $module_srl;

View file

@ -167,9 +167,14 @@ class installController extends install
if(!$oDB->isConnected()) return $oDB->getError();
// Install all the modules
$oDB->begin();
$this->installDownloadedModule();
$oDB->commit();
try {
$oDB->begin();
$this->installDownloadedModule();
$oDB->commit();
} catch(Exception $e) {
$oDB->rollback();
return new Object(-1, $e->getMessage());
}
// Create a config file
if(!$this->makeConfigFile()) return new Object(-1, 'msg_install_failed');
@ -515,6 +520,8 @@ class installController extends install
$file = trim($schema_files[$i]);
if(!$file || substr($file,-4)!='.xml') continue;
$output = $oDB->createTableByXmlFile($file);
if($output === false)
throw new Exception('msg_create_table_failed');
}
// Create a table and module instance and then execute install() method
unset($oModule);

View file

@ -405,7 +405,7 @@
<value xml:lang="vi"><![CDATA[Dùng chức năng <b>innodb</b> để sử dụng MySql Database.<br />Giao dịch được kích hoạt cho innodb]]></value>
</item>
<item name="cubrid">
<value xml:lang="ko"><![CDATA[CUBRID DB를 이용합니다. <a href="http://xe.xpressengine.net/18180659" target="_blank">Manual</a>]]></value>
<value xml:lang="ko"><![CDATA[CUBRID DB를 이용합니다. <a href="http://www.cubrid.com/zbxe/?mid=bbs_developer_tutorial&category=47452" target="_blank">Manual</a>]]></value>
<value xml:lang="en"><![CDATA[Use CUBRID as a database. See <a href="http://www.cubrid.org/wiki_tutorials/entry/cubrid-installation-instructions" target="_blank">Manual</a> for more info]]></value>
<value xml:lang="jp"><![CDATA[CUBRID DBを利用します。 <a href="http://www.cubrid.org/wiki_tutorials/entry/cubrid-installation-instructions" target="_blank">Manual</a>]]></value>
<value xml:lang="zh-CN"><![CDATA[使用CUBRID DB。 <a href="http://www.cubrid.org/wiki_tutorials/entry/cubrid-installation-instructions" target="_blank">Manual</a>]]></value>
@ -808,6 +808,10 @@
<value xml:lang="tr"><![CDATA[Kurulum dosyası oluşturulurken bir hata oluştu.]]></value>
<value xml:lang="vi"><![CDATA[Đã có lỗi xảy ra khi tạo File cài đặt.]]></value>
</item>
<item name="msg_create_table_failed">
<value xml:lang="ko"><![CDATA[DB 테이블 생성에 실패했습니다.]]></value>
<value xml:lang="en"><![CDATA[Failed to create database tables.]]></value>
</item>
<item name="ftp_get_list">
<value xml:lang="ko"><![CDATA[목록 가져오기]]></value>
<value xml:lang="en"><![CDATA[Get List]]></value>

View file

@ -1,13 +1,13 @@
<include target="header.html" />
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'moduels/integration_search/tpl/skin_info/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/integration_search/tpl/skin_info/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form action="{Context::getRequestUri()}" method="post" enctype="multipart/form-data">
<input type="hidden" name="module" value="integration_search" />
<input type="hidden" name="act" value="procIntegration_searchAdminInsertSkin" />
<input type="hidden" name="xe_validator_id" value="moduels/integration_search/tpl/skin_info/1" />
<input type="hidden" name="xe_validator_id" value="modules/integration_search/tpl/skin_info/1" />
<section class="section">
<h1>{$lang->skin_default_info}</h1>

View file

@ -262,15 +262,8 @@ class layoutAdminController extends layout
$oLayoutModel = getModel('layout');
$cache_file = $oLayoutModel->getUserLayoutCache($args->layout_srl, Context::getLangType());
FileHandler::removeFile($cache_file);
//remove from cache
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$object_key = 'layout:' . $args->layout_srl;
$cache_key = $oCacheHandler->getGroupKey('site_and_module', $object_key);
$oCacheHandler->delete($cache_key);
}
}
return $output;
}
@ -336,14 +329,7 @@ class layoutAdminController extends layout
$args = new stdClass();
$args->layout_srl = $layout_srl;
$output = executeQuery("layout.deleteLayout", $args);
//remove from cache
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$object_key = 'layout:'.$layout_srl;
$cache_key = $oCacheHandler->getGroupKey('site_and_module', $object_key);
$oCacheHandler->delete($cache_key);
}
if(!$output->toBool()) return $output;
return new Object(0,'success_deleted');

View file

@ -86,8 +86,6 @@ class layout extends ModuleObject
$oDB->addColumn('layouts','layout_type','char',1,'P',true);
}
$oCacheHandler = CacheHandler::getInstance('object', null, true);
$args->layout = '.';
$output = executeQueryArray('layout.getLayoutDotList', $args);
if($output->data && count($output->data) > 0)
@ -101,13 +99,6 @@ class layout extends ModuleObject
$args->layout = implode('|@|', $layout_path);
$args->layout_srl = $layout->layout_srl;
$output = executeQuery('layout.updateLayout', $args);
if($oCacheHandler->isSupport())
{
$object_key = 'layout:' . $args->layout_srl;
$cache_key = $oCacheHandler->getGroupKey('site_and_module', $object_key);
$oCacheHandler->delete($cache_key);
}
}
}
}

View file

@ -258,31 +258,15 @@ class layoutModel extends layout
*/
function getLayout($layout_srl)
{
$layout_info = false;
// Get information from the DB
$args = new stdClass();
$args->layout_srl = $layout_srl;
$output = executeQuery('layout.getLayout', $args);
if(!$output->data) return;
// cache controll
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$object_key = 'layout:' . $layout_srl;
$cache_key = $oCacheHandler->getGroupKey('site_and_module', $object_key);
$layout_info = $oCacheHandler->get($cache_key);
}
// Return xml file informaton after listing up the layout and extra_vars
$layout_info = $this->getLayoutInfo($layout, $output->data, $output->data->layout_type);
if($layout_info === false)
{
// Get information from the DB
$args = new stdClass();
$args->layout_srl = $layout_srl;
$output = executeQuery('layout.getLayout', $args);
if(!$output->data) return;
// Return xml file informaton after listing up the layout and extra_vars
$layout_info = $this->getLayoutInfo($layout, $output->data, $output->data->layout_type);
//insert in cache
if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $layout_info);
}
return $layout_info;
}

View file

@ -61,7 +61,6 @@
</block>
</block>
</ul>
</div>
{@$group = ''}
{@$cnt = 1}
@ -137,7 +136,7 @@
</div>
</div>
</block>
<block cond="$group"></div></div></block>
<block cond="$group"></div></block>
</section>
<section class="section">
<h1 cond="$selected_layout->menu">{$lang->menu}</h1>

View file

@ -509,6 +509,12 @@
<value xml:lang="tr"><![CDATA[Geçici Zaman Sınırı]]></value>
<value xml:lang="vi"><![CDATA[Hạn sử dụng]]></value>
</item>
<item name="limit_day_description">
<value xml:lang="ko"><![CDATA[임시 제한 일자 설명]]></value>
<value xml:lang="en"><![CDATA[Description for Temporary Limit Date]]></value>
<value xml:lang="jp"><![CDATA[一時的な期限日の説明]]></value>
</item>
<item name="limit_date">
<value xml:lang="ko"><![CDATA[제한일]]></value>
<value xml:lang="en"><![CDATA[Limit Date]]></value>
@ -2335,6 +2341,10 @@
<value xml:lang="zh-CN"><![CDATA[可设定密码更新周期,将会定期通知更换密码。 (设为零则不适用)]]></value>
<value xml:lang="tr"><![CDATA[Eğer buna bir değer biçerseniz, şifrenizi belirli aralıklarla değiştirmeniz konusunda bildirim alacaksanız (eğer 0 olarak ayarlandıysa, devredışıdır)]]></value>
</item>
<item name="msg_change_password_date">
<value xml:lang="ko"><![CDATA[%s일 동안 비밀번호를 변경하지 않았습니다. 개인정보 보호를 위하여 비밀번호를 변경해야 합니다.]]></value>
<value xml:lang="en"><![CDATA[You have not changed the password during %s days. For personal information protection, you need to change the password.]]></value>
</item>
<item name="login_trial_limit1">
<value xml:lang="ko"><![CDATA[로그인 시도 횟수 제한 횟수]]></value>
<value xml:lang="en"><![CDATA[Sign in trial limit]]></value>

View file

@ -51,7 +51,7 @@
<li>
<label for="question">{$lang->find_account_question}</label>
<select id="question" name="find_account_question" style="width:290px;display:block;">
<!--@for($i=1,$c=count($lang->find_account_question_items);$i<$c;$i++)-->
<!--@for($i=1,$c=count($lang->find_account_question_items);$i<=$c;$i++)-->
<option value="{$i}">{$lang->find_account_question_items[$i]}</option>
<!--@end-->
</select>

View file

@ -184,6 +184,7 @@ class memberAdminController extends member
$args = Context::gets(
'limit_day',
'limit_day_description',
'agreement',
'redirect_url',
'profile_image', 'profile_image_max_width', 'profile_image_max_height',

View file

@ -67,8 +67,8 @@ class memberController extends member
$oMemberModel = getModel('member');
if($this->memberInfo->change_password_date < date ('YmdHis', strtotime ('-' . $limit_date . ' day')))
{
$this->setRedirectUrl(getNotEncodedUrl('','vid',Context::get('vid'),'mid',Context::get('mid'),'act','dispMemberModifyPassword'));
return;
$msg = sprintf(Context::getLang('msg_change_password_date'), $limit_date);
return $this->setRedirectUrl(getNotEncodedUrl('','vid',Context::get('vid'),'mid',Context::get('mid'),'act','dispMemberModifyPassword'), new Object(-1, $msg));
}
}
@ -230,7 +230,8 @@ class memberController extends member
}
// Check if duplicated
$member_srl = $oMemberModel->getMemberSrlByNickName($value);
if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name');
$member_srl_by_decode = $oMemberModel->getMemberSrlByNickName(utf8_decode($value));
if(($member_srl && $logged_info->member_srl != $member_srl ) || ($member_srl_by_decode && $logged_info->member_srl != $member_srl_by_decode )) return new Object(0,'msg_exists_nick_name');
break;
case 'email_address' :
@ -369,11 +370,16 @@ class memberController extends member
{
if($config->identifier == 'email_address')
{
$this->doLogin($args->email_address);
$output = $this->doLogin($args->email_address);
}
else
{
$this->doLogin($args->user_id);
$output = $this->doLogin($args->user_id);
}
if(!$output->toBool()) {
if($output->error == -9)
$output->error = -11;
return $this->setRedirectUrl(getUrl('', 'act', 'dispMemberLoginForm'), $output);
}
}
@ -384,6 +390,7 @@ class memberController extends member
{
$msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
$this->setMessage($msg);
return $this->setRedirectUrl(getUrl('', 'act', 'dispMemberLoginForm'), new Object(-12, $msg));
}
else $this->setMessage('success_registed');
// Call a trigger (after)
@ -407,7 +414,7 @@ class memberController extends member
}
}
$this->_clearMemberCache($args->member_srl);
$this->_clearMemberCache($args->member_srl, $site_module_info->site_srl);
$this->setRedirectUrl($returnUrl);
}
@ -556,7 +563,6 @@ class memberController extends member
// Get user_id information
$this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl);
$this->_clearMemberCache($args->member_srl);
// Call a trigger after successfully log-in (after)
$trigger_output = ModuleHandler::triggerCall('member.procMemberModifyInfo', 'after', $this->memberInfo);
@ -567,7 +573,8 @@ class memberController extends member
$this->add('member_srl', $args->member_srl);
$this->setMessage('success_updated');
$this->_clearMemberCache($args->member_srl);
$site_module_info = Context::get('site_module_info');
$this->_clearMemberCache($args->member_srl, $site_module_info->site_srl);
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', 'dispMemberInfo');
$this->setRedirectUrl($returnUrl);
@ -645,8 +652,6 @@ class memberController extends member
// Return success message
$this->setMessage('success_leaved');
$this->_clearMemberCache($member_srl);
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', '');
$this->setRedirectUrl($returnUrl);
}
@ -1099,7 +1104,8 @@ class memberController extends member
if(!$output->toBool()) return $this->stop($output->getMessage());
// Remove all values having the member_srl from authentication table
executeQuery('member.deleteAuthMail',$args);
$site_module_info = Context::get('site_module_info');
$this->_clearMemberCache($args->member_srl);
// Notify the result
@ -1300,7 +1306,6 @@ class memberController extends member
list($args->email_id, $args->email_host) = explode('@', $newEmail);
$output = executeQuery('member.updateMemberEmailAddress', $args);
$this->_clearMemberCache($args->member_srl);
if(!$output->toBool())
{
return $this->stop($output->getMessage());
@ -1419,7 +1424,7 @@ class memberController extends member
$output = executeQuery('member.deleteMembersGroup', $args);
if(!$output->toBool()) return $output;
$this->setMessage('success_deleted');
$this->_clearMemberCache($args->member_srl);
$this->_clearMemberCache($args->member_srl, $site_module_info->site_srl);
}
/**
@ -1514,7 +1519,7 @@ class memberController extends member
$output = executeQuery('member.addMemberToGroup',$args);
$output2 = ModuleHandler::triggerCall('member.addMemberToGroup', 'after', $args);
$this->_clearMemberCache($member_srl);
$this->_clearMemberCache($member_srl, $site_srl);
return $output;
}
@ -1554,7 +1559,7 @@ class memberController extends member
$output = executeQuery('member.addMemberToGroup', $obj);
if(!$output->toBool()) return $output;
$this->_clearMemberCache($obj->member_srl);
$this->_clearMemberCache($obj->member_srl, $args->site_srl);
}
return new Object();
@ -1728,12 +1733,13 @@ class memberController extends member
return new Object(-1,'msg_user_denied');
}
// Notify if denied_date is less than the current time
if($this->memberInfo->limit_date && substr($this->memberInfo->limit_date,0,8) >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($this->memberInfo->limit_date,"Y-m-d")));
if($this->memberInfo->limit_date && substr($this->memberInfo->limit_date,0,8) >= date("Ymd")) return new Object(-9,sprintf(Context::getLang('msg_user_limited'),zdate($this->memberInfo->limit_date,"Y-m-d")));
// Update the latest login time
$args->member_srl = $this->memberInfo->member_srl;
$output = executeQuery('member.updateLastLogin', $args);
$this->_clearMemberCache($args->member_srl);
$site_module_info = Context::get('site_module_info');
$this->_clearMemberCache($args->member_srl, $site_module_info->site_srl);
// Check if there is recoding table.
$oDB = &DB::getInstance();
@ -1957,7 +1963,8 @@ class memberController extends member
return new Object(-1,'denied_nick_name');
}
$member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name);
if($member_srl) return new Object(-1,'msg_exists_nick_name');
$member_srl_by_decode = $oMemberModel->getMemberSrlByNickName(utf8_decode($args->nick_name));
if($member_srl || $member_srl_by_decode) return new Object(-1,'msg_exists_nick_name');
$member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address);
if($member_srl) return new Object(-1,'msg_exists_email_address');
@ -2113,6 +2120,10 @@ class memberController extends member
{
return new Object(-1, 'denied_nick_name');
}
$member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name);
$member_srl_by_decode = $oMemberModel->getMemberSrlByNickName(utf8_decode($args->nick_name));
if(($member_srl || $member_srl_by_decode) && $orgMemberInfo->nick_name != $args->nick_name) return new Object(-1,'msg_exists_nick_name');
list($args->email_id, $args->email_host) = explode('@', $args->email_address);
// Website, blog, checks the address
@ -2193,7 +2204,7 @@ class memberController extends member
$oDB->commit();
//remove from cache
$this->_clearMemberCache($args->member_srl);
$this->_clearMemberCache($args->member_srl, $args->site_srl);
// Save Session
if(!$this->memberInfo) $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl);
@ -2687,6 +2698,13 @@ class memberController extends member
$object_key = 'member_groups:' . getNumberingPath($member_srl) . $member_srl . '_' . $site_srl;
$cache_key = $oCacheHandler->getGroupKey('member', $object_key);
$oCacheHandler->delete($cache_key);
if($site_srl !== 0)
{
$object_key = 'member_groups:' . getNumberingPath($member_srl) . $member_srl . '_0';
$cache_key = $oCacheHandler->getGroupKey('member', $object_key);
$oCacheHandler->delete($cache_key);
}
}
$oCacheHandler = CacheHandler::getInstance('object');

View file

@ -415,8 +415,17 @@ class memberView extends member
$config = $this->member_config;
Context::set('identifier', $config->identifier);
$XE_VALIDATOR_MESSAGE = Context::get('XE_VALIDATOR_MESSAGE');
$XE_VALIDATOR_ERROR = Context::get('XE_VALIDATOR_ERROR');
if($XE_VALIDATOR_ERROR == -11)
Context::set('XE_VALIDATOR_MESSAGE', $XE_VALIDATOR_MESSAGE . $config->limit_day_description);
if($XE_VALIDATOR_ERROR < -10 && $XE_VALIDATOR_ERROR > -21)
Context::set('referer_url', '/');
else
Context::set('referer_url', htmlspecialchars($_SERVER['HTTP_REFERER'], ENT_COMPAT | ENT_HTML401, 'UTF-8', false));
// Set a template file
Context::set('referer_url', htmlspecialchars($_SERVER['HTTP_REFERER'], ENT_COMPAT | ENT_HTML401, 'UTF-8', false));
$this->setTemplateFile('login_form');
}

View file

@ -6,7 +6,7 @@
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skin/default/find_member_account/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form action="/" method="get" ruleset="findAccount">
<form action="{getUrl('')}" method="get" ruleset="findAccount">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="act" value="procMemberFindAccount" />
<input type="hidden" name="document_srl" value="{$document_srl}" />

View file

@ -5,13 +5,13 @@
<h1><i class="icon-user"></i> {$lang->cmd_login}</h1>
</div>
<div class="login-body">
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skin/default/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="@login" action="./" method="post" id="fo_member_login">
<form ruleset="@login" action="{getUrl('')}" method="post" id="fo_member_login">
<input type="hidden" name="success_return_url" value="{$referer_url}" />
<input type="hidden" name="act" value="procMemberLogin" />
<input type="hidden" name="xe_validator_id" value="modules/member/skin/default/1" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins" />
<fieldset>
<div class="control-group">
<input type="text" cond="$identifier == 'user_id'" name="user_id" id="uid" required placeholder="{$lang->user_id}" title="{$lang->user_id}" />

View file

@ -1,6 +1,6 @@
<include target="./common_header.html" />
<h1>{$member_title = $lang->cmd_modify_member_password}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/default/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<div cond="$XE_VALIDATOR_MESSAGE" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="modifyPassword" id="fo_insert_member" action="./" method="post">

View file

@ -4,12 +4,12 @@
<!--%load_js_plugin("ui.datepicker")-->
<include target="./common_header.html" />
<h1 style="border-bottom:1px solid #ccc">{$lang->cmd_signup}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins/default/1'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/member/skins'" class="message {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="@insertMember" id="fo_insert_member" action="./" method="post" enctype="multipart/form-data" class="form-horizontal">
<input type="hidden" name="act" value="procMemberInsert" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins/default/1" />
<input type="hidden" name="xe_validator_id" value="modules/member/skins" />
<input type="hidden" name="success_return_url" value="{getUrl('act','dispMemberInfo')}" />
<div class="agreement" cond="$member_config->agreement">
<div class="text">

View file

@ -20,6 +20,7 @@
<div class="x_controls">
<input type="number" min="0" id="limit_day" name="limit_day" value="{$config->limit_day}" /> {$lang->unit_day}
<p class="x_help-block">{$lang->about_limit_day}</p>
<input type="text" name="limit_day_description" value="{$config->limit_day_description}" placeholder="{$lang->limit_day_description}" style="width:90%" class="lang_code" />
</div>
</div>
<div class="x_control-group">

View file

@ -1877,11 +1877,9 @@ class menuAdminController extends menu
$url = str_replace(array('&','"','<','>'),array('&amp;','&quot;','&lt;','&gt;'),$node->url);
if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url))
{
$href = getSiteUrl($domain, '','mid',$node->url);
$pos = strpos($href, $_SERVER['HTTP_HOST']);
if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST']));
$href = "getSiteUrl('$domain', '','mid','$node->url')";
}
else $href = $url;
else $href = sprintf('"%s"', $url);
$is_shortcut = $node->is_shortcut;
$open_window = $node->open_window;
$expand = $node->expand;
@ -1912,7 +1910,7 @@ class menuAdminController extends menu
if($group_srls)$group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s))))||($is_logged&&%s))',$group_srls,$group_srls == -1?1:0);
else $group_check_code = "true";
$attribute = sprintf(
'node_srl="%s" parent_srl="%s" menu_name_key=\'%s\' text="<?php if(%s) { %s }?>" url="<?php print(%s?"%s":"")?>" href="<?php print(%s?"%s":"")?>" is_shortcut="%s" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="<?php if(%s) {?>%s<?php }?>"',
'node_srl="%s" parent_srl="%s" menu_name_key=\'%s\' text="<?php if(%s) { %s }?>" url="<?php print(%s?"%s":"")?>" href="<?php print(%s?%s:"")?>" is_shortcut="%s" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="<?php if(%s) {?>%s<?php }?>"',
$menu_item_srl,
$node->parent_srl,
addslashes($node->name),
@ -1980,11 +1978,9 @@ class menuAdminController extends menu
$url = str_replace(array('&','"','<','>'),array('&amp;','&quot;','&lt;','&gt;'),$node->url);
if(preg_match('/^([0-9a-zA-Z\_\-]+)$/i', $node->url))
{
$href = getSiteUrl($domain, '','mid',$node->url);
$pos = strpos($href, $_SERVER['HTTP_HOST']);
if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST']));
$href = "getSiteUrl('$domain', '','mid','$node->url')";
}
else $href = $url;
else $href = sprintf('"%s"', $url);
$is_shortcut = $node->is_shortcut;
$open_window = $node->open_window;
$normal_btn = str_replace(array('&','"','<','>'),array('&amp;','&quot;','&lt;','&gt;'),$node->normal_btn);
@ -2029,7 +2025,7 @@ class menuAdminController extends menu
}
// Create properties (check if it belongs to the menu node by url_list. It looks a trick but fast and powerful)
$attribute = sprintf(
'"node_srl"=>"%s","parent_srl"=>"%s","menu_name_key"=>\'%s\',"isShow"=>(%s?true:false),"text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"is_shortcut"=>"%s","open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s), "link"=>(%s? ( array(%s)&&in_array(Context::get("mid"),array(%s)) ?%s:%s):""),',
'"node_srl"=>"%s","parent_srl"=>"%s","menu_name_key"=>\'%s\',"isShow"=>(%s?true:false),"text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?%s:""),"url"=>(%s?"%s":""),"is_shortcut"=>"%s","open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s), "link"=>(%s? ( array(%s)&&in_array(Context::get("mid"),array(%s)) ?%s:%s):""),',
$node->menu_item_srl,
$node->parent_srl,
addslashes($node->name),

View file

@ -349,6 +349,7 @@ class menuAdminModel extends menu
foreach($_allModules as $module_name)
{
$module = $oModuleModel->getModuleInfoXml($module_name);
if(!isset($module)) continue;
$defaultSkin = $oModuleModel->getModuleDefaultSkin($module_name, 'P');
$defaultMobileSkin = $oModuleModel->getModuleDefaultSkin($module_name, 'M');
$skinInfo = $oModuleModel->loadSkinInfo(ModuleHandler::getModulePath($module_name), $defaultSkin);

View file

@ -402,6 +402,9 @@ class moduleModel extends module
}
else $module_info = $mid_info;
$oModuleController = getController('module');
if(isset($module_info->browser_title)) $oModuleController->replaceDefinedLangCode($module_info->browser_title);
return $this->addModuleExtraVars($module_info);
}
@ -782,6 +785,7 @@ class moduleModel extends module
if(!$module_info->category) $module_info->category = 'service';
sscanf($xml_obj->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d);
$module_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d);
$author_obj = new stdClass();
$author_obj->name = $xml_obj->author->name->body;
$author_obj->email_address = $xml_obj->author->attrs->email_address;
$author_obj->homepage = $xml_obj->author->attrs->link;
@ -1498,6 +1502,7 @@ class moduleModel extends module
$info = $this->getModuleInfoXml($module_name);
unset($obj);
if(!isset($info)) continue;
$info->module = $module_name;
$info->created_table_count = $created_table_count;
$info->table_count = $table_count;

View file

@ -6,117 +6,117 @@
/* 모듈 생성 후 */
function completeInsertPage(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
alert(message);
alert(message);
var url = '';
if(location.href.getQuery('module')=='admin') {
url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo');
if(page) url = url.setQuery('page',page);
} else {
url = current_url;
}
var url = '';
if(location.href.getQuery('module')=='admin') {
url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo');
if(page) url = url.setQuery('page',page);
} else {
url = current_url;
}
location.href = url;
location.href = url;
}
function completeArticleDocumentInserted(ret_obj){
var error = ret_obj['error'];
var message = ret_obj['message'];
var error = ret_obj['error'];
var message = ret_obj['message'];
var mid = ret_obj['mid'];
var mid = ret_obj['mid'];
var is_mobile = ret_obj['is_mobile'];
alert(message);
alert(message);
var url = '';
var url = '';
if(is_mobile == 'Y')
url = current_url.setQuery('act', 'dispPageAdminMobileContent').setQuery('mid', mid);
url = current_url.setQuery('act', 'dispPageAdminMobileContent').setQuery('mid', mid);
else
url = current_url.setQuery('act', 'dispPageIndex').setQuery('mid', mid);
url = current_url.setQuery('act', 'dispPageIndex').setQuery('mid', mid);
location.href = url;
location.href = url;
}
/* 내용 저장 후 */
function completeInsertPageContent(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
var mid = ret_obj['mid'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
var mid = ret_obj['mid'];
location.href = current_url.setQuery('mid',mid).setQuery('act','');
location.href = current_url.setQuery('mid',mid).setQuery('act','');
}
function completeInsertMobilePageContent(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
var mid = ret_obj['mid'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
var mid = ret_obj['mid'];
location.href = current_url.setQuery('mid',mid).setQuery('act','dispPageAdminMobileContent');
location.href = current_url.setQuery('mid',mid).setQuery('act','dispPageAdminMobileContent');
}
/* 수정한 페이지 컨텐츠를 저장 */
function doSubmitPageContent(fo_obj) {
var html = getWidgetContent();
fo_obj.content.value = html;
return procFilter(fo_obj, insert_page_content);
var html = getWidgetContent();
fo_obj.content.value = html;
return procFilter(fo_obj, insert_page_content);
}
function doSubmitMPageContent(fo_obj) {
var html = getWidgetContent();
fo_obj.content.value = html;
return procFilter(fo_obj, insert_mpage_content);
var html = getWidgetContent();
fo_obj.content.value = html;
return procFilter(fo_obj, insert_mpage_content);
}
/* 모듈 삭제 후 */
function completeDeletePage(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
alert(message);
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
alert(message);
var url = current_url.setQuery('act','dispPageAdminContent').setQuery('module_srl','');
if(page) url = url.setQuery('page',page);
var url = current_url.setQuery('act','dispPageAdminContent').setQuery('module_srl','');
if(page) url = url.setQuery('page',page);
location.href = url;
location.href = url;
}
/* 위젯 재컴파일 */
function doRemoveWidgetCache(module_srl) {
var params = new Array();
params["module_srl"] = module_srl;
exec_xml('page', 'procPageAdminRemoveWidgetCache', params, completeRemoveWidgetCache);
var params = new Array();
params["module_srl"] = module_srl;
exec_xml('page', 'procPageAdminRemoveWidgetCache', params, completeRemoveWidgetCache);
}
function completeRemoveWidgetCache(ret_obj) {
var message = ret_obj['message'];
location.reload();
var message = ret_obj['message'];
location.reload();
}
/* 일괄 설정 */
function doCartSetup(url) {
var module_srl = new Array();
jQuery('#fo_list input[name=cart]:checked').each(function() {
module_srl[module_srl.length] = jQuery(this).val();
});
var module_srl = new Array();
jQuery('#fo_list input[name=cart]:checked').each(function() {
module_srl[module_srl.length] = jQuery(this).val();
});
if(module_srl.length<1) return;
if(module_srl.length<1) return;
url += "&module_srls="+module_srl.join(',');
popopen(url,'modulesSetup');
url += "&module_srls="+module_srl.join(',');
popopen(url,'modulesSetup');
}
jQuery(function($){

View file

@ -152,6 +152,7 @@ class pointController extends point
// If there are comment points, attempt to deduct
if($comment_point>0) return new Object();
// Get all the comments related to this post
$cp_args = new stdClass();
$cp_args->document_srl = $document_srl;
$output = executeQueryArray('point.getCommentUsers', $cp_args);
// Return if there is no object

View file

@ -121,6 +121,7 @@
<option value="Y" selected="selected"|cond="$is_admin=='Y'">{$lang->is_admin}</option>
</select>
<select name="selected_group_srl" style="width:auto;margin:0" title="{$lang->member_group}">
<option value="0">{$lang->member_group}</option>
<option loop="$group_list => $key,$val" value="{$val->group_srl}" selected="selected"|cond="$selected_group_srl==$val->group_srl">{$val->title}</option>
</select>
<select name="search_target" style="width:auto;margin:0" title="{$lang->search_target}">

View file

@ -111,7 +111,7 @@ class pollModel extends poll
$poll->poll_count = (int)$output->data->poll_count;
$poll->stop_date = $output->data->stop_date;
$columnList = array('poll_index_srl', 'checkcount', 'poll_count');
$columnList = array('poll_index_srl', 'title', 'checkcount', 'poll_count');
$output = executeQuery('poll.getPollTitle', $args, $columnList);
if(!$output->data) return;
if(!is_array($output->data)) $output->data = array($output->data);

View file

@ -11,6 +11,8 @@
<action name="procTrashAdminEmptyTrash" type="controller" ruleset="emptyTrash" />
<action name="procTrashAdminRestore" type="controller" />
<action name="procTrashAdminGetList" type="controller" />
<action name="dispTrashAdminView" type="view" />
</actions>
<menus>
<menu name="trash">

View file

@ -83,4 +83,36 @@
<value xml:lang="en"><![CDATA[Remove all trash items. After execute could not be recovered.]]></value>
<value xml:lang="jp"><![CDATA[ゴミ箱を完全に消去します。実行後には復元できません。]]></value>
</item>
<item name="title">
<value xml:lang="ko"><![CDATA[제목]]></value>
<value xml:lang="en"><![CDATA[Subject]]></value>
<value xml:lang="jp"><![CDATA[タイトル]]></value>
<value xml:lang="zh-TW"><![CDATA[標題]]></value>
</item>
<item name="content">
<value xml:lang="ko"><![CDATA[내용]]></value>
<value xml:lang="en"><![CDATA[Content]]></value>
<value xml:lang="jp"><![CDATA[内容]]></value>
<value xml:lang="zh-TW"><![CDATA[內容]]></value>
</item>
<item name="trasher">
<value xml:lang="ko"><![CDATA[삭제자]]></value>
<value xml:lang="en"><![CDATA[Deleter]]></value>
<value xml:lang="jp"><![CDATA[削除者]]></value>
<value xml:lang="zh-TW"><![CDATA[刪除]]></value>
</item>
<item name="origin_info">
<value xml:lang="ko"><![CDATA[원문 정보]]></value>
<value xml:lang="en"><![CDATA[Document Info]]></value>
</item>
<item name="delete_info">
<value xml:lang="ko"><![CDATA[삭제 정보]]></value>
<value xml:lang="en"><![CDATA[Trash Info]]></value>
</item>
<item name="cmd_restore">
<value xml:lang="ko"><![CDATA[복원]]></value>
<value xml:lang="en"><![CDATA[Restore]]></value>
<value xml:lang="jp"><![CDATA[復元]]></value>
<value xml:lang="zh-TW"><![CDATA[復原]]></value>
</item>
</lang>

View file

@ -6,6 +6,7 @@ class TrashVO
var $title;
var $originModule;
var $serializedObject;
var $unserializedObject;
var $description;
var $ipaddress;
var $removerSrl;
@ -47,6 +48,14 @@ class TrashVO
{
$this->serializedObject = $serializedObject;
}
function getUnserializedObject()
{
return $this->unserializedObject;
}
function setUnserializedObject($serializedObject)
{
$this->unserializedObject = unserialize($serializedObject);
}
function getDescription()
{
return htmlspecialchars($this->description, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

View file

@ -0,0 +1,32 @@
<query id="getDocumentExtraVars" action="select">
<tables>
<table name="document_extra_keys" alias="extra_keys" />
<table name="document_extra_vars" alias="extra_vars" type="left join">
<conditions>
<condition operation="equal" column="extra_keys.module_srl" default="extra_vars.module_srl" />
<condition operation="equal" column="extra_keys.eid" default="extra_vars.eid" pipe="and" />
</conditions>
</table>
</tables>
<columns>
<column name="extra_keys.module_srl" alias="module_srl" />
<column name="extra_keys.var_name" alias="name" />
<column name="extra_keys.var_type" alias="type" />
<column name="extra_keys.var_is_required" alias="is_required" />
<column name="extra_keys.var_search" alias="search" />
<column name="extra_keys.var_default" alias="default" />
<column name="extra_keys.var_desc" alias="desc" />
<column name="extra_keys.var_idx" alias="idx" />
<column name="extra_vars.document_srl" alias="document_srl" />
<column name="extra_vars.lang_code" alias="lang_code" />
<column name="extra_vars.value" alias="value" />
<column name="extra_keys.eid" alias="eid" />
</columns>
<conditions>
<condition operation="equal" column="extra_keys.module_srl" var="module_srl" />
<condition operation="in" column="extra_vars.document_srl" var="document_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="extra_keys.var_idx" order="asc" />
</navigation>
</query>

View file

@ -41,7 +41,12 @@ var no_text_comment = '{$lang->no_text_comment}';
<tr loop="$trash_list => $no, $oTrashVO">
<td class="title">
<strong cond="!trim($oTrashVO->getTitle()) && $oTrashVO->getOriginModule() == 'comment'">{$lang->no_text_comment}</strong>
<block cond="trim($oTrashVO->getTitle())">{$oTrashVO->getTitle()}</block>
<block cond="trim($oTrashVO->getTitle())">
<block cond="isset($module_list[$oTrashVO->unserializedObject['module_srl']])">
<a href="{getUrl('', 'mid', $module_list[$oTrashVO->unserializedObject['module_srl']]->mid)}" target="_blank">{$module_list[$oTrashVO->unserializedObject['module_srl']]->browser_title}</a> -
</block>
<a href="{getUrl('act','dispTrashAdminView','trash_srl',$oTrashVO->getTrashSrl())}">{$oTrashVO->getTitle()}</a>
</block>
</td>
<td class="nowr"><!--@if($oTrashVO->getOriginModule() == 'document')-->{$lang->document}<!--@else-->{$lang->comment}<!--@end--></td>
<td class="nowr"><a href="#popup_menu_area" class="member_{$oTrashVO->getRemoverSrl()}">{$oTrashVO->getNickName()}</a></td>

View file

@ -0,0 +1,73 @@
<div class="x_page-header">
<h1>{$lang->cmd_trash} {$lang->trash_description}</h1>
</div>
<h2>{$lang->delete_info}</h2>
<table class="x_table x_table-striped x_table-hover">
<col width="120">
<tr>
<th scope="col" class="nowr">{$lang->trasher}</th>
<td>
{htmlspecialchars($remover_info->nick_name)} <a href="#popup_menu_area" class="member_{$oTrashVO->getRemoverSrl()}" onclick="return false">[{$remover_info->user_id}]</a>
</td>
</tr>
<tr>
<th scope="col" class="nowr">{$lang->trash_date}</th>
<td>{zdate($oTrashVO->getRegdate(), "Y-m-d H:i:s")}</td>
</tr>
<tr>
<th scope="row">{$lang->trash_description}</th>
<td class="text">{$oTrashVO->getDescription()}</td>
</tr>
</table>
<br>
<h2>{$lang->origin_info}</h2>
<table class="x_table x_table-striped x_table-hover">
<col width="120">
<tr>
<th scope="row">{$lang->module}</th>
<td class="text">
{$module_info->browser_title} ({$module_info->mid})
</td>
</tr>
<tr>
<th scope="row">{$lang->title}</th>
<td class="text">{$oOrigin->title}</td>
</tr>
<tr>
<th scope="row">{$lang->writer}</th>
<td class="text">{htmlspecialchars($oOrigin->nick_name)} <a href="#popup_menu_area" class="member_{$oOrigin->member_srl}" onclick="return false">[{$oOrigin->user_id}]</a></td>
</tr>
<tr>
<th scope="row">{$lang->regdate}</th>
<td class="text">{zdate($oOrigin->regdate,'Y.m.d H:i:s')}</td>
</tr>
<block loop="$oOriginExtraVars=>$key,$val">
<tr><th>{$val->name}</th>
<td>{$val->value}</td>
</tr>
</block>
<tr>
<th scope="row">{$lang->content}</th>
<td class="text">{$oOrigin->content}</td>
</tr>
</table>
<form action="./" method="post">
<input type="hidden" name="module" value="trash" />
<input type="hidden" name="act" value="procTrashAdminEmptyTrash" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="is_all" value="false" />
<input type="hidden" name="origin_module" value="{$oTrashVO->getOriginModule()}" />
<input type="hidden" name="cart[]" value="{$oTrashVO->getTrashSrl()}" />
<div class="x_pull-left"><button class="x_btn" type="button" onclick="history.go(-1)">{$lang->cmd_list}</button></div>
<div class="x_pull-right">
<button type="submit" name="is_all" class="x_btn" value="false">{$lang->cmd_delete}</button>
<button type="submit" name="act" class="x_btn x_btn-primary" value="procTrashAdminRestore">{$lang->cmd_restore}</button>
</div>
</form>

View file

@ -48,9 +48,69 @@ class trashAdminView extends trash
Context::set('page', $output->page);
Context::set('page_navigation', $output->page_navigation);
$oModuleModel = getModel('module');
$module_list = array();
$mod_srls = array();
foreach($output->data as $oTrashVO)
{
$mod_srls[] = $oTrashVO->unserializedObject['module_srl'];
}
$mod_srls = array_unique($mod_srls);
// Module List
$mod_srls_count = count($mod_srls);
if($mod_srls_count)
{
$columnList = array('module_srl', 'mid', 'browser_title');
$module_output = $oModuleModel->getModulesInfo($mod_srls, $columnList);
if($module_output && is_array($module_output))
{
foreach($module_output as $module)
{
$module_list[$module->module_srl] = $module;
}
}
}
Context::set('module_list', $module_list);
// 템플릿 파일 지정
$this->setTemplateFile('trash_list');
}
// Trash View - sejin7940
function dispTrashAdminView()
{
$trash_srl = Context::get('trash_srl');
$oTrashModel = getModel('trash');
$output = $oTrashModel->getTrash($trash_srl);
if(!$output->data->getTrashSrl()) return new Object(-1, 'msg_invalid_request');
$originObject = unserialize($output->data->getSerializedObject());
if(is_array($originObject)) $originObject = (object)$originObject;
Context::set('oTrashVO',$output->data);
Context::set('oOrigin',$originObject);
$oMemberModel = &getModel('member');
$remover_info = $oMemberModel->getMemberInfoByMemberSrl($output->data->getRemoverSrl());
Context::set('remover_info', $remover_info);
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($originObject->module_srl);
Context::set('module_info', $module_info);
if($originObject) {
$args_extra->module_srl = $originObject->module_srl;
$args_extra->document_srl = $originObject->document_srl;
$output_extra = executeQueryArray('trash.getDocumentExtraVars', $args_extra);
Context::set('oOriginExtraVars',$output_extra->data);
}
$this->setTemplateFile('trash_view');
}
}
/* End of file trash.admin.view.php */
/* Location: ./modules/trash/trash.admin.view.php */

View file

@ -87,6 +87,7 @@ class trashModel extends trash
$oTrashVO->setTitle($stdObject->title);
$oTrashVO->setOriginModule($stdObject->origin_module);
$oTrashVO->setSerializedObject($stdObject->serialized_object);
$oTrashVO->setUnserializedObject($stdObject->serialized_object);
$oTrashVO->setDescription($stdObject->description);
$oTrashVO->setIpaddress($stdObject->ipaddress);
$oTrashVO->setRemoverSrl($stdObject->remover_srl);

View file

@ -443,6 +443,17 @@ Sin la necesidad de utilizar los módulos de página o del diseño de XE, Usted
<value xml:lang="tr"><![CDATA[Widget Boyutu]]></value>
<value xml:lang="vi"><![CDATA[Kích thước]]></value>
</item>
<item name="cmd_widget_css_class">
<value xml:lang="ko"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="en"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="jp"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="zh-CN"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="zh-TW"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="fr"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="es"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="tr"><![CDATA[위젯 CSS class]]></value>
<value xml:lang="vi"><![CDATA[위젯 CSS class]]></value>
</item>
<item name="cmd_widget_align">
<value xml:lang="ko"><![CDATA[위젯 정렬]]></value>
<value xml:lang="en"><![CDATA[Align Widget]]></value>

View file

@ -127,6 +127,7 @@
height: 14px;
border: 0;
cursor: pointer;
vertical-align: middle;
background: transparent url("../../../admin/tpl/img/glyphicons-halflings.png") no-repeat;
}
.widgetButtons .widgetSetup {

View file

@ -1 +1 @@
@charset "utf-8";.widget_title{margin:10px 5px 5px 0;padding:3px;border:1px solid #ddd}.widget_mid_list{margin:0 0 5px 10px}.widget_description{margin:5px 0 0;padding:5px 0 0;border-top:1px dotted #eee;color:#aaa}#colorset_area{margin-top:.5em}#colorset_area .header{float:left;margin-right:.5em;padding-top:.2em}#colorset_area .footer{float:left}#zonePageContent{overflow:hidden;margin:0!important;padding:0!important;width:100%}.pageAddContent{width:700px}.widgetOutput{float:left;z-index:998;position:relative;overflow:hidden;width:100%;min-height:24px;cursor:move}.widgetOutput .widgetBorder,.widgetOutput .widgetBoxBorder{z-index:999;box-sizing:border-box;height:100%;min-height:24px;border:1px dashed #ccc}.widgetOutput .widgetResize{z-index:1000;position:absolute;bottom:1px;right:1px;width:12px;height:12px;border:0;cursor:pointer;background:transparent url(../images/btn_resize.gif) no-repeat left bottom}.widgetOutput .widgetResizeLeft{height:12px;bottom:1px;position:absolute;border:0;width:12px;z-index:1000;left:1px;cursor:pointer;background:transparent url(../images/btn_resize_left.gif) no-repeat left bottom}.widgetOutput .widgetBoxResize{z-index:1000;position:absolute;right:1px;bottom:1px;width:12px;height:12px;border:0;cursor:pointer;background:transparent url(../images/btn_resize.gif) no-repeat left bottom}.widgetOutput .widgetBoxResizeLeft{z-index:1000;position:absolute;left:1px;bottom:0;width:12px;height:12px;border:0;cursor:pointer;background:transparent url(../images/btn_resize_left.gif) no-repeat left bottom}.widgetButtons{float:left;z-index:1000;visibility:hidden;position:absolute;top:0;overflow:hidden;padding:0 10px;line-height:24px;box-shadow:0 0 3px #333 inset;*zoom:1}.widgetButtons#widgetButton{left:0;background-color:#C7DBE9}.widgetButtons#widgetBoxButton{right:0;background-color:#D2E9C7}.widgetButtons>button{z-index:99;padding:14px 0 0;overflow:hidden;width:14px;height:14px;border:0;cursor:pointer;background:transparent url(../../../admin/tpl/img/glyphicons-halflings.png) no-repeat}.widgetButtons .widgetSetup{background-position:-432px 0}.widgetButtons .widgetBoxSize,.widgetButtons .widgetSize{background-position:-96px -120px}.widgetButtons .widgetStyle{background-position:-456px -144px}.widgetButtons .widgetBoxCopy,.widgetButtons .widgetCopy{background-position:0 -96px}.widgetButtons .widgetBoxRemove,.widgetButtons .widgetRemove{background-position:-456px 0}.help{padding:5px 0;border-top:1px solid #ccc;background-color:#EFEFEF}ul.midCommand{float:left;margin:0 0 0 10px;padding:0;*zoom:1}ul.midCommand li{display:block;margin-bottom:5px;list-style:none}a.widgetStyle{display:inline-block;position:relative;margin:0 10px 10px 0;overflow:hidden;width:96px;height:96px;border:1px solid #fff;text-decoration:none;*zoom:1}a.widgetStyle:hover{border:1px dashed #ccc}a.widgetStyle:hover span{display:none}a.widgetStyle.selected{border:1px dashed #999}a.widgetStyle img{margin:1px;width:96px;height:96px}a.widgetStyle span{display:block;position:absolute;left:0;bottom:0;width:96px;padding:4px 3px 3px;text-align:center;font-family:tahoma;color:#fff;filter:alpha(opacity=80);opacity:.8;background-color:#888}#zonePageContent .widgetContainer{min-height:20px}
@charset "utf-8";.widget_title{margin:10px 5px 5px 0;padding:3px;border:1px solid #ddd}.widget_mid_list{margin:0 0 5px 10px}.widget_description{margin:5px 0 0;padding:5px 0 0;border-top:1px dotted #eee;color:#aaa}#colorset_area{margin-top:.5em}#colorset_area .header{float:left;margin-right:.5em;padding-top:.2em}#colorset_area .footer{float:left}#zonePageContent{overflow:hidden;margin:0!important;padding:0!important;width:100%}.pageAddContent{width:700px}.widgetOutput{float:left;z-index:998;position:relative;overflow:hidden;width:100%;min-height:24px;cursor:move}.widgetOutput .widgetBorder,.widgetOutput .widgetBoxBorder{z-index:999;box-sizing:border-box;height:100%;min-height:24px;border:1px dashed #ccc}.widgetOutput .widgetResize{z-index:1000;position:absolute;bottom:1px;right:1px;width:12px;height:12px;border:0;cursor:pointer;background:transparent url(../images/btn_resize.gif) no-repeat left bottom}.widgetOutput .widgetResizeLeft{height:12px;bottom:1px;position:absolute;border:0;width:12px;z-index:1000;left:1px;cursor:pointer;background:transparent url(../images/btn_resize_left.gif) no-repeat left bottom}.widgetOutput .widgetBoxResize{z-index:1000;position:absolute;right:1px;bottom:1px;width:12px;height:12px;border:0;cursor:pointer;background:transparent url(../images/btn_resize.gif) no-repeat left bottom}.widgetOutput .widgetBoxResizeLeft{z-index:1000;position:absolute;left:1px;bottom:0;width:12px;height:12px;border:0;cursor:pointer;background:transparent url(../images/btn_resize_left.gif) no-repeat left bottom}.widgetButtons{float:left;z-index:1000;visibility:hidden;position:absolute;top:0;overflow:hidden;padding:0 10px;line-height:24px;box-shadow:0 0 3px #333 inset;*zoom:1}.widgetButtons#widgetButton{left:0;background-color:#C7DBE9}.widgetButtons#widgetBoxButton{right:0;background-color:#D2E9C7}.widgetButtons>button{z-index:99;padding:14px 0 0;overflow:hidden;width:14px;height:14px;border:0;cursor:pointer;vertical-align:middle;background:transparent url(../../../admin/tpl/img/glyphicons-halflings.png) no-repeat}.widgetButtons .widgetSetup{background-position:-432px 0}.widgetButtons .widgetBoxSize,.widgetButtons .widgetSize{background-position:-96px -120px}.widgetButtons .widgetStyle{background-position:-456px -144px}.widgetButtons .widgetBoxCopy,.widgetButtons .widgetCopy{background-position:0 -96px}.widgetButtons .widgetBoxRemove,.widgetButtons .widgetRemove{background-position:-456px 0}.help{padding:5px 0;border-top:1px solid #ccc;background-color:#EFEFEF}ul.midCommand{float:left;margin:0 0 0 10px;padding:0;*zoom:1}ul.midCommand li{display:block;margin-bottom:5px;list-style:none}a.widgetStyle{display:inline-block;position:relative;margin:0 10px 10px 0;overflow:hidden;width:96px;height:96px;border:1px solid #fff;text-decoration:none;*zoom:1}a.widgetStyle:hover{border:1px dashed #ccc}a.widgetStyle:hover span{display:none}a.widgetStyle.selected{border:1px dashed #999}a.widgetStyle img{margin:1px;width:96px;height:96px}a.widgetStyle span{display:block;position:absolute;left:0;bottom:0;width:96px;padding:4px 3px 3px;text-align:center;font-family:tahoma;color:#fff;filter:alpha(opacity=80);opacity:.8;background-color:#888}#zonePageContent .widgetContainer{min-height:20px}

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