Разрешить пользователям регистрироваться с использованием имени пользователя в drupal commons ошибка нарушения ограничения целостности
Я использую drupal commons и хочу разрешить пользователю выбирать свое имя пользователя при регистрации.
В настоящее время drupal commons не позволяет пользователю выбирать свое собственное имя пользователя, но генерирует его автоматически.
Что я сделал до сих пор с помощью hook_user_register_form_alter:
Я изменил #тип имени (имя пользователя компьютера) со скрытого на текстовое поле. Это отобразит поле.
$form['account']['name']['#type'] = 'textfield';
Я удалил значение по умолчанию
$form['account']['name']['#value'] = NULL;
Теперь, когда Я пытаюсь добавить нового пользователя, я получаю следующее сообщение об ошибке:
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'name': INSERT INTO {users} (uid, name, pass, mail, signature, signature_format, created, status, timezone, language, picture, init, data, uuid) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9, :db_insert_placeholder_10, :db_insert_placeholder_11, :db_insert_placeholder_12, :db_insert_placeholder_13); Array ( [:db_insert_placeholder_0] => 824 [:db_insert_placeholder_1] => [:db_insert_placeholder_2] => $S$DgHF.OcL6K0hxQ0A4v.O67r4FUp4kpfeuywOrGHvb4zmoEzjpQrW [:db_insert_placeholder_3] => [email protected] [:db_insert_placeholder_4] => [:db_insert_placeholder_5] => filtered_html [:db_insert_placeholder_6] => 1463562222 [:db_insert_placeholder_7] => 1 [:db_insert_placeholder_8] => Europe/Brussels [:db_insert_placeholder_9] => en [:db_insert_placeholder_10] => 0 [:db_insert_placeholder_11] => [email protected] [:db_insert_placeholder_12] => a:2:{s:7:"contact";i:0;s:20:"l10n_client_disabled";b:0;} [:db_insert_placeholder_13] => 267c9864-8fe0-4cc5-81ef-22bd53befcf8 ) in drupal_write_record() (line 7333 of /home/me/websites/customprojects/mysite.local/docroot/includes/common.inc). Backtrace: PDOStatement->execute(Array) database.inc:2171 DatabaseStatementBase->execute(Array, Array) database.inc:683 DatabaseConnection->query('INSERT INTO {users} (uid, name, pass, mail, signature, signature_format, created, status, timezone, language, picture, init, data, uuid) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6, :db_insert_placeholder_7, :db_insert_placeholder_8, :db_insert_placeholder_9, :db_insert_placeholder_10, :db_insert_placeholder_11, :db_insert_placeholder_12, :db_insert_placeholder_13)', Array, Array) query.inc:36 InsertQuery_mysql->execute() common.inc:7333 drupal_write_record('users', Object) user.module:582 user_save(Object, Array) user.module:3912 user_register_submit(Array, Array) form.inc:1519 form_execute_handlers('submit', Array, Array) form.inc:903 drupal_process_form('user_register_form', Array, Array) form.inc:385 drupal_build_form('user_register_form', Array) form.inc:130 drupal_get_form('user_register_form') call_user_func_array('drupal_get_form', Array) menu.inc:527 menu_execute_active_handler() index.php:21
Я понимаю, что это дублирующая проблема в поле имени пользователя, но проверка в базе данных, что имя пользователя не совпадает с тем, которое я выбрал. Так что не поймите ошибку.
Кроме того, мне интересно, может ли факт наличия имени пользователя иметь побочный эффект?
1 answers
Я удалил значение по умолчанию
Вроде как, но не совсем - то, что вы на самом деле сделали, это установили статическое значение NULL для этого поля, которое будет перенесено в отправку независимо от любого пользовательского ввода.
Лучшим способом избежать подобных проблем было бы снова реализовать поле с нуля:
$form['account']['name'] = array(
'#type' => 'textfield',
'#title' => t('Username'),
// ...
);
Обратите внимание, что это не приведет к удалению дополнительной проверки, которую может добавить Commons, поэтому YMMV и могут потребоваться некоторые дополнительные шаги для выполнения ваша особенность.
Просто для справки в будущем, чтобы установить начальное значение для элемента, который не блокирует пользовательский ввод, используйте #default_value
вместо #value
.