Разрешить пользователям регистрироваться с использованием имени пользователя в 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
Author: funkyD, 2016-05-18

1 answers

Я удалил значение по умолчанию

Вроде как, но не совсем - то, что вы на самом деле сделали, это установили статическое значение NULL для этого поля, которое будет перенесено в отправку независимо от любого пользовательского ввода.

Лучшим способом избежать подобных проблем было бы снова реализовать поле с нуля:

$form['account']['name'] = array(
  '#type' => 'textfield',
  '#title' => t('Username'),
  // ...
);

Обратите внимание, что это не приведет к удалению дополнительной проверки, которую может добавить Commons, поэтому YMMV и могут потребоваться некоторые дополнительные шаги для выполнения ваша особенность.

Просто для справки в будущем, чтобы установить начальное значение для элемента, который не блокирует пользовательский ввод, используйте #default_value вместо #value.

 4
Author: Clive, 2016-05-18 10:34:14