Категории форума

Пока в планах - Отдельная таблица для пользовательских локализаций вальюшек


webitproff
webitproff • 17.07.2026 09:46 #1

Штатная функция cot_build_extrafields_data() для типов input, textarea (и всех остальных, кроме select/radio/checklistbox) не ищет переводы в языковом массиве. Она просто пропускает значение через cot_parse(). Поэтому ключ $L['xtra_xtu001_about_extra_value'] и не работает.

Реализуемое решение (без правки ядра):
В хуках вывода плагина (например, xtradbrowusers.users.details.tags.php, xtradbrowusers.usertags.php, xtradbrowusers.users.loop.php) сразу после получения $value добавить проверку:

$value = $xtra_data[$exfld['field_name']] ?? null;

// Локализация значения для input/textarea/etc.
$langKey = 'xtra_' . $exfld['field_name'] . '_value';
if (isset($L[$langKey])) {
    $value = $L[$langKey];
}

После этого присваивать теги как обычно. В языковой файл (xtradbrowusers.ru.lang.php) можно будет писать:

$L['xtra_xtu001_about_extra_value'] = 'Мы работаем с разными поставщиками...';

Таким образом, меняются только несколько файлов плагина, движок не трогается. Это даст возможность задать перевод для любого текстового значения экстраполя прямо в языковых файлах.


Пока в планах - Отдельная таблица для пользовательских локализаций вальюшек

Создание отдельной таблицы для мультиязычных вариантов — более гибкое и мощное решение, но оно требует существенной доработки плагина. Если нужно, чтобы пользователь сам вводил переводы значений экстраполей для нескольких языков, вот реализуемый пример без правки ядра Cotonti.

1. Дополнительная таблица для переводов

Создаём таблицу cot_xtradbrowusers_i18n:

CREATE TABLE cot_xtradbrowusers_i18n (
    id INT UNSIGNED NOT NULL,
    field_name VARCHAR(255) NOT NULL,
    lang CHAR(2) NOT NULL DEFAULT 'ru',
    value TEXT,
    PRIMARY KEY (id, field_name, lang),
    CONSTRAINT fk_xtradbrowusers_i18n FOREIGN KEY (id) REFERENCES cot_xtradbrowusers(id) ON DELETE CASCADE
);

Здесь lang — двухбуквенный код языка (ru, en, uk и т.д.).

2. Изменения в функциях плагина

a) Сохранение переводов
В хуках users.edit.update.done и users.profile.update.done после сохранения основного значения для каждого поля читаем из $_POST дополнительные значения с суффиксами языка (например, rxtra_phone_extra_ru, rxtra_phone_extra_en) и записываем их в новую таблицу.

b) Загрузка переводов
Функция xtradbrowusers_load_i18n($userId, $lang) возвращает массив переводов для заданного языка. При выводе в шаблонах (в хуках users.details.tags, users.loop и т.д.) вместо сырого значения подставляется перевод для текущего языка, если он существует. Если перевода нет — используется основное значение.

3. Пример кода для сохранения перевода

В xtradbrowusers.users.edit.update.done.php после строки $data[$fieldName] = cot_import_extrafields(...):

foreach (['ru', 'en', 'uk'] as $lang) {
    $translatedValue = cot_import('rxtra_' . $fieldName . '_' . $lang, 'P', 'HTM');
    if ($translatedValue !== null) {
        Cot::$db->query(
            "INSERT INTO " . Cot::$db->xtradbrowusers_i18n . " (id, field_name, lang, value)
             VALUES (?, ?, ?, ?)
             ON DUPLICATE KEY UPDATE value = ?",
            [$id, $fieldName, $lang, $translatedValue, $translatedValue]
        );
    }
}

4. Вывод перевода в шаблоне

В хуке users.details.tags.php:

$lang = Cot::$usr['lang'] ?? Cot::$cfg['defaultlang'] ?? 'ru';
$translatedValue = Cot::$db->query(
    "SELECT value FROM " . Cot::$db->xtradbrowusers_i18n . " WHERE id = ? AND field_name = ? AND lang = ?",
    [$urr['user_id'], $exfld['field_name'], $lang]
)->fetchColumn();

$displayValue = $translatedValue ?: $value;

Плюсы и минусы

Плюсы:

  • Полная свобода: пользователи могут вводить переводы для любого количества языков.
  • Не зависит от языковых файлов, поэтому переводы динамические.
  • Совместимо с любыми типами полей (input, textarea и т.д.).

Минусы:

  • Усложнение плагина: нужно добавлять поля ввода в формы, новые методы сохранения/загрузки, создавать таблицу.
  • Придётся обновлять все шаблоны форм, чтобы выводить дополнительные поля для каждого языка.

Вывод

Если вам нужна именно пользовательская локализация значений, и вы готовы к расширению функционала, вариант с отдельной таблицей — правильный путь. Если же достаточно статических переводов, задаваемых администратором в языковых файлах, проще использовать описанный ранее метод с константами $L.

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.