Решено xf_user_field_value и работа с ним со стороны

Статус
В этой теме нельзя размещать новые ответы.

DiWorm

Проверенные
Сообщения
440
Реакции
142
Баллы
5,545
День добрый!

Есть несколько вопросов о доп. полях профиля пользователя.

1. При регистрации пользователя я так понимаю создается набор записей в xf_user_field_value? Или же он создается при каком-то определенном действии?

2. Можно ли редактировать таблицу прямыми запросами (без подключения классов форума)? Будут ли они сразу обновляться на форуме? (Нет возможности проверить в данный момент на тестовой площадке, а на продакшене боюсь, т.к. не совсем понимаю эту таблицу и ее типы данных, например: field_id varbinary(25) c подключенной функцией unhex о_О)

3. Если на 2 вопрос ответ отрицательный и так делать нельзя, не подскажите какие классы отвечают за редактирование полей пользователя и как их подключить после инициализации и авторизации в свое скрипте? Гуглил по данному вопросу, но нашел только инфу о том, как создавать пользователя и менять пароль силами форума, а вот как редактировать - не смог найти ничего интересного.
 
Последнее редактирование модератором:
Итак, ап темы и вот новые сведения по вопросу.

1. Обновление\добавление поля для текущих пользователей делается в 1 запрос
Код:
INSERT INTO xf_user_field_value SET user_id = {$_SESSION['user_id']}, field_id = 'Test', field_value = 1 ON DUPLICATE KEY UPDATE field_value = 1

2. Редактировать можно напрямую, только вот в сессии параметры не изменяются, не понятно почему.
Т.е. схема такая: Добавляю пользовательское поле, делаю запрос на его изменений\или добавление для юзера, в сессии [customFields][Test] не появляется до момента, пока не изменю данные поля в ручную => нужно искать обход этого через стандартные классы XF.

Или я о чем-то забыл во время изменения БД прямыми запросами?

P.S. Релогин тоже пробовал, 0 эффекта.

UPD. Может кто помочь выдрать полный кусок кода для изменения пользовательского поля из XenAPI - XenForo PHP REST API ? Там этот механизм реализован на класса движка, но в моем выдранном коде чего-то не хватает для его работы:

Код:
XenForo_Autoloader::getInstance()->setupAutoloader(XF_ROOT . '/library');
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
$writer->setCustomFields(array('custom_fields' => array('Test' => '123')));
$writer->preSave();
$writer->save();
 
Последнее редактирование:
У вас там 2 ошибки в коде.
Надо так:
PHP:
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
$writer->setExistingData($userId); //Если не задать ай-ди, то для какого юзера сохранять поля?
$writer->setOption(XenForo_DataWriter_User::OPTION_ADMIN_EDIT, true); //это признак, что админ редактирует, чтобы игнорить запрет на редактирование
$writer->setCustomFields(array('info2' => '123123','aim' => '123132')); // собственно установка значения поля
$writer->save();

Сами поля все равно проверяются, то есть если например поле должно быть числом, а передается не число, то не сохранится.
 
Последнее редактирование:
У вас там 2 ошибки в коде.
Надо так:
PHP:
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
$writer->setExistingData($userId); //Если не задать ай-ди, то для какого юзера сохранять поля?
$writer->setOption(XenForo_DataWriter_User::OPTION_ADMIN_EDIT, true); //это признак, что админ редактирует, чтобы игнорить запрет на редактирование
$writer->setCustomFields(array('custom_fields' => array('Test' => '123'))); // собственно установка значения поля
$writer->save();

Сами поля все равно проверяются, то есть если например поле должно быть числом, а передается не число, то не сохранится.
Вот как, спасибо, сейчас првоерю

Пробую:
Код:
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
$writer->setExistingData($_SESSION['user_id']); //Если не задать ай-ди, то для какого юзера сохранять поля?
$writer->setOption(XenForo_DataWriter_User::OPTION_ADMIN_EDIT, true); //это признак, что админ редактирует, чтобы игнорить запрет на редактирование
$writer->setCustomFields(array('custom_fields' => array('sbTest' => '4'))); // собственно установка значения поля
$writer->save();



Теперь вопросов еще больше чем ответов :-) Что я сделал не так?)
 
Последнее редактирование:
Судя по всему это дамп датаврайтера.
Зачем его дампить то?
PHP:
if ($errors = $writer->getErrors())
{
var_dump($errors);
}

так можно увидеть ошибки.
Судя по всему - ошибок нет о_О
Код:
array(0) {
}

Может быть дело в том, что тип у поля установлен "Настройки"?
 
PHP:
$writer->setCustomFields(array('info2' => '123123','aim' => '123132')); // собственно установка значения поля
Вот так поля задавать надо. А у Вас вложенный массив был, я сразу и не заметил. Ключ - это id поля в админке
 
PHP:
$writer->setCustomFields(array('info2' => '123123','aim' => '123132')); // собственно установка значения поля
Вот так поля задавать надо. А у Вас вложенный массив был, я сразу и не заметил. Ключ - это id поля в админке
Теперь все работает, спасибо большой за помощь!
 
Статус
В этой теме нельзя размещать новые ответы.
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу