Để cho phép cả tên người dùng và email: trước tiên hãy thêm trình xác nhận
function YOURMODULE_form_user_login_alter(&$form, &$form_state, $form_id) {
$form['#validate'][1] = 'YOURMODULE_form_user_login_replace_email_validate';
$form['#validate'][2] = 'user_login_authenticate_validate';
$form['#validate'][3] = 'user_login_final_validate';
}
sau đó kiểm tra xem có giống địa chỉ email không (chứa @, chữ cái trước và sau @ và ít nhất 1 '.' sau @). Nếu có, thay thế email bằng tên người dùng:
function YOURMODULE_form_user_login_replace_email_validate(&$form, &$form_state) {
$name = $form_state['values']['name'];
if (strpos($name, '@')) {
$mailParts = explode('@', $name);
if ((int)count($mailParts) === 2) {
$extParts = explode('.', $mailParts[1]);
if (count($extParts) > 1) {
$query = db_select('users', 'u');
$query->distinct();
$query->fields('u', ['uid']);
$query->fields('u', ['name']);
$query->fields('u', ['mail']);
$query->condition('u.mail', $name, '=');
$result = $query->execute()->fetchAllAssoc('name');
if (!empty($result)) {
$name = array_keys($result)[0];
$form_state['values']['name'] = $name;
}
}
}
}
}
Tôi đã có một tình huống cụ thể khi tôi phải thêm xác thực dựa trên email vào trang web đang hoạt động với rất nhiều người dùng để xác thực "cũ" hoạt động và tôi đã làm theo cách đó.