mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-05-28 00:05:25 +09:00
Merge branch 'develop' into pr/member-phone-number
This commit is contained in:
commit
68840c2ede
45 changed files with 424 additions and 494 deletions
|
|
@ -726,6 +726,9 @@ class adminAdminController extends admin
|
|||
|
||||
Rhymix\Framework\Config::set('admin.allow', array_values($allowed_ip));
|
||||
Rhymix\Framework\Config::set('admin.deny', array_values($denied_ip));
|
||||
Rhymix\Framework\Config::set('session.use_keys', $vars->use_session_keys === 'Y');
|
||||
Rhymix\Framework\Config::set('session.use_ssl', $vars->use_session_ssl === 'Y');
|
||||
Rhymix\Framework\Config::set('session.use_ssl_cookies', $vars->use_cookies_ssl === 'Y');
|
||||
|
||||
// Save
|
||||
if (!Rhymix\Framework\Config::save())
|
||||
|
|
@ -824,8 +827,6 @@ class adminAdminController extends admin
|
|||
Rhymix\Framework\Config::set('use_rewrite', $vars->use_rewrite === 'Y');
|
||||
Rhymix\Framework\Config::set('session.delay', $vars->delay_session === 'Y');
|
||||
Rhymix\Framework\Config::set('session.use_db', $vars->use_db_session === 'Y');
|
||||
Rhymix\Framework\Config::set('session.use_keys', $vars->use_session_keys === 'Y');
|
||||
Rhymix\Framework\Config::set('session.use_ssl', $vars->use_session_ssl === 'Y');
|
||||
Rhymix\Framework\Config::set('view.minify_scripts', $vars->minify_scripts ?: 'common');
|
||||
Rhymix\Framework\Config::set('view.concat_scripts', $vars->concat_scripts ?: 'none');
|
||||
Rhymix\Framework\Config::set('view.server_push', $vars->use_server_push === 'Y');
|
||||
|
|
|
|||
|
|
@ -450,6 +450,11 @@ class adminAdminView extends admin
|
|||
Context::set('admin_denied_ip', implode(PHP_EOL, $denied_ip));
|
||||
Context::set('remote_addr', RX_CLIENT_IP);
|
||||
|
||||
// Session and cookie security settings
|
||||
Context::set('use_session_keys', Rhymix\Framework\Config::get('session.use_keys'));
|
||||
Context::set('use_session_ssl', Rhymix\Framework\Config::get('session.use_ssl'));
|
||||
Context::set('use_cookies_ssl', Rhymix\Framework\Config::get('session.use_ssl_cookies'));
|
||||
|
||||
$this->setTemplateFile('config_security');
|
||||
}
|
||||
|
||||
|
|
@ -538,8 +543,6 @@ class adminAdminView extends admin
|
|||
Context::set('mobile_viewport', config('mobile.viewport') ?: 'width=device-width, initial-scale=1.0, user-scalable=yes');
|
||||
Context::set('use_ssl', Rhymix\Framework\Config::get('url.ssl'));
|
||||
Context::set('delay_session', Rhymix\Framework\Config::get('session.delay'));
|
||||
Context::set('use_session_keys', Rhymix\Framework\Config::get('session.use_keys'));
|
||||
Context::set('use_session_ssl', Rhymix\Framework\Config::get('session.use_ssl'));
|
||||
Context::set('use_db_session', Rhymix\Framework\Config::get('session.use_db'));
|
||||
Context::set('minify_scripts', Rhymix\Framework\Config::get('view.minify_scripts'));
|
||||
Context::set('concat_scripts', Rhymix\Framework\Config::get('view.concat_scripts'));
|
||||
|
|
@ -779,6 +782,7 @@ class adminAdminView extends admin
|
|||
$info['session.use_db'] = config('session.use_db') ? 'true' : 'false';
|
||||
$info['session.use_keys'] = config('session.use_keys') ? 'true' : 'false';
|
||||
$info['session.use_ssl'] = config('session.use_ssl') ? 'true' : 'false';
|
||||
$info['session.use_ssl_cookies'] = config('session.use_ssl_cookies') ? 'true' : 'false';
|
||||
$info['view.concat_scripts'] = config('view.concat_scripts');
|
||||
$info['view.minify_scripts'] = config('view.minify_scripts');
|
||||
$info['use_rewrite'] = config('use_rewrite') ? 'true' : 'false';
|
||||
|
|
|
|||
|
|
@ -162,7 +162,9 @@ $lang->about_delay_session = 'To improve performance when using a caching proxy
|
|||
$lang->use_session_keys = 'Use session security keys';
|
||||
$lang->about_use_session_keys = 'Use additional security keys to guard against session theft. This setting is highly recommended if you don\'t use SSL-only sessions.<br>This setting may cause some users to become logged out.';
|
||||
$lang->use_session_ssl = 'Use SSL-only session';
|
||||
$lang->about_use_session_ssl = 'Prevent the session from being used on non-SSL pages.<br>This helps improve security if your site always uses SSL and your server is configured to redirect all non-SSL pages to SSL.';
|
||||
$lang->about_use_session_ssl = 'Force the session to be SSL-only.<br>This helps improve security if your site always uses SSL.';
|
||||
$lang->use_cookies_ssl = 'Use SSL-only cookies';
|
||||
$lang->about_use_cookies_ssl = 'Force all cookies to be SSL-only.';
|
||||
$lang->use_object_cache = 'Use Cache';
|
||||
$lang->cache_default_ttl = 'Cache default TTL';
|
||||
$lang->cache_host = 'Host';
|
||||
|
|
|
|||
|
|
@ -163,7 +163,9 @@ $lang->about_delay_session = 'Varnish 등의 프록시 캐싱 서버 사용시
|
|||
$lang->use_session_keys = '세션 보안키 사용';
|
||||
$lang->about_use_session_keys = '세션 탈취를 방지하기 위한 보안키를 사용합니다. SSL 전용 세션을 사용하지 않을 경우 반드시 보안키를 사용하시기를 권장합니다.<br>사용자 환경에 따라 로그인이 풀리는 문제가 발생할 수 있습니다.';
|
||||
$lang->use_session_ssl = 'SSL 전용 세션 사용';
|
||||
$lang->about_use_session_ssl = '세션을 SSL 전용으로 지정하여 SSL이 아닌 페이지에서 사용할 수 없도록 합니다.<br>SSL을 항상 사용하고, SSL이 아닌 페이지 방문시 자동으로 SSL 페이지로 리다이렉트되도록 서버가 설정되어 있는 경우<br>이 옵션을 사용하면 보안이 향상됩니다. (애드온 등을 사용하여 리다이렉트하는 경우 제외)';
|
||||
$lang->about_use_session_ssl = '세션을 SSL 전용으로 지정하여 SSL이 아닌 페이지에서는 사용할 수 없도록 합니다.<br>SSL을 항상 사용하도록 설정되어 있는 경우에만 활성화됩니다.';
|
||||
$lang->use_cookies_ssl = 'SSL 전용 쿠키 사용';
|
||||
$lang->about_use_cookies_ssl = '세션뿐 아니라 모든 쿠키를 SSL 전용으로 지정합니다.<br>SSL을 항상 사용하도록 설정되어 있는 경우에만 활성화됩니다.';
|
||||
$lang->use_object_cache = '캐시 사용';
|
||||
$lang->cache_default_ttl = '캐시 기본 TTL';
|
||||
$lang->cache_host = '호스트';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
<load target="css/admin.bootstrap.css" />
|
||||
<load target="css/admin.iefix.css" />
|
||||
<load target="css/admin.css" />
|
||||
<load target="js/admin.js" />
|
||||
<load target="js/jquery.tmpl.js" />
|
||||
<load target="js/jquery.jstree.js" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=2, user-scalable=yes" />
|
||||
<script>
|
||||
var admin_menu_srl = "{$admin_menu_srl}";
|
||||
xe.cmd_find = "{$lang->cmd_find}";
|
||||
|
|
|
|||
|
|
@ -105,24 +105,6 @@
|
|||
<p class="x_help-block">{$lang->about_delay_session}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
<label class="x_control-label">{$lang->use_session_keys}</label>
|
||||
<div class="x_controls">
|
||||
<label for="use_session_keys_y" class="x_inline"><input type="radio" name="use_session_keys" id="use_session_keys_y" value="Y" checked="checked"|cond="$use_session_keys !== false" /> {$lang->cmd_yes}</label>
|
||||
<label for="use_session_keys_n" class="x_inline"><input type="radio" name="use_session_keys" id="use_session_keys_n" value="N" checked="checked"|cond="$use_session_keys === false" /> {$lang->cmd_no}</label>
|
||||
<br />
|
||||
<p class="x_help-block">{$lang->about_use_session_keys}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
<label class="x_control-label">{$lang->use_session_ssl}</label>
|
||||
<div class="x_controls">
|
||||
<label for="use_session_ssl_y" class="x_inline"><input type="radio" name="use_session_ssl" id="use_session_ssl_y" value="Y" checked="checked"|cond="$use_session_ssl && $use_ssl === 'always'" disabled="disabled"|cond="$use_ssl !== 'always'" /> {$lang->cmd_yes}</label>
|
||||
<label for="use_session_ssl_n" class="x_inline"><input type="radio" name="use_session_ssl" id="use_session_ssl_n" value="N" checked="checked"|cond="!$use_session_ssl || $use_ssl !== 'always'" disabled="disabled"|cond="$use_ssl !== 'always'" /> {$lang->cmd_no}</label>
|
||||
<br />
|
||||
<p class="x_help-block">{$lang->about_use_session_ssl}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
<label class="x_control-label">{$lang->thumbnail_target}</label>
|
||||
<div class="x_controls">
|
||||
|
|
|
|||
|
|
@ -39,6 +39,33 @@
|
|||
<p class="x_help-block">{$lang->about_admin_ip_deny}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
<label class="x_control-label">{$lang->use_session_keys}</label>
|
||||
<div class="x_controls">
|
||||
<label for="use_session_keys_y" class="x_inline"><input type="radio" name="use_session_keys" id="use_session_keys_y" value="Y" checked="checked"|cond="$use_session_keys !== false" /> {$lang->cmd_yes}</label>
|
||||
<label for="use_session_keys_n" class="x_inline"><input type="radio" name="use_session_keys" id="use_session_keys_n" value="N" checked="checked"|cond="$use_session_keys === false" /> {$lang->cmd_no}</label>
|
||||
<br />
|
||||
<p class="x_help-block">{$lang->about_use_session_keys}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
<label class="x_control-label">{$lang->use_session_ssl}</label>
|
||||
<div class="x_controls">
|
||||
<label for="use_session_ssl_y" class="x_inline"><input type="radio" name="use_session_ssl" id="use_session_ssl_y" value="Y" checked="checked"|cond="$use_session_ssl && $site_module_info->security === 'always'" disabled="disabled"|cond="$site_module_info->security !== 'always'" /> {$lang->cmd_yes}</label>
|
||||
<label for="use_session_ssl_n" class="x_inline"><input type="radio" name="use_session_ssl" id="use_session_ssl_n" value="N" checked="checked"|cond="!$use_session_ssl || $site_module_info->security !== 'always'" disabled="disabled"|cond="$site_module_info->security !== 'always'" /> {$lang->cmd_no}</label>
|
||||
<br />
|
||||
<p class="x_help-block">{$lang->about_use_session_ssl}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_control-group">
|
||||
<label class="x_control-label">{$lang->use_cookies_ssl}</label>
|
||||
<div class="x_controls">
|
||||
<label for="use_cookies_ssl_y" class="x_inline"><input type="radio" name="use_cookies_ssl" id="use_cookies_ssl_y" value="Y" checked="checked"|cond="$use_cookies_ssl && $site_module_info->security === 'always'" disabled="disabled"|cond="$site_module_info->security !== 'always'" /> {$lang->cmd_yes}</label>
|
||||
<label for="use_cookies_ssl_n" class="x_inline"><input type="radio" name="use_cookies_ssl" id="use_cookies_ssl_n" value="N" checked="checked"|cond="!$use_cookies_ssl || $site_module_info->security !== 'always'" disabled="disabled"|cond="$site_module_info->security !== 'always'" /> {$lang->cmd_no}</label>
|
||||
<br />
|
||||
<p class="x_help-block">{$lang->about_use_cookies_ssl}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="x_clearfix btnArea">
|
||||
<div class="x_pull-right">
|
||||
<button type="submit" class="x_btn x_btn-primary">{$lang->cmd_save}</button>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
<load target="css/admin.bootstrap.css" />
|
||||
<load target="css/admin.iefix.css" />
|
||||
<load target="css/admin.css" />
|
||||
<load target="js/admin.js" />
|
||||
<load target="js/jquery.tmpl.js" />
|
||||
<load target="js/jquery.jstree.js" />
|
||||
<div class="x">
|
||||
<div class="content" id="content">
|
||||
{$content}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,11 @@
|
|||
</h3>
|
||||
<p class="time">{$comment->getRegdate('Y.m.d H:i')}</p>
|
||||
</div>
|
||||
<!--@if(!$comment->isAccessible())-->
|
||||
<!--@if($comment->status == RX_STATUS_DELETED)-->
|
||||
<div class="xe_content deleted">{$lang->msg_deleted_comment}</div>
|
||||
<!--@elseif($comment->status == RX_STATUS_DELETED_BY_ADMIN)-->
|
||||
<div class="xe_content deleted deleted_by_admin">{$lang->msg_admin_deleted_comment}</div>
|
||||
<!--@elseif(!$comment->isAccessible())-->
|
||||
<form action="./" method="get" class="xe_content" onsubmit="return procFilter(this, input_password)">
|
||||
<p><label for="cpw_{$comment->comment_srl}">{$lang->msg_is_secret} {$lang->msg_input_password}</label></p>
|
||||
<p><input type="password" name="password" id="cpw_{$comment->comment_srl}" class="iText" /><input type="submit" class="btn" value="{$lang->cmd_input}" /></p>
|
||||
|
|
@ -25,14 +29,7 @@
|
|||
<input type="hidden" name="comment_srl" value="{$comment->get('comment_srl')}" />
|
||||
</form>
|
||||
<!--@else-->
|
||||
<!--@if($comment->status == 7)-->
|
||||
{$lang->msg_deleted_comment}
|
||||
<!--@elseif($comment->status == 8)-->
|
||||
{$lang->msg_admin_deleted_comment}
|
||||
<!--@end-->
|
||||
<block cond="$comment->status < 7">
|
||||
{$comment->getContent(false)}
|
||||
</block>
|
||||
{$comment->getContent(false)}
|
||||
<!--@end-->
|
||||
<div cond="$comment->hasUploadedFiles()" class="fileList">
|
||||
<button type="button" class="toggleFile" onclick="jQuery(this).next('ul.files').toggle();">{$lang->uploaded_file} [<strong>{$comment->get('uploaded_count')}</strong>]</button>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,11 @@
|
|||
</h3>
|
||||
<p class="time">{$comment->getRegdate('Y.m.d H:i')}</p>
|
||||
</div>
|
||||
<!--@if(!$comment->isAccessible())-->
|
||||
<!--@if($comment->status == RX_STATUS_DELETED)-->
|
||||
<div class="xe_content deleted">{$lang->msg_deleted_comment}</div>
|
||||
<!--@elseif($comment->status == RX_STATUS_DELETED_BY_ADMIN)-->
|
||||
<div class="xe_content deleted deleted_by_admin">{$lang->msg_admin_deleted_comment}</div>
|
||||
<!--@elseif(!$comment->isAccessible())-->
|
||||
<form action="./" method="get" class="xe_content secretForm" onsubmit="return procFilter(this, input_password)">
|
||||
<p><label for="cpw_{$comment->comment_srl}">{$lang->msg_is_secret} {$lang->msg_input_password}</label></p>
|
||||
<p><input type="password" name="password" id="cpw_{$comment->comment_srl}" class="iText" /><input type="submit" class="btn" value="{$lang->cmd_input}" /></p>
|
||||
|
|
@ -25,7 +29,7 @@
|
|||
<input type="hidden" name="comment_srl" value="{$comment->get('comment_srl')}" />
|
||||
</form>
|
||||
<!--@else-->
|
||||
{$comment->getContent(false)}
|
||||
{$comment->getContent(false)}
|
||||
<!--@end-->
|
||||
<div cond="$comment->hasUploadedFiles()" class="fileList">
|
||||
<button type="button" class="toggleFile" onclick="jQuery(this).next('ul.files').toggle();"><i class="xi-diskette"></i> {$lang->uploaded_file} [<strong>{$comment->get('uploaded_count')}</strong>]</button>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ input[type=radio]{width:13px;height:13px;margin:0;padding:0}
|
|||
/* Background */
|
||||
.rp li li,
|
||||
.rp .answer,
|
||||
.rp .btn,
|
||||
/* Body */
|
||||
.bd{background:#f8f8f8;padding:1px 0}
|
||||
.co{margin:10px;line-height:1.4;font-size:14px;color:#333}
|
||||
|
|
@ -85,7 +84,6 @@ input[type=radio]{width:13px;height:13px;margin:0;padding:0}
|
|||
.rp li li li li{padding-left:55px;background-position:40px -145px}
|
||||
.rp li li li li li{padding-left:70px;background-position:55px -145px}
|
||||
.rp li li li li li li{padding-left:85px;background-position:70px -145px}
|
||||
.rp .btn{display:inline-block;width:15px;height:15px;overflow:hidden;vertical-align:middle;text-indent:15px}
|
||||
.rp .btn.ed{background-position:0 -32px}
|
||||
.rp .btn.de{background-position:-15px -32px}
|
||||
.rp .btn.re{background-position:-30px -32px}
|
||||
|
|
|
|||
|
|
@ -233,49 +233,6 @@
|
|||
.xc .pagination ul>li:last-child>a,
|
||||
.xc .pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}
|
||||
.xc .pagination-centered{text-align:center}
|
||||
/* Button */
|
||||
.xc .btn{font-size:12px;font-family:inherit;display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;line-height:20px;height:auto;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;border:1px solid #cccccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05)}
|
||||
.xc .btn:hover,
|
||||
.xc .btn:focus,
|
||||
.xc .btn:active,
|
||||
.xc .btn.active,
|
||||
.xc .btn.disabled,
|
||||
.xc .btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9}
|
||||
.xc .btn:active,
|
||||
.xc .btn.active{background-color:#cccccc \9}
|
||||
.xc .btn:first-child{*margin-left:0}
|
||||
.xc .btn:hover,
|
||||
.xc .btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear}
|
||||
.xc .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}
|
||||
.xc .btn.active,
|
||||
.xc .btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05)}
|
||||
.xc .btn.disabled,
|
||||
.xc .btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}
|
||||
.xc .btn-inverse.active{color:rgba(255, 255, 255, 0.75)}
|
||||
.xc .btn-inverse{color:#ffffff!important;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;*background-color:#222222;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
|
||||
.xc .btn-inverse:hover,
|
||||
.xc .btn-inverse:focus,
|
||||
.xc .btn-inverse:active,
|
||||
.xc .btn-inverse.active,
|
||||
.xc .btn-inverse.disabled,
|
||||
.xc .btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515}
|
||||
.xc .btn-inverse:active,
|
||||
.xc .btn-inverse.active{background-color:#080808 \9}
|
||||
.xc button.btn,
|
||||
.xc input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}
|
||||
.xc button.btn::-moz-focus-inner,
|
||||
.xc input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}
|
||||
.xc .btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}
|
||||
.xc .btn-group:first-child{*margin-left:0}
|
||||
.xc .btn-group+.btn-group{margin-left:5px}
|
||||
.xc .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
|
||||
.xc .btn-group>.btn+.btn{margin-left:-1px}
|
||||
.xc .btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}
|
||||
.xc .btn-group>.btn:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}
|
||||
.xc .btn-group>.btn:hover,
|
||||
.xc .btn-group>.btn:focus,
|
||||
.xc .btn-group>.btn:active,
|
||||
.xc .btn-group>.btn.active{z-index:2}
|
||||
/* Communication Module Customize */
|
||||
.xc,
|
||||
.xc input,
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ class documentModel extends document
|
|||
$output = $this->getDocumentExtraVarsFromDB($document_srls);
|
||||
foreach($output->data as $key => $val)
|
||||
{
|
||||
if(!$val->value)
|
||||
if(strval($val->value) === '')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<div class="xefu-dropzone">
|
||||
<span class="xefu-btn fileinput-button xefu-act-selectfile">
|
||||
<span><i class="xi-icon xi-file-upload"></i> {$lang->edit->upload_file}</span>
|
||||
<input id="xe-fileupload" type="file" class="fileupload-processing " value="{$lang->edit->upload_file}" name="Filedata" data-auto-upload="true" data-editor-sequence="{$editor_sequence}" multiple />
|
||||
<input id="xe-fileupload" type="file" class="fileupload-processing " name="Filedata" data-auto-upload="true" data-editor-sequence="{$editor_sequence}" multiple />
|
||||
</span>
|
||||
|
||||
<p class="xefu-dropzone-message" cond="!$m">{$lang->ckeditor_about_file_drop_area}</p>
|
||||
|
|
|
|||
|
|
@ -372,13 +372,14 @@ class importerAdminController extends importer
|
|||
FileHandler::removeFile($target_file);
|
||||
if(!$xmlObj) continue;
|
||||
// List Objects
|
||||
$obj = null;
|
||||
$obj = new stdClass();
|
||||
$obj->member_srl = getNextSequence();
|
||||
$obj->user_id = base64_decode($xmlObj->member->user_id->body);
|
||||
$obj->password = base64_decode($xmlObj->member->password->body);
|
||||
$obj->user_name = base64_decode($xmlObj->member->user_name->body);
|
||||
$obj->nick_name = base64_decode($xmlObj->member->nick_name->body);
|
||||
if(!$obj->user_name) $obj->user_name = $obj->nick_name;
|
||||
$obj->email = base64_decode($xmlObj->member->email->body);
|
||||
$obj->email_address = base64_decode($xmlObj->member->email->body);
|
||||
$obj->homepage = base64_decode($xmlObj->member->homepage->body);
|
||||
$obj->blog = base64_decode($xmlObj->member->blog->body);
|
||||
$obj->birthday = substr(base64_decode($xmlObj->member->birthday->body),0,8);
|
||||
|
|
@ -401,8 +402,20 @@ class importerAdminController extends importer
|
|||
}
|
||||
// Create url for homepage and blog
|
||||
if($obj->homepage && strncasecmp('http://', $obj->homepage, 7) !== 0 && strncasecmp('https://', $obj->homepage, 8) !== 0) $obj->homepage = 'http://'.$obj->homepage;
|
||||
// email address column
|
||||
$obj->email_address = $obj->email;
|
||||
// Check user ID
|
||||
if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
|
||||
{
|
||||
$obj->user_id = preg_replace('/[^a-z0-9_-]+/i', '', $obj->user_id);
|
||||
}
|
||||
if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
|
||||
{
|
||||
$obj->user_id = 't' . $obj->member_srl;
|
||||
}
|
||||
// Check email address
|
||||
if(!preg_match('/^[\w-]+((?:\.|\+|\~)[\w-]+)*@[\w-]+(\.[\w-]+)+$/', $obj->email_address))
|
||||
{
|
||||
$obj->email_address = $obj->user_id . '@example.com';
|
||||
}
|
||||
list($obj->email_id, $obj->email_host) = explode('@', $obj->email);
|
||||
// Set the mailing option
|
||||
if($obj->allow_mailing!='Y') $obj->allow_mailing = 'N';
|
||||
|
|
@ -411,18 +424,37 @@ class importerAdminController extends importer
|
|||
if(!in_array($obj->allow_message, array('Y','N','F'))) $obj->allow_message= 'Y';
|
||||
// Get member-join date if the last login time is not found
|
||||
if(!$obj->last_login) $obj->last_login = $obj->regdate;
|
||||
// Get a member_srl
|
||||
$obj->member_srl = getNextSequence();
|
||||
// Set the list order
|
||||
$obj->list_order = -1 * $obj->member_srl;
|
||||
// List extra vars
|
||||
$extra_vars = $obj->extra_vars;
|
||||
unset($obj->extra_vars);
|
||||
$obj->extra_vars = serialize($extra_vars);
|
||||
// Check if the same nickname is existing
|
||||
$nick_args = new stdClass;
|
||||
$nick_args->nick_name = $obj->nick_name;
|
||||
$nick_output = executeQuery('member.getMemberSrl', $nick_args);
|
||||
if(!$nick_output->toBool()) $obj->nick_name .= '_'.$obj->member_srl;
|
||||
// Check if the same user ID exists
|
||||
$args = new stdClass;
|
||||
$args->user_id = $obj->user_id;
|
||||
$output = executeQuery('member.getMemberSrl', $args);
|
||||
if(!$output->toBool() || $output->data)
|
||||
{
|
||||
$obj->user_id .= '_'.$obj->member_srl;
|
||||
}
|
||||
// Check if the same nickname exists
|
||||
$args = new stdClass;
|
||||
$args->nick_name = $obj->nick_name;
|
||||
$output = executeQuery('member.getMemberSrl', $args);
|
||||
if(!$output->toBool() || $output->data)
|
||||
{
|
||||
$obj->user_id .= '_'.$obj->member_srl;
|
||||
}
|
||||
// Check if the same email address exists
|
||||
$args = new stdClass;
|
||||
$args->email_address = $obj->email_address;
|
||||
$output = executeQuery('member.getMemberSrl', $args);
|
||||
if(!$output->toBool() || $output->data)
|
||||
{
|
||||
$obj->email_address = $obj->user_id . '@example.com';
|
||||
}
|
||||
|
||||
// Add a member
|
||||
$output = executeQuery('member.insertMember', $obj);
|
||||
|
||||
|
|
@ -433,7 +465,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 Rhymix. Since you password was encrypted we could not migrate it too, so please reset it by following this link:
|
||||
We recently migrated our site 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 />
|
||||
|
|
@ -751,6 +783,20 @@ class importerAdminController extends importer
|
|||
$obj->commentStatus = base64_decode($xmlDoc->post->allow_comment->body)!='N'?'ALLOW':'DENY';
|
||||
$obj->allow_trackback = base64_decode($xmlDoc->post->allow_trackback->body)!='N'?'Y':'N';
|
||||
$obj->notify_message = base64_decode($xmlDoc->post->is_notice->body);
|
||||
// Check user ID
|
||||
if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
|
||||
{
|
||||
$obj->user_id = preg_replace('/[^a-z0-9_-]+/i', '', $obj->user_id);
|
||||
}
|
||||
if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
|
||||
{
|
||||
$obj->user_id = 't' . $obj->member_srl;
|
||||
}
|
||||
// Check email address
|
||||
if(!preg_match('/^[\w-]+((?:\.|\+|\~)[\w-]+)*@[\w-]+(\.[\w-]+)+$/', $obj->email_address))
|
||||
{
|
||||
$obj->email_address = $obj->user_id . '@example.com';
|
||||
}
|
||||
// Change content information (attachment)
|
||||
if(count($files))
|
||||
{
|
||||
|
|
@ -942,6 +988,20 @@ class importerAdminController extends importer
|
|||
$obj->ipaddress = base64_decode($xmlDoc->comment->ipaddress->body);
|
||||
$obj->status = base64_decode($xmlDoc->comment->status->body)==''?'1':base64_decode($xmlDoc->comment->status->body);
|
||||
$obj->list_order = $obj->comment_srl*-1;
|
||||
// Check user ID
|
||||
if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
|
||||
{
|
||||
$obj->user_id = preg_replace('/[^a-z0-9_-]+/i', '', $obj->user_id);
|
||||
}
|
||||
if(!preg_match('/^[a-z]+[\w-]*[a-z0-9_]+$/i', $obj->user_id))
|
||||
{
|
||||
$obj->user_id = 't' . $obj->member_srl;
|
||||
}
|
||||
// Check email address
|
||||
if(!preg_match('/^[\w-]+((?:\.|\+|\~)[\w-]+)*@[\w-]+(\.[\w-]+)+$/', $obj->email_address))
|
||||
{
|
||||
$obj->email_address = $obj->user_id . '@example.com';
|
||||
}
|
||||
// Change content information (attachment)
|
||||
if(count($files))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -138,6 +138,7 @@ $lang->msg_confirm_account_comment = 'Click on the following link to complete yo
|
|||
$lang->msg_auth_mail_sent = 'The activation mail has been sent to %s. Please check your mail.';
|
||||
$lang->msg_confirm_mail_sent = 'We have just sent the activation email to %s. Please check your mail.';
|
||||
$lang->msg_invalid_auth_key = 'This is an invalid request of verification.<br />Please retry finding account info or contact the administrator.';
|
||||
$lang->msg_expired_auth_key = 'Your verification link has expired. Please request a new verification email.';
|
||||
$lang->msg_success_authed = 'Please use the password you received in the email to log in, and change it to a password of your choice as soon as possible.';
|
||||
$lang->msg_success_confirmed = 'Your account has been activated. You may log in now.';
|
||||
$lang->msg_new_member = 'Add Member';
|
||||
|
|
|
|||
|
|
@ -146,6 +146,7 @@ $lang->msg_confirm_mail_sent = '%s 메일로 가입 인증 메일이 발송되
|
|||
$lang->msg_change_mail_sent = '%s 메일로 이메일 변경 인증 메일이 발송되었습니다. 메일을 확인하세요.';
|
||||
$lang->msg_invalid_modify_email_auth_key = '잘못된 이메일 변경 요청입니다.<br />이메일 변경요청을 다시 하거나 사이트 관리자에게 문의해주세요.';
|
||||
$lang->msg_invalid_auth_key = '잘못된 계정 인증 요청입니다.<br />아이디/비밀번호 찾기를 다시 하거나 사이트 관리자에게 계정 정보를 문의해주세요.';
|
||||
$lang->msg_expired_auth_key = '인증 유효기간이 지났습니다. 인증을 다시 요청해 주십시오.';
|
||||
$lang->msg_success_authed = '임시 비밀번호로 변경되었습니다.<br />로그인 후 반드시 다른 비밀번호로 변경하시기 바랍니다.';
|
||||
$lang->msg_success_confirmed = '가입 인증이 완료되었습니다. 이제 로그인하실 수 있습니다.';
|
||||
$lang->msg_new_member = '회원 추가';
|
||||
|
|
|
|||
|
|
@ -914,7 +914,7 @@ class memberController extends member
|
|||
{
|
||||
if(isset($args->{$val}))
|
||||
{
|
||||
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', $args->{$val});
|
||||
$args->{$val} = preg_replace('/[\pZ\pC]+/u', '', html_entity_decode($args->{$val}));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1575,7 +1575,7 @@ class memberController extends member
|
|||
if(ztime($output->data->regdate) < time() - (86400 * 3))
|
||||
{
|
||||
executeQuery('member.deleteAuthMail', $args);
|
||||
return $this->stop('msg_invalid_auth_key');
|
||||
return $this->stop('msg_expired_auth_key');
|
||||
}
|
||||
|
||||
// Back up the value of $output->data->is_register
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ class memberView extends member
|
|||
function dispMemberSignUpForm()
|
||||
{
|
||||
//setcookie for redirect url in case of going to member sign up
|
||||
setcookie("XE_REDIRECT_URL", $_SERVER['HTTP_REFERER']);
|
||||
setcookie("XE_REDIRECT_URL", $_SERVER['HTTP_REFERER'], 0, '/', null, !!config('session.use_ssl_cookies'));
|
||||
|
||||
$member_config = $this->member_config;
|
||||
|
||||
|
|
|
|||
|
|
@ -233,49 +233,6 @@
|
|||
.xm .pagination ul>li:last-child>a,
|
||||
.xm .pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}
|
||||
.xm .pagination-centered{text-align:center}
|
||||
/* Button */
|
||||
.xm .btn{font-size:12px;font-family:inherit;display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;line-height:20px;height:auto;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;border:1px solid #cccccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05)}
|
||||
.xm .btn:hover,
|
||||
.xm .btn:focus,
|
||||
.xm .btn:active,
|
||||
.xm .btn.active,
|
||||
.xm .btn.disabled,
|
||||
.xm .btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9}
|
||||
.xm .btn:active,
|
||||
.xm .btn.active{background-color:#cccccc \9}
|
||||
.xm .btn:first-child{*margin-left:0}
|
||||
.xm .btn:hover,
|
||||
.xm .btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear}
|
||||
.xm .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}
|
||||
.xm .btn.active,
|
||||
.xm .btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05)}
|
||||
.xm .btn.disabled,
|
||||
.xm .btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}
|
||||
.xm .btn-inverse.active{color:rgba(255, 255, 255, 0.75)}
|
||||
.xm .btn-inverse{color:#ffffff!important;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;*background-color:#222222;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}
|
||||
.xm .btn-inverse:hover,
|
||||
.xm .btn-inverse:focus,
|
||||
.xm .btn-inverse:active,
|
||||
.xm .btn-inverse.active,
|
||||
.xm .btn-inverse.disabled,
|
||||
.xm .btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515}
|
||||
.xm .btn-inverse:active,
|
||||
.xm .btn-inverse.active{background-color:#080808 \9}
|
||||
.xm button.btn,
|
||||
.xm input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}
|
||||
.xm button.btn::-moz-focus-inner,
|
||||
.xm input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}
|
||||
.xm .btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}
|
||||
.xm .btn-group:first-child{*margin-left:0}
|
||||
.xm .btn-group+.btn-group{margin-left:5px}
|
||||
.xm .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
|
||||
.xm .btn-group>.btn+.btn{margin-left:-1px}
|
||||
.xm .btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}
|
||||
.xm .btn-group>.btn:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}
|
||||
.xm .btn-group>.btn:hover,
|
||||
.xm .btn-group>.btn:focus,
|
||||
.xm .btn-group>.btn:active,
|
||||
.xm .btn-group>.btn.active{z-index:2}
|
||||
/* Member module customize */
|
||||
.xm,
|
||||
.xm input,
|
||||
|
|
|
|||
|
|
@ -204,17 +204,32 @@ class pageView extends page
|
|||
FileHandler::writeFile($cache_file, $script);
|
||||
}
|
||||
|
||||
// Import Context and lang as local variables.
|
||||
$__Context = &$GLOBALS['__Context__'];
|
||||
$__Context->tpl_path = $filepath;
|
||||
global $lang;
|
||||
|
||||
// Start the output buffer.
|
||||
$__ob_level_before_fetch = ob_get_level();
|
||||
ob_start();
|
||||
include($cache_file);
|
||||
|
||||
// Include the compiled template.
|
||||
include $cache_file;
|
||||
|
||||
// Fetch contents of the output buffer until the buffer level is the same as before.
|
||||
$contents = '';
|
||||
while (ob_get_level() - $level > 0) {
|
||||
$contents .= ob_get_contents();
|
||||
ob_end_clean();
|
||||
while (ob_get_level() > $__ob_level_before_fetch)
|
||||
{
|
||||
$contents .= ob_get_clean();
|
||||
}
|
||||
|
||||
// Insert template path comment tag.
|
||||
if(Rhymix\Framework\Debug::isEnabledForCurrentUser() && Context::getResponseMethod() === 'HTML' && !starts_with('<!DOCTYPE', $contents) && !starts_with('<?xml', $contents))
|
||||
{
|
||||
$sign = PHP_EOL . '<!-- Template %s : ' . $target_file . ' -->' . PHP_EOL;
|
||||
$contents = sprintf($sign, 'start') . $contents . sprintf($sign, 'end');
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ class spamfilterController extends spamfilter
|
|||
{
|
||||
$text = $obj->title . ' ' . $obj->content . ' ' . $obj->nick_name . ' ' . $obj->homepage . ' ' . $obj->tags;
|
||||
}
|
||||
$text = utf8_trim(utf8_normalize_spaces(htmlspecialchars_decode(strip_tags($text))));
|
||||
$output = $oFilterModel->isDeniedWord($text);
|
||||
if(!$output->toBool())
|
||||
{
|
||||
|
|
@ -99,7 +98,6 @@ class spamfilterController extends spamfilter
|
|||
{
|
||||
$text = $obj->content . ' ' . $obj->nick_name . ' ' . $obj->homepage;
|
||||
}
|
||||
$text = utf8_trim(utf8_normalize_spaces(htmlspecialchars_decode(strip_tags($text))));
|
||||
$output = $oFilterModel->isDeniedWord($text);
|
||||
if(!$output->toBool()) return $output;
|
||||
// If the specified time check is not modified
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ class spamfilterModel extends spamfilter
|
|||
$word_list = $this->getDeniedWordList();
|
||||
if(!count($word_list)) return new BaseObject();
|
||||
|
||||
$text = utf8_trim(utf8_normalize_spaces(htmlspecialchars_decode(strip_tags($text, '<a><img>'))));
|
||||
foreach ($word_list as $word_item)
|
||||
{
|
||||
$word = $word_item->word;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue