Esiste un modo per consentire il carattere speciale nel nome utente come "#" e "~"?
Esiste un modo per consentire il carattere speciale nel nome utente come "#" e "~"?
Risposte:
Devi sostituire il nome_validato_utente ($ name) predefinito :
Verify the syntax of the given name.
Per fare ciò, definisci il tuo codice di convalida del nome utente nel tuo modulo personalizzato
function MODULENAME_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'user_register') {
$form['#validate'] = array();
$form['#validate'][] = 'registration_username_validate';
}
}
E all'interno della funzione registration_username_validate fai la tua logica per consentire i tuoi caratteri speciali.
La cura dei problemi di sicurezza causati dall'abilitazione di caratteri speciali nel nome utente e dai problemi di visualizzazione dei nomi utente non sterilizzati può causare nei temi.
user_account_form_validate
funzione predefinita che convalida più del semplice nome utente. La sostituzione di questo potrebbe consentire nomi utente duplicati! Ho aggiunto una risposta che aggira questi problemi.
Sfortunatamente, non esiste un modo semplice per farlo. Per impostazione predefinita user_register_form
e user_profile_form
hanno user_account_form_validate
impostato come primo validatore in $form['#validate']
. user_account_form_validate()
controlla e pulisce il nome, l'e-mail e la firma di un account. Come parte del controllo del nome che effettua una chiamatauser_validate_name()
. Questa è la funzione che vogliamo ignorare, no user_account_form_validate
.
Si spera in un gancio utile per scavalcarlo, ma purtroppo. Se non mi importasse della convalida dell'e-mail e della firma e del controllo per vedere se il nome è un duplicato, potrei semplicemente rimuoverlo user_account_form_validate
da
$form['#validate']
. Ma non va bene. Invece, aggiungo un validatore aggiuntivo che annulla il lavoro user_validate_name()
e ripete tutto senza il controllo del carattere speciale.
<?php
function MODULENAME_form_user_register_form_alter(
array &$form, array &$form_state, $form_id)
{
MODULENAME_add_name_validator($form);
}
function MODULENAME_form_user_profile_form_alter(
array &$form, array &$form_state, $form_id)
{
MODULENAME_add_name_validator($form);
}
function MODULENAME_add_name_validator(array &$form)
{
$validate =& $form['#validate'];
# Since `validate_name()` clears out any errors for the "name" field, we
# want to put it right after the validator we want to partially override.
$acct_validate_index = array_search('user_account_form_validate', $validate);
array_splice($validate, ($acct_validate_index + 1), 0,
['MODULENAME_validate_name']
);
}
function MODULENAME_validate_name(array $form, array &$form_state)
{
# There is no blessed way of overriding the call to `user_validate_name()` in
# `user_account_form_validate()`.
$errors =& drupal_static('form_set_error', []);
# Yes, this gets the errors. `form_get_error()` uses this method so... yeah.
if (!isset($errors['name']))
# `user_validate_name()` is a superset of what is checked here. If the name
# passed that validation, no need to rerun things.
return;
# `form_set_error()` also calls `drupal_set_message()` if it finds an
# error.
$msg_index = array_search($errors['name'], $_SESSION['messages']['error']);
if ($msg_index !== false) {
unset($_SESSION['messages']['error'][$msg_index]);
if (empty($_SESSION['messages']['error']))
unset($_SESSION['messages']['error']);
}
unset($errors['name']);
$name = isset($form_state['values']['name'])
? $form_state['values']['name'] : null;
# These checks are taken from `user_validate_name()`, simply excluding the
# for characters we don't mind being in the names.
if (!$name)
$error = t('You must enter a username.');
else if (substr($name, 0, 1) == ' ')
$error = t('The username cannot begin with a space.');
else if (substr($name, -1) == ' ')
$error = t('The username cannot end with a space.');
else if (strpos($name, ' ') !== FALSE)
$error = t('The username cannot contain multiple spaces in a row.');
else if (preg_match('/[\x{80}-\x{A0}' . // Non-printable ISO-8859-1 + NBSP
'\x{AD}' . // Soft-hyphen
'\x{2000}-\x{200F}' . // Various space characters
'\x{2028}-\x{202F}' . // Bidirectional text overrides
'\x{205F}-\x{206F}' . // Various text hinting characters
'\x{FEFF}' . // Byte order mark
'\x{FF01}-\x{FF60}' . // Full-width latin
'\x{FFF9}-\x{FFFD}' . // Replacement characters
'\x{0}-\x{1F}]/u', // NULL byte and control characters
$name))
$error = t('The username contains an illegal character.');
else if (drupal_strlen($name) > USERNAME_MAX_LENGTH)
$error = t('The username %name is too long: it must be %max characters '
.'or less.'
,['%name' => $name, '%max' => USERNAME_MAX_LENGTH]);
if (isset($error))
form_set_error('name', $error);
}
Esiste ancora un controllo del carattere speciale, tuttavia controlla solo i caratteri invisibili o di uso speciale.
$form['#validate'] = array();
bloccherà qualsiasi gestore di convalida esistente, inclusi potenzialmente quelli impostati da altri moduli contrib / personalizzati. Meglio disinserire selettivamente la funzione di validazione forzata.