Системные настройки->Управление языками, добавлен выбор иконки флага из существующей на сервере библиотеки
This commit is contained in:
@@ -212,4 +212,7 @@ SETTINGS_JS_WIN_CLOSE = "Закрыть окно"
|
||||
|
||||
# v3.31
|
||||
_const_utc = "Часовой пояс сайта"
|
||||
_const_editor = "HTML-редактор CKEditor"
|
||||
_const_editor = "HTML-редактор CKEditor"
|
||||
|
||||
# v3.32
|
||||
SETTINGS_SEL_FILE_FLAG = "Выберите из имеющихся на сервере (развернуть)"
|
||||
|
||||
@@ -1,63 +1,77 @@
|
||||
<div class="first"></div>
|
||||
|
||||
<div class="title"><h5>{#SETTINGS_LANG_EDIT#}</h5></div>
|
||||
|
||||
<div class="widget" style="margin-top: 0px;">
|
||||
<div class="body">
|
||||
{#SETTINGS_LANG_TITLE#}
|
||||
</div>
|
||||
<div class="body">{#SETTINGS_LANG_TITLE#}</div>
|
||||
</div>
|
||||
|
||||
<div class="breadCrumbHolder module">
|
||||
<div class="breadCrumb module">
|
||||
<ul>
|
||||
<li class="firstB"><a href="index.php?pop=1" title="{#MAIN_PAGE#}">{#MAIN_PAGE#}</a></li>
|
||||
<li class="firstB"><a href="index.php?pop=1">{#MAIN_PAGE#}</a></li>
|
||||
<li>{#SETTINGS_LANG_EDIT#}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" id="lang_save_form" class="mainForm" enctype="multipart/form-data" action="index.php?do=settings&sub=language&func=save&cp={$sess}">
|
||||
|
||||
<div class="widget first">
|
||||
<table cellpadding="0" cellspacing="0" width="100%" class="tableStatic">
|
||||
<col width="50" />
|
||||
<col width="100" />
|
||||
<col width="200" />
|
||||
<col width="100" /><col width="100" /><col width="200" />
|
||||
<thead>
|
||||
<tr>
|
||||
<td>{#SETTINGS_LANG_SYSTEM#}</td>
|
||||
<td>{#SETTINGS_LANG_PREFIX#}</td>
|
||||
<td>{#SETTINGS_LANG_NAME#}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{#SETTINGS_LANG_SYSTEM#} (en, ru)</td>
|
||||
<td>{#SETTINGS_LANG_PREFIX#} (/en/)</td>
|
||||
<td>{#SETTINGS_LANG_NAME#}</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><div class="pr12"><input {if ($smarty.request.Id|default:'')!=''}readonly{/if} type="text" name="lang_key" id="lang_key" value="{$items->lang_key|default:''}" /></div></td>
|
||||
<td><div class="pr12"><input {if !empty($items->Id)}readonly{/if} type="text" name="lang_key" id="lang_key" value="{$items->lang_key|default:''}" /></div></td>
|
||||
<td><div class="pr12"><input type="text" name="lang_alias_pref" id="lang_alias_pref" value="{$items->lang_alias_pref|default:''}" /></div></td>
|
||||
<td><div class="pr12"><input type="text" name="lang_name" id="lang_name" value="{$items->lang_name|default:''}" /></div></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
{#SETTINGS_LANG_FLAG#}:
|
||||
{if !empty($items->lang_key)}
|
||||
<span style="margin-left: 5px;">
|
||||
<img src="/lib/flags/{$items->lang_key}.png" alt="{$items->lang_name|default:''}" style="width: 16px; height: 11px; vertical-align: middle;" />
|
||||
</span>
|
||||
{/if}
|
||||
<div class="pr12" style="display:inline-block; margin-left:10px;">
|
||||
<input type="file" name="lang_flag" id="lang_flag" class="greyishBtn"/>
|
||||
<td colspan="3">
|
||||
<div style="margin-bottom:10px;"><strong>{#SETTINGS_LANG_FLAG#}:</strong></div>
|
||||
|
||||
<div id="current_flag_preview" style="display:inline-block; vertical-align: middle; margin-right: 20px;">
|
||||
{if !empty($items->lang_key)}
|
||||
<img src="/lib/flags/{$items->lang_key}.png" alt="" style="width: 16px; height: 11px; border: 1px solid #ccc;" />
|
||||
{else}
|
||||
<div style="width:16px; height:11px; border:1px dashed #ccc; display:inline-block;"></div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div style="display:inline-block; vertical-align: middle;">
|
||||
<input type="file" name="lang_flag" id="lang_flag" class="greyishBtn" />
|
||||
</div>
|
||||
|
||||
<div style="margin-top:15px;">
|
||||
<h6 style="padding: 5px 0;">
|
||||
<a href="javascript:void(0);" id="toggle_gallery" class="expander" style="border-bottom: 1px dashed; text-decoration: none;">
|
||||
{#SETTINGS_SEL_FILE_FLAG#}
|
||||
</a>
|
||||
</h6>
|
||||
|
||||
<div class="gallery_flags" style="display: none; height: 120px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; background: #f9f9f9; margin-top: 10px;">
|
||||
{foreach from=$available_flags item=f_name}
|
||||
<img src="/lib/flags/{$f_name}.png" class="select_flag" data-name="{$f_name}"
|
||||
title="{$f_name}" style="cursor:pointer; padding:5px; border: 1px solid transparent; width: 16px; height: 11px;" />
|
||||
{/foreach}
|
||||
</div>
|
||||
<input type="hidden" name="server_flag_path" id="server_flag_path" value="" />
|
||||
</div>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<input type="hidden" name="Id" value="{$smarty.request.Id|default:''}" />
|
||||
<input type="hidden" name="Id" value="{$items->Id|default:''}" />
|
||||
|
||||
<a href="javascript:void(0);" class="button basicBtn blueBtn" id="submit_lang_form">
|
||||
<span>{if ($smarty.request.Id|default:'')==''}{#SETTINGS_LANG_ADD#}{else}{#SETTINGS_LANG_SAVE#}{/if}</span>
|
||||
<span>{if empty($items->Id)}{#SETTINGS_LANG_ADD#}{else}{#SETTINGS_LANG_SAVE#}{/if}</span>
|
||||
</a>
|
||||
|
||||
<a href="javascript:void(0);" class="button basicBtn redBtn CloseLangDialog" style="margin-left:10px;">
|
||||
@@ -71,9 +85,31 @@
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<style>
|
||||
.select_flag:hover { border-color: #3a6d9c !important; background: #eef; }
|
||||
.select_flag.active { border-color: #3a6d9c !important; background: #ddecff; box-shadow: 0 0 5px rgba(0,0,0,0.2); }
|
||||
#toggle_gallery:hover { color: #3a6d9c; }
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
{literal}
|
||||
$(document).ready(function() {
|
||||
// Раскрытие/закрытие галереи
|
||||
$('#toggle_gallery').on('click', function() {
|
||||
$('.gallery_flags').slideToggle(200);
|
||||
});
|
||||
|
||||
// Выбор флага из галереи
|
||||
$('.select_flag').on('click', function() {
|
||||
$('.select_flag').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
$('#server_flag_path').val($(this).data('name'));
|
||||
$('#lang_flag').val('');
|
||||
|
||||
// Обновляем превью сразу
|
||||
$('#current_flag_preview').html('<img src="/lib/flags/'+$(this).data('name')+'.png" style="width: 16px; height: 11px; border: 1px solid #ccc;" />');
|
||||
});
|
||||
|
||||
$('#submit_lang_form').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
@@ -81,13 +117,13 @@ $(document).ready(function() {
|
||||
var lPref = $.trim($('#lang_alias_pref').val());
|
||||
var lName = $.trim($('#lang_name').val());
|
||||
var lFile = $('#lang_flag').val();
|
||||
var isNew = $('input[name="Id"]').val() == '';
|
||||
var lServer = $('#server_flag_path').val();
|
||||
var isNew = $('input[name="Id"]').val() == '' || $('input[name="Id"]').val() == '0';
|
||||
|
||||
if (lKey == '' || lPref == '' || lName == '' || (isNew && lFile == '')) {
|
||||
if (lKey == '' || lPref == '' || lName == '' || (isNew && lFile == '' && lServer == '')) {
|
||||
$.jGrowl('{/literal}{#SETTINGS_JS_FILL_ERR#}{literal}', {
|
||||
header: '{/literal}{#SETTINGS_JS_FILL_HEAD#}{literal}',
|
||||
theme: 'error',
|
||||
life: 3000
|
||||
theme: 'error', life: 3000
|
||||
});
|
||||
return false;
|
||||
}
|
||||
@@ -101,22 +137,26 @@ $(document).ready(function() {
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
dataType: 'json',
|
||||
beforeSend: function() {
|
||||
$.alerts._overlay('show');
|
||||
},
|
||||
success: function() {
|
||||
$.jGrowl('{/literal}{#SETTINGS_SAVED#}{literal}', {
|
||||
header: '{/literal}{#SETTINGS_JS_NOTIFY#}{literal}',
|
||||
theme: 'accept',
|
||||
life: 3000
|
||||
});
|
||||
success: function(data) {
|
||||
if (data.status === 'success') {
|
||||
$.jGrowl('{/literal}{#SETTINGS_SAVED#}{literal}', {
|
||||
header: '{/literal}{#SETTINGS_JS_NOTIFY#}{literal}',
|
||||
theme: 'accept', life: 2000
|
||||
});
|
||||
|
||||
setTimeout(function(){
|
||||
var $dialog = $(".CloseLangDialog").closest('.ui-dialog-content');
|
||||
if ($dialog.length) $dialog.dialog('close');
|
||||
else window.location.reload();
|
||||
}, 1000);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
$.jGrowl('{/literal}{#SETTINGS_JS_SERVER_ERR#}{literal}', {
|
||||
header: '{/literal}{#SETTINGS_ERROR#}{literal}',
|
||||
theme: 'error',
|
||||
life: 5000
|
||||
});
|
||||
$.jGrowl('{/literal}{#SETTINGS_JS_SERVER_ERR#}{literal}', { theme: 'error' });
|
||||
},
|
||||
complete: function() {
|
||||
$.alerts._overlay('hide');
|
||||
@@ -133,8 +173,7 @@ $(document).ready(function() {
|
||||
var $container = $(".CloseLangDialog").closest('.ui-dialog-content');
|
||||
if ($container.length) {
|
||||
$container.off("dialogclose").on("dialogclose", function() {
|
||||
if (window.parent) window.parent.location.reload();
|
||||
else window.location.reload();
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -578,112 +578,111 @@ function settingsLanguageList()
|
||||
|
||||
|
||||
/**
|
||||
* Метод Редактирования параметров языков
|
||||
*
|
||||
*/
|
||||
function settingsLanguageEdit()
|
||||
{
|
||||
global $AVE_DB, $AVE_Template;
|
||||
* Метод Редактирования параметров языков
|
||||
*/
|
||||
function settingsLanguageEdit()
|
||||
{
|
||||
global $AVE_DB, $AVE_Template;
|
||||
|
||||
// Инициализируем $items как null, чтобы шаблон работал при добавлении
|
||||
$items = null;
|
||||
|
||||
// получаем ID (используем 'id' или 'Id', если что-то передано)
|
||||
$lang_id = (int)($_REQUEST['id'] ?? $_REQUEST['Id'] ?? 0);
|
||||
// инициализируем пустой объект для режима добавления
|
||||
$items = new stdClass();
|
||||
$items->Id = 0;
|
||||
$items->lang_key = '';
|
||||
$items->lang_alias_pref = '';
|
||||
$items->lang_name = '';
|
||||
|
||||
if ($lang_id > 0)
|
||||
{
|
||||
$result = $AVE_DB->Query("
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
" . PREFIX . "_settings_lang
|
||||
WHERE
|
||||
Id = '" . $lang_id . "'
|
||||
");
|
||||
|
||||
// получение данных
|
||||
if (is_object($result)) {
|
||||
$items = $result->FetchRow();
|
||||
$lang_id = (int)($_REQUEST['id'] ?? $_REQUEST['Id'] ?? 0);
|
||||
|
||||
if ($lang_id > 0) {
|
||||
$result = $AVE_DB->Query("
|
||||
SELECT * FROM " . PREFIX . "_settings_lang
|
||||
WHERE Id = '" . $lang_id . "'
|
||||
");
|
||||
if (is_object($result)) {
|
||||
$row = $result->FetchRow();
|
||||
if ($row) $items = $row;
|
||||
}
|
||||
}
|
||||
|
||||
// сканируем папку с флагами для галереи
|
||||
$available_flags = [];
|
||||
$flags_dir = BASE_DIR . '/lib/flags/';
|
||||
if (is_dir($flags_dir)) {
|
||||
$files = @scandir($flags_dir);
|
||||
if ($files) {
|
||||
foreach ($files as $file) {
|
||||
if (strpos($file, '.png') !== false) {
|
||||
$available_flags[] = str_replace('.png', '', $file);
|
||||
}
|
||||
}
|
||||
|
||||
// Передаем $items (либо объект, либо null) в шаблон
|
||||
$AVE_Template->assign('items', $items);
|
||||
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang_edit.tpl'));
|
||||
}
|
||||
}
|
||||
|
||||
$AVE_Template->assign('available_flags', $available_flags);
|
||||
$AVE_Template->assign('items', $items);
|
||||
$AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang_edit.tpl'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Метод Сохранения параметров языков
|
||||
*/
|
||||
function settingsLanguageEditSave()
|
||||
{
|
||||
global $AVE_DB, $AVE_Template;
|
||||
|
||||
// 1. Сохранение/Обновление данных языка в БД
|
||||
{
|
||||
global $AVE_DB;
|
||||
|
||||
if (! empty($_REQUEST["Id"]))
|
||||
{
|
||||
$AVE_DB->Query("
|
||||
UPDATE
|
||||
" . PREFIX . "_settings_lang
|
||||
SET
|
||||
lang_key = '" .$_REQUEST['lang_key']. "',
|
||||
lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "',
|
||||
lang_name = '" .$_REQUEST['lang_name']. "'
|
||||
WHERE
|
||||
Id = '" . $_REQUEST["Id"] . "'
|
||||
");
|
||||
$lang_key = isset($_REQUEST['lang_key']) ? addslashes(trim($_REQUEST['lang_key'])) : '';
|
||||
$lang_name = isset($_REQUEST['lang_name']) ? addslashes(trim($_REQUEST['lang_name'])) : '';
|
||||
$lang_pref = isset($_REQUEST['lang_alias_pref']) ? addslashes(trim($_REQUEST['lang_alias_pref'])) : '';
|
||||
$id = (int)($_REQUEST['Id'] ?? 0);
|
||||
|
||||
// сохранение или обновление в БД
|
||||
if ($id > 0) {
|
||||
$AVE_DB->Query("
|
||||
UPDATE " . PREFIX . "_settings_lang
|
||||
SET
|
||||
lang_key = '" . $lang_key . "',
|
||||
lang_alias_pref = '" . $lang_pref . "',
|
||||
lang_name = '" . $lang_name . "'
|
||||
WHERE Id = '" . $id . "'
|
||||
");
|
||||
} else {
|
||||
$AVE_DB->Query("
|
||||
INSERT INTO " . PREFIX . "_settings_lang
|
||||
SET
|
||||
lang_key = '" . $lang_key . "',
|
||||
lang_name = '" . $lang_name . "',
|
||||
lang_alias_pref = '" . $lang_pref . "',
|
||||
lang_default = '0',
|
||||
lang_status = '0'
|
||||
");
|
||||
}
|
||||
|
||||
$upload_dir = BASE_DIR . '/lib/flags/';
|
||||
if (!is_dir($upload_dir)) @mkdir($upload_dir, 0755, true);
|
||||
|
||||
// если загружен файл - берем его, если выбрано из галереи - копируем
|
||||
if (!empty($lang_key)) {
|
||||
if (isset($_FILES['lang_flag']) && $_FILES['lang_flag']['error'] === UPLOAD_ERR_OK) {
|
||||
$file = $_FILES['lang_flag'];
|
||||
if ($file['type'] === 'image/png') {
|
||||
@move_uploaded_file($file['tmp_name'], $upload_dir . $lang_key . '.png');
|
||||
}
|
||||
else
|
||||
{
|
||||
$AVE_DB->Query("
|
||||
INSERT INTO
|
||||
" . PREFIX . "_settings_lang
|
||||
SET
|
||||
lang_key = '" .$_REQUEST['lang_key']. "',
|
||||
lang_name = '" .$_REQUEST['lang_name']. "',
|
||||
lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "',
|
||||
lang_default = '0',
|
||||
lang_status = '0'
|
||||
");
|
||||
|
||||
}
|
||||
elseif (!empty($_REQUEST['server_flag_path'])) {
|
||||
$source = $upload_dir . basename($_REQUEST['server_flag_path']) . '.png';
|
||||
$target = $upload_dir . $lang_key . '.png';
|
||||
if (file_exists($source) && $source != $target) {
|
||||
@copy($source, $target);
|
||||
}
|
||||
|
||||
// сохранение загруженного флага
|
||||
|
||||
$lang_key = $_REQUEST['lang_key'] ?? '';
|
||||
|
||||
if (!empty($lang_key) && isset($_FILES['lang_flag']) && $_FILES['lang_flag']['error'] === UPLOAD_ERR_OK) {
|
||||
|
||||
$file = $_FILES['lang_flag'];
|
||||
|
||||
// ПУТЬ: BASE_DIR/lib/flags/
|
||||
$upload_dir = BASE_DIR . '/lib/flags/';
|
||||
|
||||
// Проверяем и создаем папку, если нужно
|
||||
if (!is_dir($upload_dir)) {
|
||||
@mkdir($upload_dir, 0777, true);
|
||||
}
|
||||
|
||||
// Ожидаем PNG-файл
|
||||
if ($file['type'] === 'image/png') {
|
||||
$target_file = $upload_dir . $lang_key . '.png';
|
||||
|
||||
// Сохраняем файл
|
||||
if (move_uploaded_file($file['tmp_name'], $target_file)) {
|
||||
// Успех
|
||||
} else {
|
||||
// Ошибка: проверить права доступа к /lib/flags/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Очистка кэша и закрытие окна
|
||||
$AVE_DB->clearCache('langs');
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['status' => 'success']);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$AVE_DB->clearCache('langs');
|
||||
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode(['status' => 'success']);
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user