mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-04-04 19:12:12 +09:00
Merge remote-tracking branch 'refs/remotes/rhymix/develop' into develop
This commit is contained in:
commit
08e900f63e
124 changed files with 2866 additions and 2178 deletions
|
|
@ -1,8 +1,8 @@
|
|||
RewriteEngine On
|
||||
|
||||
# reserve XE Layout Template Source File (*.html)
|
||||
# reserve Rhymix Layout Template Source File (*.html)
|
||||
RewriteRule ^(layouts|m.layouts)/(.+)\.html$ - [L,F]
|
||||
# reserve XE Template Source Files (*.html)
|
||||
# reserve Rhymix Template Source Files (*.html)
|
||||
RewriteCond %{REQUEST_URI} !/modules/editor/
|
||||
RewriteRule /(skins|m.skins)/(.+)\.html$ - [L,F]
|
||||
|
||||
|
|
|
|||
17
.travis.yml
17
.travis.yml
|
|
@ -6,22 +6,19 @@ php:
|
|||
- 5.6
|
||||
- 7.0
|
||||
- hhvm
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
fast_finish: true
|
||||
sudo: false
|
||||
before_script:
|
||||
- npm install grunt grunt-cli grunt-contrib-jshint grunt-contrib-csslint grunt-phplint --save-dev
|
||||
- mysql -u root -e "CREATE DATABASE rhymix"
|
||||
- mysql -u root -e "SET PASSWORD FOR 'travis'@'localhost' = PASSWORD('travis')"
|
||||
- php -S localhost:8000 &
|
||||
- if [ $(phpenv version-name) == "5.3" ]; then touch codecept.phar; fi
|
||||
- if [ $(phpenv version-name) == "5.4" ]; then wget http://codeception.com/releases/2.0.16/codecept.phar; fi
|
||||
- if [ ! -f codecept.phar ]; then wget http://codeception.com/codecept.phar; fi
|
||||
- if [[ $TRAVIS_PHP_VERSION != "hhvm" ]]; then php -S localhost:8000 & fi
|
||||
- if [[ $TRAVIS_PHP_VERSION == "5.3" ]]; then touch codecept.phar; fi
|
||||
- if [[ $TRAVIS_PHP_VERSION == "5.4" ]]; then wget http://codeception.com/releases/2.0.16/codecept.phar; fi
|
||||
- if [[ ! -f codecept.phar ]]; then wget http://codeception.com/codecept.phar; fi
|
||||
script:
|
||||
- if [ -f codecept.phar ]; then php codecept.phar build; fi
|
||||
- if [ -f codecept.phar ]; then php codecept.phar run -d --fail-fast --env travis; fi
|
||||
- if [[ -f codecept.phar ]]; then php codecept.phar build; fi
|
||||
- if [[ $TRAVIS_PHP_VERSION == "hhvm" ]]; then php codecept.phar run -d --fail-fast --env travis --skip Install; fi
|
||||
- if [[ $TRAVIS_PHP_VERSION != "hhvm" ]]; then php codecept.phar run -d --fail-fast --env travis; fi
|
||||
- grunt lint
|
||||
notifications:
|
||||
email: false
|
||||
|
|
|
|||
13
README.md
13
README.md
|
|
@ -32,9 +32,16 @@ RhymiX는 개발자와 사용자가 서로의 권리와 책임을 존중하는
|
|||
|
||||
### 설치 환경
|
||||
|
||||
- PHP 5.3 이상 (PHP 5.5 이상 권장, PHP 7 지원)
|
||||
- MYSQL 4.1 이상 (MySQL 5.0 이상 또는 MariaDB 권장)
|
||||
- 필수 모듈: curl, gd, iconv _or_ mbstring, json, mcrypt _or_ openssl, xml
|
||||
- PHP 5.3.3 이상 (PHP 5.5.9 이상 권장, PHP 7 지원)
|
||||
- MySQL 4.1.13 이상 (MySQL 5.0.7 이상 또는 MariaDB 권장)
|
||||
- CUBRID 또는 MS SQL을 DB로 사용할 수도 있으나, 권장하지는 않습니다.
|
||||
- 필수 PHP 모듈
|
||||
- curl
|
||||
- gd
|
||||
- iconv 또는 mbstring
|
||||
- json
|
||||
- mcrypt 또는 openssl
|
||||
- xml 및 simplexml
|
||||
- php.ini에서 session.auto_start = Off로 설정되어 있어야 합니다.
|
||||
- 설치 폴더 또는 files 폴더에 쓰기 권한이 주어져야 합니다.
|
||||
|
||||
|
|
|
|||
|
|
@ -527,8 +527,8 @@ if($called_position == 'before_module_proc')
|
|||
<?xml version="1.0" ?>
|
||||
<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd" >
|
||||
<service>
|
||||
<engineName>XpressEngine</engineName>
|
||||
<engineLink>http://www.xpressengine.com/ </engineLink>
|
||||
<engineName>Rhymix</engineName>
|
||||
<engineLink>https://www.rhymix.org/ </engineLink>
|
||||
<homePageLink>{$homepagelink}</homePageLink>
|
||||
<apis>
|
||||
<api name="MetaWeblog" preferred="true" apiLink="{$api_url}" blogID="" />
|
||||
|
|
|
|||
|
|
@ -1,10 +1,6 @@
|
|||
<?php
|
||||
/* Copyright (C) NAVER <http://www.navercorp.com> */
|
||||
|
||||
define('FOLLOW_REQUEST_SSL', 0);
|
||||
define('ENFORCE_SSL', 1);
|
||||
define('RELEASE_SSL', 2);
|
||||
|
||||
/**
|
||||
* Manages Context such as request arguments/environment variables
|
||||
* It has dual method structure, easy-to use methods which can be called as self::methodname(),and methods called with static object.
|
||||
|
|
@ -1275,12 +1271,27 @@ class Context
|
|||
public static function setRequestMethod($type = '')
|
||||
{
|
||||
self::$_instance->js_callback_func = self::$_instance->getJSCallbackFunc();
|
||||
|
||||
($type && self::$_instance->request_method = $type) or
|
||||
((strpos($_SERVER['CONTENT_TYPE'], 'json') || strpos($_SERVER['HTTP_CONTENT_TYPE'], 'json')) && self::$_instance->request_method = 'JSON') or
|
||||
($GLOBALS['HTTP_RAW_POST_DATA'] && self::$_instance->request_method = 'XMLRPC') or
|
||||
(self::$_instance->js_callback_func && self::$_instance->request_method = 'JS_CALLBACK') or
|
||||
(self::$_instance->request_method = $_SERVER['REQUEST_METHOD']);
|
||||
|
||||
if ($type)
|
||||
{
|
||||
self::$_instance->request_method = $type;
|
||||
}
|
||||
elseif (strpos($_SERVER['CONTENT_TYPE'], 'json') !== false || strpos($_SERVER['HTTP_CONTENT_TYPE'], 'json') !== false)
|
||||
{
|
||||
self::$_instance->request_method = 'JSON';
|
||||
}
|
||||
elseif ($GLOBALS['HTTP_RAW_POST_DATA'])
|
||||
{
|
||||
self::$_instance->request_method = 'XMLRPC';
|
||||
}
|
||||
elseif (self::$_instance->js_callback_func)
|
||||
{
|
||||
self::$_instance->request_method = 'JS_CALLBACK';
|
||||
}
|
||||
else
|
||||
{
|
||||
self::$_instance->request_method = $_SERVER['REQUEST_METHOD'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1600,15 +1611,7 @@ class Context
|
|||
static $url = null;
|
||||
if(is_null($url))
|
||||
{
|
||||
$url = self::getRequestUri();
|
||||
if(count($_GET) > 0)
|
||||
{
|
||||
foreach($_GET as $key => $val)
|
||||
{
|
||||
$vars[] = $key . '=' . ($val ? urlencode(self::convertEncodingStr($val)) : '');
|
||||
}
|
||||
$url .= '?' . join('&', $vars);
|
||||
}
|
||||
$url = self::getRequestUri() . RX_REQUEST_URL;
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
|
|
@ -1678,7 +1681,7 @@ class Context
|
|||
$domain_info = parse_url($domain);
|
||||
if(is_null($current_info))
|
||||
{
|
||||
$current_info = parse_url(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . getScriptPath());
|
||||
$current_info = parse_url((RX_SSL ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . RX_BASEURL);
|
||||
}
|
||||
if($domain_info['host'] . $domain_info['path'] == $current_info['host'] . $current_info['path'])
|
||||
{
|
||||
|
|
@ -1686,11 +1689,7 @@ class Context
|
|||
}
|
||||
else
|
||||
{
|
||||
$domain = preg_replace('/^(http|https):\/\//i', '', trim($domain));
|
||||
if(substr_compare($domain, '/', -1) !== 0)
|
||||
{
|
||||
$domain .= '/';
|
||||
}
|
||||
$domain = rtrim(preg_replace('/^(http|https):\/\//i', '', trim($domain)), '/') . '/';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1746,7 +1745,7 @@ class Context
|
|||
'dispDocumentAdminManageDocument' => 'dispDocumentManageDocument',
|
||||
'dispModuleAdminSelectList' => 'dispModuleSelectList'
|
||||
);
|
||||
if($act_alias[$act])
|
||||
if(isset($act_alias[$act]))
|
||||
{
|
||||
$get_vars['act'] = $act_alias[$act];
|
||||
}
|
||||
|
|
@ -1794,27 +1793,9 @@ class Context
|
|||
$query = $target_map[$target];
|
||||
}
|
||||
|
||||
if(!$query)
|
||||
if(!$query && count($get_vars) > 0)
|
||||
{
|
||||
$queries = array();
|
||||
foreach($get_vars as $key => $val)
|
||||
{
|
||||
if(is_array($val) && count($val) > 0)
|
||||
{
|
||||
foreach($val as $k => $v)
|
||||
{
|
||||
$queries[] = $key . '[' . $k . ']=' . urlencode($v);
|
||||
}
|
||||
}
|
||||
elseif(!is_array($val))
|
||||
{
|
||||
$queries[] = $key . '=' . urlencode($val);
|
||||
}
|
||||
}
|
||||
if(count($queries) > 0)
|
||||
{
|
||||
$query = 'index.php?' . join('&', $queries);
|
||||
}
|
||||
$query = 'index.php?' . http_build_query($get_vars);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1823,18 +1804,18 @@ class Context
|
|||
if($_use_ssl == 'always')
|
||||
{
|
||||
$query = self::getRequestUri(ENFORCE_SSL, $domain) . $query;
|
||||
// optional SSL use
|
||||
}
|
||||
// optional SSL use
|
||||
elseif($_use_ssl == 'optional')
|
||||
{
|
||||
$ssl_mode = ((self::get('module') === 'admin') || ($get_vars['module'] === 'admin') || (isset($get_vars['act']) && self::isExistsSSLAction($get_vars['act']))) ? ENFORCE_SSL : RELEASE_SSL;
|
||||
$query = self::getRequestUri($ssl_mode, $domain) . $query;
|
||||
// no SSL
|
||||
}
|
||||
// no SSL
|
||||
else
|
||||
{
|
||||
// currently on SSL but target is not based on SSL
|
||||
if($_SERVER['HTTPS'] == 'on')
|
||||
if(RX_SSL)
|
||||
{
|
||||
$query = self::getRequestUri(ENFORCE_SSL, $domain) . $query;
|
||||
}
|
||||
|
|
@ -1844,7 +1825,7 @@ class Context
|
|||
}
|
||||
else
|
||||
{
|
||||
$query = getScriptPath() . $query;
|
||||
$query = RX_BASEURL . $query;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1910,11 +1891,9 @@ class Context
|
|||
return $url[$ssl_mode][$domain_key];
|
||||
}
|
||||
|
||||
$current_use_ssl = ($_SERVER['HTTPS'] == 'on');
|
||||
|
||||
switch($ssl_mode)
|
||||
{
|
||||
case FOLLOW_REQUEST_SSL: $use_ssl = $current_use_ssl;
|
||||
case FOLLOW_REQUEST_SSL: $use_ssl = RX_SSL;
|
||||
break;
|
||||
case ENFORCE_SSL: $use_ssl = TRUE;
|
||||
break;
|
||||
|
|
@ -1924,20 +1903,16 @@ class Context
|
|||
|
||||
if($domain)
|
||||
{
|
||||
$target_url = trim($domain);
|
||||
if(substr_compare($target_url, '/', -1) !== 0)
|
||||
{
|
||||
$target_url.= '/';
|
||||
}
|
||||
$target_url = rtrim(trim($domain), '/') . '/';
|
||||
}
|
||||
else
|
||||
{
|
||||
$target_url = $_SERVER['HTTP_HOST'] . getScriptPath();
|
||||
$target_url = $_SERVER['HTTP_HOST'] . RX_BASEURL;
|
||||
}
|
||||
|
||||
$url_info = parse_url('http://' . $target_url);
|
||||
|
||||
if($current_use_ssl != $use_ssl)
|
||||
if($use_ssl != RX_SSL)
|
||||
{
|
||||
unset($url_info['port']);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,10 +14,10 @@ class DBCubrid extends DB
|
|||
{
|
||||
|
||||
/**
|
||||
* prefix of XE tables(One more XE can be installed on a single DB)
|
||||
* prefix of Rhymix tables(One more Rhymix can be installed on a single DB)
|
||||
* @var string
|
||||
*/
|
||||
var $prefix = 'xe_';
|
||||
var $prefix = 'rx_';
|
||||
|
||||
/**
|
||||
* max size of constant in CUBRID(if string is larger than this, '...'+'...' should be used)
|
||||
|
|
|
|||
|
|
@ -13,10 +13,10 @@ class DBMssql extends DB
|
|||
{
|
||||
|
||||
/**
|
||||
* prefix of XE tables(One more XE can be installed on a single DB)
|
||||
* prefix of Rhymix tables(One more Rhymix can be installed on a single DB)
|
||||
* @var string
|
||||
*/
|
||||
var $prefix = 'xe';
|
||||
var $prefix = 'rx';
|
||||
var $param = array();
|
||||
var $comment_syntax = '/* %s */';
|
||||
|
||||
|
|
|
|||
|
|
@ -14,10 +14,10 @@
|
|||
class DBMysql extends DB
|
||||
{
|
||||
/**
|
||||
* prefix of a tablename (One or more XEs can be installed in a single DB)
|
||||
* prefix of a tablename (One or more Rhymix can be installed in a single DB)
|
||||
* @var string
|
||||
*/
|
||||
var $prefix = 'xe_'; // / <
|
||||
var $prefix = 'rx_'; // / <
|
||||
var $comment_syntax = '/* %s */';
|
||||
var $charset = 'utf8';
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ class DBMysql extends DB
|
|||
$result = @mysql_connect($connection["db_hostname"], $connection["db_userid"], $connection["db_password"]);
|
||||
if(!$result)
|
||||
{
|
||||
exit('XE cannot connect to DB.');
|
||||
exit('Unable to connect to DB.');
|
||||
}
|
||||
|
||||
if(mysql_error())
|
||||
|
|
@ -76,10 +76,10 @@ class DBMysql extends DB
|
|||
return;
|
||||
}
|
||||
|
||||
// Error appears if the version is lower than 4.1
|
||||
if(version_compare(mysql_get_server_info($result), '4.1', '<'))
|
||||
// Error appears if the version is lower than 4.1.13
|
||||
if(version_compare(mysql_get_server_info($result), '4.1.13', '<'))
|
||||
{
|
||||
$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, 'RhymiX requires MySQL 4.1.13 or later. Current MySQL version is ' . mysql_get_server_info());
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -168,7 +168,7 @@ class DBMysql extends DB
|
|||
{
|
||||
if(!$connection)
|
||||
{
|
||||
exit('XE cannot handle DB connection.');
|
||||
exit('Rhymix cannot handle DB connection.');
|
||||
}
|
||||
// Run the query statement
|
||||
$result = @mysql_query($query, $connection);
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ class DisplayHandler extends Handler
|
|||
* @param ModuleObject $oModule the module object
|
||||
* @return void
|
||||
*/
|
||||
function printContent(&$oModule)
|
||||
public function printContent(&$oModule)
|
||||
{
|
||||
// Check if the gzip encoding supported
|
||||
if(
|
||||
|
|
@ -85,28 +85,24 @@ class DisplayHandler extends Handler
|
|||
$httpStatusCode = $oModule->getHttpStatusCode();
|
||||
if($httpStatusCode && $httpStatusCode != 200)
|
||||
{
|
||||
$this->_printHttpStatusCode($httpStatusCode);
|
||||
self::_printHttpStatusCode($httpStatusCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Context::getResponseMethod() == 'JSON' || Context::getResponseMethod() == 'JS_CALLBACK')
|
||||
{
|
||||
$this->_printJSONHeader();
|
||||
self::_printJSONHeader();
|
||||
}
|
||||
else if(Context::getResponseMethod() != 'HTML')
|
||||
{
|
||||
$this->_printXMLHeader();
|
||||
self::_printXMLHeader();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_printHTMLHeader();
|
||||
self::_printHTMLHeader();
|
||||
}
|
||||
}
|
||||
|
||||
// debugOutput output
|
||||
$this->content_size = strlen($output);
|
||||
$output .= $this->_debugOutput();
|
||||
|
||||
// disable gzip if output already exists
|
||||
ob_flush();
|
||||
if(headers_sent())
|
||||
|
|
@ -123,6 +119,10 @@ class DisplayHandler extends Handler
|
|||
// results directly output
|
||||
print $output;
|
||||
|
||||
// debugOutput output
|
||||
$this->content_size = strlen($output);
|
||||
print $this->_debugOutput();
|
||||
|
||||
// call a trigger after display
|
||||
ModuleHandler::triggerCall('display', 'after', $output);
|
||||
|
||||
|
|
@ -135,7 +135,7 @@ class DisplayHandler extends Handler
|
|||
* __DEBUG_OUTPUT__ == 0, messages are written in ./files/_debug_message.php
|
||||
* @return void
|
||||
*/
|
||||
function _debugOutput()
|
||||
public function _debugOutput()
|
||||
{
|
||||
if(!__DEBUG__)
|
||||
{
|
||||
|
|
@ -179,14 +179,14 @@ class DisplayHandler extends Handler
|
|||
);
|
||||
$firephp->fb(
|
||||
array(
|
||||
'Elapsed time >>> Total : ' . sprintf('%0.5f sec', $end - __StartTime__),
|
||||
'Elapsed time >>> Total : ' . sprintf('%0.5f sec', $end - RX_MICROTIME),
|
||||
array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans Content'),
|
||||
array(
|
||||
sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__elapsed_class_load__']),
|
||||
sprintf('%0.5f sec (%d called)', $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__xmlparse_elapsed__']),
|
||||
sprintf('%0.5f sec', $end - __StartTime__ - $GLOBALS['__template_elapsed__'] - $GLOBALS['__xmlparse_elapsed__'] - $GLOBALS['__db_elapsed_time__'] - $GLOBALS['__elapsed_class_load__']),
|
||||
sprintf('%0.5f sec', $end - RX_MICROTIME - $GLOBALS['__template_elapsed__'] - $GLOBALS['__xmlparse_elapsed__'] - $GLOBALS['__db_elapsed_time__'] - $GLOBALS['__elapsed_class_load__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__widget_excute_elapsed__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__trans_content_elapsed__'])
|
||||
)
|
||||
|
|
@ -234,12 +234,12 @@ class DisplayHandler extends Handler
|
|||
$buff[] = sprintf("\tResponse contents size\t: %d byte", $this->content_size);
|
||||
|
||||
// total execution time
|
||||
$buff[] = sprintf("\n- Total elapsed time : %0.5f sec", $end - __StartTime__);
|
||||
$buff[] = sprintf("\n- Total elapsed time : %0.5f sec", $end - RX_MICROTIME);
|
||||
|
||||
$buff[] = sprintf("\tclass file load elapsed time \t: %0.5f sec", $GLOBALS['__elapsed_class_load__']);
|
||||
$buff[] = sprintf("\tTemplate compile elapsed time\t: %0.5f sec (%d called)", $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']);
|
||||
$buff[] = sprintf("\tXmlParse compile elapsed time\t: %0.5f sec", $GLOBALS['__xmlparse_elapsed__']);
|
||||
$buff[] = sprintf("\tPHP elapsed time \t\t\t\t: %0.5f sec", $end - __StartTime__ - $GLOBALS['__template_elapsed__'] - $GLOBALS['__xmlparse_elapsed__'] - $GLOBALS['__db_elapsed_time__'] - $GLOBALS['__elapsed_class_load__']);
|
||||
$buff[] = sprintf("\tPHP elapsed time \t\t\t\t: %0.5f sec", $end - RX_MICROTIME - $GLOBALS['__template_elapsed__'] - $GLOBALS['__xmlparse_elapsed__'] - $GLOBALS['__db_elapsed_time__'] - $GLOBALS['__elapsed_class_load__']);
|
||||
$buff[] = sprintf("\tDB class elapsed time \t\t\t: %0.5f sec", $GLOBALS['__dbclass_elapsed_time__'] - $GLOBALS['__db_elapsed_time__']);
|
||||
|
||||
// widget execution time
|
||||
|
|
@ -318,7 +318,7 @@ class DisplayHandler extends Handler
|
|||
* print a HTTP HEADER for XML, which is encoded in UTF-8
|
||||
* @return void
|
||||
*/
|
||||
function _printXMLHeader()
|
||||
public static function _printXMLHeader()
|
||||
{
|
||||
header("Content-Type: text/xml; charset=UTF-8");
|
||||
}
|
||||
|
|
@ -327,7 +327,7 @@ class DisplayHandler extends Handler
|
|||
* print a HTTP HEADER for HTML, which is encoded in UTF-8
|
||||
* @return void
|
||||
*/
|
||||
function _printHTMLHeader()
|
||||
public static function _printHTMLHeader()
|
||||
{
|
||||
header("Content-Type: text/html; charset=UTF-8");
|
||||
}
|
||||
|
|
@ -336,16 +336,16 @@ class DisplayHandler extends Handler
|
|||
* print a HTTP HEADER for JSON, which is encoded in UTF-8
|
||||
* @return void
|
||||
*/
|
||||
function _printJSONHeader()
|
||||
public static function _printJSONHeader()
|
||||
{
|
||||
header("Content-Type: text/html; charset=UTF-8");
|
||||
header("Content-Type: text/javascript; charset=UTF-8");
|
||||
}
|
||||
|
||||
/**
|
||||
* print a HTTP HEADER for HTML, which is encoded in UTF-8
|
||||
* @return void
|
||||
*/
|
||||
function _printHttpStatusCode($code)
|
||||
public static function _printHttpStatusCode($code)
|
||||
{
|
||||
$statusMessage = Context::get('http_status_message');
|
||||
header("HTTP/1.0 $code $statusMessage");
|
||||
|
|
|
|||
|
|
@ -571,6 +571,7 @@ class FileHandler
|
|||
}
|
||||
}
|
||||
|
||||
$url = str_replace('&', '&', $url);
|
||||
$response = Requests::request($url, $request_headers, $body ?: $post_data, $method, $request_options);
|
||||
|
||||
if(count($response->cookies))
|
||||
|
|
|
|||
|
|
@ -8,19 +8,18 @@
|
|||
*/
|
||||
class Mobile
|
||||
{
|
||||
|
||||
/**
|
||||
* Whether mobile or not mobile mode
|
||||
* @var bool
|
||||
*/
|
||||
var $ismobile = NULL;
|
||||
public $ismobile = NULL;
|
||||
|
||||
/**
|
||||
* Get instance of Mobile class(for singleton)
|
||||
*
|
||||
* @return Mobile
|
||||
*/
|
||||
function &getInstance()
|
||||
public function getInstance()
|
||||
{
|
||||
static $theInstance;
|
||||
if(!isset($theInstance))
|
||||
|
|
@ -35,10 +34,9 @@ class Mobile
|
|||
*
|
||||
* @return bool If mobile mode returns true or false
|
||||
*/
|
||||
function isFromMobilePhone()
|
||||
public static function isFromMobilePhone()
|
||||
{
|
||||
$oMobile = & Mobile::getInstance();
|
||||
return $oMobile->_isFromMobilePhone();
|
||||
return self::getInstance()->_isFromMobilePhone();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -46,7 +44,7 @@ class Mobile
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
function _isFromMobilePhone()
|
||||
public function _isFromMobilePhone()
|
||||
{
|
||||
if($this->ismobile !== NULL)
|
||||
{
|
||||
|
|
@ -92,7 +90,7 @@ class Mobile
|
|||
$this->ismobile = FALSE;
|
||||
setcookie("mobile", FALSE, 0, $xe_web_path);
|
||||
setcookie("user-agent", FALSE, 0, $xe_web_path);
|
||||
if(!$this->isMobilePadCheckByAgent() && $this->isMobileCheckByAgent())
|
||||
if(!self::isMobilePadCheckByAgent() && self::isMobileCheckByAgent())
|
||||
{
|
||||
$this->ismobile = TRUE;
|
||||
}
|
||||
|
|
@ -100,13 +98,13 @@ class Mobile
|
|||
}
|
||||
else
|
||||
{
|
||||
if($this->isMobilePadCheckByAgent())
|
||||
if(self::isMobilePadCheckByAgent())
|
||||
{
|
||||
$this->ismobile = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if($this->isMobileCheckByAgent())
|
||||
if(self::isMobileCheckByAgent())
|
||||
{
|
||||
$this->ismobile = TRUE;
|
||||
}
|
||||
|
|
@ -143,7 +141,7 @@ class Mobile
|
|||
*
|
||||
* @return bool Returns true on mobile device or false.
|
||||
*/
|
||||
function isMobileCheckByAgent()
|
||||
public static function isMobileCheckByAgent()
|
||||
{
|
||||
static $UACheck;
|
||||
if(isset($UACheck))
|
||||
|
|
@ -177,7 +175,7 @@ class Mobile
|
|||
*
|
||||
* @return bool TRUE for tablet, and FALSE for else.
|
||||
*/
|
||||
function isMobilePadCheckByAgent()
|
||||
public static function isMobilePadCheckByAgent()
|
||||
{
|
||||
static $UACheck;
|
||||
if(isset($UACheck))
|
||||
|
|
@ -226,15 +224,13 @@ class Mobile
|
|||
* @param bool $ismobile
|
||||
* @return void
|
||||
*/
|
||||
function setMobile($ismobile)
|
||||
public static function setMobile($ismobile)
|
||||
{
|
||||
$oMobile = Mobile::getInstance();
|
||||
$oMobile->ismobile = $ismobile;
|
||||
self::getInstance()->ismobile = (bool)$ismobile;
|
||||
}
|
||||
|
||||
function isMobileEnabled()
|
||||
public static function isMobileEnabled()
|
||||
{
|
||||
$db_info = Context::getDBInfo();
|
||||
return ($db_info->use_mobile_view === 'Y');
|
||||
return (Context::getDBInfo()->use_mobile_view === 'Y');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ class ModuleHandler extends Handler
|
|||
* @return void
|
||||
* */
|
||||
|
||||
function __construct($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '')
|
||||
public function __construct($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '')
|
||||
{
|
||||
// If XE has not installed yet, set module as install
|
||||
if(!Context::isInstalled())
|
||||
|
|
@ -94,7 +94,7 @@ class ModuleHandler extends Handler
|
|||
|
||||
if(isset($this->act) && (strlen($this->act) >= 4 && substr_compare($this->act, 'disp', 0, 4) === 0))
|
||||
{
|
||||
if(Context::get('_use_ssl') == 'optional' && Context::isExistsSSLAction($this->act) && $_SERVER['HTTPS'] != 'on')
|
||||
if(Context::get('_use_ssl') == 'optional' && Context::isExistsSSLAction($this->act) && !RX_SSL)
|
||||
{
|
||||
if(Context::get('_https_port')!=null) {
|
||||
header('location:https://' . $_SERVER['HTTP_HOST'] . ':' . Context::get('_https_port') . $_SERVER['REQUEST_URI']);
|
||||
|
|
@ -106,7 +106,7 @@ class ModuleHandler extends Handler
|
|||
}
|
||||
|
||||
// call a trigger before moduleHandler init
|
||||
ModuleHandler::triggerCall('moduleHandler.init', 'before', $this);
|
||||
self::triggerCall('moduleHandler.init', 'before', $this);
|
||||
|
||||
// execute addon (before module initialization)
|
||||
$called_position = 'before_module_init';
|
||||
|
|
@ -119,7 +119,7 @@ class ModuleHandler extends Handler
|
|||
* Initialization. It finds the target module based on module, mid, document_srl, and prepares to execute an action
|
||||
* @return boolean true: OK, false: redirected
|
||||
* */
|
||||
function init()
|
||||
public function init()
|
||||
{
|
||||
$oModuleModel = getModel('module');
|
||||
$site_module_info = Context::get('site_module_info');
|
||||
|
|
@ -301,7 +301,7 @@ class ModuleHandler extends Handler
|
|||
}
|
||||
|
||||
// Call a trigger after moduleHandler init
|
||||
$output = ModuleHandler::triggerCall('moduleHandler.init', 'after', $this->module_info);
|
||||
$output = self::triggerCall('moduleHandler.init', 'after', $this->module_info);
|
||||
if(!$output->toBool())
|
||||
{
|
||||
$this->error = $output->getMessage();
|
||||
|
|
@ -318,7 +318,7 @@ class ModuleHandler extends Handler
|
|||
* get a module instance and execute an action
|
||||
* @return ModuleObject executed module instance
|
||||
* */
|
||||
function procModule()
|
||||
public function procModule()
|
||||
{
|
||||
$oModuleModel = getModel('module');
|
||||
$display_mode = Mobile::isFromMobilePhone() ? 'mobile' : 'view';
|
||||
|
|
@ -326,8 +326,8 @@ class ModuleHandler extends Handler
|
|||
// If error occurred while preparation, return a message instance
|
||||
if($this->error)
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
self::_setInputErrorToContext();
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -362,8 +362,8 @@ class ModuleHandler extends Handler
|
|||
$this->error = 'msg_module_is_not_exists';
|
||||
$this->httpStatusCode = '404';
|
||||
|
||||
$this->_setInputErrorToContext();
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
self::_setInputErrorToContext();
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -400,7 +400,7 @@ class ModuleHandler extends Handler
|
|||
if(!in_array(strtoupper($_SERVER['REQUEST_METHOD']), $allowedMethodList))
|
||||
{
|
||||
$this->error = "msg_invalid_request";
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -429,13 +429,13 @@ class ModuleHandler extends Handler
|
|||
}
|
||||
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
|
||||
// Admin ip
|
||||
if($kind == 'admin' && $_SESSION['denied_admin'] == 'Y')
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
self::_setInputErrorToContext();
|
||||
$this->error = "msg_not_permitted_act";
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -448,24 +448,24 @@ class ModuleHandler extends Handler
|
|||
$orig_type = "view";
|
||||
$type = "mobile";
|
||||
// create a module instance
|
||||
$oModule = $this->getModuleInstance($this->module, $type, $kind);
|
||||
$oModule = self::getModuleInstance($this->module, $type, $kind);
|
||||
if(!is_object($oModule) || !method_exists($oModule, $this->act))
|
||||
{
|
||||
$type = $orig_type;
|
||||
Mobile::setMobile(FALSE);
|
||||
$oModule = $this->getModuleInstance($this->module, $type, $kind);
|
||||
$oModule = self::getModuleInstance($this->module, $type, $kind);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// create a module instance
|
||||
$oModule = $this->getModuleInstance($this->module, $type, $kind);
|
||||
$oModule = self::getModuleInstance($this->module, $type, $kind);
|
||||
}
|
||||
|
||||
if(!is_object($oModule))
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
self::_setInputErrorToContext();
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -482,9 +482,9 @@ class ModuleHandler extends Handler
|
|||
|
||||
if(!Context::isInstalled())
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
self::_setInputErrorToContext();
|
||||
$this->error = 'msg_invalid_request';
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -513,7 +513,7 @@ class ModuleHandler extends Handler
|
|||
else
|
||||
{
|
||||
$this->error = 'msg_invalid_request';
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -555,7 +555,7 @@ class ModuleHandler extends Handler
|
|||
if(!in_array(strtoupper($_SERVER['REQUEST_METHOD']), $allowedMethodList))
|
||||
{
|
||||
$this->error = "msg_invalid_request";
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -583,23 +583,23 @@ class ModuleHandler extends Handler
|
|||
$orig_type = "view";
|
||||
$type = "mobile";
|
||||
// create a module instance
|
||||
$oModule = $this->getModuleInstance($forward->module, $type, $kind);
|
||||
$oModule = self::getModuleInstance($forward->module, $type, $kind);
|
||||
if(!is_object($oModule) || !method_exists($oModule, $this->act))
|
||||
{
|
||||
$type = $orig_type;
|
||||
Mobile::setMobile(FALSE);
|
||||
$oModule = $this->getModuleInstance($forward->module, $type, $kind);
|
||||
$oModule = self::getModuleInstance($forward->module, $type, $kind);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$oModule = $this->getModuleInstance($forward->module, $type, $kind);
|
||||
$oModule = self::getModuleInstance($forward->module, $type, $kind);
|
||||
}
|
||||
|
||||
if(!is_object($oModule))
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
self::_setInputErrorToContext();
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage('msg_module_is_not_exists');
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -624,10 +624,10 @@ class ModuleHandler extends Handler
|
|||
}
|
||||
else
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
self::_setInputErrorToContext();
|
||||
|
||||
$this->error = 'msg_is_not_administrator';
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -639,9 +639,9 @@ class ModuleHandler extends Handler
|
|||
$grant = $oModuleModel->getGrant($this->module_info, $logged_info);
|
||||
if(!$grant->manager)
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
self::_setInputErrorToContext();
|
||||
$this->error = 'msg_is_not_manager';
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -651,9 +651,9 @@ class ModuleHandler extends Handler
|
|||
{
|
||||
if(!$grant->is_admin && $this->module != $this->orig_module->module && $xml_info->permission->{$this->act} != 'manager')
|
||||
{
|
||||
$this->_setInputErrorToContext();
|
||||
self::_setInputErrorToContext();
|
||||
$this->error = 'msg_is_not_administrator';
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject = self::getModuleInstance('message', $display_mode);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
|
@ -710,7 +710,7 @@ class ModuleHandler extends Handler
|
|||
$_SESSION['XE_VALIDATOR_MESSAGE_TYPE'] = 'error';
|
||||
$_SESSION['XE_VALIDATOR_RETURN_URL'] = $returnUrl;
|
||||
$_SESSION['XE_VALIDATOR_ID'] = Context::get('xe_validator_id');
|
||||
$this->_setInputValueToSession();
|
||||
self::_setInputValueToSession();
|
||||
return $oModule;
|
||||
}
|
||||
}
|
||||
|
|
@ -753,7 +753,7 @@ class ModuleHandler extends Handler
|
|||
}
|
||||
|
||||
// if failed message exists in session, set context
|
||||
$this->_setInputErrorToContext();
|
||||
self::_setInputErrorToContext();
|
||||
|
||||
$procResult = $oModule->proc();
|
||||
|
||||
|
|
@ -773,7 +773,7 @@ class ModuleHandler extends Handler
|
|||
{
|
||||
$redirectUrl = Context::get('error_return_url');
|
||||
}
|
||||
$this->_setInputValueToSession();
|
||||
self::_setInputValueToSession();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -807,7 +807,7 @@ class ModuleHandler extends Handler
|
|||
* set error message to Session.
|
||||
* @return void
|
||||
* */
|
||||
function _setInputErrorToContext()
|
||||
public static function _setInputErrorToContext()
|
||||
{
|
||||
if($_SESSION['XE_VALIDATOR_ERROR'] && !Context::get('XE_VALIDATOR_ERROR'))
|
||||
{
|
||||
|
|
@ -834,14 +834,14 @@ class ModuleHandler extends Handler
|
|||
Context::set('INPUT_ERROR', $_SESSION['INPUT_ERROR']);
|
||||
}
|
||||
|
||||
$this->_clearErrorSession();
|
||||
self::_clearErrorSession();
|
||||
}
|
||||
|
||||
/**
|
||||
* clear error message to Session.
|
||||
* @return void
|
||||
* */
|
||||
function _clearErrorSession()
|
||||
public static function _clearErrorSession()
|
||||
{
|
||||
unset($_SESSION['XE_VALIDATOR_ERROR']);
|
||||
unset($_SESSION['XE_VALIDATOR_MESSAGE']);
|
||||
|
|
@ -855,7 +855,7 @@ class ModuleHandler extends Handler
|
|||
* occured error when, set input values to session.
|
||||
* @return void
|
||||
* */
|
||||
function _setInputValueToSession()
|
||||
public static function _setInputValueToSession()
|
||||
{
|
||||
$requestVars = Context::getRequestVars();
|
||||
unset($requestVars->act, $requestVars->mid, $requestVars->vid, $requestVars->success_return_url, $requestVars->error_return_url);
|
||||
|
|
@ -870,7 +870,7 @@ class ModuleHandler extends Handler
|
|||
* @param ModuleObject $oModule module instance
|
||||
* @return void
|
||||
* */
|
||||
function displayContent($oModule = NULL)
|
||||
public function displayContent($oModule = NULL)
|
||||
{
|
||||
// If the module is not set or not an object, set error
|
||||
if(!$oModule || !is_object($oModule))
|
||||
|
|
@ -886,7 +886,7 @@ class ModuleHandler extends Handler
|
|||
}
|
||||
|
||||
// Call trigger after moduleHandler proc
|
||||
$output = ModuleHandler::triggerCall('moduleHandler.proc', 'after', $oModule);
|
||||
$output = self::triggerCall('moduleHandler.proc', 'after', $oModule);
|
||||
if(!$output->toBool())
|
||||
{
|
||||
$this->error = $output->getMessage();
|
||||
|
|
@ -912,14 +912,14 @@ class ModuleHandler extends Handler
|
|||
{
|
||||
// display content with message module instance
|
||||
$type = Mobile::isFromMobilePhone() ? 'mobile' : 'view';
|
||||
$oMessageObject = ModuleHandler::getModuleInstance('message', $type);
|
||||
$oMessageObject = self::getModuleInstance('message', $type);
|
||||
$oMessageObject->setError(-1);
|
||||
$oMessageObject->setMessage($this->error);
|
||||
$oMessageObject->dispMessage();
|
||||
|
||||
if($oMessageObject->getHttpStatusCode() && $oMessageObject->getHttpStatusCode() != '200')
|
||||
{
|
||||
$this->_setHttpStatusMessage($oMessageObject->getHttpStatusCode());
|
||||
self::_setHttpStatusMessage($oMessageObject->getHttpStatusCode());
|
||||
$oMessageObject->setTemplateFile('http_status_code');
|
||||
}
|
||||
|
||||
|
|
@ -935,7 +935,7 @@ class ModuleHandler extends Handler
|
|||
$oModule = $oMessageObject;
|
||||
}
|
||||
|
||||
$this->_clearErrorSession();
|
||||
self::_clearErrorSession();
|
||||
}
|
||||
|
||||
// Check if layout_srl exists for the module
|
||||
|
|
@ -1065,7 +1065,7 @@ class ModuleHandler extends Handler
|
|||
* @param string $module module name
|
||||
* @return string path of the module
|
||||
* */
|
||||
function getModulePath($module)
|
||||
public static function getModulePath($module)
|
||||
{
|
||||
return sprintf('./modules/%s/', $module);
|
||||
}
|
||||
|
|
@ -1078,7 +1078,7 @@ class ModuleHandler extends Handler
|
|||
* @return ModuleObject module instance (if failed it returns null)
|
||||
* @remarks if there exists a module instance created before, returns it.
|
||||
* */
|
||||
function &getModuleInstance($module, $type = 'view', $kind = '')
|
||||
public static function getModuleInstance($module, $type = 'view', $kind = '')
|
||||
{
|
||||
|
||||
if(__DEBUG__ == 3)
|
||||
|
|
@ -1106,12 +1106,12 @@ class ModuleHandler extends Handler
|
|||
// if there is no instance of the module in global variable, create a new one
|
||||
if(!isset($GLOBALS['_loaded_module'][$module][$type][$kind]))
|
||||
{
|
||||
ModuleHandler::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name);
|
||||
self::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name);
|
||||
|
||||
if($extend_module && (!is_readable($high_class_file) || !is_readable($class_file)))
|
||||
{
|
||||
$module = $parent_module;
|
||||
ModuleHandler::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name);
|
||||
self::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name);
|
||||
}
|
||||
|
||||
// Check if the base class and instance class exist
|
||||
|
|
@ -1142,16 +1142,6 @@ class ModuleHandler extends Handler
|
|||
$oModule->setModule($module);
|
||||
$oModule->setModulePath($class_path);
|
||||
|
||||
// If the module has a constructor, run it.
|
||||
if(!isset($GLOBALS['_called_constructor'][$instance_name]))
|
||||
{
|
||||
$GLOBALS['_called_constructor'][$instance_name] = TRUE;
|
||||
if(@method_exists($oModule, $instance_name))
|
||||
{
|
||||
$oModule->{$instance_name}();
|
||||
}
|
||||
}
|
||||
|
||||
// Store the created instance into GLOBALS variable
|
||||
$GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule;
|
||||
}
|
||||
|
|
@ -1165,9 +1155,9 @@ class ModuleHandler extends Handler
|
|||
return $GLOBALS['_loaded_module'][$module][$type][$kind];
|
||||
}
|
||||
|
||||
function _getModuleFilePath($module, $type, $kind, &$classPath, &$highClassFile, &$classFile, &$instanceName)
|
||||
public static function _getModuleFilePath($module, $type, $kind, &$classPath, &$highClassFile, &$classFile, &$instanceName)
|
||||
{
|
||||
$classPath = ModuleHandler::getModulePath($module);
|
||||
$classPath = self::getModulePath($module);
|
||||
|
||||
$highClassFile = sprintf('%s%s%s.class.php', _XE_PATH_, $classPath, $module);
|
||||
$highClassFile = FileHandler::getRealPath($highClassFile);
|
||||
|
|
@ -1204,7 +1194,7 @@ class ModuleHandler extends Handler
|
|||
* @param object $obj an object as a parameter to trigger
|
||||
* @return Object
|
||||
* */
|
||||
function triggerCall($trigger_name, $called_position, &$obj)
|
||||
public static function triggerCall($trigger_name, $called_position, &$obj)
|
||||
{
|
||||
// skip if not installed
|
||||
if(!Context::isInstalled())
|
||||
|
|
@ -1267,12 +1257,12 @@ class ModuleHandler extends Handler
|
|||
* @param string $code
|
||||
* @return string
|
||||
* */
|
||||
function _setHttpStatusMessage($code)
|
||||
public static function _setHttpStatusMessage($code)
|
||||
{
|
||||
$statusMessageList = array(
|
||||
'100' => 'Continue',
|
||||
'101' => 'Switching Protocols',
|
||||
'201' => 'OK', // todo check array key '201'
|
||||
'200' => 'OK',
|
||||
'201' => 'Created',
|
||||
'202' => 'Accepted',
|
||||
'203' => 'Non-Authoritative Information',
|
||||
|
|
|
|||
|
|
@ -1,357 +0,0 @@
|
|||
<?php
|
||||
/* Copyright (C) NAVER <http://www.navercorp.com> */
|
||||
|
||||
/**
|
||||
* This class makes encryption and digital signing easy to use in XE.
|
||||
*
|
||||
* The encryption methods use AES-128, and is fully compatible with
|
||||
* https://github.com/defuse/php-encryption
|
||||
* except that it uses base64-encoded keys and ciphertexts.
|
||||
*
|
||||
* The digital signature methods is based on the same SHA-256 based
|
||||
* key derivation function used by the encryption methods.
|
||||
*
|
||||
* A key is automatically generated and saved to the files/config directory
|
||||
* when first invoked. The same key will be used for all subsequent
|
||||
* method calls that do not specify a different key.
|
||||
* The key must be a binary string exactly 16 bytes long.
|
||||
*
|
||||
* @file Crypto.class.php
|
||||
* @author Kijin Sung (kijin@kijinsung.com)
|
||||
* @package /classes/security
|
||||
* @version 1.0
|
||||
*/
|
||||
class Crypto
|
||||
{
|
||||
/**
|
||||
* @brief Default configuration
|
||||
*/
|
||||
const ENCRYPTION_ALGO = 'aes-128';
|
||||
const ENCRYPTION_MODE = 'cbc';
|
||||
const ENCRYPTION_BLOCK_SIZE = 16;
|
||||
const ENCRYPTION_KEY_SIZE = 16;
|
||||
const ENCRYPTION_KEY_INFO = 'DefusePHP|KeyForEncryption';
|
||||
const ENCRYPTION_MAC_ALGO = 'sha256';
|
||||
const ENCRYPTION_MAC_SIZE = 32;
|
||||
const ENCRYPTION_MAC_INFO = 'DefusePHP|KeyForAuthentication';
|
||||
const SIGNATURE_ALGO = 'sha256';
|
||||
const SIGNATURE_SIZE = '32';
|
||||
|
||||
/**
|
||||
* @brief The default key
|
||||
*/
|
||||
protected static $_default_key = null;
|
||||
|
||||
/**
|
||||
* @brief The currently selected extension
|
||||
*/
|
||||
protected static $_extension = null;
|
||||
|
||||
/**
|
||||
* @brief If this is true, encryption and signature are only valid in current session
|
||||
*/
|
||||
protected $_current_session_only = false;
|
||||
|
||||
/**
|
||||
* @brief Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
if(function_exists('openssl_encrypt'))
|
||||
{
|
||||
self::$_extension = 'openssl';
|
||||
}
|
||||
elseif(function_exists('mcrypt_encrypt'))
|
||||
{
|
||||
self::$_extension = 'mcrypt';
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception('Crypto class requires openssl or mcrypt extension.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check if cryptography is supported on this server
|
||||
* @return bool
|
||||
*/
|
||||
public static function isSupported()
|
||||
{
|
||||
return (function_exists('openssl_encrypt') || function_exists('mcrypt_encrypt'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Make encryption and signature only valid in current session
|
||||
* @return void
|
||||
*/
|
||||
public function currentSessionOnly()
|
||||
{
|
||||
$this->_current_session_only = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Encrypt a string
|
||||
* @param string $plaintext The string to encrypt
|
||||
* @param string $key Optional key. If empty, default key will be used.
|
||||
* @return string
|
||||
*/
|
||||
public function encrypt($plaintext, $key = null)
|
||||
{
|
||||
if($key === null || $key === '')
|
||||
{
|
||||
$key = $this->_getSessionKey();
|
||||
}
|
||||
|
||||
// Generate subkey for encryption
|
||||
$enc_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_KEY_INFO);
|
||||
|
||||
// Generate IV
|
||||
$iv = self::_createIV();
|
||||
|
||||
// Encrypt the plaintext
|
||||
if(self::$_extension === 'openssl')
|
||||
{
|
||||
$openssl_method = self::ENCRYPTION_ALGO . '-' . self::ENCRYPTION_MODE;
|
||||
$ciphertext = openssl_encrypt($plaintext, $openssl_method, $enc_key, OPENSSL_RAW_DATA, $iv);
|
||||
}
|
||||
else
|
||||
{
|
||||
$mcrypt_method = str_replace('aes', 'rijndael', self::ENCRYPTION_ALGO);
|
||||
$plaintext = self::_applyPKCS7Padding($plaintext, self::ENCRYPTION_BLOCK_SIZE);
|
||||
$ciphertext = mcrypt_encrypt($mcrypt_method, $enc_key, $plaintext, self::ENCRYPTION_MODE, $iv);
|
||||
}
|
||||
|
||||
// Generate MAC
|
||||
$mac_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_MAC_INFO);
|
||||
$mac = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($iv . $ciphertext), $mac_key, true);
|
||||
|
||||
// Return the MAC, IV, and ciphertext as a base64 encoded string
|
||||
return base64_encode($mac . $iv . $ciphertext);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Decrypt a string
|
||||
* @param string $ciphertext The string to decrypt
|
||||
* @param string $key Optional key. If empty, default key will be used.
|
||||
* @return string
|
||||
*/
|
||||
public function decrypt($ciphertext, $key = null)
|
||||
{
|
||||
if($key === null || $key === '')
|
||||
{
|
||||
$key = $this->_getSessionKey();
|
||||
}
|
||||
|
||||
// Base64 decode the ciphertext and check the length
|
||||
$ciphertext = @base64_decode($ciphertext);
|
||||
if(strlen($ciphertext) < (self::ENCRYPTION_MAC_SIZE + (self::ENCRYPTION_BLOCK_SIZE * 2)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Extract MAC and IV from the remainder of the ciphertext
|
||||
$mac = substr($ciphertext, 0, self::ENCRYPTION_MAC_SIZE);
|
||||
$iv = substr($ciphertext, self::ENCRYPTION_MAC_SIZE, self::ENCRYPTION_BLOCK_SIZE);
|
||||
$ciphertext = substr($ciphertext, self::ENCRYPTION_MAC_SIZE + self::ENCRYPTION_BLOCK_SIZE);
|
||||
|
||||
// Validate MAC
|
||||
$mac_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_MAC_INFO);
|
||||
$mac_compare = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($iv . $ciphertext), $mac_key, true);
|
||||
$oPassword = new Password();
|
||||
if(!$oPassword->strcmpConstantTime($mac, $mac_compare))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Generate subkey for encryption
|
||||
$enc_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_KEY_INFO);
|
||||
|
||||
// Decrypt the ciphertext
|
||||
if (self::$_extension === 'openssl')
|
||||
{
|
||||
$openssl_method = self::ENCRYPTION_ALGO . '-' . self::ENCRYPTION_MODE;
|
||||
$plaintext = openssl_decrypt($ciphertext, $openssl_method, $enc_key, OPENSSL_RAW_DATA, $iv);
|
||||
}
|
||||
else
|
||||
{
|
||||
$mcrypt_method = str_replace('aes', 'rijndael', self::ENCRYPTION_ALGO);
|
||||
$plaintext = @mcrypt_decrypt($mcrypt_method, $enc_key, $ciphertext, self::ENCRYPTION_MODE, $iv);
|
||||
if($plaintext === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$plaintext = self::_stripPKCS7Padding($plaintext, self::ENCRYPTION_BLOCK_SIZE);
|
||||
if($plaintext === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Return the plaintext
|
||||
return $plaintext;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a digital signature of a string
|
||||
* @param string $plaintext The string to sign
|
||||
* @param string $key Optional key. If empty, default key will be used.
|
||||
* @return string
|
||||
*/
|
||||
public function createSignature($plaintext, $key = null)
|
||||
{
|
||||
if($key === null || $key === '')
|
||||
{
|
||||
$key = $this->_getSessionKey();
|
||||
}
|
||||
|
||||
// Generate a signature using HMAC
|
||||
return bin2hex(self::_defuseCompatibleHKDF($plaintext, $key));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Verify a digital signature
|
||||
* @param string $signature The signature to verify
|
||||
* @param string $plaintext The string to verify
|
||||
* @param string $key Optional key. If empty, default key will be used.
|
||||
* @return bool
|
||||
*/
|
||||
public function verifySignature($signature, $plaintext, $key = null)
|
||||
{
|
||||
if($key === null || $key === '')
|
||||
{
|
||||
$key = $this->_getSessionKey();
|
||||
}
|
||||
|
||||
// Verify the signature using HMAC
|
||||
$oPassword = new Password();
|
||||
$compare = bin2hex(self::_defuseCompatibleHKDF($plaintext, $key));
|
||||
return $oPassword->strcmpConstantTime($signature, $compare);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the default key applicable to this instance
|
||||
* @return string
|
||||
*/
|
||||
protected function _getSessionKey()
|
||||
{
|
||||
if($this->_current_session_only)
|
||||
{
|
||||
if(!isset($_SESSION['XE_CRYPTO_SESSKEY']))
|
||||
{
|
||||
$_SESSION['XE_CRYPTO_SESSKEY'] = self::_createSecureKey();
|
||||
}
|
||||
$session_key = base64_decode($_SESSION['XE_CRYPTO_SESSKEY']);
|
||||
return strval(self::_getDefaultKey()) ^ strval($session_key);
|
||||
}
|
||||
else
|
||||
{
|
||||
return strval(self::_getDefaultKey());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the default key
|
||||
* @return string
|
||||
*/
|
||||
protected static function _getDefaultKey()
|
||||
{
|
||||
if(self::$_default_key !== null)
|
||||
{
|
||||
return base64_decode(self::$_default_key);
|
||||
}
|
||||
else
|
||||
{
|
||||
$file_name = _XE_PATH_ . 'files/config/crypto.config.php';
|
||||
if(file_exists($file_name) && is_readable($file_name))
|
||||
{
|
||||
$key = (include $file_name);
|
||||
}
|
||||
if(!isset($key) || !is_string($key))
|
||||
{
|
||||
$key = self::_createSecureKey();
|
||||
self::_setDefaultKey($key);
|
||||
}
|
||||
return base64_decode(self::$_default_key = $key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the default key
|
||||
* @param string $key The default key
|
||||
* @return void
|
||||
*/
|
||||
protected static function _setDefaultKey($key)
|
||||
{
|
||||
self::$_default_key = $key = trim($key);
|
||||
$file_name = _XE_PATH_ . 'files/config/crypto.config.php';
|
||||
$file_content = '<?php return ' . var_export($key, true) . ';' . PHP_EOL;
|
||||
FileHandler::writeFile($file_name, $file_content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a secure key
|
||||
* @return string
|
||||
*/
|
||||
protected static function _createSecureKey()
|
||||
{
|
||||
$oPassword = new Password();
|
||||
return base64_encode($oPassword->createSecureSalt(ENCRYPTION_KEY_SIZE, 'binary'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create an IV
|
||||
* @return string
|
||||
*/
|
||||
protected static function _createIV()
|
||||
{
|
||||
$oPassword = new Password();
|
||||
return $oPassword->createSecureSalt(self::ENCRYPTION_BLOCK_SIZE, 'binary');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Apply PKCS#7 padding to a string
|
||||
* @param string $str The string
|
||||
* @param int $block_size The block size
|
||||
* @return string
|
||||
*/
|
||||
protected static function _applyPKCS7Padding($str, $block_size)
|
||||
{
|
||||
$padding_size = $block_size - (strlen($str) % $block_size);
|
||||
if ($padding_size === 0) $padding_size = $block_size;
|
||||
return $str . str_repeat(chr($padding_size), $padding_size);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove PKCS#7 padding from a string
|
||||
* @param string $str The string
|
||||
* @param int $block_size The block size
|
||||
* @return string
|
||||
*/
|
||||
protected static function _stripPKCS7Padding($str, $block_size)
|
||||
{
|
||||
if (strlen($str) % $block_size !== 0) return false;
|
||||
$padding_size = ord(substr($str, -1));
|
||||
if ($padding_size < 1 || $padding_size > $block_size) return false;
|
||||
if (substr($str, (-1 * $padding_size)) !== str_repeat(chr($padding_size), $padding_size)) return false;
|
||||
return substr($str, 0, strlen($str) - $padding_size);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief HKDF function compatible with defuse/php-encryption
|
||||
* @return string
|
||||
*/
|
||||
protected static function _defuseCompatibleHKDF($key, $info)
|
||||
{
|
||||
$salt = str_repeat("\x00", self::ENCRYPTION_MAC_SIZE);
|
||||
$prk = hash_hmac(self::ENCRYPTION_MAC_ALGO, $key, $salt, true);
|
||||
$t = $last_block = '';
|
||||
for ($block_index = 1; strlen($t) < self::ENCRYPTION_KEY_SIZE; $block_index++)
|
||||
{
|
||||
$t .= $last_block = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($last_block . $info . chr($block_index)), $prk, true);
|
||||
}
|
||||
return substr($t, 0, self::ENCRYPTION_KEY_SIZE);
|
||||
}
|
||||
}
|
||||
/* End of file : Crypto.class.php */
|
||||
/* Location: ./classes/security/Crypto.class.php */
|
||||
|
|
@ -21,7 +21,7 @@ class TemplateHandler
|
|||
private $config = NULL;
|
||||
private $skipTags = NULL;
|
||||
private $handler_mtime = 0;
|
||||
static private $rootTpl = NULL;
|
||||
private static $rootTpl = NULL;
|
||||
|
||||
/**
|
||||
* constructor
|
||||
|
|
@ -38,7 +38,7 @@ class TemplateHandler
|
|||
* returns TemplateHandler's singleton object
|
||||
* @return TemplateHandler instance
|
||||
*/
|
||||
static public function &getInstance()
|
||||
public static function getInstance()
|
||||
{
|
||||
static $oTemplate = NULL;
|
||||
|
||||
|
|
@ -495,7 +495,7 @@ class TemplateHandler
|
|||
foreach($matches[1] as $n => $stmt)
|
||||
{
|
||||
$expr = $matches[2][$n];
|
||||
$expr = $this->_replaceVar($expr);
|
||||
$expr = self::_replaceVar($expr);
|
||||
$closing++;
|
||||
|
||||
switch($stmt)
|
||||
|
|
@ -568,7 +568,7 @@ class TemplateHandler
|
|||
if(strpos($node, '|cond="') !== false)
|
||||
{
|
||||
$node = preg_replace('@(\s[-\w:]+(?:="[^"]+?")?)\|cond="(.+?)"@s', '<?php if($2){ ?>$1<?php } ?>', $node);
|
||||
$node = $this->_replaceVar($node);
|
||||
$node = self::_replaceVar($node);
|
||||
}
|
||||
|
||||
if($nodes[$idx] != $node)
|
||||
|
|
@ -600,7 +600,7 @@ class TemplateHandler
|
|||
|
||||
if($m[1]{0} == '@')
|
||||
{
|
||||
$m[1] = $this->_replaceVar(substr($m[1], 1));
|
||||
$m[1] = self::_replaceVar(substr($m[1], 1));
|
||||
return "<?php {$m[1]} ?>";
|
||||
}
|
||||
else
|
||||
|
|
@ -615,7 +615,7 @@ class TemplateHandler
|
|||
{
|
||||
$escape_option = 'noescape';
|
||||
}
|
||||
$m[1] = $this->_replaceVar($m[1]);
|
||||
$m[1] = self::_replaceVar($m[1]);
|
||||
switch($escape_option)
|
||||
{
|
||||
case 'auto':
|
||||
|
|
@ -674,7 +674,7 @@ class TemplateHandler
|
|||
return "<?php \$__tpl=TemplateHandler::getInstance();echo \$__tpl->compile('{$fileDir}','{$pathinfo['basename']}') ?>";
|
||||
// <!--%load_js_plugin-->
|
||||
case 'load_js_plugin':
|
||||
$plugin = $this->_replaceVar($m[5]);
|
||||
$plugin = self::_replaceVar($m[5]);
|
||||
$s = "<!--#JSPLUGIN:{$plugin}-->";
|
||||
if(strpos($plugin, '$__Context') === false)
|
||||
{
|
||||
|
|
@ -780,7 +780,7 @@ class TemplateHandler
|
|||
$m[7] = substr($m[7], 1);
|
||||
if(!$m[7])
|
||||
{
|
||||
return '<?php ' . $this->_replaceVar($m[8]) . '{ ?>' . $m[9];
|
||||
return '<?php ' . self::_replaceVar($m[8]) . '{ ?>' . $m[9];
|
||||
}
|
||||
if(!preg_match('/^(?:((?:end)?(?:if|switch|for(?:each)?|while)|end)|(else(?:if)?)|(break@)?(case|default)|(break))$/', $m[7], $mm))
|
||||
{
|
||||
|
|
@ -803,11 +803,11 @@ class TemplateHandler
|
|||
$var = preg_replace('/^\s*\(\s*(.+?) .*$/', '$1', $m[8]);
|
||||
$precheck = "if({$var}&&count({$var}))";
|
||||
}
|
||||
return '<?php ' . $this->_replaceVar($precheck . $m[7] . $m[8]) . '{ ?>' . $m[9];
|
||||
return '<?php ' . self::_replaceVar($precheck . $m[7] . $m[8]) . '{ ?>' . $m[9];
|
||||
}
|
||||
if($mm[2])
|
||||
{
|
||||
return "<?php }{$m[7]}" . $this->_replaceVar($m[8]) . "{ ?>" . $m[9];
|
||||
return "<?php }{$m[7]}" . self::_replaceVar($m[8]) . "{ ?>" . $m[9];
|
||||
}
|
||||
if($mm[4])
|
||||
{
|
||||
|
|
@ -827,7 +827,7 @@ class TemplateHandler
|
|||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
function _getRelativeDir($path)
|
||||
private function _getRelativeDir($path)
|
||||
{
|
||||
$_path = $path;
|
||||
|
||||
|
|
@ -865,7 +865,7 @@ class TemplateHandler
|
|||
* @param string $php
|
||||
* @return string $__Context->varname
|
||||
*/
|
||||
function _replaceVar($php)
|
||||
private static function _replaceVar($php)
|
||||
{
|
||||
if(!strlen($php))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -99,7 +99,6 @@ $GLOBALS['RX_AUTOLOAD_FILE_MAP'] = array_change_key_case(array(
|
|||
'ModuleObject' => 'classes/module/ModuleObject.class.php',
|
||||
'Object' => 'classes/object/Object.class.php',
|
||||
'PageHandler' => 'classes/page/PageHandler.class.php',
|
||||
'Crypto' => 'classes/security/Crypto.class.php',
|
||||
'EmbedFilter' => 'classes/security/EmbedFilter.class.php',
|
||||
'IpFilter' => 'classes/security/IpFilter.class.php',
|
||||
'Password' => 'classes/security/Password.class.php',
|
||||
|
|
@ -145,8 +144,11 @@ $GLOBALS['RX_AUTOLOAD_FILE_MAP'] = array_change_key_case(array(
|
|||
'HintTableTag' => 'classes/xml/xmlquery/tags/table/HintTableTag.class.php',
|
||||
'TableTag' => 'classes/xml/xmlquery/tags/table/TableTag.class.php',
|
||||
'TablesTag' => 'classes/xml/xmlquery/tags/table/TablesTag.class.php',
|
||||
'Bmp' => 'common/libraries/bmp.php',
|
||||
'Ftp' => 'common/libraries/ftp.php',
|
||||
'Tar' => 'common/libraries/tar.php',
|
||||
'CryptoCompat' => 'common/libraries/cryptocompat.php',
|
||||
'VendorPass' => 'common/libraries/vendorpass.php',
|
||||
), CASE_LOWER);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -18,18 +18,18 @@ define('RX_TIME', intval(RX_MICROTIME));
|
|||
/**
|
||||
* RX_BASEDIR is the SERVER-SIDE absolute path of Rhymix (with trailing slash).
|
||||
*/
|
||||
define('RX_BASEDIR', dirname(__DIR__) . '/');
|
||||
define('RX_BASEDIR', str_replace('\\', '/', dirname(__DIR__)) . '/');
|
||||
|
||||
/**
|
||||
* RX_BASEURL is the CLIENT-SIDE absolute path of Rhymix (with trailing slash, relative to the document root).
|
||||
*/
|
||||
if (isset($_SERVER['DOCUMENT_ROOT']) && !strncmp(RX_BASEDIR, $_SERVER['DOCUMENT_ROOT'], strlen($_SERVER['DOCUMENT_ROOT'])))
|
||||
if (isset($_SERVER['DOCUMENT_ROOT']) && !strncmp(RX_BASEDIR, str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']), strlen($_SERVER['DOCUMENT_ROOT'])))
|
||||
{
|
||||
define('RX_BASEURL', rtrim(substr(RX_BASEDIR, strlen($_SERVER['DOCUMENT_ROOT'])), '/') . '/');
|
||||
}
|
||||
elseif (isset($_SERVER['PHP_SELF']) && ($len = strlen($_SERVER['PHP_SELF'])) && $len >= 10 && substr($_SERVER['PHP_SELF'], $len - 10) === '/index.php')
|
||||
{
|
||||
define('RX_BASEURL', rtrim(substr($_SERVER['PHP_SELF'], 0, $len - 10), '/') . '/');
|
||||
define('RX_BASEURL', rtrim(str_replace('\\', '/', substr($_SERVER['PHP_SELF'], 0, $len - 10)), '/') . '/');
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -119,8 +119,8 @@ define('__XE_VERSION_ALPHA__', false);
|
|||
define('__XE_VERSION_BETA__', false);
|
||||
define('__XE_VERSION_RC__', false);
|
||||
define('__XE_VERSION_STABLE__', true);
|
||||
define('__XE_MIN_PHP_VERSION__', '5.3.0');
|
||||
define('__XE_RECOMMEND_PHP_VERSION__', '5.5.0');
|
||||
define('__XE_MIN_PHP_VERSION__', '5.3.3');
|
||||
define('__XE_RECOMMEND_PHP_VERSION__', '5.5.9');
|
||||
define('__ZBXE__', true);
|
||||
define('__ZBXE_VERSION__', RX_VERSION);
|
||||
define('_XE_PATH_', RX_BASEDIR);
|
||||
|
|
@ -140,3 +140,6 @@ define('LOWER', 'abcdefghijklmnopqrstuvwxyz');
|
|||
define('CR', "\r");
|
||||
define('CRLF', "\r\n");
|
||||
define('LF', "\n");
|
||||
define('FOLLOW_REQUEST_SSL', 0);
|
||||
define('ENFORCE_SSL', 1);
|
||||
define('RELEASE_SSL', 2);
|
||||
|
|
|
|||
|
|
@ -6,6 +6,428 @@
|
|||
* Copyright (c) Rhymix Developers and Contributors
|
||||
*/
|
||||
|
||||
|
||||
/** Get the first value of an array.
|
||||
*
|
||||
* @param array $array The input array
|
||||
* @return mixed
|
||||
*/
|
||||
function array_first(array $array)
|
||||
{
|
||||
return reset($array);
|
||||
}
|
||||
|
||||
/** Get the first key of an array.
|
||||
*
|
||||
* @param array $array The input array
|
||||
* @return mixed
|
||||
*/
|
||||
function array_first_key(array $array)
|
||||
{
|
||||
reset($array);
|
||||
return key($array);
|
||||
}
|
||||
|
||||
/** Get the last value of an array.
|
||||
*
|
||||
* @param array $array The input array
|
||||
* @return mixed
|
||||
*/
|
||||
function array_last(array $array)
|
||||
{
|
||||
return end($array);
|
||||
}
|
||||
|
||||
/** Get the last key of an array.
|
||||
*
|
||||
* @param array $array The input array
|
||||
* @return mixed
|
||||
*/
|
||||
function array_last_key(array $array)
|
||||
{
|
||||
end($array);
|
||||
return key($array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Flatten a multi-dimensional array into a one-dimensional array.
|
||||
* Based on util.php <https://github.com/brandonwamboldt/utilphp>
|
||||
* Contributed by Theodore R. Smith of PHP Experts, Inc. <http://www.phpexperts.pro/>
|
||||
*
|
||||
* @param array $array The array to flatten
|
||||
* @param bool $preserve_keys Whether or not to preserve array keys (default: true)
|
||||
* @return array
|
||||
*/
|
||||
function array_flatten(array $array, $preserve_keys = true)
|
||||
{
|
||||
$result = array();
|
||||
array_walk_recursive($array, function($value, $key) use(&$result, $preserve_keys) {
|
||||
if ($preserve_keys && !is_int($key))
|
||||
{
|
||||
$result[$key] = $value;
|
||||
}
|
||||
else
|
||||
{
|
||||
$result[] = $value;
|
||||
}
|
||||
});
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the base name of a class name (without namespaces).
|
||||
* Based on Laravel helper function <http://laravel.com/docs/5.0/helpers>
|
||||
*
|
||||
* @param string|object $class The class name
|
||||
* @return string
|
||||
*/
|
||||
function class_basename($class)
|
||||
{
|
||||
return basename(str_replace('\\', '/', is_object($class) ? get_class($class) : $class));
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is a shortcut to htmlspecialchars().
|
||||
*
|
||||
* @param string $str The string to escape
|
||||
* @param bool $double_escape Set this to false to skip symbols that are already escaped (default: true)
|
||||
* @return string
|
||||
*/
|
||||
function escape($str, $double_escape = true)
|
||||
{
|
||||
$flags = defined('ENT_SUBSTITUTE') ? (ENT_QUOTES | ENT_SUBSTITUTE) : (ENT_QUOTES | ENT_IGNORE);
|
||||
return htmlspecialchars($str, $flags, 'UTF-8', $double_escape);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function escapes a string to be used in a CSS property.
|
||||
*
|
||||
* @param string $str The string to escape
|
||||
* @return string
|
||||
*/
|
||||
function escape_css($str)
|
||||
{
|
||||
return preg_replace('/[^a-zA-Z0-9_.#\/-]/', '', $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function escapes a string to be used in a JavaScript string literal.
|
||||
*
|
||||
* @param string $str The string to escape
|
||||
* @return string
|
||||
*/
|
||||
function escape_js($str)
|
||||
{
|
||||
$flags = JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT;
|
||||
if (defined('JSON_UNESCAPED_UNICODE')) $flags = $flags | JSON_UNESCAPED_UNICODE;
|
||||
$str = json_encode((string)$str, $flags);
|
||||
return substr($str, 1, strlen($str) - 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function escapes a string to be used in a 'single-quoted' PHP string literal.
|
||||
* Null bytes are removed.
|
||||
*
|
||||
* @param string $str The string to escape
|
||||
* @return string
|
||||
*/
|
||||
function escape_sqstr($str)
|
||||
{
|
||||
return str_replace(array('\\0', '\\"'), array('', '"'), addslashes($str));
|
||||
}
|
||||
|
||||
/**
|
||||
* This function escapes a string to be used in a "double-quoted" PHP string literal.
|
||||
* Null bytes are removed.
|
||||
*
|
||||
* @param string $str The string to escape
|
||||
* @return string
|
||||
*/
|
||||
function escape_dqstr($str)
|
||||
{
|
||||
return str_replace(array('\\0', "\\'", '$'), array('', "'", '\\$'), addslashes($str));
|
||||
}
|
||||
|
||||
/**
|
||||
* This function splits a string into an array, but allows the delimter to be escaped.
|
||||
* For example, 'A|B\|C|D' will be split into 'A', 'B|C', and 'D'
|
||||
* because the bar between B and C is escaped.
|
||||
*
|
||||
* @param string $delimiter The delimiter
|
||||
* @param string $str The string to split
|
||||
* @param int $limit The maximum number of items to return, 0 for unlimited (default: 0)
|
||||
* @param string $escape_char The escape character (default: backslash)
|
||||
* @return array
|
||||
*/
|
||||
function explode_with_escape($delimiter, $str, $limit = 0, $escape_char = '\\')
|
||||
{
|
||||
if ($limit < 1) $limit = null;
|
||||
$result = array();
|
||||
$split = preg_split('/(?<!' . preg_quote($escape_char, '/') . ')' . preg_quote($delimiter, '/') . '/', $str, $limit);
|
||||
foreach ($split as $piece)
|
||||
{
|
||||
if (trim($piece) !== '')
|
||||
{
|
||||
$result[] = trim(str_replace($escape_char . $delimiter, $delimiter, $piece));
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if $haystack starts with $needle, and false otherwise.
|
||||
*
|
||||
* @param string $needle The needle
|
||||
* @param string $haystack The haystack
|
||||
* @param bool $case_sensitive Whether the search should be case-sensitive (default: true)
|
||||
* @return bool
|
||||
*/
|
||||
function starts_with($needle, $haystack, $case_sensitive = true)
|
||||
{
|
||||
if (strlen($needle) > strlen($haystack)) return false;
|
||||
if ($case_sensitive)
|
||||
{
|
||||
return !strncmp($needle, $haystack, strlen($needle));
|
||||
}
|
||||
else
|
||||
{
|
||||
!strncasecmp($needle, $haystack, strlen($needle));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if $haystack ends with $needle, and false otherwise.
|
||||
*
|
||||
* @param string $needle The needle
|
||||
* @param string $haystack The haystack
|
||||
* @param bool $case_sensitive Whether the search should be case-sensitive (default: true)
|
||||
* @return bool
|
||||
*/
|
||||
function ends_with($needle, $haystack, $case_sensitive = true)
|
||||
{
|
||||
if (strlen($needle) > strlen($haystack)) return false;
|
||||
if ($case_sensitive)
|
||||
{
|
||||
return (substr($haystack, -strlen($needle)) === $needle);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (strtolower(substr($haystack, -strlen($needle))) === strtolower($needle));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if $haystack contains $needle, and false otherwise.
|
||||
*
|
||||
* @param string $needle The needle
|
||||
* @param string $haystack The haystack
|
||||
* @param bool $case_sensitive Whether the search should be case-sensitive (default: true)
|
||||
* @return bool
|
||||
*/
|
||||
function contains($needle, $haystack, $case_sensitive = true)
|
||||
{
|
||||
return $case_sensitive ? (strpos($haystack, $needle) !== false) : (stripos($haystack, $needle) !== false);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns true if $needle is between $min and $max, and false otherwise.
|
||||
* Non-numeric values are compared according to PHP defaults.
|
||||
*
|
||||
* @param mixed $needle The needle
|
||||
* @param mixed $min The minimum value
|
||||
* @param mixed $max The maximum value
|
||||
* @param bool $exclusive Set this to true to exclude endpoints (default: false)
|
||||
* @return bool
|
||||
*/
|
||||
function is_between($needle, $min, $max, $exclusive = false)
|
||||
{
|
||||
if ($exclusive)
|
||||
{
|
||||
return ($needle > $min && $needle < $max);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ($needle >= $min && $needle <= $max);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function restricts $input to be between $min and $max.
|
||||
* All values less than $min are converted to $min, and all values greater than $max are converted to $max.
|
||||
* Non-numeric values are compared according to PHP defaults.
|
||||
*
|
||||
* @param mixed $input The value to convert
|
||||
* @param mixed $min The minimum value
|
||||
* @param mixed $max The maximum value
|
||||
* @return mixed
|
||||
*/
|
||||
function force_range($input, $min, $max)
|
||||
{
|
||||
if ($input < $min) $input = $min;
|
||||
if ($input > $max) $input = $max;
|
||||
return $input;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function encodes a string with base64, using a URL-safe character set.
|
||||
*
|
||||
* @param string $str The string to encode
|
||||
* @return string
|
||||
*/
|
||||
function base64_encode_urlsafe($str)
|
||||
{
|
||||
return strtr(rtrim(base64_encode($str), '='), '+/', '-_');
|
||||
}
|
||||
|
||||
/**
|
||||
* This function decodes a string with base64, using a URL-safe character set.
|
||||
*
|
||||
* @param string $str The string to decode
|
||||
* @return string
|
||||
*/
|
||||
function base64_decode_urlsafe($str)
|
||||
{
|
||||
return @base64_decode(str_pad(strtr($str, '-_', '+/'), ceil(strlen($str) / 4) * 4, '=', STR_PAD_RIGHT));
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert hexadecimal color codes to an array of R, G, B values.
|
||||
* This function can handle both 6-digit and 3-digit notations, optionally prefixed with '#'.
|
||||
* If the color code is illegal, this function will return all nulls.
|
||||
*
|
||||
* @param string $hex The color to convert
|
||||
* @return array
|
||||
*/
|
||||
function hex2rgb($hex)
|
||||
{
|
||||
$hex = ltrim($hex, '#');
|
||||
if (strlen($hex) == 3)
|
||||
{
|
||||
$r = hexdec(substr($hex, 0, 1) . substr($hex, 0, 1));
|
||||
$g = hexdec(substr($hex, 1, 1) . substr($hex, 1, 1));
|
||||
$b = hexdec(substr($hex, 2, 1) . substr($hex, 2, 1));
|
||||
}
|
||||
elseif (strlen($hex) == 6)
|
||||
{
|
||||
$r = hexdec(substr($hex, 0, 2));
|
||||
$g = hexdec(substr($hex, 2, 2));
|
||||
$b = hexdec(substr($hex, 4, 2));
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = $g = $b = null;
|
||||
}
|
||||
return array($r, $g, $b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of R, G, B values to hexadecimal color codes.
|
||||
* If the RGB values are illegal, this function will return #000000.
|
||||
*
|
||||
* @param array $rgb The color to convert
|
||||
* @param bool $hash_prefix Whether or not to prefix the result with '#' (default: true)
|
||||
* @return string
|
||||
*/
|
||||
function rgb2hex(array $rgb, $hash_prefix = true)
|
||||
{
|
||||
if (!isset($rgb[0]) || !isset($rgb[1]) || !isset($rgb[2]) || $rgb[0] > 255 || $rgb[1] > 255 || $rgb[2] > 255)
|
||||
{
|
||||
return '#000000';
|
||||
}
|
||||
$hex = $hash_prefix ? '#' : '';
|
||||
$hex .= str_pad(dechex(max(0, $rgb[0])), 2, '0', STR_PAD_LEFT);
|
||||
$hex .= str_pad(dechex(max(0, $rgb[1])), 2, '0', STR_PAD_LEFT);
|
||||
$hex .= str_pad(dechex(max(0, $rgb[2])), 2, '0', STR_PAD_LEFT);
|
||||
return $hex;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function includes another file in a clean scope.
|
||||
* This is useful if the included file tries to define global variables.
|
||||
*
|
||||
* @param string $filename The name of the file to include
|
||||
* @return mixed
|
||||
*/
|
||||
function include_in_clean_scope($filename)
|
||||
{
|
||||
return (include $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function includes another file while ignoring all errors inside of it.
|
||||
*
|
||||
* @param string $filename The name of the file to include
|
||||
* @return mixed
|
||||
*/
|
||||
function include_and_ignore_errors($filename)
|
||||
{
|
||||
error_reporting(0);
|
||||
$result = (include $filename);
|
||||
error_reporting(~0);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function includes another file while ignoring all output.
|
||||
*
|
||||
* @param string $filename The name of the file to include
|
||||
* @return mixed
|
||||
*/
|
||||
function include_and_ignore_output($filename)
|
||||
{
|
||||
ob_start();
|
||||
$result = (include $filename);
|
||||
ob_end_clean();
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Polyfill for hex2bin() which does not exist in PHP 5.3.
|
||||
*
|
||||
* @param string $hex The hexadecimal string to convert to binary
|
||||
* @return string
|
||||
*/
|
||||
if (!function_exists('hex2bin'))
|
||||
{
|
||||
function hex2bin($hex)
|
||||
{
|
||||
if (strlen($hex) % 2) $hex = '0' . $hex;
|
||||
return pack('H*', $hex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts any value to either true or false.
|
||||
* Based on util.php <https://github.com/brandonwamboldt/utilphp>
|
||||
*
|
||||
* @param string $input The input value
|
||||
* @return bool
|
||||
*/
|
||||
function tobool($input)
|
||||
{
|
||||
if (preg_match('/^(1|[ty].*|on|oui|si|vrai|aye)$/i', $input)) return true;
|
||||
if (preg_match('/^(0|[fn].*|off)$/i', $input)) return false;
|
||||
return (bool)$input;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given string contains valid UTF-8.
|
||||
*
|
||||
* @param string $str The input string
|
||||
* @return bool
|
||||
*/
|
||||
function utf8_check($str)
|
||||
{
|
||||
if (function_exists('mb_check_encoding'))
|
||||
{
|
||||
return mb_check_encoding($str, 'UTF-8');
|
||||
}
|
||||
else
|
||||
{
|
||||
return ($str === @iconv('UTF-8', 'UTF-8', $str));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode UTF-8 characters outside of the Basic Multilingual Plane in the &#xxxxxx format.
|
||||
* This allows emoticons and other characters to be stored in MySQL without utf8mb4 support.
|
||||
|
|
@ -21,3 +443,28 @@ function utf8_mbencode($str)
|
|||
return '&#x' . dechex($codepoint) . ';';
|
||||
}, $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function replaces all whitespace characters with a single regular space (0x20).
|
||||
* Unicode whitespace characters are also replaced.
|
||||
*
|
||||
* @param string $str The input string
|
||||
* @param bool $multiline Set this to true to permit newlines inside the string (default: false)
|
||||
* @return string
|
||||
*/
|
||||
function utf8_normalize_spaces($str, $multiline = false)
|
||||
{
|
||||
return $multiline ? preg_replace('/((?!\x0A)[\pZ\pC])+/u', ' ', $str) : preg_replace('/[\pZ\pC]+/u', ' ', $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function trims all space from the beginning and end of a string.
|
||||
* Unicode whitespace characters are also trimmed.
|
||||
*
|
||||
* @param string $str The input string
|
||||
* @return string
|
||||
*/
|
||||
function utf8_trim($str)
|
||||
{
|
||||
return preg_replace('/^[\s\pZ\pC]+|[\s\pZ\pC]+$/u', '', $str);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -476,7 +476,12 @@ function zbxe_folder_close(id) {
|
|||
* popup_layout 에서 window.onload 시 자동 요청됨.
|
||||
**/
|
||||
function setFixedPopupSize() {
|
||||
var $ = jQuery, $win = $(window), $pc = $('body>.popup'), w, h, dw, dh, offset;
|
||||
var $ = jQuery, $win = $(window), $pc = $('body>.popup'), w, h, dw, dh, offset, scbw;
|
||||
|
||||
var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
|
||||
widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
|
||||
$outer.remove();
|
||||
scbw = 100 - widthWithScroll;
|
||||
|
||||
offset = $pc.css({overflow:'scroll'}).offset();
|
||||
|
||||
|
|
@ -485,13 +490,18 @@ function setFixedPopupSize() {
|
|||
|
||||
if(w < 800) w = 800 + offset.left*2;
|
||||
|
||||
|
||||
dw = $win.width();
|
||||
dh = $win.height();
|
||||
|
||||
if(w != dw) window.resizeBy(w - dw, 0);
|
||||
if(h != dh) window.resizeBy(0, h - dh);
|
||||
// Window 의 너비나 높이는 스크린의 너비나 높이보다 클 수 없다. 스크린의 너비나 높이와 내용의 너비나 높이를 비교해서 최소값을 이용한다.
|
||||
if(Math.min(w, window.screen.availWidth) != dw) window.resizeBy(Math.min(w, window.screen.availWidth) - dw, 0);
|
||||
if(Math.min(h, window.screen.availHeight-100) != dh) window.resizeBy(0, Math.min(h, window.screen.availHeight-100) - dh);
|
||||
|
||||
$pc.width(w-offset.left*2).css({overflow:'',height:''});
|
||||
$pc.width(Math.min(w, window.screen.availWidth)-offset.left*2).css({overflow:'',height:''});
|
||||
if(Math.min(h, window.screen.availHeight-100) === window.screen.availHeight-100) {
|
||||
$pc.width(Math.min(w, window.screen.availWidth)-offset.left*2-scbw).css({overflow:'',height:''});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -3014,6 +3014,10 @@
|
|||
<value xml:lang="vi"><![CDATA[Đã bình chọn.]]></value>
|
||||
<value xml:lang="mn"><![CDATA[Санал болгогдсон]]></value>
|
||||
</item>
|
||||
<item name="success_voted_canceled">
|
||||
<value xml:lang="ko"><![CDATA[추천이 취소되었습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[]]></value>
|
||||
</item>
|
||||
<item name="success_blamed">
|
||||
<value xml:lang="ko"><![CDATA[비추천했습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Not recommended successfully.]]></value>
|
||||
|
|
@ -3028,6 +3032,10 @@
|
|||
<value xml:lang="vi"><![CDATA[Đã phê bình.]]></value>
|
||||
<value xml:lang="mn"><![CDATA[Санал болгогдоогүй]]></value>
|
||||
</item>
|
||||
<item name="success_blamed_canceled">
|
||||
<value xml:lang="ko"><![CDATA[비추천이 취소되었습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[]]></value>
|
||||
</item>
|
||||
<item name="success_copied">
|
||||
<value xml:lang="ko"><![CDATA[복사했습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Copied successfully.]]></value>
|
||||
|
|
@ -3622,16 +3630,16 @@
|
|||
<item name="invalid_email">
|
||||
<value xml:lang="ko"><![CDATA[%s의 값은 올바른 메일 주소가 아닙니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[%s is NOT a valid email address.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[%sのメール形式が正しくありません。(例: developers@xepressengine.com)]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[%s格式有误。(例:developers@xpressengine.com)]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[%s E-mail格式有誤。(例:developers@xpressengine.com)]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Le format de %s est invalide. ex) developers@xpressengine.com]]></value>
|
||||
<value xml:lang="de"><![CDATA[% s ist eine ungültige Mail. ex) developers@xpressengine.com]]></value>
|
||||
<value xml:lang="ru"><![CDATA[The format of %s is invalid. ex) developers@xpressengine.com]]></value>
|
||||
<value xml:lang="es"><![CDATA[Formato email inválido en el %s(ej. developers@xpressengine.com)]]></value>
|
||||
<value xml:lang="tr"><![CDATA[%s biçimi geçersiz. örn.) developers@xpressengine.com]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Định dạng của %s không hợp lệ. Ví dụ: emailname@yahoo.com]]></value>
|
||||
<value xml:lang="mn"><![CDATA[%s-ын хэлбэрийг буруу оруулсан байна.(Жнь: developers@xpressengine.com)]]></value>
|
||||
<value xml:lang="jp"><![CDATA[%sのメール形式が正しくありません。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[%s格式有误。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[%s E-mail格式有誤。)]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Le format de %s est invalide.]]></value>
|
||||
<value xml:lang="de"><![CDATA[% s ist eine ungültige Mail.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[The format of %s is invalid.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Formato email inválido en el %s]]></value>
|
||||
<value xml:lang="tr"><![CDATA[%s biçimi geçersiz.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Định dạng của %s không hợp lệ.]]></value>
|
||||
<value xml:lang="mn"><![CDATA[%s-ын хэлбэрийг буруу оруулсан байна.]]></value>
|
||||
</item>
|
||||
<item name="invalid_userid">
|
||||
<value xml:lang="ko"><![CDATA[%s의 값은 영문, 숫자, _만 가능하며 첫 글자는 영문이어야 합니다.]]></value>
|
||||
|
|
@ -3662,25 +3670,30 @@
|
|||
<value xml:lang="mn"><![CDATA[%s-ын хэлбэр буруу байна. . Латин vсэг, тоо болон '_'-р оруулж болох бeгeeд эхлэл нь vсэг байх шаардлагатай. ]]></value>
|
||||
</item>
|
||||
<item name="invalid_homepage">
|
||||
<value xml:lang="ko"><![CDATA[%s의 형식이 잘못되었습니다.(예: http://www.xpressengine.com)]]></value>
|
||||
<value xml:lang="en"><![CDATA[The format of %s is invalid. e.g.) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="jp"><![CDATA[%sの形式が正しくありません。(例: http://www.xepressengine.com)]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[%s格式有误。(例: http://xpressengine.com/)]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[%s格式有誤。(例: http://xpressengine.com/)]]></value>
|
||||
<value xml:lang="fr"><![CDATA[La format de %s n'est pas convenable. ex) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="de"><![CDATA[Das Format von% s ist ungültig. Z.B. http://xpressengine.com/]]></value>
|
||||
<value xml:lang="es"><![CDATA[Formato url inválido en el %s(ej: http://xpressengine.com/)]]></value>
|
||||
<value xml:lang="tr"><![CDATA[%s biçimi geçersiz. örn.) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Định dạng của %s không hợp lệ. Đúng sẽ là: http://xpressengine.vn hoặc http://www.xpressengine.vn]]></value>
|
||||
<value xml:lang="mn"><![CDATA[%s-ын хэлбэр буруу байна..(Жнь: http://xpressengine.com/)]]></value>
|
||||
<value xml:lang="ko"><![CDATA[%s의 형식이 잘못되었습니다.(예: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="en"><![CDATA[The format of %s is invalid. e.g.) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="jp"><![CDATA[%sの形式が正しくありません。(例: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[%s格式有误。(例: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[%s格式有誤。(例: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="fr"><![CDATA[La format de %s n'est pas convenable. ex) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="de"><![CDATA[Das Format von% s ist ungültig. Z.B. https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="es"><![CDATA[Formato url inválido en el %s(ej: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="tr"><![CDATA[%s biçimi geçersiz. örn.) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Định dạng của %s không hợp lệ. Đúng sẽ là: https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="mn"><![CDATA[%s-ын хэлбэр буруу байна..(Жнь: https://www.rhymix.org/)]]></value>
|
||||
</item>
|
||||
<item name="invalid_url">
|
||||
<value xml:lang="ko"><![CDATA[%s의 형식이 잘못되었습니다.(예: http://www.xpressengine.com)]]></value>
|
||||
<value xml:lang="en"><![CDATA[The format of %s is invalid. e.g.) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="jp"><![CDATA[%sの形式が正しくありません。例) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[%s 格式错误。 例)http://xpressengine.com/]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[%s 格式錯誤。 例) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="tr"><![CDATA[%s formatı geçersizdir.) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="ko"><![CDATA[%s의 형식이 잘못되었습니다.(예: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="en"><![CDATA[The format of %s is invalid. e.g.) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="jp"><![CDATA[%sの形式が正しくありません。(例: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[%s格式有误。(例: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[%s格式有誤。(例: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="fr"><![CDATA[La format de %s n'est pas convenable. ex) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="de"><![CDATA[Das Format von% s ist ungültig. Z.B. https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="es"><![CDATA[Formato url inválido en el %s(ej: https://www.rhymix.org/)]]></value>
|
||||
<value xml:lang="tr"><![CDATA[%s biçimi geçersiz. örn.) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Định dạng của %s không hợp lệ. Đúng sẽ là: https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="mn"><![CDATA[%s-ын хэлбэр буруу байна..(Жнь: https://www.rhymix.org/)]]></value>
|
||||
</item>
|
||||
<item name="invalid_korean">
|
||||
<value xml:lang="ko"><![CDATA[%s의 형식이 잘못되었습니다. 한글로만 입력해야 합니다.]]></value>
|
||||
|
|
|
|||
|
|
@ -457,9 +457,7 @@ function getFullSiteUrl()
|
|||
*/
|
||||
function getCurrentPageUrl()
|
||||
{
|
||||
$protocol = $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://';
|
||||
$url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
return htmlspecialchars($url, ENT_COMPAT, 'UTF-8', FALSE);
|
||||
return escape((RX_SSL ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1125,8 +1123,11 @@ function removeSrcHack($match)
|
|||
}
|
||||
}
|
||||
|
||||
$filter_arrts = array('style', 'src', 'href');
|
||||
//Remove ACT URL (CSRF)
|
||||
$except_act = array('procFileDownload');
|
||||
$block_act = array('dispMemberLogout', 'dispLayoutPreview');
|
||||
|
||||
$filter_arrts = array('style', 'src', 'href');
|
||||
if($tag === 'object') array_push($filter_arrts, 'data');
|
||||
if($tag === 'param') array_push($filter_arrts, 'value');
|
||||
|
||||
|
|
@ -1137,9 +1138,16 @@ function removeSrcHack($match)
|
|||
$attr_value = rawurldecode($attrs[$attr]);
|
||||
$attr_value = htmlspecialchars_decode($attr_value, ENT_COMPAT);
|
||||
$attr_value = preg_replace('/\s+|[\t\n\r]+/', '', $attr_value);
|
||||
if(preg_match('@(\?|&|;)(act=)@i', $attr_value))
|
||||
|
||||
preg_match('@(\?|&|;)act=(disp|proc)([^&]*)@i', $attr_value, $actmatch);
|
||||
$url_action = $actmatch[2].$actmatch[3];
|
||||
|
||||
if(!empty($url_action) && !in_array($url_action, $except_act))
|
||||
{
|
||||
unset($attrs[$attr]);
|
||||
if($actmatch[2] == 'proc' || in_array($url_action, $block_act))
|
||||
{
|
||||
unset($attrs[$attr]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1179,63 +1187,17 @@ function removeSrcHack($match)
|
|||
return "<{$match[1]}{$tag}{$attr}{$match[4]}>";
|
||||
}
|
||||
|
||||
// convert hexa value to RGB
|
||||
/**
|
||||
* Convert hexa value to RGB
|
||||
*
|
||||
* @param string $hexstr
|
||||
* @return array
|
||||
*/
|
||||
if(!function_exists('hexrgb'))
|
||||
{
|
||||
/**
|
||||
* Convert hexa value to RGB
|
||||
*
|
||||
* @param string $hexstr
|
||||
* @return array
|
||||
*/
|
||||
function hexrgb($hex)
|
||||
{
|
||||
$hex = ltrim($hex, '#');
|
||||
if(strlen($hex) == 3)
|
||||
{
|
||||
$r = hexdec(substr($hex, 0, 1) . substr($hex, 0, 1));
|
||||
$g = hexdec(substr($hex, 1, 1) . substr($hex, 1, 1));
|
||||
$b = hexdec(substr($hex, 2, 1) . substr($hex, 2, 1));
|
||||
}
|
||||
elseif(strlen($hex) == 6)
|
||||
{
|
||||
$r = hexdec(substr($hex, 0, 2));
|
||||
$g = hexdec(substr($hex, 2, 2));
|
||||
$b = hexdec(substr($hex, 4, 2));
|
||||
}
|
||||
else
|
||||
{
|
||||
$r = $g = $b = null;
|
||||
}
|
||||
return array('red' => $r, 'green' => $g, 'blue' => $b, 'r' => $r, 'g' => $g, 'b' => $b);
|
||||
}
|
||||
}
|
||||
|
||||
// convert RGB value to hexa
|
||||
if(!function_exists('rgbhex'))
|
||||
{
|
||||
/**
|
||||
* convert RGB value to hexa
|
||||
*
|
||||
* @param array $rgb
|
||||
* @param bool $hash_prefix
|
||||
* @return string
|
||||
*/
|
||||
function rgbhex(array $rgb, $hash_prefix = true)
|
||||
{
|
||||
if(!isset($rgb['r']) && !isset($rgb['g']) && !isset($rgb['b']) && count($rgb) >= 3)
|
||||
{
|
||||
list($rgb['r'], $rgb['g'], $rgb['b']) = $rgb;
|
||||
}
|
||||
if(!isset($rgb['r']) || !isset($rgb['g']) || !isset($rgb['b']) || $rgb['r'] > 255 || $rgb['g'] > 255 || $rgb['b'] > 255)
|
||||
{
|
||||
return '#000000';
|
||||
}
|
||||
$hex = $hash_prefix ? '#' : '';
|
||||
$hex .= str_pad(dechex(max(0, $rgb['r'])), 2, '0', STR_PAD_LEFT);
|
||||
$hex .= str_pad(dechex(max(0, $rgb['g'])), 2, '0', STR_PAD_LEFT);
|
||||
$hex .= str_pad(dechex(max(0, $rgb['b'])), 2, '0', STR_PAD_LEFT);
|
||||
return $hex;
|
||||
return hex2rgb($hex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1249,36 +1211,7 @@ if(!function_exists('rgbhex'))
|
|||
*/
|
||||
function mysql_pre4_hash_password($password)
|
||||
{
|
||||
$nr = 1345345333;
|
||||
$add = 7;
|
||||
$nr2 = 0x12345671;
|
||||
|
||||
settype($password, "string");
|
||||
|
||||
for($i = 0; $i < strlen($password); $i++)
|
||||
{
|
||||
if($password[$i] == ' ' || $password[$i] == '\t')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$tmp = ord($password[$i]);
|
||||
$nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8);
|
||||
$nr2 += ($nr2 << 8) ^ $nr;
|
||||
$add += $tmp;
|
||||
}
|
||||
$result1 = sprintf("%08lx", $nr & ((1 << 31) - 1));
|
||||
$result2 = sprintf("%08lx", $nr2 & ((1 << 31) - 1));
|
||||
|
||||
if($result1 == '80000000')
|
||||
{
|
||||
$nr += 0x80000000;
|
||||
}
|
||||
if($result2 == '80000000')
|
||||
{
|
||||
$nr2 += 0x80000000;
|
||||
}
|
||||
|
||||
return sprintf("%08lx%08lx", $nr, $nr2);
|
||||
return VendorPass::mysql_old_password($password);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1288,12 +1221,7 @@ function mysql_pre4_hash_password($password)
|
|||
*/
|
||||
function getScriptPath()
|
||||
{
|
||||
static $url = NULL;
|
||||
if($url == NULL)
|
||||
{
|
||||
$url = str_ireplace('/tools/', '/', preg_replace('/index.php$/i', '', str_replace('\\', '/', $_SERVER['SCRIPT_NAME'])));
|
||||
}
|
||||
return $url;
|
||||
return RX_BASEURL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
257
common/libraries/bmp.php
Normal file
257
common/libraries/bmp.php
Normal file
|
|
@ -0,0 +1,257 @@
|
|||
<?php
|
||||
// Read 1,4,8,24,32bit BMP files
|
||||
// Save 24bit BMP files
|
||||
|
||||
// Author: de77
|
||||
// Licence: MIT
|
||||
// Webpage: de77.com
|
||||
// Article about this class: http://de77.com/php/read-and-write-bmp-in-php-imagecreatefrombmp-imagebmp
|
||||
// First-version: 07.02.2010
|
||||
// Version: 21.08.2010
|
||||
|
||||
// Modified by Kijin Sung, April 6, 2013: Remove die() and global functions
|
||||
|
||||
class BMP
|
||||
{
|
||||
public static function imagebmp(&$img, $filename = false)
|
||||
{
|
||||
$wid = imagesx($img);
|
||||
$hei = imagesy($img);
|
||||
$wid_pad = str_pad('', $wid % 4, "\0");
|
||||
|
||||
$size = 54 + ($wid + $wid_pad) * $hei * 3; //fixed
|
||||
|
||||
//prepare & save header
|
||||
$header['identifier'] = 'BM';
|
||||
$header['file_size'] = self::dword($size);
|
||||
$header['reserved'] = self::dword(0);
|
||||
$header['bitmap_data'] = self::dword(54);
|
||||
$header['header_size'] = self::dword(40);
|
||||
$header['width'] = self::dword($wid);
|
||||
$header['height'] = self::dword($hei);
|
||||
$header['planes'] = self::word(1);
|
||||
$header['bits_per_pixel'] = self::word(24);
|
||||
$header['compression'] = self::dword(0);
|
||||
$header['data_size'] = self::dword(0);
|
||||
$header['h_resolution'] = self::dword(0);
|
||||
$header['v_resolution'] = self::dword(0);
|
||||
$header['colors'] = self::dword(0);
|
||||
$header['important_colors'] = self::dword(0);
|
||||
|
||||
if ($filename)
|
||||
{
|
||||
$f = fopen($filename, "wb");
|
||||
foreach ($header AS $h)
|
||||
{
|
||||
fwrite($f, $h);
|
||||
}
|
||||
|
||||
//save pixels
|
||||
for ($y=$hei-1; $y>=0; $y--)
|
||||
{
|
||||
for ($x=0; $x<$wid; $x++)
|
||||
{
|
||||
$rgb = imagecolorat($img, $x, $y);
|
||||
fwrite($f, byte3($rgb));
|
||||
}
|
||||
fwrite($f, $wid_pad);
|
||||
}
|
||||
fclose($f);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($header AS $h)
|
||||
{
|
||||
echo $h;
|
||||
}
|
||||
|
||||
//save pixels
|
||||
for ($y=$hei-1; $y>=0; $y--)
|
||||
{
|
||||
for ($x=0; $x<$wid; $x++)
|
||||
{
|
||||
$rgb = imagecolorat($img, $x, $y);
|
||||
echo self::byte3($rgb);
|
||||
}
|
||||
echo $wid_pad;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function getimagesize($filename)
|
||||
{
|
||||
$f = fopen($filename, "rb");
|
||||
|
||||
//read header
|
||||
$header = fread($f, 54);
|
||||
$header = unpack( 'c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/' .
|
||||
'Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/'.
|
||||
'Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors', $header);
|
||||
|
||||
if ($header['identifier1'] != 66 or $header['identifier2'] != 77)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!in_array($header['bits_per_pixel'], array(24, 32, 8, 4, 1)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$bps = $header['bits_per_pixel']; //bits per pixel
|
||||
$wid2 = ceil(($bps/8 * $header['width']) / 4) * 4;
|
||||
$colors = pow(2, $bps);
|
||||
|
||||
$wid = $header['width'];
|
||||
$hei = $header['height'];
|
||||
|
||||
return array($wid, $hei, 'BMP');
|
||||
}
|
||||
|
||||
public static function imagecreatefrombmp($filename)
|
||||
{
|
||||
$f = fopen($filename, "rb");
|
||||
|
||||
//read header
|
||||
$header = fread($f, 54);
|
||||
$header = unpack( 'c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/' .
|
||||
'Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/'.
|
||||
'Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors', $header);
|
||||
|
||||
if ($header['identifier1'] != 66 or $header['identifier2'] != 77)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!in_array($header['bits_per_pixel'], array(24, 32, 8, 4, 1)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$bps = $header['bits_per_pixel']; //bits per pixel
|
||||
$wid2 = ceil(($bps/8 * $header['width']) / 4) * 4;
|
||||
$colors = pow(2, $bps);
|
||||
|
||||
$wid = $header['width'];
|
||||
$hei = $header['height'];
|
||||
|
||||
$img = imagecreatetruecolor($header['width'], $header['height']);
|
||||
|
||||
//read palette
|
||||
if ($bps < 9)
|
||||
{
|
||||
for ($i=0; $i<$colors; $i++)
|
||||
{
|
||||
$palette[] = self::undword(fread($f, 4));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($bps == 32)
|
||||
{
|
||||
imagealphablending($img, false);
|
||||
imagesavealpha($img, true);
|
||||
}
|
||||
$palette = array();
|
||||
}
|
||||
|
||||
//read pixels
|
||||
for ($y=$hei-1; $y>=0; $y--)
|
||||
{
|
||||
$row = fread($f, $wid2);
|
||||
$pixels = self::str_split2($row, $bps, $palette);
|
||||
for ($x=0; $x<$wid; $x++)
|
||||
{
|
||||
self::makepixel($img, $x, $y, $pixels[$x], $bps);
|
||||
}
|
||||
}
|
||||
fclose($f);
|
||||
|
||||
return $img;
|
||||
}
|
||||
|
||||
private static function str_split2($row, $bps, $palette)
|
||||
{
|
||||
switch ($bps)
|
||||
{
|
||||
case 32:
|
||||
case 24: return str_split($row, $bps/8);
|
||||
case 8: $out = array();
|
||||
$count = strlen($row);
|
||||
for ($i=0; $i<$count; $i++)
|
||||
{
|
||||
$out[] = $palette[ ord($row[$i]) ];
|
||||
}
|
||||
return $out;
|
||||
case 4: $out = array();
|
||||
$count = strlen($row);
|
||||
for ($i=0; $i<$count; $i++)
|
||||
{
|
||||
$roww = ord($row[$i]);
|
||||
$out[] = $palette[ ($roww & 240) >> 4 ];
|
||||
$out[] = $palette[ ($roww & 15) ];
|
||||
}
|
||||
return $out;
|
||||
case 1: $out = array();
|
||||
$count = strlen($row);
|
||||
for ($i=0; $i<$count; $i++)
|
||||
{
|
||||
$roww = ord($row[$i]);
|
||||
$out[] = $palette[ ($roww & 128) >> 7 ];
|
||||
$out[] = $palette[ ($roww & 64) >> 6 ];
|
||||
$out[] = $palette[ ($roww & 32) >> 5 ];
|
||||
$out[] = $palette[ ($roww & 16) >> 4 ];
|
||||
$out[] = $palette[ ($roww & 8) >> 3 ];
|
||||
$out[] = $palette[ ($roww & 4) >> 2 ];
|
||||
$out[] = $palette[ ($roww & 2) >> 1 ];
|
||||
$out[] = $palette[ ($roww & 1) ];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
private static function makepixel($img, $x, $y, $str, $bps)
|
||||
{
|
||||
switch ($bps)
|
||||
{
|
||||
case 32 : $a = ord($str[0]);
|
||||
$b = ord($str[1]);
|
||||
$c = ord($str[2]);
|
||||
$d = 256 - ord($str[3]); //TODO: gives imperfect results
|
||||
$pixel = $d*256*256*256 + $c*256*256 + $b*256 + $a;
|
||||
imagesetpixel($img, $x, $y, $pixel);
|
||||
break;
|
||||
case 24 : $a = ord($str[0]);
|
||||
$b = ord($str[1]);
|
||||
$c = ord($str[2]);
|
||||
$pixel = $c*256*256 + $b*256 + $a;
|
||||
imagesetpixel($img, $x, $y, $pixel);
|
||||
break;
|
||||
case 8 :
|
||||
case 4 :
|
||||
case 1 : imagesetpixel($img, $x, $y, $str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static function byte3($n)
|
||||
{
|
||||
return chr($n & 255) . chr(($n >> 8) & 255) . chr(($n >> 16) & 255);
|
||||
}
|
||||
|
||||
private static function undword($n)
|
||||
{
|
||||
$r = unpack("V", $n);
|
||||
return $r[1];
|
||||
}
|
||||
|
||||
private static function dword($n)
|
||||
{
|
||||
return pack("V", $n);
|
||||
}
|
||||
|
||||
private static function word($n)
|
||||
{
|
||||
return pack("v", $n);
|
||||
}
|
||||
}
|
||||
129
common/libraries/cryptocompat.php
Normal file
129
common/libraries/cryptocompat.php
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This class uses mcrypt to perform encryption and decryption in a way
|
||||
* that is fully compatible with https://github.com/defuse/php-encryption
|
||||
*/
|
||||
class CryptoCompat
|
||||
{
|
||||
// Default configuration
|
||||
const ENCRYPTION_ALGO = 'aes-128';
|
||||
const ENCRYPTION_MODE = 'cbc';
|
||||
const ENCRYPTION_BLOCK_SIZE = 16;
|
||||
const ENCRYPTION_KEY_SIZE = 16;
|
||||
const ENCRYPTION_KEY_INFO = 'DefusePHP|KeyForEncryption';
|
||||
const ENCRYPTION_MAC_ALGO = 'sha256';
|
||||
const ENCRYPTION_MAC_SIZE = 32;
|
||||
const ENCRYPTION_MAC_INFO = 'DefusePHP|KeyForAuthentication';
|
||||
|
||||
// Encrypt method
|
||||
public static function encrypt($plaintext, $key)
|
||||
{
|
||||
// Generate subkey for encryption
|
||||
$enc_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_KEY_INFO);
|
||||
|
||||
// Generate IV
|
||||
$iv = self::_createIV();
|
||||
|
||||
// Encrypt the plaintext
|
||||
$mcrypt_method = str_replace('aes', 'rijndael', self::ENCRYPTION_ALGO);
|
||||
$plaintext = self::_applyPKCS7Padding($plaintext, self::ENCRYPTION_BLOCK_SIZE);
|
||||
$ciphertext = mcrypt_encrypt($mcrypt_method, $enc_key, $plaintext, self::ENCRYPTION_MODE, $iv);
|
||||
|
||||
// Generate MAC
|
||||
$mac_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_MAC_INFO);
|
||||
$mac = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($iv . $ciphertext), $mac_key, true);
|
||||
|
||||
// Return the MAC, IV, and ciphertext
|
||||
return $mac . $iv . $ciphertext;
|
||||
}
|
||||
|
||||
// Decrypt method
|
||||
public static function decrypt($ciphertext, $key)
|
||||
{
|
||||
// Extract MAC and IV from the remainder of the ciphertext
|
||||
$mac = substr($ciphertext, 0, self::ENCRYPTION_MAC_SIZE);
|
||||
$iv = substr($ciphertext, self::ENCRYPTION_MAC_SIZE, self::ENCRYPTION_BLOCK_SIZE);
|
||||
$ciphertext = substr($ciphertext, self::ENCRYPTION_MAC_SIZE + self::ENCRYPTION_BLOCK_SIZE);
|
||||
|
||||
// Validate MAC
|
||||
$mac_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_MAC_INFO);
|
||||
$mac_compare = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($iv . $ciphertext), $mac_key, true);
|
||||
if (!Password::strcmpConstantTime($mac, $mac_compare))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Generate subkey for encryption
|
||||
$enc_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_KEY_INFO);
|
||||
|
||||
// Decrypt the ciphertext
|
||||
$mcrypt_method = str_replace('aes', 'rijndael', self::ENCRYPTION_ALGO);
|
||||
$plaintext = @mcrypt_decrypt($mcrypt_method, $enc_key, $ciphertext, self::ENCRYPTION_MODE, $iv);
|
||||
if ($plaintext === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$plaintext = self::_stripPKCS7Padding($plaintext, self::ENCRYPTION_BLOCK_SIZE);
|
||||
if ($plaintext === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return the plaintext
|
||||
return $plaintext;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create an IV
|
||||
* @return string
|
||||
*/
|
||||
protected static function _createIV()
|
||||
{
|
||||
return hex2bin(Password::createSecureSalt(self::ENCRYPTION_BLOCK_SIZE * 2, 'hex'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Apply PKCS#7 padding to a string
|
||||
* @param string $str The string
|
||||
* @param int $block_size The block size
|
||||
* @return string
|
||||
*/
|
||||
protected static function _applyPKCS7Padding($str, $block_size)
|
||||
{
|
||||
$padding_size = $block_size - (strlen($str) % $block_size);
|
||||
if ($padding_size === 0) $padding_size = $block_size;
|
||||
return $str . str_repeat(chr($padding_size), $padding_size);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Remove PKCS#7 padding from a string
|
||||
* @param string $str The string
|
||||
* @param int $block_size The block size
|
||||
* @return string
|
||||
*/
|
||||
protected static function _stripPKCS7Padding($str, $block_size)
|
||||
{
|
||||
if (strlen($str) % $block_size !== 0) return false;
|
||||
$padding_size = ord(substr($str, -1));
|
||||
if ($padding_size < 1 || $padding_size > $block_size) return false;
|
||||
if (substr($str, (-1 * $padding_size)) !== str_repeat(chr($padding_size), $padding_size)) return false;
|
||||
return substr($str, 0, strlen($str) - $padding_size);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief HKDF function compatible with defuse/php-encryption
|
||||
* @return string
|
||||
*/
|
||||
protected static function _defuseCompatibleHKDF($key, $info)
|
||||
{
|
||||
$salt = str_repeat("\x00", self::ENCRYPTION_MAC_SIZE);
|
||||
$prk = hash_hmac(self::ENCRYPTION_MAC_ALGO, $key, $salt, true);
|
||||
$t = $last_block = '';
|
||||
for ($block_index = 1; strlen($t) < self::ENCRYPTION_KEY_SIZE; $block_index++)
|
||||
{
|
||||
$t .= $last_block = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($last_block . $info . chr($block_index)), $prk, true);
|
||||
}
|
||||
return substr($t, 0, self::ENCRYPTION_KEY_SIZE);
|
||||
}
|
||||
}
|
||||
150
common/libraries/vendorpass.php
Normal file
150
common/libraries/vendorpass.php
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
<?php
|
||||
|
||||
// PHP implementation of several vendor-specific password hashing functions.
|
||||
|
||||
class VendorPass
|
||||
{
|
||||
// MySQL's OLD_PASSWORD() function.
|
||||
// Minor modification of the code written by Dustin Fineout, 10/9/2009
|
||||
// Source: http://stackoverflow.com/questions/260236/mysql-hashing-function-implementation
|
||||
|
||||
public static function mysql_old_password($password)
|
||||
{
|
||||
$password = strval($password);
|
||||
$length = strlen($password);
|
||||
$nr1 = 0x50305735; $nr2 = 0x12345671; $add = 7; $tmp = null;
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$byte = substr($password, $i, 1);
|
||||
if ($byte === ' ' || $byte === "\t") continue;
|
||||
$tmp = ord($byte);
|
||||
$nr1 ^= (($nr1 << 8) & 0x7FFFFFFF) + ((($nr1 & 63) + $add) * $tmp);
|
||||
$nr2 += (($nr2 << 8) & 0x7FFFFFFF) ^ $nr1;
|
||||
$add += $tmp;
|
||||
}
|
||||
return sprintf("%08x%08x", $nr1 & 0x7FFFFFFF, $nr2 & 0x7FFFFFFF);
|
||||
}
|
||||
|
||||
// MySQL's PASSWORD() function.
|
||||
|
||||
public static function mysql_new_password($password)
|
||||
{
|
||||
return '*' . strtoupper(sha1(sha1($password, true)));
|
||||
}
|
||||
|
||||
// MS SQL Server's PWDENCRYPT() function.
|
||||
|
||||
public static function mssql_pwdencrypt($password, $salt = null)
|
||||
{
|
||||
if ($salt !== null && strlen($salt) === 54)
|
||||
{
|
||||
$salt = substr($salt, 6, 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
$salt = strtoupper(str_pad(dechex(mt_rand(0, 65535)), 4, '0') .
|
||||
str_pad(dechex(mt_rand(0, 65535)), 4, '0'));
|
||||
}
|
||||
$password = mb_convert_encoding($password, 'UTF-16LE', 'UTF-8');
|
||||
return '0x0100' . strtoupper($salt . sha1($password . pack('H*', $salt)));
|
||||
}
|
||||
|
||||
// Drupal's SHA512-based password hashing algorithm.
|
||||
|
||||
public static function drupal($password, $salt = null)
|
||||
{
|
||||
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
|
||||
if ($salt !== null && strlen($salt) > 12)
|
||||
{
|
||||
$iterations = intval(strpos($itoa64, substr($salt, 3, 1)));
|
||||
$salt = substr($salt, 4, 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
$iterations = 15;
|
||||
$salt = Password::createSecureSalt(8, 'hex');
|
||||
}
|
||||
$count = 1 << $iterations;
|
||||
$hash = hash('sha512', $salt . $password, true);
|
||||
do
|
||||
{
|
||||
$hash = hash('sha512', $hash . $password, true);
|
||||
} while (--$count);
|
||||
$hash = self::drupal_base64($hash, strlen($hash), $itoa64);
|
||||
return substr('$S$' . $itoa64[$iterations] . $salt . $hash, 0, 55);
|
||||
}
|
||||
|
||||
// Drupal's own Base64 implementation.
|
||||
|
||||
protected static function drupal_base64($input, $count, $chars)
|
||||
{
|
||||
$output = '';
|
||||
$i = 0;
|
||||
do
|
||||
{
|
||||
$value = ord($input[$i++]);
|
||||
$output .= $chars[$value & 0x3f];
|
||||
if ($i < $count) $value |= ord($input[$i]) << 8;
|
||||
$output .= $chars[($value >> 6) & 0x3f];
|
||||
if ($i++ >= $count) break;
|
||||
if ($i < $count) $value |= ord($input[$i]) << 16;
|
||||
$output .= $chars[($value >> 12) & 0x3f];
|
||||
if ($i++ >= $count) break;
|
||||
$output .= $chars[($value >> 18) & 0x3f];
|
||||
} while ($i < $count);
|
||||
return $output;
|
||||
}
|
||||
|
||||
// Joomla's MD5-based password hashing algorithm.
|
||||
|
||||
public static function joomla($password, $salt = null)
|
||||
{
|
||||
if ($salt !== null && strlen($salt) > 33)
|
||||
{
|
||||
$salt = substr($salt, 33);
|
||||
}
|
||||
else
|
||||
{
|
||||
$salt = Password::createSecureSalt(32, 'hex');
|
||||
}
|
||||
return md5($password . $salt) . ':' . $salt;
|
||||
}
|
||||
|
||||
// KimsQ Rb's algorithms.
|
||||
|
||||
public static function kimsqrb($password, $salt = null)
|
||||
{
|
||||
if (preg_match('/(\$[1-4])\$([0-9]{14})$/', $salt, $matches))
|
||||
{
|
||||
$date = '$' . $matches[2];
|
||||
$fakesalt = substr(base64_encode(substr($date, 1) . 'salt'), 0, 22);
|
||||
switch ($matches[1])
|
||||
{
|
||||
case '$1': return self::password_hash($password, 1, ['cost' =>10, 'salt' => $fakesalt]) . '$1' . $date;
|
||||
case '$2': return hash('sha512', $password . $fakesalt) . '$2' . $date;
|
||||
case '$3': return hash('sha256', $password . $fakesalt) . '$3' . $date;
|
||||
case '$4': return md5(sha1(md5($password . $fakesalt))) . '$4' . $date;
|
||||
}
|
||||
}
|
||||
|
||||
$date = '$' . date('YmdHis');
|
||||
$fakesalt = substr(base64_encode(substr($date, 1) . 'salt'), 0, 22);
|
||||
return self::password_hash($password, 1, ['cost' =>10, 'salt' => $fakesalt]) . '$1' . $date;
|
||||
}
|
||||
|
||||
// Bcrypt wrapper for PHP 5.4.
|
||||
|
||||
public static function password_hash($password, $algo = 1, $options = [])
|
||||
{
|
||||
if (!isset($options['salt']) || !preg_match('/^[0-9a-zA-Z\.\/]{22,}$/', $options['salt']))
|
||||
{
|
||||
$options['salt'] = Password::createSecureSalt(22, 'alnum');
|
||||
}
|
||||
if (!isset($options['cost']) || $options['cost'] < 4 || $options['cost'] > 31)
|
||||
{
|
||||
$options['cost'] = 10;
|
||||
}
|
||||
|
||||
$salt = '$2y$' . sprintf('%02d', $options['cost']) . '$' . $options['salt'];
|
||||
return @crypt($password, $salt);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,15 +2,15 @@
|
|||
$db_info = Context::getDBInfo();
|
||||
$lang_type = Context::getLangType();
|
||||
$ssl_actions = Context::getSSLActions();
|
||||
$css_files=Context::getCssFile();
|
||||
$js_files=Context::getJsFile();
|
||||
$css_files = Context::getCssFile();
|
||||
$js_files = Context::getJsFile();
|
||||
}
|
||||
<!DOCTYPE html>
|
||||
<html lang="{str_replace('jp','ja',$lang_type)}">
|
||||
<head>
|
||||
<!-- META -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="Generator" content="XpressEngine">
|
||||
<meta name="Generator" content="Rhymix">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<block loop="Context::getMetaTag() => $no, $val">
|
||||
<meta http-equiv="{$val['name']}"|cond="$val['is_http_equiv']" name="{$val['name']}"|cond="!$val['is_http_equiv']" content="{$val['content']}">
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<header class="header">
|
||||
<h1>
|
||||
<a href="{geturl('')}" id="siteTitle">
|
||||
<img src="siteTitle.png" alt="XpressEngine" cond="!Context::getSiteTitle() && !$layout_info->LOGO_IMG && !$layout_info->LOGO_TEXT">
|
||||
<img src="siteTitle.png" alt="Rhymix" cond="!Context::getSiteTitle() && !$layout_info->LOGO_IMG && !$layout_info->LOGO_TEXT">
|
||||
<block cond="Context::getSiteTitle() && !$layout_info->LOGO_IMG && !$layout_info->LOGO_TEXT">{Context::getSiteTitle()}</block>
|
||||
<img src="{$layout_info->LOGO_IMG}" alt="{$layout_info->LOGO_TEXT}" cond="$layout_info->LOGO_IMG">
|
||||
<block cond="!$layout_info->LOGO_IMG && $layout_info->LOGO_TEXT">{$layout_info->LOGO_TEXT}</block>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<p class="f_logo">
|
||||
<a href="#"><img src="../img/f_logo.png" alt="Xpress Engine" /></a>
|
||||
<a href="#"><img src="../img/f_logo.png" alt="Rhymix" /></a>
|
||||
</p>
|
||||
<p class="sub_desc">XpressEngine is a free software CMS. You can redistribute or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation.</p>
|
||||
<p class="sub_desc">Rhymix is a free software CMS. You can redistribute or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation.</p>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
<li>
|
||||
<a href="{getUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteDesign')}" target="_blank" class="ico"><i class="xi-layout-top-left"></i><span class="blind">레이아웃 디자인 바꾸기</span></a>
|
||||
<h2>레이아웃 디자인 바꾸기</h2>
|
||||
<p>XE는 다양한 레이아웃 디자인을 제공합니다. 레이아웃 디자인은 <a href="{getUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteDesign')}" target="_blank">[관리 > 사이트 제작/편집 > 사이트 디자인 설정]</a>에서 변경할 수 있습니다.</p>
|
||||
<p>Rhymix는 다양한 레이아웃 디자인을 제공합니다. 레이아웃 디자인은 <a href="{getUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteDesign')}" target="_blank">[관리 > 사이트 제작/편집 > 사이트 디자인 설정]</a>에서 변경할 수 있습니다.</p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{getUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteMap')}" target="_blank" class="ico"><i class="xi-home"></i><span class="blind">초기화면 바꾸기</span></a>
|
||||
|
|
@ -46,8 +46,8 @@
|
|||
</section>
|
||||
<section class="features">
|
||||
<span class="noti">FEATURES</span>
|
||||
<h1 class="tit">XE CORE. FEATURES</h1>
|
||||
<p class="cont">XpressEngine은 XE Core 프레임웍을 기반으로 개별 프로그램과 스킨을 실행하여 결과물을 생성합니다.<br />다양한 개성을 가진 프로그램과 스킨을 조합하여 다채로운 기능을 가진 멋진 웹사이트를 만들 수 있습니다.</p>
|
||||
<h1 class="tit">Rhymix. FEATURES</h1>
|
||||
<p class="cont">Rhymix는 프레임웍을 기반으로 개별 프로그램과 스킨을 실행하여 결과물을 생성합니다.<br />다양한 개성을 가진 프로그램과 스킨을 조합하여 다채로운 기능을 가진 멋진 웹사이트를 만들 수 있습니다.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<div class="fe_box">
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
<h2>손쉬운 사이트 구축</h2>
|
||||
</div>
|
||||
<div class="fe_bottom">
|
||||
<p>XE는 블로그형, 카페형 등 다양한 모듈을 제공합니다. 만들고자 하는 사이트에 적합한 모듈을 선택하여 쉽고 빠르게 사이트를 구축할 수 있습니다.</p>
|
||||
<p>Rhymix는 블로그형, 카페형 등 다양한 모듈을 제공합니다. 만들고자 하는 사이트에 적합한 모듈을 선택하여 쉽고 빠르게 사이트를 구축할 수 있습니다.</p>
|
||||
<a href="#">CHECK IT OUT</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -68,7 +68,7 @@
|
|||
<h2>기능을 더하는 구조</h2>
|
||||
</div>
|
||||
<div class="fe_bottom">
|
||||
<p>XE는 확장기능을 내려받아 더 많은 기능을 이용할 수 있습니다. 기본 기능과 확장 기능을 자유롭게 조합하여 다양한 웹 사이트를 제작할 수 있습니다.</p>
|
||||
<p>Rhymix는 확장기능을 내려받아 더 많은 기능을 이용할 수 있습니다. 기본 기능과 확장 기능을 자유롭게 조합하여 다양한 웹 사이트를 제작할 수 있습니다.</p>
|
||||
<a href="#">CHECK IT OUT</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
<h2>오픈 소스 & 커뮤니티</h2>
|
||||
</div>
|
||||
<div class="fe_bottom">
|
||||
<p>XE는 오픈 커뮤니티를 통해 다양한 정보를 제공합니다. 커뮤니티에서 원하는 정보를 찾거거나 공유할 수 있습니다</p>
|
||||
<p>Rhymix는 오픈 커뮤니티를 통해 다양한 정보를 제공합니다. 커뮤니티에서 원하는 정보를 찾거거나 공유할 수 있습니다</p>
|
||||
<a href="#">CHECK IT OUT</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -92,7 +92,7 @@
|
|||
<h2>다국어 지원</h2>
|
||||
</div>
|
||||
<div class="fe_bottom">
|
||||
<p>XE는 여러 나라의 언어를 지원합니다. 웹 사이트를 언어별로 분리하지 않고도 다국어 웹 사이트를 쉽게 제작할 수 있습니다.</p>
|
||||
<p>Rhymix는 여러 나라의 언어를 지원합니다. 웹 사이트를 언어별로 분리하지 않고도 다국어 웹 사이트를 쉽게 제작할 수 있습니다.</p>
|
||||
<a href="#">CHECK IT OUT</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -106,7 +106,7 @@
|
|||
<li>
|
||||
<a href="https://www.xpressengine.com/forum" target="_blank" class="ico"><i class="xi-community"></i><span class="blind">COMMUNITY</span></a>
|
||||
<h2>COMMUNITY</h2>
|
||||
<p>XE와 관련한 다양한 커뮤니티를 만나보세요.</p>
|
||||
<p>Rhymix와 관련한 다양한 커뮤니티를 만나보세요.</p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.xpressengine.com/qna" target="_blank" class="ico"><i class="xi-users"></i><span class="blind">Q&A</span></a>
|
||||
|
|
@ -116,10 +116,10 @@
|
|||
<li>
|
||||
<a href="https://www.xpressengine.com/download" target="_blank" class="ico"><i class="xi-download-square"></i><span class="blind">DOWNLOAD</span></a>
|
||||
<h2>DOWNLOAD</h2>
|
||||
<p>XE 자료실을 통해 나만의 홈페이지를 만들어보세요.</p>
|
||||
<p>Rhymix 자료실을 통해 나만의 홈페이지를 만들어보세요.</p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/xpressengine/xe-core" target="_blank" class="ico"><i class="xi-github"></i><span class="blind">GITHUB</span></a>
|
||||
<a href="https://github.com/rhymix/rhymix" target="_blank" class="ico"><i class="xi-github"></i><span class="blind">GITHUB</span></a>
|
||||
<h2>GITHUB</h2>
|
||||
<p>오픈소스 프로젝트 개발참여를 위한 GitHub 페이지입니다.</p>
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
<li>
|
||||
<div class="ico"><i class="xi-layout-top-left"></i><span class="blind">레이아웃 디자인 바꾸기</span></div>
|
||||
<h2>최적화</h2>
|
||||
<p>XpressEngine 뿐 아니라, 다양한 프레임워크에서 동일하게 구현됩니다. 다양한 프레임워크에서 자유롭게 이용해 보세요!</p>
|
||||
<p>Rhymix 뿐 아니라, 다양한 프레임워크에서 동일하게 구현됩니다. 다양한 프레임워크에서 자유롭게 이용해 보세요!</p>
|
||||
</li>
|
||||
<li>
|
||||
<div class="ico"><i class="xi-home"></i><span class="blind">초기화면 바꾸기</span></div>
|
||||
|
|
|
|||
|
|
@ -595,7 +595,7 @@ class adminAdminView extends admin
|
|||
$php_core['memory_limit'] = "{$ini_info['memory_limit']['local_value']}";
|
||||
$info['PHP_Core'] = $php_core;
|
||||
|
||||
$str_info = "[XE Server Environment " . date("Y-m-d") . "]\n\n";
|
||||
$str_info = "[Rhymix Server Environment " . date("Y-m-d") . "]\n\n";
|
||||
$str_info .= "realpath : ".realpath('./')."\n";
|
||||
foreach( $info as $key=>$value )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -365,10 +365,10 @@
|
|||
<value xml:lang="vi"><![CDATA[URL mặc định]]></value>
|
||||
</item>
|
||||
<item name="about_default_url">
|
||||
<value xml:lang="ko"><![CDATA[여러 사이트를 운영할 때 기본 URL이 필요합니다. XE 설치 경로를 포함한 URL을 입력하세요. (예: http://도메인/설치경로)]]></value>
|
||||
<value xml:lang="en"><![CDATA[Enter a default URL to be used to control multiple websites, including XE installation path. E.g.) http://domain//installation path]]></value>
|
||||
<value xml:lang="jp"><![CDATA[複数のサイトを運営する際に基本URLが必要です。XEインストール先を含むURLを入力してください。(例:http://ドメイン/インストール先)]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Birden fazla siteyi işletirken temel bir URL'ye ihtiyaç vardır. XE yükleme route'unu kapsayana bir URL giriniz.(Örneğin: http:// alan adı / yükleme route'u)]]></value>
|
||||
<value xml:lang="ko"><![CDATA[여러 사이트를 운영할 때 기본 URL이 필요합니다. Rhymix 설치 경로를 포함한 URL을 입력하세요. (예: http://도메인/설치경로)]]></value>
|
||||
<value xml:lang="en"><![CDATA[Enter a default URL to be used to control multiple websites, including Rhymix installation path. E.g.) http://domain/installation path]]></value>
|
||||
<value xml:lang="jp"><![CDATA[複数のサイトを運営する際に基本URLが必要です。Rhymixインストール先を含むURLを入力してください。(例:http://ドメイン/インストール先)]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Birden fazla siteyi işletirken temel bir URL'ye ihtiyaç vardır. Rhymix yükleme route'unu kapsayana bir URL giriniz.(Örneğin: http:// alan adı / yükleme route'u)]]></value>
|
||||
</item>
|
||||
<item name="env_information">
|
||||
<value xml:lang="ko"><![CDATA[환경 정보]]></value>
|
||||
|
|
@ -420,15 +420,15 @@
|
|||
</item>
|
||||
<item name="about_download_link">
|
||||
<value xml:lang="ko"><![CDATA[최신 버전이 배포되었습니다. download 링크를 클릭하면 다운 받을 수 있습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[New version of XE is now available! Please click the download link to get the latest version.]]></value>
|
||||
<value xml:lang="en"><![CDATA[New version of Rhymix is now available! Please click the download link to get the latest version.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[新しいバージョンが配布されています。「ダウンロード」リンクをクリックするとダウンロードできます。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[官方网站已发布最新版本XE。请点击[下载]链接下载最新版本。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[官方网站已发布最新版本Rhymix。请点击[下载]链接下载最新版本。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[官方網站已發佈最新版本。請按[下載]下載最新版本。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Nouvelle version est disponible. Pour télécharger la dernière version, cliquez le lien.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Новая версия XE доступна. Чтобы скачать последнюю версию, нажмите ссылку закачки]]></value>
|
||||
<value xml:lang="es"><![CDATA[La versión más reciente Zerboard XE está disponible. Para descargar la versión más reciente, haga clic en enlace de descarga.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Zeroboard XE'nin yeni sürümü yayımlandı! Lütfen son sürümü için indirme linkine tıklayınız.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đã có phiên bản mới nhất của XE. Hãy bấm vào Link để Download.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Новая версия Rhymix доступна. Чтобы скачать последнюю версию, нажмите ссылку закачки]]></value>
|
||||
<value xml:lang="es"><![CDATA[La versión más reciente Rhymix está disponible. Para descargar la versión más reciente, haga clic en enlace de descarga.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix'nin yeni sürümü yayımlandı! Lütfen son sürümü için indirme linkine tıklayınız.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đã có phiên bản mới nhất của Rhymix. Hãy bấm vào Link để Download.]]></value>
|
||||
</item>
|
||||
<item name="item_addon">
|
||||
<value xml:lang="ko"><![CDATA[애드온 목록]]></value>
|
||||
|
|
@ -574,16 +574,16 @@
|
|||
<value xml:lang="vi"><![CDATA[Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.]]></value>
|
||||
</item>
|
||||
<item name="welcome_to_xe">
|
||||
<value xml:lang="ko"><![CDATA[XE 관리자]]></value>
|
||||
<value xml:lang="en"><![CDATA[Welcome to the XE admin page.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEの管理者ページです。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[XE 管理页面]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[XE管理頁面]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Bienvenue sur la Page d'Administration du XE]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Добро пожаловать на страницу администратора XE]]></value>
|
||||
<value xml:lang="es"><![CDATA[Esta es la página del Administrador de XE]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE Yönetici Sayfasına Hoşgeldiniz]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Chào mừng bạn đến với trang quản lý của XE!]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix 관리자]]></value>
|
||||
<value xml:lang="en"><![CDATA[Welcome to the Rhymix admin page.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixの管理者ページです。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[Rhymix 管理页面]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Rhymix管理頁面]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Bienvenue sur la Page d'Administration du Rhymix]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Добро пожаловать на страницу администратора Rhymix]]></value>
|
||||
<value xml:lang="es"><![CDATA[Esta es la página del Administrador de Rhymix]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix Yönetici Sayfasına Hoşgeldiniz]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Chào mừng bạn đến với trang quản lý của Rhymix!]]></value>
|
||||
</item>
|
||||
<item name="about_lang_env">
|
||||
<value xml:lang="ko"><![CDATA[처음 방문하는 사용자들의 언어 설정을 동일하게 하려면, 원하는 언어로 변경 후 아래 [저장] 버튼을 클릭하면 됩니다.]]></value>
|
||||
|
|
@ -598,16 +598,16 @@
|
|||
<value xml:lang="vi"><![CDATA[Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại.]]></value>
|
||||
</item>
|
||||
<item name="xe_license">
|
||||
<value xml:lang="ko"><![CDATA[XE는 LGPL을 따릅니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[XE complies with the LGPL.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEのライセンスはLGPLです。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[XE遵循 LGPL协议]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[XE遵循 LGPL協議]]></value>
|
||||
<value xml:lang="fr"><![CDATA[XE s'applique la LGPL]]></value>
|
||||
<value xml:lang="ru"><![CDATA[XE подчиняется Стандартной Общественной Лицензии LGPL]]></value>
|
||||
<value xml:lang="es"><![CDATA[XE está bajo la Licencia de LGPL]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE LGPL ile uyumludur]]></value>
|
||||
<value xml:lang="vi"><![CDATA[XE sử dụng giấy phép LGPL]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix는 GPL을 따릅니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix complies with the GPL.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[RhymixのライセンスはGPLです。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[Rhymix遵循 GPL协议]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Rhymix遵循 GPL協議]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Rhymix s'applique la GPL]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Rhymix подчиняется Стандартной Общественной Лицензии GPL]]></value>
|
||||
<value xml:lang="es"><![CDATA[Rhymix está bajo la Licencia de GPL]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix GPL ile uyumludur]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Rhymix sử dụng giấy phép GPL]]></value>
|
||||
</item>
|
||||
<item name="yesterday">
|
||||
<value xml:lang="ko"><![CDATA[어제]]></value>
|
||||
|
|
@ -824,9 +824,9 @@
|
|||
<value xml:lang="vi"><![CDATA[Xóa thông tin FTP.]]></value>
|
||||
</item>
|
||||
<item name="msg_find_xe_path_fail">
|
||||
<value xml:lang="ko"><![CDATA[XE 설치 경로를 자동으로 찾지 못하였습니다. 수동 설정해주세요.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Failed to search XE installed path automatically. Please set manually.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEのインストル先が見つかりませんでした。手動で設定してください。]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix 설치 경로를 자동으로 찾지 못하였습니다. 수동 설정해주세요.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Failed to search Rhymix installed path automatically. Please set manually.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixのインストル先が見つかりませんでした。手動で設定してください。]]></value>
|
||||
</item>
|
||||
<item name="msg_ftp_invalid_path">
|
||||
<value xml:lang="ko"><![CDATA[FTP 경로(Path)를 읽을 수 없습니다.]]></value>
|
||||
|
|
@ -1389,16 +1389,16 @@
|
|||
<value xml:lang="mn"><![CDATA[FTP холболт шалгах]]></value>
|
||||
</item>
|
||||
<item name="msg_safe_mode_ftp_needed">
|
||||
<value xml:lang="ko"><![CDATA[PHP의<strong>safe_mode=On</strong>일 경우 XE의 정상적인 동작을 돕습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[If safe_mode setting of PHP is On, it hepls normal functioning of XE.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[PHPのsafe_modeがOnの場合、FTP情報を登録することで、XEのインストール及び利用が可能になります。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[当PHP的safe_mode=On时,请必须输入相关FTP信息,否则将无法正常安装或使用XE程序。]]></value>
|
||||
<value xml:lang="ko"><![CDATA[PHP의<strong>safe_mode=On</strong>일 경우 Rhymix의 정상적인 동작을 돕습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[If safe_mode setting of PHP is On, it hepls normal functioning of Rhymix.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[PHPのsafe_modeがOnの場合、FTP情報を登録することで、Rhymixのインストール及び利用が可能になります。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[当PHP的safe_mode=On时,请必须输入相关FTP信息,否则将无法正常安装或使用Rhymix程序。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[當 PHP 的安全模式(safe_mode)開啟時,請輸入相關 FTP 資訊,否則無法正常安裝或使用程式。]]></value>
|
||||
<value xml:lang="de"><![CDATA[Zur Installation und Nutzung des XEs muss die Angabe des FTPs festgestellt werden, wenn safe_mode in PHP 'An' ist.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Si la la variable safe_mode está activa[safe_mode=On], debe rellenar los datos de FTP para seguir instalando y usar con normalidad el XE.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Eğer PHP güvenli mod ayarları etkinse, XE'yi kurmak için FTP hesap bilgilerini girmelisiniz.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Nếu safe_mode của PHP mở, bạn có thể cài đặt các thành phần bổ xung cho XE một cách tự động qua FTP.]]></value>
|
||||
<value xml:lang="mn"><![CDATA[PHP의 safe_mode가 Onбайх тохиолдолд , FTP мэдээллийг заавал оруулснаар XE идэвжvvлэх болон хэрэглэх боломжтой болно.]]></value>
|
||||
<value xml:lang="de"><![CDATA[Zur Installation und Nutzung des Rhymixs muss die Angabe des FTPs festgestellt werden, wenn safe_mode in PHP 'An' ist.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Si la la variable safe_mode está activa[safe_mode=On], debe rellenar los datos de FTP para seguir instalando y usar con normalidad el Rhymix.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Eğer PHP güvenli mod ayarları etkinse, Rhymix'yi kurmak için FTP hesap bilgilerini girmelisiniz.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Nếu safe_mode của PHP mở, bạn có thể cài đặt các thành phần bổ xung cho Rhymix một cách tự động qua FTP.]]></value>
|
||||
<value xml:lang="mn"><![CDATA[PHP의 safe_mode가 Onбайх тохиолдолд , FTP мэдээллийг заавал оруулснаар Rhymix идэвжvvлэх болон хэрэглэх боломжтой болно.]]></value>
|
||||
</item>
|
||||
<item name="msg_safe_mode_ftp_needed2">
|
||||
<value xml:lang="ko"><![CDATA[모듈의 쉬운 설치 또는 업데이트가 가능해 집니다.]]></value>
|
||||
|
|
@ -1479,24 +1479,24 @@
|
|||
<value xml:lang="vi"><![CDATA[Hãy nhập thông tin đường dẫn của FTP.]]></value>
|
||||
</item>
|
||||
<item name="ftp_installed_realpath">
|
||||
<value xml:lang="ko"><![CDATA[설치된 XE의 절대경로]]></value>
|
||||
<value xml:lang="en"><![CDATA[Absolute Path of XE]]></value>
|
||||
<value xml:lang="jp"><![CDATA[インストールされたXEの絶対パス]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[XE绝对路径]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[XE絕對路經]]></value>
|
||||
<value xml:lang="de"><![CDATA[absoluter Pfad, in dem XE installiert ist.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[KesinnXE Yolu]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đường dẫn thư mục đã cài đặt XE]]></value>
|
||||
<value xml:lang="ko"><![CDATA[설치된 Rhymix의 절대경로]]></value>
|
||||
<value xml:lang="en"><![CDATA[Absolute Path of Rhymix]]></value>
|
||||
<value xml:lang="jp"><![CDATA[インストールされたRhymixの絶対パス]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[Rhymix绝对路径]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Rhymix絕對路經]]></value>
|
||||
<value xml:lang="de"><![CDATA[absoluter Pfad, in dem Rhymix installiert ist.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[KesinnRhymix Yolu]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đường dẫn thư mục đã cài đặt Rhymix]]></value>
|
||||
</item>
|
||||
<item name="msg_ftp_installed_ftp_realpath">
|
||||
<value xml:lang="ko"><![CDATA[설치된 XE의 FTP 경로]]></value>
|
||||
<value xml:lang="en"><![CDATA[Absolute FTP Path of XE installed]]></value>
|
||||
<value xml:lang="jp"><![CDATA[インストールされたXEのFTP絶対パス設定]]></value>
|
||||
<value xml:lang="ko"><![CDATA[설치된 Rhymix의 FTP 경로]]></value>
|
||||
<value xml:lang="en"><![CDATA[Absolute FTP Path of Rhymix installed]]></value>
|
||||
<value xml:lang="jp"><![CDATA[インストールされたRhymixのFTP絶対パス設定]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[FTP绝对路径设置]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[XE的 FTP 絕對路經]]></value>
|
||||
<value xml:lang="de"><![CDATA[absoluten Pfad des FTPs, in dem XE installiert ist, festlegen.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE Salt FTP Yolu]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đường dẫn tuyệt đối của thư mục cài đặt XE trên FTP]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Rhymix的 FTP 絕對路經]]></value>
|
||||
<value xml:lang="de"><![CDATA[absoluten Pfad des FTPs, in dem Rhymix installiert ist, festlegen.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix Salt FTP Yolu]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đường dẫn tuyệt đối của thư mục cài đặt Rhymix trên FTP]]></value>
|
||||
</item>
|
||||
<item name="msg_php_warning_title">
|
||||
<value xml:lang="ko"><![CDATA[안전하지 않은 PHP 버전 경고]]></value>
|
||||
|
|
@ -1507,8 +1507,8 @@
|
|||
<value xml:lang="en"><![CDATA[The server is using a unsafe version of PHP, it is recommended to upgrade to the latest stable version.]]></value>
|
||||
</item>
|
||||
<item name="msg_php_warning_notice_explain">
|
||||
<value xml:lang="ko"><![CDATA[<li>매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.</li><li>XE 최신 버전을 사용할 수 없습니다.</li><li>XE 최신 버전 이상에서 지원하는 확장 기능을 사용할 수 없습니다.</li><li>일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.</li>]]></value>
|
||||
<value xml:lang="en"><![CDATA[<li>PHP version of this server can be exposed to serious security problems and attacks.</li><li>Latest version of XE is not available.</li><li>You can not use extensions that are supported by the latest version of XE.</li><li>Some extensions may not work properly. It can cause problems.</li>]]></value>
|
||||
<value xml:lang="ko"><![CDATA[<li>매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.</li><li>Rhymix 최신 버전을 사용할 수 없습니다.</li><li>Rhymix 최신 버전 이상에서 지원하는 확장 기능을 사용할 수 없습니다.</li><li>일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.</li>]]></value>
|
||||
<value xml:lang="en"><![CDATA[<li>PHP version of this server can be exposed to serious security problems and attacks.</li><li>Latest version of Rhymix is not available.</li><li>You can not use extensions that are supported by the latest version of Rhymix.</li><li>Some extensions may not work properly. It can cause problems.</li>]]></value>
|
||||
</item>
|
||||
<item name="msg_php_warning_now_version">
|
||||
<value xml:lang="ko"><![CDATA[이 서버의 PHP 버전]]></value>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
<div class="x_control-group">
|
||||
<label class="x_control-label" for="adminTitle">{$lang->admin_title}</label>
|
||||
<div class="x_controls">
|
||||
<input type="text" name="adminTitle" id="adminTitle" value="{$config_object->adminTitle}" placeholder="XE Admin" />
|
||||
<input type="text" name="adminTitle" id="adminTitle" value="{$config_object->adminTitle}" placeholder="Rhymix Admin" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_clearfix btnArea">
|
||||
|
|
|
|||
|
|
@ -334,8 +334,8 @@
|
|||
<value xml:lang="jp"><![CDATA[このパッケージは、削除をサポートしません(モジュールクラスにmoduleUninstall()がありません)。]]></value>
|
||||
</item>
|
||||
<item name="msg_update_core_title">
|
||||
<value xml:lang="ko"><![CDATA[XE core가 업데이트 됩니다.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XE coreがアップデートされます。]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix core가 업데이트 됩니다.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymix coreがアップデートされます。]]></value>
|
||||
</item>
|
||||
<item name="msg_update_core">
|
||||
<value xml:lang="ko"><![CDATA[core 업데이트 시 설치된 프로그램의 호환성을 반드시 점검 바랍니다.]]></value>
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@
|
|||
|
||||
<ul>
|
||||
<li>매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.</li>
|
||||
<li>XE 최신 버전을 사용할 수 없습니다.</li>
|
||||
<li>XE 최신 버전 이상을 지원하는 확장 기능을 사용할 수 없습니다.</li>
|
||||
<li>Rhymix 최신 버전을 사용할 수 없습니다.</li>
|
||||
<li>Rhymix 최신 버전 이상을 지원하는 확장 기능을 사용할 수 없습니다.</li>
|
||||
<li>일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ class board extends ModuleObject
|
|||
{
|
||||
$args->mid = 'board';
|
||||
$args->module = 'board';
|
||||
$args->browser_title = 'XpressEngine';
|
||||
$args->browser_title = 'Rhymix';
|
||||
$args->skin = 'default';
|
||||
$args->site_srl = 0;
|
||||
$output = $oModuleController->insertModule($args);
|
||||
|
|
|
|||
|
|
@ -34,7 +34,10 @@
|
|||
</ul>
|
||||
</div>
|
||||
<p class="action">
|
||||
<span class="vote" cond="$comment->get('voted_count')!=0">{$lang->cmd_vote}:{$comment->get('voted_count')?$comment->get('voted_count'):0}</span>
|
||||
<a cond="$comment->getVote() === false || $comment->getVote() < 0" href="#" onclick="doCallModuleAction('comment','procCommentVoteUp','{$comment->comment_srl}');return false;"|cond="$is_logged" class="voted"><i class="xi-thumbs-up"></i>{$lang->cmd_vote}{$comment->get('voted_count')}</a>
|
||||
<a cond="$comment->getVote() > 0" href="#" onclick="doCallModuleAction('comment','procCommentVoteUpCancel','{$comment->comment_srl}');return false;"|cond="$is_logged" class="voted"><i class="xi-thumbs-up"></i>{$lang->cmd_vote}{$comment->get('voted_count')}</a>
|
||||
<a cond="$comment->getVote() === false || $comment->getVote() > 0" href="#" onclick="doCallModuleAction('comment','procCommentVoteDown','{$comment->comment_srl}');return false;"|cond="$is_logged" class="voted"><i class="xi-thumbs-up"></i>{$lang->cmd_vote_down}{$comment->get('blamed_count')}</a>
|
||||
<a cond="$comment->getVote() < 0" href="#" onclick="doCallModuleAction('comment','procCommentVoteDownCancel','{$comment->comment_srl}');return false;"|cond="$is_logged" class="voted"><i class="xi-thumbs-up"></i>{$lang->cmd_vote_down}{$comment->get('blamed_count')}</a>
|
||||
<a cond="$oDocument->allowComment()" href="{getUrl('act','dispBoardReplyComment','comment_srl',$comment->comment_srl)}" class="reply"><i class="xi-reply"></i> {$lang->cmd_reply}</a>
|
||||
<a cond="$comment->isGranted()||!$comment->get('member_srl')" href="{getUrl('act','dispBoardModifyComment','comment_srl',$comment->comment_srl)}" class="modify"><i class="xi-eraser"></i> {$lang->cmd_modify}</a>
|
||||
<a cond="$comment->isGranted()||!$comment->get('member_srl')" href="{getUrl('act','dispBoardDeleteComment','comment_srl',$comment->comment_srl)}" class="delete"><i class="xi-trash"></i> {$lang->cmd_delete}</a>
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
<script>
|
||||
var sTitle = '{str_ireplace(array('<script', '</script'), array("<scr'+'ipt", "</scr'+'ipt"), addslashes($oDocument->getTitleText()))}';
|
||||
var sTitle = '{$oDocument->getTitleText()}';
|
||||
jQuery(function($){
|
||||
$('.twitter').snspost({
|
||||
type : 'twitter',
|
||||
|
|
@ -79,7 +79,19 @@
|
|||
content : sTitle
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
</div>
|
||||
<div class="vote">
|
||||
<ul>
|
||||
<li>
|
||||
<a cond="$oDocument->getVoted() === false || $oDocument->getVoted() < 0" href="#" onclick="doCallModuleAction('document','procDocumentVoteUp','{$oDocument->document_srl}');return false;"|cond="$is_logged" class="voted"> <i class="xi-thumbs-up"></i><br>{$lang->cmd_vote} {$oDocument->get('voted_count')}</a>
|
||||
<a cond="$oDocument->getVoted() > 0" href="#" onclick="doCallModuleAction('document','procDocumentVoteUpCancel','{$oDocument->document_srl}');return false;"|cond="$is_logged" class="voted"> <i class="xi-thumbs-up"></i><br>{$lang->cmd_vote} {$oDocument->get('voted_count')}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a cond="$oDocument->getVoted() === false || $oDocument->getVoted() > 0" herf="#" onclick="doCallModuleAction('document','procDocumentVoteDown','{$oDocument->document_srl}');return false;"|cond="$is_logged" class="voted"> <i class="xi-thumbs-down"></i><br>{$lang->cmd_vote_down} {$oDocument->get('blamed_count')}</a>
|
||||
<a cond="$oDocument->getVoted() < 0" herf="#" onclick="doCallModuleAction('document','procDocumentVoteDownCancel','{$oDocument->document_srl}');return false;"|cond="$is_logged" class="voted"> <i class="xi-thumbs-down"></i><br>{$lang->cmd_vote_down} {$oDocument->get('blamed_count')}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div cond="$oDocument->hasUploadedFiles()" class="fileList">
|
||||
<button type="button" class="toggleFile" onclick="jQuery(this).next('ul.files').toggle();"><i class="xi-diskette"></i> {$lang->uploaded_file} [<strong>{$oDocument->get('uploaded_count')}</strong>]</button>
|
||||
|
|
|
|||
|
|
@ -570,6 +570,13 @@
|
|||
.read_footer .sns a:hover{border-color:#DECA79;background-color:#f9dc5f;transition: all 0.2s ease-in-out;-webkit-transition: all 0.2s ease-in-out}
|
||||
.read_footer .sns a:hover {color:#747474;transition: all 0.2s ease-in-out;-webkit-transition: all 0.2s ease-in-out}
|
||||
|
||||
.read_footer .vote{ margin-top:51px;text-align:center; }
|
||||
.read_footer .vote li{display:inline;vertical-align:top}
|
||||
.read_footer .vote a{display:inline-block;width:70px;height:70px;border:1px solid #e0e0e0;background-color:#f4f4f4; border-radius:2px;}
|
||||
.read_footer .vote i{font-size:22px;line-height:45px;color:#bcbcbc}
|
||||
.read_footer .vote a:hover{border-color:#DECA79;background-color:#f9dc5f;transition: all 0.2s ease-in-out;-webkit-transition: all 0.2s ease-in-out}
|
||||
.read_footer .vote a:hover {color:#747474;transition: all 0.2s ease-in-out;-webkit-transition: all 0.2s ease-in-out}
|
||||
|
||||
.read_footer .sign {
|
||||
clear: both;
|
||||
border: 1px solid #ddd;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<author email_address="developers@xpressengine.com" link="https://www.xpressengine.com/">
|
||||
<name xml:lang="ko">NAVER</name>
|
||||
</author>
|
||||
<license>LGPL v2</license>
|
||||
<license>GPL v2</license>
|
||||
<extra_vars>
|
||||
</extra_vars>
|
||||
</skin>
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ class commentAdminController extends comment
|
|||
// send email to comment's author, all admins and thread(document) subscribers - START
|
||||
// -------------------------------------------------------
|
||||
$oMail = new Mail();
|
||||
$mail_title = "[XE - " . $module_info->mid . "] comment(s) status changed to " . $new_status . " on document: \"" . $oDocument->getTitleText() . "\"";
|
||||
$mail_title = "[Rhymix - " . $module_info->mid . "] comment(s) status changed to " . $new_status . " on document: \"" . $oDocument->getTitleText() . "\"";
|
||||
$oMail->setTitle($mail_title);
|
||||
$mail_content = "
|
||||
The comment #" . $comment_srl . " on document \"" . $oDocument->getTitleText() . "\" has been " . $new_status . " by admin of <strong><i>" . strtoupper($module_info->mid) . "</i></strong> module.
|
||||
|
|
|
|||
|
|
@ -59,6 +59,29 @@ class commentController extends comment
|
|||
return $output;
|
||||
}
|
||||
|
||||
function procCommentVoteUpCancel()
|
||||
{
|
||||
if(!Context::get('logged_info')) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$comment_srl = Context::get('target_srl');
|
||||
if(!$comment_srl) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$oCommentModel = getModel('comment');
|
||||
$oComment = $oCommentModel->getComment($comment_srl, FALSE, FALSE);
|
||||
if($oComment->get('voted_count') <= 0)
|
||||
{
|
||||
return new Object(-1, 'msg_comment_voted_cancel_not');
|
||||
}
|
||||
$point = 1;
|
||||
$output = $this->updateVotedCountCancel($comment_srl, $oComment, $point);
|
||||
|
||||
$output = new Object();
|
||||
$output->setMessage('success_voted_canceled');
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action to handle recommendation votes on comments (Down)
|
||||
* @return Object
|
||||
|
|
@ -97,6 +120,74 @@ class commentController extends comment
|
|||
return $output;
|
||||
}
|
||||
|
||||
function procCommentVoteDownCancel()
|
||||
{
|
||||
if(!Context::get('logged_info')) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$comment_srl = Context::get('target_srl');
|
||||
if(!$comment_srl) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$oCommentModel = getModel('comment');
|
||||
$oComment = $oCommentModel->getComment($comment_srl, FALSE, FALSE);
|
||||
if($oComment->get('blamed_count') >= 0)
|
||||
{
|
||||
return new Object(-1, 'msg_comment_blamed_cancel_not');
|
||||
}
|
||||
$point = -1;
|
||||
$output = $this->updateVotedCountCancel($comment_srl, $oComment, $point);
|
||||
|
||||
$output = new Object();
|
||||
$output->setMessage('success_voted_canceled');
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
function updateVotedCountCancel($comment_srl, $oComment, $point)
|
||||
{
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
$args = new stdClass();
|
||||
$d_args = new stdClass();
|
||||
$args->comment_srl = $d_args->comment_srl = $comment_srl;
|
||||
$d_args->member_srl = $logged_info->member_srl;
|
||||
if($point > 0)
|
||||
{
|
||||
$args->voted_count = $oComment->get('voted_count') - $point;
|
||||
$output = executeQuery('comment.updateVotedCount', $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
$args->blamed_count = $oComment->get('blamed_count') - $point;
|
||||
$output = executeQuery('comment.updateBlamedCount', $args);
|
||||
}
|
||||
$d_output = executeQuery('comment.deleteCommentVotedLog', $d_args);
|
||||
if(!$d_output->toBool()) return $d_output;
|
||||
|
||||
//session reset
|
||||
$_SESSION['voted_comment'][$comment_srl] = false;
|
||||
|
||||
// begin transaction
|
||||
$oDB = DB::getInstance();
|
||||
$oDB->begin();
|
||||
|
||||
$obj = new stdClass();
|
||||
$obj->member_srl = $oComment->get('member_srl');
|
||||
$obj->module_srl = $oComment->get('module_srl');
|
||||
$obj->comment_srl = $oComment->get('comment_srl');
|
||||
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
|
||||
$obj->point = $point;
|
||||
$obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
|
||||
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
|
||||
$obj->cancel = 1;
|
||||
$trigger_output = ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'after', $obj);
|
||||
if(!$trigger_output->toBool())
|
||||
{
|
||||
$oDB->rollback();
|
||||
return $trigger_output;
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to be called when a comment posting is reported
|
||||
* @return void|Object
|
||||
|
|
@ -319,7 +410,7 @@ class commentController extends comment
|
|||
// determine the order
|
||||
$obj->list_order = getNextSequence() * -1;
|
||||
|
||||
// remove XE's own tags from the contents
|
||||
// remove Rhymix's own tags from the contents
|
||||
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
|
||||
|
||||
// if use editor of nohtml, Remove HTML tags from the contents.
|
||||
|
|
@ -549,7 +640,7 @@ class commentController extends comment
|
|||
{
|
||||
$oMail = new Mail();
|
||||
$oMail->setSender($obj->email_address, $obj->email_address);
|
||||
$mail_title = "[XE - " . Context::get('mid') . "] A new comment was posted on document: \"" . $oDocument->getTitleText() . "\"";
|
||||
$mail_title = "[Rhymix - " . Context::get('mid') . "] A new comment was posted on document: \"" . $oDocument->getTitleText() . "\"";
|
||||
$oMail->setTitle($mail_title);
|
||||
$url_comment = getFullUrl('','document_srl',$obj->document_srl).'#comment_'.$obj->comment_srl;
|
||||
if($using_validation)
|
||||
|
|
@ -635,7 +726,7 @@ class commentController extends comment
|
|||
/*
|
||||
// send email to author - START
|
||||
$oMail = new Mail();
|
||||
$mail_title = "[XE - ".Context::get('mid')."] your comment on document: \"".$oDocument->getTitleText()."\" have to be approved";
|
||||
$mail_title = "[Rhymix - ".Context::get('mid')."] your comment on document: \"".$oDocument->getTitleText()."\" have to be approved";
|
||||
$oMail->setTitle($mail_title);
|
||||
//$mail_content = sprintf("From : <a href=\"%s?document_srl=%s&comment_srl=%s#comment_%d\">%s?document_srl=%s&comment_srl=%s#comment_%d</a><br/>\r\n%s ", getFullUrl(''),$comment->document_srl,$comment->comment_srl,$comment->comment_srl, getFullUrl(''),$comment->document_srl,$comment->comment_srl,$comment->comment_srl,$comment>content);
|
||||
$mail_content = "
|
||||
|
|
@ -745,7 +836,7 @@ class commentController extends comment
|
|||
$obj->content = $source_obj->get('content');
|
||||
}
|
||||
|
||||
// remove XE's wn tags from contents
|
||||
// remove Rhymix's wn tags from contents
|
||||
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
|
||||
|
||||
// if use editor of nohtml, Remove HTML tags from the contents.
|
||||
|
|
@ -1163,11 +1254,14 @@ class commentController extends comment
|
|||
// update the number of votes
|
||||
if($point < 0)
|
||||
{
|
||||
// leave into session information
|
||||
$_SESSION['voted_comment'][$comment_srl] = $point;
|
||||
$args->blamed_count = $oComment->get('blamed_count') + $point;
|
||||
$output = executeQuery('comment.updateBlamedCount', $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
$_SESSION['voted_comment'][$comment_srl] = $point;
|
||||
$args->voted_count = $oComment->get('voted_count') + $point;
|
||||
$output = executeQuery('comment.updateVotedCount', $args);
|
||||
}
|
||||
|
|
@ -1193,9 +1287,6 @@ class commentController extends comment
|
|||
|
||||
$oDB->commit();
|
||||
|
||||
// leave into session information
|
||||
$_SESSION['voted_comment'][$comment_srl] = TRUE;
|
||||
|
||||
// Return the result
|
||||
$output = new Object(0, $success_message);
|
||||
if($point > 0)
|
||||
|
|
|
|||
|
|
@ -281,6 +281,29 @@ class commentItem extends Object
|
|||
return htmlspecialchars($this->get('nick_name'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
|
||||
}
|
||||
|
||||
function getVote()
|
||||
{
|
||||
if(!$this->comment_srl) return false;
|
||||
if($_SESSION['voted_comment'][$this->comment_srl])
|
||||
{
|
||||
return $_SESSION['voted_comment'][$this->comment_srl];
|
||||
}
|
||||
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
$args = new stdClass();
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
$args->comment_srl = $this->comment_srl;
|
||||
$output = executeQuery('comment.getCommentVotedLog', $args);
|
||||
|
||||
if($output->data->point)
|
||||
{
|
||||
return $output->data->point;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return content with htmlspecialchars
|
||||
* @return string
|
||||
|
|
@ -631,46 +654,41 @@ class commentItem extends Object
|
|||
// get an image file from the doc content if no file attached.
|
||||
if(!$source_file)
|
||||
{
|
||||
$content = $this->get('content');
|
||||
$target_src = NULL;
|
||||
|
||||
preg_match_all("!src=(\"|')([^\"' ]*?)(\"|')!is", $content, $matches, PREG_SET_ORDER);
|
||||
|
||||
$cnt = count($matches);
|
||||
|
||||
for($i = 0; $i < $cnt; $i++)
|
||||
preg_match_all("!<img\s[^>]*?src=(\"|')([^\"' ]*?)(\"|')!is", $this->get('content'), $matches, PREG_SET_ORDER);
|
||||
foreach($matches as $match)
|
||||
{
|
||||
$target_src = $matches[$i][2];
|
||||
$target_src = htmlspecialchars_decode(trim($match[2]));
|
||||
if(preg_match('/\/(common|modules|widgets|addons|layouts)\//i', $target_src))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!preg_match('/^(http|https):\/\//i', $target_src))
|
||||
if(!preg_match('/^https?:\/\//i',$target_src))
|
||||
{
|
||||
$target_src = Context::getRequestUri() . $target_src;
|
||||
$target_src = Context::getRequestUri().$target_src;
|
||||
}
|
||||
|
||||
$tmp_file = sprintf('./files/cache/tmp/%d', md5(rand(111111, 999999) . $this->comment_srl));
|
||||
|
||||
FileHandler::makeDir('./files/cache/tmp');
|
||||
|
||||
if(!is_dir('./files/cache/tmp'))
|
||||
{
|
||||
FileHandler::makeDir('./files/cache/tmp');
|
||||
}
|
||||
FileHandler::getRemoteFile($target_src, $tmp_file);
|
||||
|
||||
if(!file_exists($tmp_file))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
list($_w, $_h, $_t, $_a) = @getimagesize($tmp_file);
|
||||
|
||||
if($_w < $width || $_h < $height)
|
||||
if($is_img = @getimagesize($tmp_file))
|
||||
{
|
||||
list($_w, $_h, $_t, $_a) = $is_img;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$source_file = $tmp_file;
|
||||
$is_tmp_file = TRUE;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@
|
|||
<action name="procCommentAdminAddCart" type="controller" />
|
||||
<action name="procCommentGetList" type="controller" />
|
||||
<action name="procCommentAdminMoveToTrash" type="controller" />
|
||||
<action name="procCommentVoteUpCancel" type="controller" />
|
||||
<action name="procCommentVoteDownCancel" type="controller" />
|
||||
</actions>
|
||||
<menus>
|
||||
<menu name="comment">
|
||||
|
|
|
|||
|
|
@ -81,6 +81,12 @@
|
|||
<value xml:lang="tr"><![CDATA[Yorumları, kullanıcının girdiği rakam kadar gösterin. Eğer yorum sayısı belirlenen sayıyı aşarsa, yorum Liste'ye taşınır.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Hiển thị số bình luận được gửi, và nó sẽ tạo một danh sách nếu có nhiều bình luận.]]></value>
|
||||
</item>
|
||||
<item name="msg_comment_voted_cancel_not">
|
||||
<value xml:lang="ko"><![CDATA[추천수가 0이하일 경우 추천캔슬을 사용할 수 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_comment_blamed_cancel_not">
|
||||
<value xml:lang="ko"><![CDATA[추천수가 0이하일 경우 비추천캔슬을 사용할 수 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_cart_is_null">
|
||||
<value xml:lang="ko"><![CDATA[삭제할 글을 선택해주세요.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Please select an article to delete.]]></value>
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@
|
|||
</tables>
|
||||
<conditions>
|
||||
<condition operation="in" column="comment_srl" var="comment_srl" filter="number" notnull="notnull" />
|
||||
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
|
|||
15
modules/comment/queries/getCommentVotedLog.xml
Normal file
15
modules/comment/queries/getCommentVotedLog.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<query id="getCommentVotedLog" action="select">
|
||||
<tables>
|
||||
<table name="comment_voted_log" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="comment_srl" var="comment_srl" filter="number" notnull="notnull" />
|
||||
<group pipe="and">
|
||||
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" pipe="and" />
|
||||
</group>
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -29,7 +29,9 @@
|
|||
<action name="getDocumentMenu" type="model" />
|
||||
|
||||
<action name="procDocumentVoteUp" type="controller" />
|
||||
<action name="procDocumentVoteUpCancel" type="controller" />.
|
||||
<action name="procDocumentVoteDown" type="controller" />
|
||||
<action name="procDocumentVoteDownCancel" type="controller" />
|
||||
<action name="procDocumentDeclare" type="controller" />
|
||||
<action name="procDocumentAddCart" type="controller" />
|
||||
<action name="procDocumentManageCheckedDocument" type="controller" />
|
||||
|
|
@ -63,7 +65,6 @@
|
|||
<action name="procDocumentAdminDeleteAllThumbnail" type="controller" />
|
||||
<action name="procDocumentAdminCancelDeclare" type="controller" />
|
||||
<action name="procDocumentAdminMoveToTrash" type="controller" />
|
||||
|
||||
</actions>
|
||||
<menus>
|
||||
<menu name="document">
|
||||
|
|
|
|||
|
|
@ -44,6 +44,27 @@ class documentController extends document
|
|||
return $output;
|
||||
}
|
||||
|
||||
function procDocumentVoteUpCancel()
|
||||
{
|
||||
if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$document_srl = Context::get('target_srl');
|
||||
if(!$document_srl) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$oDocumentModel = getModel('document');
|
||||
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
|
||||
if($oDocument->get('voted_count') <= 0)
|
||||
{
|
||||
return new Object(-1, 'msg_document_voted_cancel_not');
|
||||
}
|
||||
$point = 1;
|
||||
$output = $this->updateVotedCountCancel($document_srl, $oDocument, $point);
|
||||
|
||||
$output = new Object();
|
||||
$output->setMessage('success_voted_canceled');
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* insert alias
|
||||
* @param int $module_srl
|
||||
|
|
@ -89,6 +110,82 @@ class documentController extends document
|
|||
return $output;
|
||||
}
|
||||
|
||||
function procDocumentVoteDownCancel()
|
||||
{
|
||||
if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$document_srl = Context::get('target_srl');
|
||||
if(!$document_srl) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
$oDocumentModel = getModel('document');
|
||||
$oDocument = $oDocumentModel->getDocument($document_srl, false, false);
|
||||
if($oDocument->get('blamed_count') >= 0)
|
||||
{
|
||||
return new Object(-1, 'msg_document_voted_cancel_not');
|
||||
}
|
||||
$point = -1;
|
||||
$output = $this->updateVotedCountCancel($document_srl, $oDocument, $point);
|
||||
|
||||
$output = new Object();
|
||||
$output->setMessage('success_blamed_canceled');
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update Document Voted Cancel
|
||||
* @param int $document_srl
|
||||
* @param Document $oDocument
|
||||
* @param int $point
|
||||
* @return object
|
||||
*/
|
||||
function updateVotedCountCancel($document_srl, $oDocument, $point)
|
||||
{
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
$args = new stdClass();
|
||||
$d_args = new stdClass();
|
||||
$args->document_srl = $d_args->document_srl = $document_srl;
|
||||
$d_args->member_srl = $logged_info->member_srl;
|
||||
if($point > 0)
|
||||
{
|
||||
$args->voted_count = $oDocument->get('voted_count') - $point;
|
||||
$output = executeQuery('document.updateVotedCount', $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
$args->blamed_count = $oDocument->get('blamed_count') - $point;
|
||||
$output = executeQuery('document.updateBlamedCount', $args);
|
||||
}
|
||||
$d_output = executeQuery('document.deleteDocumentVotedLog', $d_args);
|
||||
if(!$d_output->toBool()) return $d_output;
|
||||
|
||||
//session reset
|
||||
$_SESSION['voted_document'][$document_srl] = false;
|
||||
|
||||
// begin transaction
|
||||
$oDB = DB::getInstance();
|
||||
$oDB->begin();
|
||||
|
||||
$obj = new stdClass();
|
||||
$obj->member_srl = $oDocument->get('member_srl');
|
||||
$obj->module_srl = $oDocument->get('module_srl');
|
||||
$obj->document_srl = $oDocument->get('document_srl');
|
||||
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
|
||||
$obj->point = $point;
|
||||
$obj->before_point = ($point < 0) ? $oDocument->get('blamed_count') : $oDocument->get('voted_count');
|
||||
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
|
||||
$obj->cancel = 1;
|
||||
|
||||
$trigger_output = ModuleHandler::triggerCall('document.updateVotedCountCancel', 'after', $obj);
|
||||
if(!$trigger_output->toBool())
|
||||
{
|
||||
$oDB->rollback();
|
||||
return $trigger_output;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action called when the post is reported by other member
|
||||
* @return void|Object
|
||||
|
|
@ -1175,7 +1272,7 @@ class documentController extends document
|
|||
}
|
||||
|
||||
// Use member_srl for logged-in members and IP address for non-members.
|
||||
$args = new stdClass;
|
||||
$args = new stdClass();
|
||||
if($member_srl)
|
||||
{
|
||||
$args->member_srl = $member_srl;
|
||||
|
|
@ -1201,11 +1298,15 @@ class documentController extends document
|
|||
if($point < 0)
|
||||
{
|
||||
$args->blamed_count = $oDocument->get('blamed_count') + $point;
|
||||
// Leave in the session information
|
||||
$_SESSION['voted_document'][$document_srl] = $point;
|
||||
$output = executeQuery('document.updateBlamedCount', $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
$args->voted_count = $oDocument->get('voted_count') + $point;
|
||||
// Leave in the session information
|
||||
$_SESSION['voted_document'][$document_srl] = $point;
|
||||
$output = executeQuery('document.updateVotedCount', $args);
|
||||
}
|
||||
if(!$output->toBool()) return $output;
|
||||
|
|
@ -1239,9 +1340,6 @@ class documentController extends document
|
|||
$oCacheHandler->delete($cache_key);
|
||||
}
|
||||
|
||||
// Leave in the session information
|
||||
$_SESSION['voted_document'][$document_srl] = true;
|
||||
|
||||
// Return result
|
||||
$output = new Object();
|
||||
if($point > 0)
|
||||
|
|
|
|||
|
|
@ -369,6 +369,29 @@ class documentItem extends Object
|
|||
return $title;
|
||||
}
|
||||
|
||||
function getVoted()
|
||||
{
|
||||
if(!$this->document_srl) return false;
|
||||
if($_SESSION['voted_document'][$this->document_srl])
|
||||
{
|
||||
return $_SESSION['voted_document'][$this->document_srl];
|
||||
}
|
||||
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
$args = new stdClass();
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
$args->document_srl = $this->document_srl;
|
||||
$output = executeQuery('document.getDocumentVotedLog', $args);
|
||||
|
||||
if($output->data->point)
|
||||
{
|
||||
return $output->data->point;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTitle($cut_size = 0, $tail='...')
|
||||
{
|
||||
if(!$this->document_srl) return;
|
||||
|
|
@ -814,8 +837,19 @@ class documentItem extends Object
|
|||
|
||||
// If not specify its height, create a square
|
||||
if(!$height) $height = $width;
|
||||
if($this->get('content'))
|
||||
{
|
||||
$content = $this->get('content');
|
||||
}
|
||||
else
|
||||
{
|
||||
$args = new stdClass();
|
||||
$args->document_srl = $this->document_srl;
|
||||
$output = executeQuery('document.getDocument', $args);
|
||||
$content = $output->data->content;
|
||||
}
|
||||
// Return false if neither attachement nor image files in the document
|
||||
if(!$this->get('uploaded_count') && !preg_match("!<img!is", $this->get('content'))) return;
|
||||
if(!$this->get('uploaded_count') && !preg_match("!<img!is", $content)) return;
|
||||
// Get thumbnai_type information from document module's configuration
|
||||
if(!in_array($thumbnail_type, array('crop','ratio')))
|
||||
{
|
||||
|
|
@ -826,7 +860,7 @@ class documentItem extends Object
|
|||
$config = $oDocumentModel->getDocumentConfig();
|
||||
$GLOBALS['__document_config__'] = $config;
|
||||
}
|
||||
$thumbnail_type = $config->thumbnail_type;
|
||||
$thumbnail_type = $config->thumbnail_type ?: 'crop';
|
||||
}
|
||||
|
||||
// Define thumbnail information
|
||||
|
|
@ -891,23 +925,31 @@ class documentItem extends Object
|
|||
// If not exists, file an image file from the content
|
||||
if(!$source_file)
|
||||
{
|
||||
$content = $this->get('content');
|
||||
$target_src = null;
|
||||
preg_match_all("!src=(\"|')([^\"' ]*?)(\"|')!is", $content, $matches, PREG_SET_ORDER);
|
||||
$cnt = count($matches);
|
||||
for($i=0;$i<$cnt;$i++)
|
||||
preg_match_all("!<img\s[^>]*?src=(\"|')([^\"' ]*?)(\"|')!is", $content, $matches, PREG_SET_ORDER);
|
||||
foreach($matches as $match)
|
||||
{
|
||||
$target_src = trim($matches[$i][2]);
|
||||
if(!preg_match("/\.(jpg|png|jpeg|gif|bmp)$/i",$target_src)) continue;
|
||||
if(preg_match('/\/(common|modules|widgets|addons|layouts)\//i', $target_src)) continue;
|
||||
$target_src = htmlspecialchars_decode(trim($match[2]));
|
||||
if(preg_match('/\/(common|modules|widgets|addons|layouts)\//i', $target_src))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!preg_match('/^(http|https):\/\//i',$target_src)) $target_src = Context::getRequestUri().$target_src;
|
||||
if(!preg_match('/^https?:\/\//i',$target_src))
|
||||
{
|
||||
$target_src = Context::getRequestUri().$target_src;
|
||||
}
|
||||
|
||||
$tmp_file = sprintf('./files/cache/tmp/%d', md5(rand(111111,999999).$this->document_srl));
|
||||
if(!is_dir('./files/cache/tmp')) FileHandler::makeDir('./files/cache/tmp');
|
||||
if(!is_dir('./files/cache/tmp'))
|
||||
{
|
||||
FileHandler::makeDir('./files/cache/tmp');
|
||||
}
|
||||
FileHandler::getRemoteFile($target_src, $tmp_file);
|
||||
if(!file_exists($tmp_file)) continue;
|
||||
if(!file_exists($tmp_file))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if($is_img = @getimagesize($tmp_file))
|
||||
|
|
@ -918,7 +960,6 @@ class documentItem extends Object
|
|||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$source_file = $tmp_file;
|
||||
$is_tmp_file = true;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -349,6 +349,10 @@
|
|||
<value xml:lang="ko"><![CDATA[최고관리자의 게시글을 지울 권한이 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[You don't have permission to delete the posts of Top Admin.]]></value>
|
||||
</item>
|
||||
<item name="msg_document_voted_cancel_not">
|
||||
<value xml:lang="ko"><![CDATA[추천수가 0이하일 경우 추천캔슬을 사용할 수 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[]]></value>
|
||||
</item>
|
||||
<item name="move_target_module">
|
||||
<value xml:lang="ko"><![CDATA[대상 페이지]]></value>
|
||||
<value xml:lang="en"><![CDATA[Target module ]]></value>
|
||||
|
|
|
|||
|
|
@ -4,5 +4,6 @@
|
|||
</tables>
|
||||
<conditions>
|
||||
<condition operation="in" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
|
||||
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
|
|||
15
modules/document/queries/getDocumentVotedLog.xml
Normal file
15
modules/document/queries/getDocumentVotedLog.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<query id="getDocumentVotedLog" action="select">
|
||||
<tables>
|
||||
<table name="document_voted_log" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
|
||||
<group pipe="and">
|
||||
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
<condition operation="equal" column="ipaddress" var="ipaddress" pipe="and" />
|
||||
</group>
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -63,8 +63,7 @@ class image_link extends EditorHandler
|
|||
if(substr($src, 0,2)=='./') $src = Context::getRequestUri().substr($src, 2);
|
||||
else if(substr($src , 0, 1)=='/')
|
||||
{
|
||||
if($_SERVER['HTTPS']=='on') $http_src = 'https://';
|
||||
else $http_src = 'http://';
|
||||
$http_src = RX_SSL ? 'https://' : 'http://';
|
||||
$src = $http_src.$_SERVER['HTTP_HOST'].$src;
|
||||
}
|
||||
else if(!strpos($temp_src[0],':') && $src) $src = Context::getRequestUri().$src;
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class poll_maker extends EditorHandler
|
|||
{
|
||||
$args = new stdClass();
|
||||
|
||||
$args->poll_srl = $xml_obj->attrs->poll_srl;
|
||||
$args->poll_srl = intval($xml_obj->attrs->poll_srl);
|
||||
$skin = $xml_obj->attrs->skin;
|
||||
if(!$skin) $skin = 'default';
|
||||
$args->skin = $skin;
|
||||
|
|
@ -61,6 +61,11 @@ class poll_maker extends EditorHandler
|
|||
$tpl_path = sprintf('%sskins/%s', _XE_PATH_ . 'widgets/pollWidget/', $args->skin);
|
||||
$tpl_file = 'pollview';
|
||||
|
||||
// Get the information related to the survey
|
||||
$oPollModel = getModel('poll');
|
||||
$poll_data = $oPollModel->_getPollinfo($args->poll_srl);
|
||||
|
||||
Context::set('poll_data', $poll_data);
|
||||
Context::set('colorset', $args->colorset);
|
||||
Context::set('poll_srl', $args->poll_srl);
|
||||
Context::set('style', $args->style);
|
||||
|
|
|
|||
|
|
@ -31,14 +31,14 @@ $(function(){
|
|||
, onSelect:function(){
|
||||
$(this).prev('input[type="hidden"]').val(this.value.replace(/-/g,""));
|
||||
}
|
||||
,minDate: new Date("{date('Y-m-d',time()+60*60*24*30)}")
|
||||
,defaultDate: new Date("{date('Y-m-d',time()+60*60*24*30)}")
|
||||
,minDate: new Date("{date('Y-m-d',time())}")
|
||||
};
|
||||
$.extend(option,$.datepicker.regional['{$lang_type}']);
|
||||
$.extend(option,$.datepicker.regional['{str_replace('jp','ja',$lang_type)}']);
|
||||
$(".inputDate").datepicker(option);
|
||||
});
|
||||
})(jQuery);
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
|
|
@ -46,7 +46,7 @@ $(function(){
|
|||
<div class="x_controls">
|
||||
<select id="skin" name="skin">
|
||||
<!--@foreach($skin_list as $skin=>$skin_info)-->
|
||||
<option value="{$skin}">{$skin_info->title} (skin by <!--@foreach($skin_info->author as $author=>$author_info)-->{@ $authorname = array(); $authorname[] = $author_info->name; }<!--@end-->{implode(",",$authorname)})</option>
|
||||
<option value="{$skin}">{$skin_info->title} (by {@ $authorname = array();}<!--@foreach($skin_info->author as $author=>$author_info)-->{@ $authorname[] = $author_info->name; }<!--@end-->{implode(",",$authorname)})</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -7,16 +7,16 @@
|
|||
* 부모창의 위지윅에디터에 데이터를 삽입
|
||||
**/
|
||||
function completeInsertPoll(ret_obj) {
|
||||
if(typeof(opener)=="undefined") return null;
|
||||
if(typeof(opener)=="undefined") return null;
|
||||
|
||||
var fo_obj = get_by_id('fo_component');
|
||||
var skin = fo_obj.skin.options[fo_obj.skin.selectedIndex].value;
|
||||
var fo_obj = get_by_id('fo_component');
|
||||
var skin = fo_obj.skin.options[fo_obj.skin.selectedIndex].value;
|
||||
|
||||
var poll_srl = ret_obj["poll_srl"];
|
||||
if(!poll_srl) return null;
|
||||
var poll_srl = ret_obj["poll_srl"];
|
||||
if(!poll_srl) return null;
|
||||
|
||||
var text = "<img src=\"../../../../common/img/blank.gif\" poll_srl=\""+poll_srl+"\" editor_component=\"poll_maker\" skin=\""+skin+"\" style=\"display:block;width:400px;height:300px;border:2px dotted #4371B9;background:url(./modules/editor/components/poll_maker/tpl/poll_maker_component.gif) no-repeat center;\" />";
|
||||
alert(ret_obj['message']);
|
||||
var text = "<img src=\"../../../../common/img/blank.gif\" poll_srl=\""+poll_srl+"\" editor_component=\"poll_maker\" skin=\""+skin+"\" style=\"display:block;width:400px;height:300px;border:2px dotted #4371B9;background:url(./modules/editor/components/poll_maker/tpl/poll_maker_component.gif) no-repeat center;\" />";
|
||||
alert(ret_obj['message']);
|
||||
|
||||
opener.editorFocus(opener.editorPrevSrl);
|
||||
|
||||
|
|
@ -24,9 +24,9 @@ function completeInsertPoll(ret_obj) {
|
|||
|
||||
opener.editorReplaceHTML(iframe_obj, text);
|
||||
opener.editorFocus(opener.editorPrevSrl);
|
||||
window.close();
|
||||
window.close();
|
||||
|
||||
return null;
|
||||
return null;
|
||||
}
|
||||
|
||||
jQuery(function($){
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
function completeInsertPoll(e){if("undefined"==typeof opener)return null;var t=get_by_id("fo_component"),o=t.skin.options[t.skin.selectedIndex].value,n=e.poll_srl;if(!n)return null;var l='<img src="../../../../common/img/blank.gif" poll_srl="'+n+'" editor_component="poll_maker" skin="'+o+'" style="display:block;width:400px;height:300px;border:2px dotted #4371B9;background:url(./modules/editor/components/poll_maker/tpl/poll_maker_component.gif) no-repeat center;" />';alert(e.message),opener.editorFocus(opener.editorPrevSrl);var i=opener.editorGetIFrame(opener.editorPrevSrl);return opener.editorReplaceHTML(i,l),opener.editorFocus(opener.editorPrevSrl),window.close(),null}jQuery(function(e){function t(){var t=e(".poll_box");$inputs=t.find("input"),poll_idx=0,$inputs.attr("name",function(e,t){return/^checkcount_/.test(t)&&poll_idx++,t.replace(/^([a-z]+_)(?:tidx|\d+)/,"$1"+poll_idx)}),t.length>1?t.find("button._del_poll").show():t.find("button._del_poll").hide()}function o(){var o=e("#poll_source");o.before(o.clone(!0).removeAttr("id").addClass("poll_box").css("display","block")),t()}var n;return n=e(opener.editorPrevNode),n.length&&"poll_maker"==n.attr("editor_component")?(alert(msg_poll_cannot_modify),window.close()):(e("#add_poll").click(function(){o(),setFixedPopupSize()}),e("button._add_item").click(function(){var t,o,n;t=e(this).prev().children("table").find(">tbody>tr:last"),o=t.clone(),match=t.find("td>input").attr("name").match(/item_(\d+)_(\d+)$/),match&&(match[2]++,(n=o.find("th")).html(n.html().replace(/ \d+/," "+match[2])),o.find("td>input").attr("name","item_"+match[1]+"_"+match[2]),t.after(o),setFixedPopupSize())}),e("button._del_item").click(function(){var t,o;t=e(this).prevAll("div").children("table").find(">tbody>tr:last"),o=t.find("td>input").attr("name").match(/item_(\d+)_(\d+)/),o&&2!=o[2]&&(t.remove(),setFixedPopupSize())}),e("button._del_poll").click(function(){e(this).parent(".poll_box").remove(),t()}),void o())}),jQuery(window).load(setFixedPopupSize);
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="editor.css" />
|
||||
<title>XpressEngine</title>
|
||||
<title>Rhymix</title>
|
||||
</head>
|
||||
<body class="xe_content editable">
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="editor.css" />
|
||||
<title>XpressEngine</title>
|
||||
<title>Rhymix</title>
|
||||
</head>
|
||||
<body class="xe_content editable">
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="editor.css" />
|
||||
<title>XpressEngine</title>
|
||||
<title>Rhymix</title>
|
||||
</head>
|
||||
<body class="xe_content editable">
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="editor.css" />
|
||||
<title>XpressEngine</title>
|
||||
<title>Rhymix</title>
|
||||
</head>
|
||||
<body class="xe_content editable">
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="editor.css" />
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
<title>XpressEngine</title>
|
||||
<title>Rhymix</title>
|
||||
</head>
|
||||
<body class="xe_content editable">
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" href="editor.css" />
|
||||
<link rel="stylesheet" href="style.css" />
|
||||
<title>XpressEngine</title>
|
||||
<title>Rhymix</title>
|
||||
</head>
|
||||
<body class="xe_content editable">
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -201,16 +201,16 @@
|
|||
<value xml:lang="vi"><![CDATA[Những định dạng này sẽ được phép liên kết. Hãy sử dụng dấu(,) để thêm nhiều định dạng . Ví dụ: .hwp, .doc, .zip, .pdf]]></value>
|
||||
</item>
|
||||
<item name="about_allow_outlink_site">
|
||||
<value xml:lang="ko"><![CDATA[파일 외부 링크 설정에 상관없이 허용하는 사이트 주소입니다. 여러 개 입력 시에 줄을 바꿔서 구분해주세요. 예)http://www.xpressengine.com]]></value>
|
||||
<value xml:lang="en"><![CDATA[These websites will alyways be allowed. Please use new line for multiple input. ex)http://xpressengine.com/]]></value>
|
||||
<value xml:lang="jp"><![CDATA[外部からのファイルリンク設定に関係なく、常に外部からのリンクを許可するURLです。複数登録時には、改行で記入してください。 ex)http://xpressengine.com/]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[可以设置允许外链的站点。多个站点以换行来区分,即一行一个。 ex)http://xpressengine.com/]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[可設置允許外部檔案連結的網站名單。當數量太多時,可換行輸入。 例) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="fr"><![CDATA[파일 외부 링크 설정에 관계 없이 허용하는 사이트 주소입니다. 여러개 입력시에 줄을 바꿔서 구분해주세요. ex)http://xpressengine.com/]]></value>
|
||||
<value xml:lang="ru"><![CDATA[These websites will alyways be allowed. Please use new line for multiple input. ex)http://www.hotmail.com]]></value>
|
||||
<value xml:lang="es"><![CDATA[Archivos, independientemente de la configuración para permitir a los enlaces externos es la dirección del sitio. Entrada múltiples gubunhaeju un cambio en la línea, por favor. Ej.) http://xpressengine.com/]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Bu sitelere her zaman izin verilecektir. Lütfen çoklu giriş için yeni satır kullanınız. örn.)http://xpressengine.com/]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Những Website được phép liên kết. Hãy nhập địa chỉ của những Website được phép. Ví dụ: http://xpressengine.com/]]></value>
|
||||
<value xml:lang="ko"><![CDATA[파일 외부 링크 설정에 상관없이 허용하는 사이트 주소입니다. 여러 개 입력 시에 줄을 바꿔서 구분해주세요. 예)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="en"><![CDATA[These websites will alyways be allowed. Please use new line for multiple input. ex)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="jp"><![CDATA[外部からのファイルリンク設定に関係なく、常に外部からのリンクを許可するURLです。複数登録時には、改行で記入してください。 ex)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[可以设置允许外链的站点。多个站点以换行来区分,即一行一个。 ex)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[可設置允許外部檔案連結的網站名單。當數量太多時,可換行輸入。 例) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="fr"><![CDATA[파일 외부 링크 설정에 관계 없이 허용하는 사이트 주소입니다. 여러개 입력시에 줄을 바꿔서 구분해주세요. ex)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="ru"><![CDATA[These websites will alyways be allowed. Please use new line for multiple input. ex)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="es"><![CDATA[Archivos, independientemente de la configuración para permitir a los enlaces externos es la dirección del sitio. Entrada múltiples gubunhaeju un cambio en la línea, por favor. Ej.) https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Bu sitelere her zaman izin verilecektir. Lütfen çoklu giriş için yeni satır kullanınız. örn.)https://www.rhymix.org/]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Những Website được phép liên kết. Hãy nhập địa chỉ của những Website được phép. Ví dụ: https://www.rhymix.org/]]></value>
|
||||
</item>
|
||||
<item name="about_allowed_filesize">
|
||||
<value xml:lang="ko"><![CDATA[하나의 파일에 대해 최고 용량을 지정할 수 있습니다.(관리자는 제외)]]></value>
|
||||
|
|
|
|||
|
|
@ -432,7 +432,7 @@ class importerAdminController extends importer
|
|||
$oMail->setTitle("Password update for your " . getFullSiteUrl() . " account");
|
||||
$webmaster_name = $member_config->webmaster_name?$member_config->webmaster_name:'Webmaster';
|
||||
$oMail->setContent("Dear $obj->user_name, <br /><br />
|
||||
We recently migrated our phpBB forum to XpressEngine. Since you password was encrypted we could not migrate it too, so please reset it by following this link:
|
||||
We recently migrated our phpBB forum to Rhymix. Since you password was encrypted we could not migrate it too, so please reset it by following this link:
|
||||
<a href='" . getFullSiteUrl() . "/?act=dispMemberFindAccount' >" . getFullSiteUrl() . "?act=dispMemberFindAccount</a>. You need to enter you email address and hit the 'Find account' button. You will then receive an email with a new, generated password that you can change after login. <br /><br />
|
||||
|
||||
Thank you for your understanding,<br />
|
||||
|
|
|
|||
|
|
@ -26,27 +26,27 @@
|
|||
</item>
|
||||
<item name="preprocessing">
|
||||
<value xml:lang="ko"><![CDATA[데이터 이전을 위한 사전 준비 중입니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[XE is preparing for importing.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix is preparing for importing.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[データ移転のため、準備中です。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[正准备数据导入]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[匯入資料中]]></value>
|
||||
<value xml:lang="fr"><![CDATA[On est en train de préparer pour transférer les données.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Идет подготовка для импортирования данных]]></value>
|
||||
<value xml:lang="es"><![CDATA[데이터 이전을 위한 사전 준비중입니다.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE içe aktarım için hazırlanıyor.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix içe aktarım için hazırlanıyor.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Đang chuẩn bị cho việc chuyển dữ liệu.]]></value>
|
||||
</item>
|
||||
<item name="importer">
|
||||
<value xml:lang="ko"><![CDATA[데이터 들여오기]]></value>
|
||||
<value xml:lang="en"><![CDATA[XE Data Importer]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEデータ変換]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix Data Importer]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixデータ変換]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[数据导入]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[匯入]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Transférer les Données du XE]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Импортировать данные XE]]></value>
|
||||
<value xml:lang="es"><![CDATA[Transferir los datos de XE]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE Veri Alıcısı]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Chuyển XE Data]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Transférer les Données du Rhymix]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Импортировать данные Rhymix]]></value>
|
||||
<value xml:lang="es"><![CDATA[Transferir los datos de Rhymix]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix Veri Alıcısı]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Chuyển Rhymix Data]]></value>
|
||||
</item>
|
||||
<item name="source_type">
|
||||
<value xml:lang="ko"><![CDATA[이전 대상]]></value>
|
||||
|
|
@ -508,25 +508,25 @@ Hãy nhập đường dẫn cho File chứa Data trên Host dưới dạng http:
|
|||
<value xml:lang="vi"><![CDATA[Lựa chọn này sẽ đồng bộ thông tin thành viên trước khi đồng bộ Bài viết và thành viên.]]></value>
|
||||
</item>
|
||||
<item name="about_importer">
|
||||
<value xml:lang="ko"><![CDATA[다른 프로그램의 데이터를 XML 형식으로 변환 후 업로드하면 XE로 이전할 수 있습니다. <a href="http://www.xpressengine.com/index.php?mid=download&category_srl=18324038" target="_blank">XML Exporter</a>를 이용하면 XML파일로 변환할 수 있습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Data Importer will help you import Zeroboard4, Zeroboard5 Beta or other program's data into XE.
|
||||
<value xml:lang="ko"><![CDATA[다른 프로그램의 데이터를 XML 형식으로 변환 후 업로드하면 Rhymix로 이전할 수 있습니다. <a href="http://www.xpressengine.com/index.php?mid=download&category_srl=18324038" target="_blank">XML Exporter</a>를 이용하면 XML파일로 변환할 수 있습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Data Importer will help you import Zeroboard4, Zeroboard5 Beta or other program's data into Rhymix.
|
||||
In order to import, you first have to use <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Exporter</a> to convert the data you want into XML File.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをXEのデータに変換することができます。
|
||||
<value xml:lang="jp"><![CDATA[ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをRhymixのデータに変換することができます。
|
||||
変換するためには、<a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Exporter</a>を利用して変換したい書き込みデータをXMLファイルで作成してアップロードしてください。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[不仅可以导入Zeroboard 4,Zb5beta的数据,也可以把其他程序数据导入到XE当中。
|
||||
<value xml:lang="zh-CN"><![CDATA[不仅可以导入Zeroboard 4,Zb5beta的数据,也可以把其他程序数据导入到Rhymix当中。
|
||||
导入数据时请利用 <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Exporter</a>生成XML文件后再上传。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[不僅可以匯入 Zeroboard 4,Zb5beta 的資料,也能夠把其他程式資料匯入到 XE 當中。
|
||||
<value xml:lang="zh-TW"><![CDATA[不僅可以匯入 Zeroboard 4,Zb5beta 的資料,也能夠把其他程式資料匯入到 Rhymix 當中。
|
||||
匯入資料時,請利用 <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Exporter</a> 建立 XML 檔案後再上傳。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Vous pouvez transférer les données de Zeroboard4, de Zeroboard5 Beta ou d'autres logiciels aux données de XE.
|
||||
<value xml:lang="fr"><![CDATA[Vous pouvez transférer les données de Zeroboard4, de Zeroboard5 Beta ou d'autres logiciels aux données de Rhymix.
|
||||
Pour transférer, vous devez utiliser <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">Exporteur de XML</a> pour convertir les données en fichier de XML, et puis téléchargez-le.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Вы можете импортировать данные Zeroboard4, Zeroboard5 Beta или других программ в XE.
|
||||
<value xml:lang="ru"><![CDATA[Вы можете импортировать данные Zeroboard4, Zeroboard5 Beta или других программ в Rhymix.
|
||||
Чтобы импортировать, Вам следует использовать <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Экспортер (XML Exporter)</a>, чтобы конвертировать нужные данные в XML Файл и затем загрузить его.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Es posible trasferir los datos de Zeroboard4, zb5beta o de otros programas a XE.
|
||||
<value xml:lang="es"><![CDATA[Es posible trasferir los datos de Zeroboard4, zb5beta o de otros programas a Rhymix.
|
||||
Para la transferencia debe utilizar <a href="http://www.xpressengine.com/index.php?mid=download&category_srl=18324038" target="_blank">XML Exporter</a> para transformar los datos en archivo XML, y luego subir ese archivo.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Veri Alıcısı XE'ye, Zeroboard4, Zeroboard5 Beta veya başka programların verilerini aktarmada yardımcı olacaktır.
|
||||
<value xml:lang="tr"><![CDATA[Veri Alıcısı Rhymix'ye, Zeroboard4, Zeroboard5 Beta veya başka programların verilerini aktarmada yardımcı olacaktır.
|
||||
İçe aktarımı gerçekleştirebilmek için öncelikle <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML DışAktarımcı</a>'yı kullanıp istediğiniz veriyi XML türüne çevirmelisiniz.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Bạn có thể chuyển Data từ Zeroboard4, Zeroboard5 Beta hay Data của những mã nguồn khác vào Data của XE.
|
||||
Để hiểu rõ hơn công việc này, bạn có thể tham khảo cách chuyển đổi Data của bạn vào XE khi bạn đã Upload chúng tại <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Exporter</a>.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Bạn có thể chuyển Data từ Zeroboard4, Zeroboard5 Beta hay Data của những mã nguồn khác vào Data của Rhymix.
|
||||
Để hiểu rõ hơn công việc này, bạn có thể tham khảo cách chuyển đổi Data của bạn vào Rhymix khi bạn đã Upload chúng tại <a href="https://github.com/xpressengine/xe-migration-tool" target="_blank">XML Exporter</a>.]]></value>
|
||||
</item>
|
||||
<item name="about_target_path">
|
||||
<value xml:lang="ko"><![CDATA[첨부 파일을 받기 위해 제로보드4가 설치된 위치를 입력해주세요.
|
||||
|
|
|
|||
|
|
@ -394,18 +394,18 @@ class installController extends install
|
|||
$checklist['json'] = false;
|
||||
}
|
||||
|
||||
// Check openssl
|
||||
if(function_exists('openssl_encrypt'))
|
||||
// Check mcrypt or openssl
|
||||
if(function_exists('mcrypt_encrypt') || function_exists('openssl_encrypt'))
|
||||
{
|
||||
$checklist['openssl'] = true;
|
||||
$checklist['mcrypt'] = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$checklist['openssl'] = false;
|
||||
$checklist['mcrypt'] = false;
|
||||
}
|
||||
|
||||
// Check XML
|
||||
if(function_exists('xml_parser_create'))
|
||||
// Check xml & simplexml
|
||||
if(function_exists('xml_parser_create') && function_exists('simplexml_load_string'))
|
||||
{
|
||||
$checklist['xml'] = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ class installView extends install
|
|||
Context::set('progressMenu', '4');
|
||||
|
||||
$error_return_url = getNotEncodedUrl('', 'act', Context::get('act'), 'db_type', Context::get('db_type'));
|
||||
if($_SERVER['HTTPS'] == 'on')
|
||||
if(RX_SSL)
|
||||
{
|
||||
// Error occured when using https protocol at "ModuleHandler::init() '
|
||||
$parsedUrl = parse_url($error_return_url);
|
||||
|
|
@ -182,7 +182,7 @@ class installView extends install
|
|||
include _XE_PATH_.'files/config/tmpDB.config.php';
|
||||
|
||||
Context::set('use_rewrite', $_SESSION['use_rewrite']);
|
||||
Context::set('use_ssl', $_SERVER['HTTPS'] === 'on' ? 'always' : 'none');
|
||||
Context::set('use_ssl', RX_SSL ? 'always' : 'none');
|
||||
Context::set('time_zone', $GLOBALS['time_zone']);
|
||||
Context::set('db_type', $db_info->db_type);
|
||||
$this->setTemplateFile('admin_form');
|
||||
|
|
|
|||
|
|
@ -137,20 +137,22 @@
|
|||
<value xml:lang="vi"><![CDATA[Điều khoản thư mục files]]></value>
|
||||
</item>
|
||||
<item name="xml">
|
||||
<value xml:lang="ko"><![CDATA[xml]]></value>
|
||||
<value xml:lang="en"><![CDATA[xml]]></value>
|
||||
<value xml:lang="jp"><![CDATA[xml]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[xml]]></value>
|
||||
<value xml:lang="fr"><![CDATA[xml]]></value>
|
||||
<value xml:lang="ru"><![CDATA[xml]]></value>
|
||||
<value xml:lang="es"><![CDATA[xml]]></value>
|
||||
<value xml:lang="tr"><![CDATA[xml]]></value>
|
||||
<value xml:lang="ko"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="en"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="jp"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="fr"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="ru"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="es"><![CDATA[xml / simplexml]]></value>
|
||||
<value xml:lang="tr"><![CDATA[xml / simplexml]]></value>
|
||||
</item>
|
||||
<item name="curl">
|
||||
<value xml:lang="ko"><![CDATA[curl]]></value>
|
||||
<value xml:lang="en"><![CDATA[curl]]></value>
|
||||
<value xml:lang="jp"><![CDATA[curl]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[curl]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[curl]]></value>
|
||||
<value xml:lang="fr"><![CDATA[curl]]></value>
|
||||
<value xml:lang="ru"><![CDATA[curl]]></value>
|
||||
<value xml:lang="es"><![CDATA[curl]]></value>
|
||||
|
|
@ -161,6 +163,7 @@
|
|||
<value xml:lang="en"><![CDATA[iconv / mbstring]]></value>
|
||||
<value xml:lang="jp"><![CDATA[iconv / mbstring]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[iconv / mbstring]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[iconv / mbstring]]></value>
|
||||
<value xml:lang="fr"><![CDATA[iconv / mbstring]]></value>
|
||||
<value xml:lang="ru"><![CDATA[iconv / mbstring]]></value>
|
||||
<value xml:lang="es"><![CDATA[iconv / mbstring]]></value>
|
||||
|
|
@ -171,6 +174,7 @@
|
|||
<value xml:lang="en"><![CDATA[json]]></value>
|
||||
<value xml:lang="jp"><![CDATA[json]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[json]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[json]]></value>
|
||||
<value xml:lang="fr"><![CDATA[json]]></value>
|
||||
<value xml:lang="ru"><![CDATA[json]]></value>
|
||||
<value xml:lang="es"><![CDATA[json]]></value>
|
||||
|
|
@ -181,20 +185,22 @@
|
|||
<value xml:lang="en"><![CDATA[gd]]></value>
|
||||
<value xml:lang="jp"><![CDATA[gd]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[gd]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[gd]]></value>
|
||||
<value xml:lang="fr"><![CDATA[gd]]></value>
|
||||
<value xml:lang="ru"><![CDATA[gd]]></value>
|
||||
<value xml:lang="es"><![CDATA[gd]]></value>
|
||||
<value xml:lang="tr"><![CDATA[gd]]></value>
|
||||
</item>
|
||||
<item name="openssl">
|
||||
<value xml:lang="ko"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="en"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="jp"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="fr"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="ru"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="es"><![CDATA[openssl]]></value>
|
||||
<value xml:lang="tr"><![CDATA[openssl]]></value>
|
||||
<item name="mcrypt">
|
||||
<value xml:lang="ko"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="en"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="jp"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="fr"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="ru"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="es"><![CDATA[mcrypt / openssl]]></value>
|
||||
<value xml:lang="tr"><![CDATA[mcrypt / openssl]]></value>
|
||||
</item>
|
||||
<item name="session">
|
||||
<value xml:lang="ko"><![CDATA[session.auto_start 설정]]></value>
|
||||
|
|
|
|||
|
|
@ -56,16 +56,16 @@ $sitemap = array(
|
|||
'title' => 'Utility menu',
|
||||
'list' => array(
|
||||
array(
|
||||
'menu_name' => 'XE Official Site',
|
||||
'menu_name' => 'Rhymix Official Site',
|
||||
'is_shortcut' => 'Y',
|
||||
'open_window' => 'Y',
|
||||
'shortcut_target' => 'http://www.xpressengine.com'
|
||||
'shortcut_target' => 'https://www.rhymix.org/'
|
||||
),
|
||||
array(
|
||||
'menu_name' => 'GitHub',
|
||||
'is_shortcut' => 'Y',
|
||||
'open_window' => 'Y',
|
||||
'shortcut_target' => 'https://github.com/xpressengine'
|
||||
'shortcut_target' => 'https://github.com/rhymix'
|
||||
),
|
||||
)
|
||||
),
|
||||
|
|
@ -269,7 +269,7 @@ $obj->email_address = $logged_info->email_address;
|
|||
|
||||
$obj->module_srl = $module_srl;
|
||||
Context::set('version', __XE_VERSION__);
|
||||
$obj->title = 'Welcome XE';
|
||||
$obj->title = 'Welcome Rhymix';
|
||||
|
||||
$obj->content = $oTemplateHandler->compile(_XE_PATH_ . 'modules/install/script/welcome_content', 'welcome_content_'.$lang);
|
||||
|
||||
|
|
@ -279,7 +279,7 @@ if(!$output->toBool()) return $output;
|
|||
$document_srl = $output->get('document_srl');
|
||||
|
||||
unset($obj->document_srl);
|
||||
$obj->title = 'Welcome mobile XE';
|
||||
$obj->title = 'Welcome mobile Rhymix';
|
||||
$output = $oDocumentController->insertDocument($obj, true);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
<div class="welcomeXE">
|
||||
<section class="intro">
|
||||
<span class="noti">WELCOME TO</span>
|
||||
<h1 class="tit">WELCOME TO XPRESSENGINE</h1>
|
||||
<P class="cont">XpressEngine은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">XE 시작하기</a>
|
||||
<h1 class="tit">WELCOME TO Rhymix</h1>
|
||||
<P class="cont">Rhymix은 자유로운 웹 콘텐츠 발행을 돕는 CMS입니다.<br />간편한 설치와 다양한 추가 프로그램을 활용하여<br /> 자신만의 웹페이지를 쉽고 빠르게 만들 수 있습니다.</P>
|
||||
<a href="{getUrl('', 'module', 'admin')}" target="_blank" class="btn_start">Rhymix 시작하기</a>
|
||||
</section>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<li>
|
||||
<div class="ico"><i class="xi-layout-top-left"></i></div>
|
||||
<h2>최적화</h2>
|
||||
<p>XpressEngine 뿐 아니라, 다양한 프레임워크에서 동일하게 구현됩니다. 여러 환경에서 자유롭게 이용해보세요!</p>
|
||||
<p>Rhymix 뿐 아니라, 다양한 프레임워크에서 동일하게 구현됩니다. 여러 환경에서 자유롭게 이용해보세요!</p>
|
||||
</li>
|
||||
<li>
|
||||
<div class="ico"><i class="xi-arrows-alt"></i></div>
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ jQuery(function($){
|
|||
var user_id_input = $("input[name='user_id']");
|
||||
var email_input = $("input[name='email_address']");
|
||||
email_input.on("blur", function() {
|
||||
if (user_id_input.val() == "") {
|
||||
if (user_id_input.val() == "" && email_input.val() != "") {
|
||||
user_id_input.val(email_input.val().replace(/@.+$/g, "").replace(/[^a-zA-Z0-9_]/g, ""));
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -893,13 +893,13 @@
|
|||
</item>
|
||||
<item name="about_faceoff" type="array">
|
||||
<item name="title">
|
||||
<value xml:lang="ko"><![CDATA[XpressEngine FaceOff Layout 관리자]]></value>
|
||||
<value xml:lang="en"><![CDATA[XpressEngine FaceOff Layout Manager]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XpressEngine FaceOff レイアウト管理ツール]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[XpressEngine FaceOff布局管理工具]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[XpressEngine FaceOff 版面管理者]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XpressEngine FaceOff Yerleşim Düzeni Yöneticisi]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Quản lý giao diện XpressEngine FaceOff]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix FaceOff Layout 관리자]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix FaceOff Layout Manager]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymix FaceOff レイアウト管理ツール]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[Rhymix FaceOff布局管理工具]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Rhymix FaceOff 版面管理者]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix FaceOff Yerleşim Düzeni Yöneticisi]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Quản lý giao diện Rhymix FaceOff]]></value>
|
||||
</item>
|
||||
<item name="description">
|
||||
<value xml:lang="ko"><![CDATA[FaceOff Layout관리자로 웹상에서 쉽게 레이아웃을 꾸밀 수 있습니다.<br/>아래 그림을 보고 구성요소와 기능을 이용하여 원하는 레이아웃을 만드세요.]]></value>
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1312,14 +1312,14 @@
|
|||
</item>
|
||||
<item name="msg_confirm_account_title">
|
||||
<value xml:lang="ko"><![CDATA[가입 인증 메일입니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[XE Account Activation]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix Account Activation]]></value>
|
||||
<value xml:lang="jp"><![CDATA[確認メールです。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[会员注册]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[帳號啟用]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Mél à confirmer l'Authentification]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Письмо, подтверждающее регистрацию]]></value>
|
||||
<value xml:lang="es"><![CDATA[가입 인증 메일입니다]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE Hesap Etkinleştirmesi]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Rhymix Hesap Etkinleştirmesi]]></value>
|
||||
</item>
|
||||
<item name="title_modify_email_address">
|
||||
<value xml:lang="ko"><![CDATA[이메일주소 변경 요청 확인 메일입니다.]]></value>
|
||||
|
|
|
|||
|
|
@ -987,12 +987,12 @@ Menu không phải là người quản lý, nhiệm vụ của nó chỉ là li
|
|||
<value xml:lang="jp"><![CDATA[FTPパスワード]]></value>
|
||||
</item>
|
||||
<item name="need_core_update">
|
||||
<value xml:lang="ko"><![CDATA[설치하려면 XE core 업데이트가 필요합니다]]></value>
|
||||
<value xml:lang="jp"><![CDATA[設置するにはXE coreアップデートが必要です。]]></value>
|
||||
<value xml:lang="ko"><![CDATA[설치하려면 Rhymix 업데이트가 필요합니다]]></value>
|
||||
<value xml:lang="jp"><![CDATA[設置するにはRhymixアップデートが必要です。]]></value>
|
||||
</item>
|
||||
<item name="need_core_update_continue">
|
||||
<value xml:lang="ko"><![CDATA[XE core 업데이트가 함께 진행됩니다. 계속하시겠습니까?]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XE coreアップデートを一緒に行います。続けますか?]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix 업데이트가 함께 진행됩니다. 계속하시겠습니까?]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixアップデートを一緒に行います。続けますか?]]></value>
|
||||
</item>
|
||||
<item name="not_found_module">
|
||||
<value xml:lang="ko"><![CDATA[모듈이 존재하지 않음]]></value>
|
||||
|
|
|
|||
|
|
@ -517,7 +517,6 @@ class menuAdminModel extends menu
|
|||
{
|
||||
$this->_menuInfoSetting($menu->list[$key], $start_module, $isMenuFixed, $menuSrl,$siteSrl);
|
||||
}
|
||||
ksort($menu->list);
|
||||
$menu->list = array_values($menu->list);
|
||||
}
|
||||
else
|
||||
|
|
@ -569,7 +568,6 @@ class menuAdminModel extends menu
|
|||
{
|
||||
$this->_menuInfoSetting($menu->list[$key2], $start_module, $isMenuFixed, $value->menu_srl,$siteSrl);
|
||||
}
|
||||
ksort($menu->list);
|
||||
$menu->list = array_values($menu->list);
|
||||
}
|
||||
else
|
||||
|
|
@ -721,7 +719,6 @@ class menuAdminModel extends menu
|
|||
{
|
||||
$this->_menuInfoSetting($menu['list'][$key], $start_module, $isMenuFixed, $menuSrl, $siteSrl);
|
||||
}
|
||||
ksort($menu['list']);
|
||||
$menu['list'] = array_values($menu['list']);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -369,26 +369,26 @@
|
|||
<value xml:lang="vi"><![CDATA[Với ID Website]]></value>
|
||||
</item>
|
||||
<item name="about_domain">
|
||||
<value xml:lang="ko"><![CDATA[1개 이상의 사이트를 만들기 위해서는 전용 도메인이 있어야 합니다. 독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요. 예) www.xpressengine.com/xe]]></value>
|
||||
<value xml:lang="en"><![CDATA[In order to create more than one virtual site, every club needs to have its own domain name. A sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path where XE is installed. ex) www.xpressengine.com/xe]]></value>
|
||||
<value xml:lang="jp"><![CDATA[複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。 また、 XEのインストールパスも一緒に記入してください。 ex) www.xpressengine.com/xe]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[要创建一个站点必须有一个专用域名。 一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。 ex) www.xpressengine.com/xe]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[要建立網站必須要有個專屬域名。 頂級域名或次級域名都可以。輸入時,請將 XE 安裝路徑也一起輸入。 例) www.xpressengine.com/xe]]></value>
|
||||
<value xml:lang="es"><![CDATA[Para crear un dominio privado de la site requiere. Independiente de dominio o subdominio, y XE está instalado, el camino que en su conjunto. Ej.) www.xpressengine.com / zbxe]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Birden fazla sanal website oluşturabilmek için, her birinin kendi alanadına ihtiyacı vardır. Alt-alanadı (örn., aaa.bbb.com of bbb.com) da kullanılabilir. XE'nin de içinde kurulu olduğu yolun adresini giriniz. örn.) www.xpressengine.com/xe]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Để tạo nhiều Website nhỏ, các Website nhỏ này cần những tên miền riêng của mình. Có thể sử dụng những Subdomain dạng aaa.bbb.com của bbb.com. Hãy nhập địa chỉ bao gồm cả Domain cài đặt XE. Ví dụ: www.vietxe.net/xe]]></value>
|
||||
<value xml:lang="ko"><![CDATA[1개 이상의 사이트를 만들기 위해서는 전용 도메인이 있어야 합니다. 독립 도메인이나 서브 도메인이 있으면 되고 Rhymix가 설치된 경로까지 같이 넣어주세요. 예) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="en"><![CDATA[In order to create more than one virtual site, every club needs to have its own domain name. A sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path where Rhymix is installed. ex) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="jp"><![CDATA[複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。 また、 Rhymixのインストールパスも一緒に記入してください。 ex) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[要创建一个站点必须有一个专用域名。 一级域名或二级域名皆可。输入的时候请把Rhymix安装路径也一起输入。 ex) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[要建立網站必須要有個專屬域名。 頂級域名或次級域名都可以。輸入時,請將 Rhymix 安裝路徑也一起輸入。 例) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="es"><![CDATA[Para crear un dominio privado de la site requiere. Independiente de dominio o subdominio, y Rhymix está instalado, el camino que en su conjunto. Ej.) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Birden fazla sanal website oluşturabilmek için, her birinin kendi alanadına ihtiyacı vardır. Alt-alanadı (örn., aaa.bbb.com of bbb.com) da kullanılabilir. Rhymix'nin de içinde kurulu olduğu yolun adresini giriniz. örn.) www.rhymix.org/rx]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Để tạo nhiều Website nhỏ, các Website nhỏ này cần những tên miền riêng của mình. Có thể sử dụng những Subdomain dạng aaa.bbb.com của bbb.com. Hãy nhập địa chỉ bao gồm cả Domain cài đặt Rhymix. Ví dụ: www.rhymix.org/rx]]></value>
|
||||
</item>
|
||||
<item name="about_vid">
|
||||
<value xml:lang="ko"><![CDATA[별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)과 중복될 수 없습니다. 첫 글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="en"><![CDATA[Users can access via http://XEaddress/ID. You cannot use same site id as the existing module name(mid). Site id should start with an alphabet character. Alphabet characters, numbers and underscore can be used for the site id.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[別途のドメインではなく、「http://XEアドレス/ID」へのアクセスが可能です。この際、モジュール名(mid)と重複しないように登録してください。 必ず、頭文字は半角英文字にし、「(すべて半角の)英数字・_ 」 だけの組み合わせで入力してください。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[直接以http://XE安装地址/ID的方式访问。 模块名(mid)不能重复。 模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[直接以 http://程式安裝位址/ID 的方式訪問。模組名稱(mid)不能重複。 必須要以英文字母開頭,只允許使用底線、英文及數字。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다. 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="ru"><![CDATA[별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다. 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="es"><![CDATA[별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다. 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Kullanıcılar, http://XEaddress/ID adresiyle ulaşabilirler. Varolan bir modül adıyla(mid) aynı olan site kimliği kullanamazsınız . Site kimliği bir harfle başlamaladır . Alfabetik karakterler, sayılar ve _ işareti site kimliği için kullanılabilir.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Người sử dụng có thể truy cập qua http://XEaddress/ID. Bạn không thể sử dụng ID giống nhau và giống tên Module đã có. Teen ID có dạng là các chữ cái, số và dấu gạch dưới (_).]]></value>
|
||||
<value xml:lang="ko"><![CDATA[별도의 도메인이 아닌 https://Rhymix주소/ID 로 접속할 수 있습니다. 모듈명(mid)과 중복될 수 없습니다. 첫 글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="en"><![CDATA[Users can access via https://Rhymixaddress/ID. You cannot use same site id as the existing module name(mid). Site id should start with an alphabet character. Alphabet characters, numbers and underscore can be used for the site id.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[別途のドメインではなく、「https://Rhymixアドレス/ID」へのアクセスが可能です。この際、モジュール名(mid)と重複しないように登録してください。 必ず、頭文字は半角英文字にし、「(すべて半角の)英数字・_ 」 だけの組み合わせで入力してください。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[直接以https://Rhymix安装地址/ID的方式访问。 模块名(mid)不能重复。 模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[直接以 https://程式安裝位址/ID 的方式訪問。模組名稱(mid)不能重複。 必須要以英文字母開頭,只允許使用底線、英文及數字。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[별도의 도메인이 아닌 https://Rhymix주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다. 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="ru"><![CDATA[별도의 도메인이 아닌 https://Rhymix주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다. 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="es"><![CDATA[별도의 도메인이 아닌 https://Rhymix주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다. 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Kullanıcılar, https://Rhymixaddress/ID adresiyle ulaşabilirler. Varolan bir modül adıyla(mid) aynı olan site kimliği kullanamazsınız . Site kimliği bir harfle başlamaladır . Alfabetik karakterler, sayılar ve _ işareti site kimliği için kullanılabilir.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Người sử dụng có thể truy cập qua https://Rhymixaddress/ID. Bạn không thể sử dụng ID giống nhau và giống tên Module đã có. Teen ID có dạng là các chữ cái, số và dấu gạch dưới (_).]]></value>
|
||||
</item>
|
||||
<item name="msg_already_registed_vid">
|
||||
<value xml:lang="ko"><![CDATA[이미 등록된 사이트 ID 입니다. 게시판 등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.]]></value>
|
||||
|
|
@ -930,20 +930,20 @@
|
|||
<value xml:lang="vi"><![CDATA[Khi thành viên dăng kí tại trang chủ, nghĩa là họ cũng là thành viên của những trang khác (Ví dụ: cafeXE,...).]]></value>
|
||||
</item>
|
||||
<item name="about_module">
|
||||
<value xml:lang="ko"><![CDATA[XE는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다. 모듈 관리 모듈은 설치된 모든 모듈을 보여주고 관리를 돕습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[XE consists of modules except the basic library. [Module Manage] module will show all installed modules and help you to manage them.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理できるようにします。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[除基本library以外XE全部由模块组成。 模块管理中列出所有已安装的模块,因此易于管理。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[除基本函式庫以外 XE 全部由模組組成。 模組管理中列出所有已安裝的模組,因此易於管理。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[XE se compose des modules sauf la bibliothèque fondamental.
|
||||
<value xml:lang="ko"><![CDATA[Rhymix는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다. 모듈 관리 모듈은 설치된 모든 모듈을 보여주고 관리를 돕습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix consists of modules except the basic library. [Module Manage] module will show all installed modules and help you to manage them.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理できるようにします。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[除基本library以外Rhymix全部由模块组成。 模块管理中列出所有已安装的模块,因此易于管理。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[除基本函式庫以外 Rhymix 全部由模組組成。 模組管理中列出所有已安裝的模組,因此易於管理。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Rhymix se compose des modules sauf la bibliothèque fondamental.
|
||||
Le module [Administration des Modules] montera tous les modules installés et vous aidera les administrer.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[XE состоит из модулей, за исключением базовой библиотеки.
|
||||
<value xml:lang="ru"><![CDATA[Rhymix состоит из модулей, за исключением базовой библиотеки.
|
||||
Управление модулем покажет все установленные модули и поможет управлять ими.]]></value>
|
||||
<value xml:lang="es"><![CDATA[XE consiste de módulos excepto la librería básica.
|
||||
<value xml:lang="es"><![CDATA[Rhymix consiste de módulos excepto la librería básica.
|
||||
Módulo del Manejo del Módulo muestra todos los módulos instalados y ayuda el manejo de ellos.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[XE, temel kitaplık dışında, modüllerden oluşmaktadır.
|
||||
<value xml:lang="tr"><![CDATA[Rhymix, temel kitaplık dışında, modüllerden oluşmaktadır.
|
||||
[Modül Yönetimi] modülü, size kurulu tüm modülleri gösterecek ve onları yönetmenize yardımcı olacaktır.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Khu vực Module trong XE ngoại trừ Library là tại [Module Manage]. Tất cả những Module đang có sẽ hiển thị, giúp bạn quản lý một cách dễ dàng.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Khu vực Module trong Rhymix ngoại trừ Library là tại [Module Manage]. Tất cả những Module đang có sẽ hiển thị, giúp bạn quản lý một cách dễ dàng.]]></value>
|
||||
</item>
|
||||
<item name="about_extra_vars_default_value">
|
||||
<value xml:lang="ko"><![CDATA[다중/단일 선택 등 기본 값이 여러 개가 필요한 경우 , (콤마)로 연결하면 됩니다.]]></value>
|
||||
|
|
@ -1004,10 +1004,10 @@ Le module [Administration des Modules] montera tous les modules installés et vo
|
|||
<value xml:lang="zh-TW"><![CDATA[模組登錄失敗]]></value>
|
||||
</item>
|
||||
<item name="multilingual_desc">
|
||||
<value xml:lang="ko"><![CDATA[현재 12 종류의 다국어 문자를 지원할 수 있습니다. 다른 종류의 다국어 지원을 원하는 경우 /common/lang/ 폴더의 다국어 가운데 하나의 세트를 번역해서 XE 개발자(contact@xpressengine.com)에게 보내주세요.]]></value>
|
||||
<value xml:lang="en"><![CDATA[XE supports 12 languages currently. If you want to use another language, translate one set of languages in /common/lang/ folder into that language and send it to us (contact@xpressengine.com).]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEは、12種類の多国語をサポートしています。他の種類の多国語のサポートを希望する場合は、/common/lang/フォルダの多国語のうち、ひとつのセットを翻訳してXE開発者(contact@xpressengine.com)までお送りください。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[XE 目前支援 12 種國際語言。 想添加其他語言,請將 /common/lang/ 目錄的檔案新增翻譯後,寄至 XE 開發團隊(contact@xpressengine.com)]]></value>
|
||||
<value xml:lang="ko"><![CDATA[현재 12 종류의 다국어 문자를 지원할 수 있습니다. 다른 종류의 다국어 지원을 원하는 경우 /common/lang/ 폴더의 다국어 가운데 하나의 세트를 번역해서 Rhymix 개발자(devops@rhymix.org)에게 보내주세요.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Rhymix supports 12 languages currently. If you want to use another language, translate one set of languages in /common/lang/ folder into that language and send it to us (devops@rhymix.org).]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixは、12種類の多国語をサポートしています。他の種類の多国語のサポートを希望する場合は、/common/lang/フォルダの多国語のうち、ひとつのセットを翻訳してRhymix開発者(devops@rhymix.org)までお送りください。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Rhymix 目前支援 12 種國際語言。 想添加其他語言,請將 /common/lang/ 目錄的檔案新增翻譯後,寄至 Rhymix 開發團隊(devops@rhymix.org)]]></value>
|
||||
</item>
|
||||
<item name="add_word">
|
||||
<value xml:lang="ko"><![CDATA[새로운 단어 또는 문장 추가]]></value>
|
||||
|
|
|
|||
|
|
@ -128,10 +128,10 @@
|
|||
</item>
|
||||
</item>
|
||||
<item name="about_page_type">
|
||||
<value xml:lang="ko"><![CDATA[페이지 타입을 선택하여 원하는 화면을 구성할 수 있습니다. <ol><li>위젯형 : 여러가지 위젯들을 생성하여 화면을 구성합니다.</li><li>문서형 : 제목, 내용, 태그를 갖는 문서를 제작하여 포스팅 형식의 페이지를 작성합니다. </li><li>외부페이지형 : 외부 HTML 또는 PHP 파일을 XE에서 사용할 수 있습니다.</li></ol>]]></value>
|
||||
<value xml:lang="en"><![CDATA[Select Page Type to build a page. <ol><li>Widget: Create multiple widgets.</li><li>Article: Create articles with titles, contents and tags for posting page. </li><li>External Page: Use external HTML or PHP files in XE.</li></ol>]]></value>
|
||||
<value xml:lang="jp"><![CDATA[ページタイプを選択して好きな画面を構成できます。<ol><li>ウィジェット型 : いろんなウィジェットを生成して画面を構成します。</li><li>ドキュメント型 : タイトル、内容、タグのあるドキュメントを製作して、投稿形式のページを作成します。</li><li>外部ページ型 : 外部HTML、またはPHPファイルをXEで使用できます。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[請選擇想要建立的頁面。 <ol><li>Widget 頁面:是以 widgets 為主所建立的頁面。</li><li>主題頁面:可建立頁面的主題、內容及標簽。 </li><li>外連頁面:在 XE 中使用外部 HTML 或 PHP 檔案。</li></ol>]]></value>
|
||||
<value xml:lang="ko"><![CDATA[페이지 타입을 선택하여 원하는 화면을 구성할 수 있습니다. <ol><li>위젯형 : 여러가지 위젯들을 생성하여 화면을 구성합니다.</li><li>문서형 : 제목, 내용, 태그를 갖는 문서를 제작하여 포스팅 형식의 페이지를 작성합니다. </li><li>외부페이지형 : 외부 HTML 또는 PHP 파일을 Rhymix에서 사용할 수 있습니다.</li></ol>]]></value>
|
||||
<value xml:lang="en"><![CDATA[Select Page Type to build a page. <ol><li>Widget: Create multiple widgets.</li><li>Article: Create articles with titles, contents and tags for posting page. </li><li>External Page: Use external HTML or PHP files in Rhymix.</li></ol>]]></value>
|
||||
<value xml:lang="jp"><![CDATA[ページタイプを選択して好きな画面を構成できます。<ol><li>ウィジェット型 : いろんなウィジェットを生成して画面を構成します。</li><li>ドキュメント型 : タイトル、内容、タグのあるドキュメントを製作して、投稿形式のページを作成します。</li><li>外部ページ型 : 外部HTML、またはPHPファイルをRhymixで使用できます。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[請選擇想要建立的頁面。 <ol><li>Widget 頁面:是以 widgets 為主所建立的頁面。</li><li>主題頁面:可建立頁面的主題、內容及標簽。 </li><li>外連頁面:在 Rhymix 中使用外部 HTML 或 PHP 檔案。</li></ol>]]></value>
|
||||
</item>
|
||||
<item name="opage_path">
|
||||
<value xml:lang="ko"><![CDATA[외부 문서 위치]]></value>
|
||||
|
|
@ -140,14 +140,14 @@
|
|||
<value xml:lang="zh-TW"><![CDATA[外連文章位置]]></value>
|
||||
</item>
|
||||
<item name="about_opage">
|
||||
<value xml:lang="ko"><![CDATA[XE가 아닌 외부 HTML 또는 PHP 파일을 삽입할 수 있습니다. 절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다]]></value>
|
||||
<value xml:lang="en"><![CDATA[This module enables to use external html or php files in XE. It allows absolute or relative path, and if the url starts with 'http://' , it can display the external page of the server.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[XEではなく、外部HTML、またはPHPファイルをXEで使用できるようにするモジュールです。 絶対パス、相対パスを利用でき、http://で開始する場合にサーバー外部のページも表示できます。]]></value>
|
||||
<value xml:lang="ko"><![CDATA[Rhymix가 아닌 외부 HTML 또는 PHP 파일을 삽입할 수 있습니다. 절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다]]></value>
|
||||
<value xml:lang="en"><![CDATA[This module enables to use external html or php files in Rhymix. It allows absolute or relative path, and if the url starts with 'http://' , it can display the external page of the server.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Rhymixではなく、外部HTML、またはPHPファイルをRhymixで使用できるようにするモジュールです。 絶対パス、相対パスを利用でき、http://で開始する場合にサーバー外部のページも表示できます。]]></value>
|
||||
</item>
|
||||
<item name="about_opage_path">
|
||||
<value xml:lang="ko"><![CDATA[외부문서의 위치를 입력해주세요. /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다. http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다. 현재 XE가 설치된 절대경로는 다음과 같습니다. ]]></value>
|
||||
<value xml:lang="en"><![CDATA[Please enter the location of external document. Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used. If you input the path like 'http://url/sample.php', the result will be received and then displayed. This is current XE's absolute path. ]]></value>
|
||||
<value xml:lang="jp"><![CDATA[外部ドキュメントの位置を入力してください。 /path1/path2/sample.phpのような絶対パス、もしくは../path2/sample.phpのような相対パス両方とも使用できます。 http://url/sample.phpのように使用すると、該当ページをウェブへ転送し、出力します。 現在、XEがインストールされている絶対パスは、次のとおりです。 ]]></value>
|
||||
<value xml:lang="ko"><![CDATA[외부문서의 위치를 입력해주세요. /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다. http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다. 현재 Rhymix가 설치된 절대경로는 다음과 같습니다. ]]></value>
|
||||
<value xml:lang="en"><![CDATA[Please enter the location of external document. Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used. If you input the path like 'http://url/sample.php', the result will be received and then displayed. This is current Rhymix's absolute path. ]]></value>
|
||||
<value xml:lang="jp"><![CDATA[外部ドキュメントの位置を入力してください。 /path1/path2/sample.phpのような絶対パス、もしくは../path2/sample.phpのような相対パス両方とも使用できます。 http://url/sample.phpのように使用すると、該当ページをウェブへ転送し、出力します。 現在、Rhymixがインストールされている絶対パスは、次のとおりです。 ]]></value>
|
||||
</item>
|
||||
<item name="opage_mobile_path">
|
||||
<value xml:lang="ko"><![CDATA[모바일용 외부 문서 위치]]></value>
|
||||
|
|
@ -156,9 +156,9 @@
|
|||
<value xml:lang="zh-TW"><![CDATA[手機外連文章位置]]></value>
|
||||
</item>
|
||||
<item name="about_opage_mobile_path">
|
||||
<value xml:lang="ko"><![CDATA[모바일용 외부문서의 위치를 입력해주세요. 입력하지 않으면 위에서 지정한 외부문서 위치의 페이지를 이용합니다. /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다. http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다. 현재 XE가 설치된 절대경로는 다음과 같습니다. ]]></value>
|
||||
<value xml:lang="en"><![CDATA[Please enter the location of external document for mobile view. If not inputted, it uses the external document specified above. Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used. If you input the path like 'http://url/sample.php', the result will be received and then displayed. This is current XE's absolute path. ]]></value>
|
||||
<value xml:lang="jp"><![CDATA[モバイル用外部ドキュメントの位置を入力してください。入力しないと上記で指定した外部ドキュメントの位置のページを利用します。 /path1/path2/sample.phpのように絶対パス、もしくは../path2/sample.phpのような相対パス両方とも使用できます。 http://url/sample.phpのように使用すると、該当ページをウェブへ転送し、出力します。 現在、XEのインストールされている絶対パスは、次のとおりです。 ]]></value>
|
||||
<value xml:lang="ko"><![CDATA[모바일용 외부문서의 위치를 입력해주세요. 입력하지 않으면 위에서 지정한 외부문서 위치의 페이지를 이용합니다. /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다. http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다. 현재 Rhymix가 설치된 절대경로는 다음과 같습니다. ]]></value>
|
||||
<value xml:lang="en"><![CDATA[Please enter the location of external document for mobile view. If not inputted, it uses the external document specified above. Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used. If you input the path like 'http://url/sample.php', the result will be received and then displayed. This is current Rhymix's absolute path. ]]></value>
|
||||
<value xml:lang="jp"><![CDATA[モバイル用外部ドキュメントの位置を入力してください。入力しないと上記で指定した外部ドキュメントの位置のページを利用します。 /path1/path2/sample.phpのように絶対パス、もしくは../path2/sample.phpのような相対パス両方とも使用できます。 http://url/sample.phpのように使用すると、該当ページをウェブへ転送し、出力します。 現在、Rhymixのインストールされている絶対パスは、次のとおりです。 ]]></value>
|
||||
</item>
|
||||
<item name="page_management">
|
||||
<value xml:lang="ko"><![CDATA[페이지 관리]]></value>
|
||||
|
|
|
|||
|
|
@ -60,14 +60,14 @@
|
|||
</item>
|
||||
<item name="about_point_io">
|
||||
<value xml:lang="ko"><![CDATA[체크 하면 포인트 모듈 기능을 켤 수 있습니다. 포인트 모듈 기능을 끌 경우, 포인트 모듈의 모든 트리거가 삭제됩니다. 포인트 기록은 유지되지만 새로 기록 되지는 않습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by XE Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="ru"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Point module can be on or off. If you OFF this module, every triggers will be deleted from database and will not be called by Rhymix Core. Point record would be preserved.]]></value>
|
||||
</item>
|
||||
<item name="max_level">
|
||||
<value xml:lang="ko"><![CDATA[최고 레벨]]></value>
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ class point extends ModuleObject
|
|||
$oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before');
|
||||
// Add a trigger for comment voting up and down 2014.08.30 sejin7940
|
||||
$oModuleController->insertTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
|
||||
$oModuleController->insertTrigger('document.updateVotedCountCancel', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
|
||||
return new Object();
|
||||
}
|
||||
|
||||
|
|
@ -132,6 +133,7 @@ class point extends ModuleObject
|
|||
|
||||
// Add a trigger for comment voting up and down 2014.08.30 sejin7940
|
||||
if(!$oModuleModel->getTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) return true;
|
||||
if(!$oModuleModel->getTrigger('document.updateVotedCountCancel', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -174,6 +176,8 @@ class point extends ModuleObject
|
|||
// Add a trigger for voting up and down 2008.05.13 haneul
|
||||
if(!$oModuleModel->getTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'))
|
||||
$oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
|
||||
if(!$oModuleModel->getTrigger('document.updateVotedCountCancel', 'point', 'controller', 'triggerUpdateVotedCount', 'after'))
|
||||
$oModuleController->insertTrigger('document.updateVotedCountCancel', 'point', 'controller', 'triggerUpdateVotedCount', 'after');
|
||||
// Add a trigger for using points for permanent saving of a temporarily saved document 2009.05.19 zero
|
||||
if(!$oModuleModel->getTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before'))
|
||||
$oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before');
|
||||
|
|
|
|||
|
|
@ -492,7 +492,18 @@ class pointController extends point
|
|||
|
||||
if(!$point) return new Object();
|
||||
// Increase the point
|
||||
$cur_point += $point;
|
||||
if($obj->cancel > 0)
|
||||
{
|
||||
$cur_point -= $point;
|
||||
}
|
||||
else if($obj->cancel == null)
|
||||
{
|
||||
$cur_point += $point;
|
||||
}
|
||||
else
|
||||
{
|
||||
$cur_point += $point;
|
||||
}
|
||||
$this->setPoint($member_srl,$cur_point);
|
||||
|
||||
return new Object();
|
||||
|
|
|
|||
|
|
@ -250,37 +250,60 @@
|
|||
<value xml:lang="jp"><![CDATA[選択したアンケート]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[已選擇的投票]]></value>
|
||||
</item>
|
||||
<item name="poll_no_poll_srl">
|
||||
<value xml:lang="ko"><![CDATA[Poll srl 값이 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="poll_no_poll_or_deleted_poll">
|
||||
<value xml:lang="ko"><![CDATA[삭제되었거나 잘못된 투표입니다.]]></value>
|
||||
</item>
|
||||
<item name="poll_item_members">
|
||||
<value xml:lang="ko"><![CDATA[%s 항목을 투표한 사용자]]></value>
|
||||
</item>
|
||||
<item name="btn_poll_gotovote">
|
||||
<value xml:lang="ko"><![CDATA[투표 화면으로 가기]]></value>
|
||||
</item>
|
||||
<item name="btn_poll_gotoresult">
|
||||
<value xml:lang="ko"><![CDATA[결과 화면으로 가기]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_vote">
|
||||
<value xml:lang="ko"><![CDATA[투표할 수 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_exceed_max_select">
|
||||
<value xml:lang="ko"><![CDATA[최대 투표 항목수를 초과했습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_add_item">
|
||||
<value xml:lang="ko"><![CDATA[항목을 추가할 수 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_delete_item">
|
||||
<value xml:lang="ko"><![CDATA[항목을 삭제할 수 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_item_title_cannot_empty">
|
||||
<value xml:lang="ko"><![CDATA[항목의 이름은 비어 있을수 없습니다.]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_delete_item_poll_exist">
|
||||
<value xml:lang="ko"><![CDATA[항목 투표수가 0 이상이므로 삭제할 수 없습니다.]]></value>
|
||||
</item>
|
||||
</lang>
|
||||
<item name="poll_no_poll_srl">
|
||||
<value xml:lang="ko"><![CDATA[Poll srl 값이 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[There is no Poll srl value.]]></value>
|
||||
</item>
|
||||
<item name="poll_no_poll_or_deleted_poll">
|
||||
<value xml:lang="ko"><![CDATA[삭제되었거나 잘못된 투표입니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Deleted or invalid poll.]]></value>
|
||||
</item>
|
||||
<item name="poll_item_members">
|
||||
<value xml:lang="ko"><![CDATA[%s 항목을 선택한 사용자]]></value>
|
||||
<value xml:lang="en"><![CDATA[Who select %s]]></value>
|
||||
</item>
|
||||
<item name="btn_poll_gotovote">
|
||||
<value xml:lang="ko"><![CDATA[투표 화면으로 가기]]></value>
|
||||
<value xml:lang="en"><![CDATA[Back to the poll]]></value>
|
||||
</item>
|
||||
<item name="btn_poll_gotoresult">
|
||||
<value xml:lang="ko"><![CDATA[결과 화면으로 가기]]></value>
|
||||
<value xml:lang="en"><![CDATA[See results]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_vote">
|
||||
<value xml:lang="ko"><![CDATA[투표할 수 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Unable to vote.]]></value>
|
||||
</item>
|
||||
<item name="msg_exceed_max_select">
|
||||
<value xml:lang="ko"><![CDATA[최대 투표 항목수를 초과했습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Exceed maximum selection limit.]]></value>
|
||||
</item>
|
||||
<item name="add_poll_item">
|
||||
<value xml:lang="ko"><![CDATA[항목 추가]]></value>
|
||||
<value xml:lang="en"><![CDATA[Add this item]]></value>
|
||||
</item>
|
||||
<item name="msg_can_add_item">
|
||||
<value xml:lang="ko"><![CDATA[항목을 추가할 수 있습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[You can add items.]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_add_item">
|
||||
<value xml:lang="ko"><![CDATA[항목을 추가할 수 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Cannot add an item.]]></value>
|
||||
</item>
|
||||
<item name="delete_poll_item">
|
||||
<value xml:lang="ko"><![CDATA[항목 삭제]]></value>
|
||||
<value xml:lang="en"><![CDATA[Delete this item]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_delete_item">
|
||||
<value xml:lang="ko"><![CDATA[항목을 삭제할 수 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Cannot delete the item.]]></value>
|
||||
</item>
|
||||
<item name="msg_item_title_cannot_empty">
|
||||
<value xml:lang="ko"><![CDATA[설문 항목은 빈칸일 수 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Item cannot be an empty.]]></value>
|
||||
</item>
|
||||
<item name="msg_cannot_delete_item_poll_exist">
|
||||
<value xml:lang="ko"><![CDATA[항목 투표수가 0 이상이므로 삭제할 수 없습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[Cannot delete this item, because someone selects this item.]]></value>
|
||||
</item>
|
||||
</lang>
|
||||
|
|
@ -22,7 +22,7 @@ class pollController extends poll
|
|||
$stop_date = Context::get('stop_date');
|
||||
if($stop_date < date('Ymd'))
|
||||
{
|
||||
$stop_date = date('YmdHis', $_SERVER['REQUEST_TIME']+60*60*24*365);
|
||||
$stop_date = date('YmdHis', $_SERVER['REQUEST_TIME']+60*60*24*30);
|
||||
}
|
||||
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
|
|
|||
|
|
@ -10,22 +10,21 @@ class pollModel extends poll
|
|||
/**
|
||||
* @brief Initialization
|
||||
*/
|
||||
function init()
|
||||
public function init()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns poll infomation
|
||||
*/
|
||||
function getPollinfo()
|
||||
public function _getPollinfo($poll_srl)
|
||||
{
|
||||
$args = new stdClass;
|
||||
$poll_srl = Context::get('poll_srl');
|
||||
$args->poll_srl = intval($poll_srl);
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
if(!$poll_srl || $poll_srl=='') return new Object(-1,"poll_no_poll_srl");
|
||||
if(!$args->poll_srl || $args->poll_srl === 0) return new Object(-1,"poll_no_poll_srl");
|
||||
|
||||
$args->poll_srl = $poll_srl;
|
||||
// Get the information related to the survey
|
||||
$columnList = array('poll_count', 'stop_date','poll_type','member_srl');
|
||||
$output = executeQuery('poll.getPoll', $args, $columnList);
|
||||
|
|
@ -33,8 +32,11 @@ class pollModel extends poll
|
|||
if(!$output->data) return new Object(-1,"poll_no_poll_or_deleted_poll");
|
||||
|
||||
$poll = new stdClass;
|
||||
|
||||
// if a person can vote is_polled=0, else 1
|
||||
$poll->is_polled = 0;
|
||||
if($output->data->stop_date < date("Ymd")) $poll->is_polled = 1;
|
||||
elseif($this->isPolled($poll_srl)) $poll->is_polled = 1;
|
||||
|
||||
$poll->poll_count = (int)$output->data->poll_count;
|
||||
$poll->poll_type = (int)$output->data->poll_type;
|
||||
|
|
@ -64,20 +66,31 @@ class pollModel extends poll
|
|||
|
||||
}
|
||||
|
||||
$output = new stdClass;
|
||||
|
||||
$poll->poll_srl = $poll_srl;
|
||||
$caniadditem = $this->isAbletoAddItem($poll->poll_type) && !!$logged_info->member_srl;
|
||||
$output->caniadditem = $this->isAbletoAddItem($poll->poll_type) && !!$logged_info->member_srl;
|
||||
|
||||
$oPollModel = getModel('poll');
|
||||
if($oPollModel->isPolled($poll_srl)) $poll->is_polled = 1;
|
||||
$output->poll = $poll;
|
||||
|
||||
$this->add('poll', $poll);
|
||||
$this->add('caniadditem', $caniadditem);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns poll infomation
|
||||
*/
|
||||
public function getPollinfo()
|
||||
{
|
||||
$output = $this->_getPollinfo(Context::get('poll_srl'));
|
||||
|
||||
$this->add('poll', $output->poll);
|
||||
$this->add('caniadditem', $output->caniadditem);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns poll item infomation
|
||||
*/
|
||||
function getPollitemInfo()
|
||||
public function getPollitemInfo()
|
||||
{
|
||||
$args = new stdClass;
|
||||
$poll_srl = Context::get('poll_srl');
|
||||
|
|
@ -160,13 +173,12 @@ class pollModel extends poll
|
|||
* @brief returns poll status
|
||||
* @see this function uses isPolled function below
|
||||
*/
|
||||
function getPollstatus()
|
||||
public function getPollstatus()
|
||||
{
|
||||
$poll_srl = Context::get('poll_srl');
|
||||
if(!$poll_srl || $poll_srl=='') return new Object(-1,"poll_no_poll_srl");
|
||||
|
||||
$oPollModel = getModel('poll');
|
||||
if($oPollModel->isPolled($poll_srl)) $is_polled = 1;
|
||||
if($this->isPolled($poll_srl)) $is_polled = 1;
|
||||
else $is_polled = 0;
|
||||
|
||||
$this->add('is_polled', $is_polled);
|
||||
|
|
@ -175,7 +187,7 @@ class pollModel extends poll
|
|||
/**
|
||||
* @brief The function examines if the user has already been polled
|
||||
*/
|
||||
function isPolled($poll_srl)
|
||||
public function isPolled($poll_srl)
|
||||
{
|
||||
$args = new stdClass;
|
||||
$args->poll_srl = $poll_srl;
|
||||
|
|
@ -199,7 +211,7 @@ class pollModel extends poll
|
|||
* Return the result after checking if the poll has responses
|
||||
* @deprecated this function uses poll skin, which will be removed
|
||||
*/
|
||||
function getPollHtml($poll_srl, $style = '', $skin = 'default')
|
||||
public function getPollHtml($poll_srl, $style = '', $skin = 'default')
|
||||
{
|
||||
$args = new stdClass;
|
||||
$args->poll_srl = $poll_srl;
|
||||
|
|
@ -258,7 +270,7 @@ class pollModel extends poll
|
|||
* @brief Return the result's HTML
|
||||
* @deprecated this function uses poll skin, which will be removed
|
||||
*/
|
||||
function getPollResultHtml($poll_srl, $skin = 'default')
|
||||
public function getPollResultHtml($poll_srl, $skin = 'default')
|
||||
{
|
||||
$args = new stdClass;
|
||||
$args->poll_srl = $poll_srl;
|
||||
|
|
@ -306,7 +318,7 @@ class pollModel extends poll
|
|||
* @brief Selected poll - return the colorset of the skin
|
||||
* @deprecated this function uses poll skin, which will be removed
|
||||
*/
|
||||
function getPollGetColorsetList()
|
||||
public function getPollGetColorsetList()
|
||||
{
|
||||
$skin = Context::get('skin');
|
||||
|
||||
|
|
|
|||
|
|
@ -157,8 +157,7 @@ class rssView extends rss
|
|||
break;
|
||||
}
|
||||
|
||||
if($_SERVER['HTTPS']=='on') $proctcl = 'https://';
|
||||
else $proctcl = 'http://';
|
||||
$proctcl = RX_SSL ? 'https://' : 'http://';
|
||||
|
||||
$temp_link = explode('/', $info->link);
|
||||
if($temp_link[0]=='' && $info->link)
|
||||
|
|
|
|||
|
|
@ -378,25 +378,25 @@
|
|||
<item name="about_widget">
|
||||
<value xml:lang="ko"><![CDATA[위젯은 레이아웃이나 페이지에서 사용하는 작은 구성요소입니다.
|
||||
위젯은 내부 페이지 또는 외부 open api와 연동될 수도 있고, 설정을 통해 다양하게 응용될 수 있습니다.
|
||||
XE의 페이지나 레이아웃 모듈을 사용하지 않더라도 [코드생성] 기능을 통해 직접 위젯 추가도 할 수 있습니다.]]></value>
|
||||
Rhymix의 페이지나 레이아웃 모듈을 사용하지 않더라도 [코드생성] 기능을 통해 직접 위젯 추가도 할 수 있습니다.]]></value>
|
||||
<value xml:lang="en"><![CDATA[A widget is a small free-standing application used in a layout or page module.
|
||||
It can be linked with internal module or external Open API. Through its configuration setting, wide application is possible.
|
||||
You can directly add a widget by using the [Generate Code] function without using the XE page module or layout module.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[ウィジェット、またはページモジュールに用いられる単体の構成要素です。内部モジュールまたは外部のOPEN API と連動ができ、設定によって様々な応用が可能です。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加できます。]]></value>
|
||||
You can directly add a widget by using the [Generate Code] function without using the Rhymix page module or layout module.]]></value>
|
||||
<value xml:lang="jp"><![CDATA[ウィジェット、またはページモジュールに用いられる単体の構成要素です。内部モジュールまたは外部のOPEN API と連動ができ、設定によって様々な応用が可能です。Rhymixのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加できます。]]></value>
|
||||
<value xml:lang="zh-CN"><![CDATA[控件是在布局或页面模块中使用的一种小部件。
|
||||
不仅可以关联内部模块或外部open api,而且通过设置可以用在多种用途。
|
||||
即使不使用XE的页面模块或布局模块,也可以通过『代码生成』功能直接可以添加相应控件。]]></value>
|
||||
即使不使用Rhymix的页面模块或布局模块,也可以通过『代码生成』功能直接可以添加相应控件。]]></value>
|
||||
<value xml:lang="zh-TW"><![CDATA[Widget是在版面或頁面模組中使用的一種元件。
|
||||
不僅可以連結內部模組或外部 Open API,而且通過設置可以有許多種用途。
|
||||
即使不使用 XE 的頁面或版面設計模組,也可以通過『建立原始碼』功能直接新增相對應 Widget。]]></value>
|
||||
即使不使用 Rhymix 的頁面或版面設計模組,也可以通過『建立原始碼』功能直接新增相對應 Widget。]]></value>
|
||||
<value xml:lang="fr"><![CDATA[Un gadjet est un petit application indépendant qui est utilisé dans une Mise en Page ou dans une module de Page. Un gajet peut être lié avec un module intérieur ou avec un API extérieur ouvert. L'application divers est possible par la configuration.
|
||||
Vous pouvez directement ajouter un gadget en utilisant la fonction [Générer le Code] sans utiliser un module de Page de XE ni un module de Mise en Page.]]></value>
|
||||
Vous pouvez directement ajouter un gadget en utilisant la fonction [Générer le Code] sans utiliser un module de Page de Rhymix ni un module de Mise en Page.]]></value>
|
||||
<value xml:lang="es"><![CDATA[Un Widget es una pequena aplicación para ser usados en los diseños o en el módulo de páginas.
|
||||
Puede ser enlazados con un módulo interno o con open api externo y con la configuración de ella puede utilizar en variadas aplicaciones.
|
||||
Sin la necesidad de utilizar los módulos de página o del diseño de XE, Usted puede directamente añadir un widget usando la función de [Generar Códigos].]]></value>
|
||||
Sin la necesidad de utilizar los módulos de página o del diseño de Rhymix, Usted puede directamente añadir un widget usando la función de [Generar Códigos].]]></value>
|
||||
<value xml:lang="tr"><![CDATA[Widget, yerleşim düzeninde veya sayfa modülünde kullanılan küçük bir serbest uygulamadır.
|
||||
Dahili modüle bağlanabileceği gibi, harici açık apilerle de bağlantı kurabilir. Yapılandırma ayarları yoluyla, geniş bir uygulama alanı vardır.
|
||||
[Kod Üret] fonksiyonunu kullanarak, XE sayfa modülüne veya yerleşim düzeni modülüne ihtiyaç duymadan widget ekleyebilirsiniz.]]></value>
|
||||
[Kod Üret] fonksiyonunu kullanarak, Rhymix sayfa modülüne veya yerleşim düzeni modülüne ihtiyaç duymadan widget ekleyebilirsiniz.]]></value>
|
||||
<value xml:lang="vi"><![CDATA[Widget là một ứng dụng nhỏ có thể đặt ở bất kì vị trí nào do người dùng lựa chọn.<br />Nó có thể kết nối với những Module trong Website hay Open API bên ngoài và hiển thị nội dung của Module đó.<br />Thông qua sự thiết lập cấu hình, nó có thể là một ứng dụng rộng dãi.<br />Bạn có thể thêm một Widget bằng cách bấm nút [<b>Tạo Code</b>] để lấy Code thêm vào một Module hay trang nào đó.]]></value>
|
||||
</item>
|
||||
<item name="cmd_content_insert">
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ $install_config = array(
|
|||
|
||||
$install_config = '<' . '?php $install_config = ' . var_export($install_config, true) . ';';
|
||||
|
||||
mkdir(_XE_PATH_ . 'files/env', 0755, true);
|
||||
file_put_contents(_XE_PATH_ . 'files/env/easyinstall_last', time());
|
||||
|
||||
$I->wantTo('Auto install');
|
||||
$I->writeToFile(_XE_PATH_ . 'config/install.config.php', $install_config);
|
||||
$I->amOnPage('/');
|
||||
|
|
|
|||
|
|
@ -26,6 +26,9 @@ if(file_exists(_XE_PATH_ . 'config/install.config.php')) {
|
|||
$I->deleteFile(_XE_PATH_ . 'config/install.config.php');
|
||||
}
|
||||
|
||||
mkdir(_XE_PATH_ . 'files/env', 0755, true);
|
||||
file_put_contents(_XE_PATH_ . 'files/env/easyinstall_last', time());
|
||||
|
||||
// Step 1 : License Agreement
|
||||
$I->wantTo('Install RhymiX');
|
||||
$I->amOnPage('/index.php?l=ko');
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue