big fix fields for ЗРЗ-8.4

This commit is contained in:
2025-11-27 01:18:25 +05:00
parent 7d07d964c1
commit 3c46200790
15 changed files with 168 additions and 89 deletions

View File

@@ -5,7 +5,7 @@
<h5>{#RUBRIK_TEMPLATE_EDIT#}</h5>
{/if}
<div class="num">
<a class="basicNum" href="index.php?do=rubs&action=tmpls&Id={$smarty.request.rubric_id|escape}&cp={$sess}">{#RUBRIC_TMPLS_BUTTON#}</a>
<a class="basicNum" href="index.php?do=rubs&action=tmpls&Id={$smarty.request.rubric_id|escape}&cp={$sess}">{#RUBRIK_TMPLS_BUTTON#}</a>
&nbsp;
<a class="basicNum" href="index.php?do=rubs&action=edit&Id={$smarty.request.rubric_id|escape}&cp={$sess}">{#RUBRIK_EDIT#}</a>
&nbsp;
@@ -25,7 +25,7 @@
<li class="firstB"><a href="index.php" title="{#MAIN_PAGE#}">{#MAIN_PAGE#}</a></li>
<li><a href="index.php?do=rubs&cp={$sess}">{#RUBRIK_SUB_TITLE#}</a></li>
<li><strong class="code">{$rubric->rubric_title|escape}</strong></li>
<li>{#RUBRIC_TMPLS_BUTTON#}</li>
<li>{#RUBRIK_TMPLS_BUTTON#}</li>
{if $smarty.request.action != 'tmpls_edit'}
<li>{#RUBRIK_TEMPLATE_NEW#}</li>
{else}
@@ -54,13 +54,13 @@
<div class="widget first">
<div class="head">
<h5 class="iFrames">{#RUBRIC_TMPLS_NAME_FULL#}</h5>
<h5 class="iFrames">{#RUBRIK_TMPLS_NAME_FULL#}</h5>
</div>
<div class="rowElem noborder">
<label>{#RUBRIC_TMPLS_NAME#}</label>
<label>{#RUBRIK_TMPLS_NAME#}</label>
<div class="formRight">
<input name="template_title" type="text" value="{if $smarty.request.tmpls_name}{$smarty.request.tmpls_name|escape:html}{else}{$template->title|escape:html}{/if}" maxlength="50" style="width: 400px;" class="mousetrap" />
<input name="template_title" type="text" value="{if isset($smarty.request.tmpls_name) && $smarty.request.tmpls_name}{$smarty.request.tmpls_name|escape:html}{else}{$template->title|escape:html}{/if}" maxlength="50" style="width: 400px;" class="mousetrap" />
</div>
<div class="fix"></div>
</div>
@@ -268,7 +268,7 @@
</tr>
{/if}
{foreach from=$field_group.fields item=field}
{foreach from=$field_group.fields item=field}
<tr>
<td align="center">
<strong class="code">{$field.Id}</strong>
@@ -304,7 +304,7 @@
<div class="rowElem" id="saveBtn">
<div class="saveBtn">
<input type="hidden" name="id" value="{$smarty.request.id|escape}" />
<input type="hidden" name="id" value="{$smarty.request.id|default:0|escape}" />
<input class="basicBtn" type="submit" value="{#RUBRIK_BUTTON_TPL#}" />
{if $smarty.request.action == 'tmpls_edit'}
{#RUBRIK_OR#}

View File

@@ -16,8 +16,8 @@
{
global $AVE_DB, $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$lang_file = $fld_dir . 'lang/' . (defined('ACP') ? $_SESSION['admin_language'] : $_SESSION['user_language']) . '.txt';
@@ -30,7 +30,8 @@
switch ($action)
{
case 'edit':
if (isset($default))
if (!empty($default))
{
$sql = $AVE_DB->Query("
SELECT
@@ -55,6 +56,7 @@
}
else
{
// Если $default пуст, выводим ошибку, а не выполняем SQL
$AVE_Template->assign('error', $AVE_Template->get_config_vars('error'));
}

View File

@@ -16,8 +16,8 @@
{
global $AVE_DB, $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_name = basename($fld_dir);
$lang_file = $fld_dir . 'lang/' . (defined('ACP') ? $_SESSION['admin_language'] : $_SESSION['user_language']) . '.txt';
@@ -31,7 +31,8 @@
switch ($action)
{
case 'edit':
if (isset($default))
if (!empty($default))
{
$parent = $AVE_DB->Query("
SELECT
@@ -71,6 +72,7 @@
}
else
{
// Этот блок выполняется, если $default пуст.
$AVE_Template->assign('error', $AVE_Template->get_config_vars('error'));
}

View File

@@ -25,7 +25,7 @@
{assign var=mega_new value="load" scope="global"}
{/if}
<div class="mega" id="mega_{$doc_id}_{$field_id}" data-id="{$field_id}" data-doc="{$doc_id}" data-rubric="{$smarty.request.rubric_id}">
<div class="mega" id="mega_{$doc_id}_{$field_id}" data-id="{$field_id}" data-doc="{$doc_id}" data-rubric="{$smarty.request.rubric_id|default:0}">
<input type="hidden" value="" id="cascad__{$field_id}_{$doc_id}">
{if $show_upload}
<input type="file" class="mega_upload mega_upload_field_{$field_id}_{$doc_id}" multiple="multiple" name="mega_files_{$field_id}_{$doc_id}[]" id="mega_upload_field_{$field_id}_{$doc_id}" style="visibility: hidden; display: none;" data-max-files="{$max_files}" />

View File

@@ -16,8 +16,8 @@
{
global $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_name = basename($fld_dir);
$lang_file = $fld_dir . 'lang/' . (defined('ACP') ? $_SESSION['admin_language'] : $_SESSION['user_language']) . '.txt';
@@ -37,7 +37,12 @@
$items = array_diff($items, array(''));
@$field_value = unserialize($field_value);
// ✅ ИСПРАВЛЕНИЕ 1: Безопасная десериализация
if (!empty($field_value)) {
$field_value = @unserialize($field_value);
} else {
$field_value = array();
}
$AVE_Template->assign('items', $items);
$AVE_Template->assign('field_id', $field_id);
@@ -48,8 +53,9 @@
break;
case 'doc':
$items = (isset($field_value))
? unserialize($field_value)
// ✅ ИСПРАВЛЕНИЕ 2: Безопасная десериализация (устранение unserialize error)
$items = (!empty($field_value))
? @unserialize($field_value)
: array();
if ($items != false)
@@ -101,7 +107,7 @@
break;
case 'req':
$items = (isset($field_value)) ? unserialize($field_value) : array();
$items = (!empty($field_value)) ? @unserialize($field_value) : array();
if ($items != false)
{
@@ -149,10 +155,11 @@
break;
case 'api':
// ✅ ИСПРАВЛЕНИЕ 3: Безопасная десериализация
if (empty($field_value))
return $field_value;
return unserialize($field_value);
return @unserialize($field_value);
break;
case 'name':

View File

@@ -1,7 +1,7 @@
{if $items}
<select size="5" class="select" style="min-width: 300px; max-width: 600px;" multiple="multiple" name="feld[{$field_id}][]">
{foreach from=$items key=key item=item}
<option value="{$item|trim|escape}" {if in_array($item|trim|escape, $field_value|trim|escape)} selected="selected"{/if}>{$item}</option>
<option value="{$item|trim|escape}" {if in_array($item|trim|escape, $field_value)} selected="selected"{/if}>{$item}</option>
{/foreach}
</select>
{else}

View File

@@ -1,23 +1,23 @@
<?php
/**
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @filesource
* @copyright © 2007-2015 AVE.cms, http://www.ave-cms.ru
*
* @license GPL v.2
*/
 * AVE.cms
 *
 * @package AVE.cms
 * @version 3.x
 * @filesource
 * @copyright © 2007-2015 AVE.cms, http://www.ave-cms.ru
 *
 * @license GPL v.2
 */
// Шаблоны рубрик
function get_field_rubrics($field_value, $action, $field_id = 0, $tpl = '', $tpl_empty = 0, &$maxlength = null, $document_fields = array(), $rubric_id = 0, $default = null)
{
global $AVE_DB, $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$lang_file = $fld_dir . 'lang/' . (defined('ACP') ? $_SESSION['admin_language'] : $_SESSION['user_language']) . '.txt';
@@ -27,13 +27,14 @@ function get_field_rubrics($field_value, $action, $field_id = 0, $tpl = '', $tpl
$res = 0;
if ($_REQUEST['action'] == 'new')
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'new')
$field_value = 0;
switch ($action)
{
case 'edit':
if (isset($default))
if (!empty($default))
{
$sql = $AVE_DB->Query("
SELECT
@@ -57,6 +58,7 @@ function get_field_rubrics($field_value, $action, $field_id = 0, $tpl = '', $tpl
}
else
{
// Если $default пуст, выводим ошибку, а не выполняем SQL
$AVE_Template->assign('error', $AVE_Template->get_config_vars('error'));
}

View File

@@ -11,13 +11,13 @@
* @license GPL v.2
*/
// Однострочное числовое
// Однострочное числовое (Три значения)
function get_field_single_line_numeric_three ($field_value, $action, $field_id = 0, $tpl = '', $tpl_empty = 0, &$maxlength = null, $document_fields = array(), $rubric_id = 0, $default = null, $_tpl=null)
{
global $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/'; // Убрал невидимый пробел
$tpl_dir = $fld_dir . 'tpl/';
$fld_name = basename($fld_dir);
$lang_file = $fld_dir . 'lang/' . (defined('ACP') ? $_SESSION['admin_language'] : $_SESSION['user_language']) . '.txt';
@@ -29,12 +29,26 @@
switch ($action)
{
case 'edit':
// Инициализируем $field_value как массив с 3-мя пустыми строками по умолчанию.
$safe_values = ['', '', ''];
if (! empty($field_value))
$field_value = explode('|', $field_value);
{
// Если значение не пусто, разделяем его на элементы
$values = explode('|', $field_value);
// Гарантируем, что массив содержит минимум 3 элемента, используя безопасный доступ (?? '')
$safe_values = [
$values[0] ?? '',
$values[1] ?? '',
$values[2] ?? ''
];
}
$AVE_Template->assign('field_dir', $fld_name);
$AVE_Template->assign('field_id', $field_id);
$AVE_Template->assign('field_value', $field_value);
$AVE_Template->assign('field_value', $safe_values); // Присваиваем гарантированный массив
$tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin', $_tpl);
@@ -113,15 +127,21 @@
break;
case 'save':
// Обрабатываем массив из трех значений, очищаем и собираем в строку '|'
$save = array();
if (is_array($field_value))
{
foreach ($field_value AS $k => $v)
{
$save[] = preg_replace('/[^\d.]/', '', $v);
}
// Очищаем каждое из трех значений и сохраняем
$value_0 = preg_replace('/[^\d.]/','', $field_value[0] ?? '');
$value_1 = preg_replace('/[^\d.]/','', $field_value[1] ?? '');
$value_2 = preg_replace('/[^\d.]/','', $field_value[2] ?? '');
$save = [$value_0, $value_1, $value_2];
}
elseif (!empty($field_value)) {
// Если не массив, но не пусто, сохраняем как есть (для совместимости)
$save[] = preg_replace('/[^\d.]/','', $field_value);
}
return empty($save) ? '' : implode('|', $save);

View File

@@ -1 +1 @@
{$field_value.0} - {$field_value.1} - {$field_value.2}
{$field_value.0|default:''} - {$field_value.1|default:''} - {$field_value.2|default:''}

View File

@@ -11,13 +11,13 @@
* @license GPL v.2
*/
// Однострочное числовое
// Однострочное числовое (Два значения)
function get_field_single_line_numeric_two ($field_value, $action, $field_id = 0, $tpl = '', $tpl_empty = 0, &$maxlength = null, $document_fields = array(), $rubric_id = 0, $default = null, $_tpl=null)
{
global $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_name = basename($fld_dir);
$lang_file = $fld_dir . 'lang/' . (defined('ACP') ? $_SESSION['admin_language'] : $_SESSION['user_language']) . '.txt';
@@ -29,12 +29,25 @@
switch ($action)
{
case 'edit':
// Инициализируем $field_value как массив с 2-мя пустыми строками по умолчанию.
$safe_values = ['', ''];
if (! empty($field_value))
$field_value = explode('|', $field_value);
{
// Если значение не пусто, разделяем его на элементы
$values = explode('|', $field_value);
// Гарантируем, что массив содержит минимум 2 элемента, используя безопасный доступ
$safe_values = [
$values[0] ?? '',
$values[1] ?? ''
];
}
$AVE_Template->assign('field_dir', $fld_name);
$AVE_Template->assign('field_id', $field_id);
$AVE_Template->assign('field_value', $field_value);
$AVE_Template->assign('field_value', $safe_values); // Присваиваем гарантированный массив
$tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin', $_tpl);
@@ -113,15 +126,20 @@
break;
case 'save':
// Обрабатываем массив из двух значений, очищаем и собираем в строку '|'
$save = array();
if (is_array($field_value))
{
foreach ($field_value AS $k => $v)
{
$save[] = preg_replace('/[^\d.]/', '', $v);
}
// Очищаем каждое из двух значений и сохраняем
$value_0 = preg_replace('/[^\d.]/','', $field_value[0] ?? '');
$value_1 = preg_replace('/[^\d.]/','', $field_value[1] ?? '');
$save = [$value_0, $value_1];
}
// Если пришла не строка, но не массив, возвращаем то, что есть (для совместимости)
elseif (!empty($field_value)) {
$save[] = preg_replace('/[^\d.]/','', $field_value);
}
return empty($save) ? '' : implode('|', $save);

View File

@@ -1 +1 @@
{$field_value.0} - {$field_value.1}
{$field_value.0|default:''} - {$field_value.1|default:''}

View File

@@ -16,15 +16,19 @@
{
global $AVE_DB, $AVE_Template;
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_dir = dirname(__FILE__) . '/';
$tpl_dir = $fld_dir . 'tpl/';
$fld_name = basename($fld_dir);
$rubric_id = ($rubric_id > 0)
? $rubric_id
: ($_REQUEST['rubric_id']
: (isset($_REQUEST['rubric_id']) && $_REQUEST['rubric_id']
? (int)$_REQUEST['rubric_id']
: $AVE_DB->Query("SELECT rubric_id FROM ".PREFIX."_documents WHERE Id = '".$_REQUEST['Id']."'")->GetCell());
: (isset($_REQUEST['Id'])
? $AVE_DB->Query("SELECT rubric_id FROM ".PREFIX."_documents WHERE Id = '".$_REQUEST['Id']."'")->GetCell()
: 0
)
);
$lang_file = $fld_dir . 'lang/' . (defined('ACP')
? $_SESSION['admin_language']
@@ -181,28 +185,34 @@
{
function tagsValue ($field_value)
{
// Если есть выделенные теги
if (! empty($field_value['tags']))
$tags = $field_value['tags'];
else
$tags = array();
$tags = array();
unset ($tags['other']);
// Если есть теги через зяпятую
if (! empty($field_value['tags']['other']))
// 1. Собираем теги по галочкам (если есть)
if (isset($field_value['tags']) && is_array($field_value['tags']))
{
$tags_checked = $field_value['tags'];
unset ($tags_checked['other']);
$tags = $tags_checked;
}
// 2. Собираем новые теги через запятую
if (isset($field_value['tags']['other']) && ! empty($field_value['tags']['other']))
{
$tags_new = explode(',', $field_value['tags']['other']);
$tags_new = array_map('trim', $tags_new);
$tags_new = array_diff($tags_new, array(''));
}
else
$tags_new = array();
// Совмещаем массивы
// 3. Совмещаем массивы и делаем значения уникальными
$tags = array_merge($tags, $tags_new);
// Делаем уникальные значения
$field_value = array_unique($tags);
// Если все теги пусты, возвращаем пустой массив
if (empty($field_value)) {
return array();
}
return $field_value;
}
@@ -221,19 +231,26 @@
$AVE_Document = new AVE_Document();
}
foreach ($data['feld'] AS $_k => $_v)
{
if (array_key_exists('tags', $_v))
{
$tags = tagsValue($_v);
$document_id = isset($data['document_id']) ? (int)$data['document_id'] : 0;
$rubric_id = isset($data['rubric_id']) ? (int)$data['rubric_id'] : 0;
if ($document_id > 0 && $rubric_id > 0)
{
foreach ($data['feld'] AS $_k => $_v)
{
if (is_array($_v) && array_key_exists('tags', $_v))
{
$tags = tagsValue($_v);
if (! empty($tags))
{
$tags = implode(',', $tags);
$AVE_Document->saveTags($data['document_id'], $data['rubric_id'], $tags);
}
}
}
if (! empty($tags))
{
$tags = implode(',', $tags);
// Используем безопасные переменные $document_id и $rubric_id
$AVE_Document->saveTags($document_id, $rubric_id, $tags);
}
}
}
}
}
}
?>

View File

@@ -10,7 +10,9 @@
ob_start();
ob_implicit_flush(0);
define('BASE_DIR', str_replace("\\", "/", dirname(dirname(dirname(__FILE__)))));
if (!defined('BASE_DIR')) {
define('BASE_DIR', str_replace("\\", "/", dirname(dirname(dirname(__FILE__)))));
}
require_once(BASE_DIR . '/inc/init.php');

View File

@@ -1,14 +1,14 @@
{if isset($param.4) && $param.4 == 'embed'}
<object width="{$param.1}" height="{$param.2}">
<object width="{$param.1|default:420}" height="{$param.2|default:315}">
<param name="movie" value="{$video_url}" />
<param name="allowFullScreen" value="{$param.3}" />
<param name="allowFullScreen" value="{$param.3|default:true}" />
<param name="allowscriptaccess" value="always" />
<embed type="application/x-shockwave-flash" width="{$param.1}" height="{$param.2}" src="{$video_url}" allowfullscreen="{$param.3}" allowscriptaccess="always"></embed>
<embed type="application/x-shockwave-flash" width="{$param.1|default:420}" height="{$param.2|default:315}" src="{$video_url}" allowfullscreen="{$param.3|default:true}" allowscriptaccess="always"></embed>
</object>
{else}
<iframe width="{$param.1}" height="{$param.2}" src="{$video_url}" frameborder="0" {if isset($param.3) && $param.3 == 'true'}allowfullscreen{/if}></iframe>
<iframe width="{$param.1|default:560}" height="{$param.2|default:315}" src="{$video_url}" frameborder="0" {if isset($param.3) && $param.3 == 'true'}allowfullscreen{/if}></iframe>
{/if}

View File

@@ -359,6 +359,15 @@
return $params_of_teaser[$id_param_array][$num];
}
// Функция получения уникальных параметров для каждого тизера
function f_params_of_teaser ($id_param_array,$num)
{
global $params_of_teaser;
return $params_of_teaser[$id_param_array][$num];
}
// Функция получения элемента запроса
function showrequestelement ($mixed, $template = '', $tparams = '')
{
@@ -579,7 +588,7 @@
$item = str_replace('[tag:link]', $link, $item);
$item = str_replace('[tag:docid]', $row->Id, $item);
$item = str_replace('[tag:itemid]', $row->Id, $item);
$item = str_replace('[tag:docitemnum]', $req_item_num, $item);
$item = str_replace('[tag:docitemnum]', (string)$req_item_num, $item);
$item = str_replace('[tag:adminlink]', 'index.php?do=docs&action=edit&rubric_id=' . $row->rubric_id . '&Id=' . $row->Id . '&cp=' . session_id() . '', $item);
$item = str_replace('[tag:doctitle]', stripslashes(htmlspecialchars_decode($row->document_title)), $item);
$item = str_replace('[tag:docparent]', $row->document_parent, $item);