nond
Проверенные
- Сообщения
- 316
- Реакции
- 131
- Баллы
- 11,045
Кто решал такую задачу?
Возникла потребность массового добавления вариантов ответов кастомных полей, ибо в ручную через админку, конечно их можно вносить, но если таких полей будет 100-300-500 и более, откровенно не всегда хочется ковыряться.
Например надо массово внести года выпуска или те же наименования городов
В базе данных кастомные поля хранятся в Таблице
Например у этого поля выбора года
В консоли HTML (F12), ввод вариантов ответов прячутся в полях админки:
name="field_choice[]" value="release2025"
name="field_choice_text[]" value="2025"
Спросил у Qwen3.5-Plus
"Создать шаблон SQL-запроса или PHP скрипт на добавление в столбцы field_choices, match_params пар текстовых данных из файла в таблицу xf_thread_field"
Пока осмысливаю писанину Королевы.
Может кто подсказать, насколько лажовый код от ИИ?
Может запрос переформулировать?
Возникла потребность массового добавления вариантов ответов кастомных полей, ибо в ручную через админку, конечно их можно вносить, но если таких полей будет 100-300-500 и более, откровенно не всегда хочется ковыряться.
Например надо массово внести года выпуска или те же наименования городов
В базе данных кастомные поля хранятся в Таблице
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 "Импорт завершен.";
?>
Пока осмысливаю писанину Королевы.
Может кто подсказать, насколько лажовый код от ИИ?
Может запрос переформулировать?

