# Changelog - XFields Plugin with ng-helpers

**Дата модернизации:** 18 января 2026 → 31 января 2026
**Версия плагина:** 0.33
**Версия ng-helpers:** v0.2.1 → v0.2.2

## 🎯 Цель модернизации

Интеграция современных функций ng-helpers для улучшения безопасности, производительности и отладки плагина дополнительных полей (xfields).

---

## 📅 Обновление v0.2.2 (31 января 2026)

### Добавленные функции:

- ✅ **array_get()** - Безопасный доступ к массивам $\_REQUEST и $\_POST

### Улучшения безопасности:

- Все прямые обращения к `$_REQUEST` заменены на `array_get($_REQUEST, 'key', default)`
- Предотвращение ошибок "Undefined array key" и "Undefined index"
- Защита от потенциальных уязвимостей при отсутствии обязательных параметров

### Модифицированные файлы:

#### **config.php**

- Обновлен импорт: `use function Plugins\{notify, sanitize, logger, array_get};`
- Заменено **40+ обращений** к `$_REQUEST` на `array_get()` с дефолтными значениями
- Защищены все параметры форм: section, action, field, id, edit, title, type, required, disabled, area, regpage, default values, options, images settings, storage, db_type, db_len, subaction

#### **xfields.php**

- Обновлен импорт: `use function Plugins\{notify, sanitize, logger, get_ip, cache_get, cache_put, cache_forget, array_get};`

---

## 🔧 Интеграция ng-helpers v0.2.1 (18 января 2026)

### Добавленные функции:

- ✅ **notify()** - Современные уведомления вместо устаревшего msg()
- ✅ **sanitize()** - Очистка пользовательского ввода для предотвращения XSS
- ✅ **logger()** - Детальное логирование операций с полями
- ✅ **get_ip()** - Получение IP-адреса для аудита
- ✅ **cache_get/cache_put/cache_forget()** - Кэширование (подготовлено для будущих оптимизаций)

### Модифицированные файлы:

#### 1. **xfields.php** (основной файл плагина)

- Добавлен импорт: `use function Plugins\{notify, sanitize, logger, get_ip, cache_get, cache_put, cache_forget};`
- Заменены 2 вызова `msg()` на `notify()`
- Добавлено `sanitize()` для всех пользовательских данных в полях
- Добавлено логирование ошибок валидации с IP-адресами
  **Изменения:**

```php
// Было:
msg(['type' => 'error', 'text' => str_replace('{field}', $id, $lang['xfields_msge_emptyrequired'])]);
// Стало:
notify('error', str_replace('{field}', $id, $lang['xfields_msge_emptyrequired']));
logger('xfields', 'Required field empty: ' . $id, ['ip' => get_ip()]);
```

#### 2. **config.php** (административная панель)

- Добавлен импорт: `use function Plugins\{notify, sanitize, logger};`
- Заменены все 12 вызовов `msg()` на `notify()`
- Добавлено логирование всех ошибок конфигурации с контекстом
  **Заменённые вызовы:**
- ❌ Поле не существует → ✅ `notify('error')` + logger
- ❌ Поле уже существует → ✅ `notify('error')` + logger
- ❌ Неверный формат имени → ✅ `notify('error')` + logger
- ❌ Ошибка значения по умолчанию → ✅ `notify('error')` + logger (2x для select/multiselect)
- ❌ Не указан тип поля → ✅ `notify('error')` + logger
- ❌ Не указан заголовок → ✅ `notify('error')` + logger
- ❌ Неверный тип БД → ✅ `notify('error')` + logger
- ❌ Неверная длина БД → ✅ `notify('error')` + logger
- ❌ Ошибка сохранения конфига → ✅ `notify('error')` + logger (2x)
- ❌ Поле не найдено для обновления → ✅ `notify('error')` + logger

---

## 🔒 Улучшения безопасности

### 1. **Санитизация пользовательского ввода**

- Все данные из `$rcall[$id]` теперь проходят через `sanitize()`
- Предотвращение XSS-атак через пользовательские поля
- Очистка данных перед сохранением в БД

### 2. **IP-аудит**

- Логирование IP-адресов при ошибках валидации
- Возможность отслеживания подозрительных попыток ввода
- Аудит операций с полями

---

## 📊 Логирование операций

Теперь логируются следующие события:
| Событие | Уровень | Контекст |
| ------------------------------ | ------- | ---------------------- |
| Пустое обязательное поле | warning | field, ip |
| Поле не существует | error | field, section |
| Поле уже существует | error | field, section |
| Неверный формат имени | error | field |
| Ошибка значения по умолчанию | error | field, value |
| Пустой тип поля | error | field |
| Пустой заголовок | error | field |
| Неверный тип БД | error | field, type |
| Неверная длина БД | error | field, len |
| Ошибка сохранения конфига | error | field, section |
| Поле не найдено при обновлении | error | field, section, action |

---

## 🚀 Производительность

### Подготовка к кэшированию

- Добавлены импорты функций кэширования (cache_get/cache_put/cache_forget)
- Готовность к кэшированию конфигурации полей
- Возможность кэширования метаданных для уменьшения запросов к БД

### Рекомендации по дальнейшей оптимизации:

1. Кэшировать результат `xf_configLoad()` с TTL 3600 сек
2. Использовать `cache_forget('xfields_config')` при изменении конфигурации
3. Кэшировать список полей для каждой секции отдельно

---

## 🐛 Исправленные проблемы

1. **Устаревшие уведомления**: Все `msg()` заменены на современный `notify()`
2. **Отсутствие логирования**: Добавлено детальное логирование всех операций
3. **Небезопасный ввод**: Добавлена санитизация через `sanitize()`
4. **Отсутствие аудита**: Добавлено логирование IP-адресов

---

## 📋 Требования

- **NGCMS**: 0.9.3+
- **ng-helpers**: v0.2.1+
- **PHP**: 7.0+ (рекомендуется 7.4+)

---

## 🔄 Миграция

### Шаги обновления:

1. Убедиться, что установлен ng-helpers v0.2.1+
2. Заменить файлы:
   - `xfields.php`
   - `config.php`
3. Очистить кэш NG CMS (если используется)
4. Проверить работу плагина в административной панели
5. Проверить создание/редактирование новостей с доп. полями

### Обратная совместимость:

✅ **Полная обратная совместимость**

- Все существующие дополнительные поля продолжат работать
- Структура БД не изменена
- API плагина не изменён
- Шаблоны не требуют обновления

---

## 📝 Список изменений

### Файлы изменены:

- ✅ `xfields.php` - добавлены ng-helpers импорты и модернизация
- ✅ `config.php` - добавлены ng-helpers импорты и модернизация

### Файлы без изменений:

- ⚪ `lib/common.php` - библиотека функций (без msg())
- ⚪ `install.php` - установка
- ⚪ `uninstall.php` - деинсталляция
- ⚪ `tpl/**` - шаблоны

---

## 🎯 Будущие улучшения

### Планируется в следующих версиях:

1. **Кэширование конфигурации полей** для уменьшения нагрузки
2. **Валидация данных** с использованием `validate_*` функций ng-helpers
3. **CSRF-защита** форм редактирования полей
4. **Benchmark** операций с большими наборами полей
5. **Оптимизация SQL** запросов с использованием JOIN

---

## 👤 Авторы

- **Оригинальный автор**: Vitaly A. Ponomarev
- **Модернизация с ng-helpers**: NGCMS Development Team (18 января 2026)

---

## 📄 Лицензия

## Совместимость с лицензией Next Generation CMS

## 🔗 См. также

- [ng-helpers Documentation](../ng-helpers/README.md)
- [XFields Plugin Documentation](readme)
- [NGCMS Documentation](../../docs/)
