XF 2.3 Массовое добавление кастомных полей с вариантами ответов

Версия XenForo
2.3.10

nond

Проверенные
Сообщения
316
Реакции
131
Баллы
11,045
Кто решал такую задачу?

Возникла потребность массового добавления вариантов ответов кастомных полей, ибо в ручную через админку, конечно их можно вносить, но если таких полей будет 100-300-500 и более, откровенно не всегда хочется ковыряться.

Например надо массово внести года выпуска или те же наименования городов
2026-03-18_123549.png

В базе данных кастомные поля хранятся в Таблице xf_thread_field, значения кастомных полей в xf_thread_field_value

Например у этого поля выбора года field_id = Year_of_release

В консоли HTML (F12), ввод вариантов ответов прячутся в полях админки:
name="field_choice[]" value="release2025"
name="field_choice_text[]" value="2025"

HTML:
<div class="inputGroup">
    <span class="inputGroup-text dragHandle" aria-label="Drag handle"></span>
    <input type="text" class="input" name="field_choice[]" value="release2025" placeholder="Значение (только A-Z, 0-9, и _)" size="24" maxlength="25" dir="ltr">
 
    <span class="inputGroup-splitter"></span>
    <input type="text" class="input" name="field_choice_text[]" value="2025" placeholder="Текст" size="24">
</div>

Спросил у Qwen3.5-Plus
"Создать шаблон SQL-запроса или PHP скрипт на добавление в столбцы field_choices, match_params пар текстовых данных из файла в таблицу xf_thread_field"

Для решения этой задачи лучше всего подходит PHP-скрипт, так как данные в XenForo (таблица xf_thread_field) в колонках field_choices и match_params хранятся в формате JSON. Просто вставить текст через запятую нельзя — база данных выдаст ошибку или функционал поля сломается.
Ниже представлены два варианта решения.
Вариант 1: PHP Скрипт (Рекомендуемый)
Этот скрипт читает CSV-файл, автоматически преобразует данные в правильный JSON-формат и обновляет базу данных.
Требования:
Файл data.csv должен лежать в той же папке, что и скрипт.
Формат CSV: field_id;choice1,choice2,choice3;min_length,max_length (разделитель — точка с запятой).

PHP:
<?php
// НАСТРОЙКИ ПОДКЛЮЧЕНИЯ К БД
$host = 'localhost';
$db   = 'имя_базы_данных';
$user = 'пользователь_бд';
$pass = 'пароль_бд';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $opt);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

// ИМЯ ФАЙЛА С ДАННЫМИ
$filename = 'data.csv';

if (!file_exists($filename)) {
    die("Файл $filename не найден!");
}

$file = fopen($filename, "r");

echo "Начало импорта...\n";

while (($data = fgetcsv($file, 1000, ";")) !== FALSE) {
    // Ожидаемая структура строки в CSV:
    // Column 0: field_id (например, 'country')
    // Column 1: Список вариантов через запятую (например, 'Russia,USA,Germany')
    // Column 2: Параметры валидации через запятую (например, '2,50' - мин и макс длина)
 
    if (empty($data[0])) continue; // Пропуск пустых строк

    $fieldId = trim($data[0]);
 
    // 1. Обработка field_choices (превращаем строку "A,B,C" в JSON ["A","B","C"])
    $choicesRaw = isset($data[1]) ? trim($data[1]) : '';
    $choicesArray = !empty($choicesRaw) ? array_map('trim', explode(',', $choicesRaw)) : [];
    $choicesJson = json_encode($choicesArray, JSON_UNESCAPED_UNICODE);

    // 2. Обработка match_params (превращаем строку "2,50" в JSON [2, 50])
    // Примечание: формат match_params зависит от типа поля. Здесь пример для текстового поля.
    $paramsRaw = isset($data[2]) ? trim($data[2]) : '';
    $paramsArray = !empty($paramsRaw) ? array_map('trim', explode(',', $paramsRaw)) : [];
 
    // Если параметры числовые, конвертируем их в int для чистоты JSON
    $paramsArray = array_map('intval', $paramsArray);
 
    $paramsJson = json_encode($paramsArray, JSON_UNESCAPED_UNICODE);

    // 3. SQL Запрос обновления
    $sql = "UPDATE xf_thread_field
            SET field_choices = :choices,
                match_params = :params
            WHERE field_id = :id";
      
    $stmt = $pdo->prepare($sql);
 
    $result = $stmt->execute([
        ':choices' => $choicesJson,
        ':params'  => $paramsJson,
        ':id'      => $fieldId
    ]);

    if ($result) {
        echo "Успешно обновлено поле: $fieldId\n";
    } else {
        echo "Ошибка обновления поля: $fieldId\n";
    }
}

fclose($file);
echo "Импорт завершен.";
?>

Пока осмысливаю писанину Королевы.
Может кто подсказать, насколько лажовый код от ИИ?
Может запрос переформулировать?
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу