Системные настройки->Управление языками, добавлен выбор иконки флага из существующей на сервере библиотеки

This commit is contained in:
2026-05-12 22:16:26 +05:00
parent 6a6b13ec11
commit eb1d121b19
3 changed files with 180 additions and 139 deletions

View File

@@ -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 = "Выберите из имеющихся на сервере (развернуть)"

View File

@@ -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();
});
}
});

View File

@@ -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;
}
/**