2011-11-10 17 views
18

Dopo aver appena registrato un nuovo account e creato un profilo, come faccio a registrare un utente?drupal 7 registra automaticamente l'utente in

ho provato:

global $user; 
$user = user_load($account->uid); 

o

global $user; 
$user = user_load(array('mail' => $_POST['email'], 'pass' => trim($_POST['password']))); 

ma né lavoro e la seconda genera un errore circa array_flip.

risposta

28

Ho intenzione di rispondere a questo per riferimento futuro, perché la terza risposta sopra è sbagliata, e la prima risposta funzionerà ma non è necessaria (replica l'esperienza dell'utente che invia il modulo di login, chiama tutti i validatori ecc, e presumibilmente si è già fatto che convalida o non sarebbe il tentativo di registrare l'utente direttamente.

questo funzionerà come previsto, a patto di avere $username e $password dal proprio modulo o la funzione, e si sa che l'utente non è collegato:

if ($uid = user_authenticate($username, $password)) { 
    global $user; 
    $user = user_load($uid); 

    $login_array = array ('name' => $username); 
    user_login_finalize($login_array); 
} 

Prima si convalida e il nome utente e la password che hai. Se si ottiene un UID diverso da zero, l'autenticazione è riuscita. Si crea una matrice che fornisce l'unica informazione necessaria che era nel modulo di login originale e la si passa a user_login_finalize(), che fa tutto il resto (non solo rigenerando la sessione, ma anche registrando correttamente il login e chiamando i ganci di accesso).

+0

Grazie mille per la risposta. Ho provato a inviare una modifica ma erano troppo pochi caratteri - ho dovuto passare in '$ login_array' per riferimento per far funzionare tutto (quindi' user_login_finalize (& $ login_array); '). Grazie ancora! – doubleswirve

+0

Ehi, @Ken, ho messo questo codice in funzione e ho provato a chiamarlo usando hook_menu(), hook_boot(), in page.tpl ma non funziona per me. O sono io che mostro una pagina vuota senza messaggio o ho accesso alla pagina (creato tramite hook_menu()) ma poi per le altre pagine mi disconnetto automaticamente. Potete per favore aiutarmi? –

+0

@DineshSubhashPatil - una pagina vuota senza messaggi (il leggendario WSOD) significa quasi certamente che c'è un errore del server. Controlla i log del tuo server web per vedere cosa sta andando storto. Inoltre è possibile aggiungere un controllo degli errori; in particolare, prima di chiamare 'user_login_finalize' assicurati che' $ user' sia un oggetto valido. Il secondo problema è meno comprensibile, ma potrebbe essere dovuto a un problema con la sessione PHP? Sospetto che se rintracci l'errore WSOD, risolvi il problema. – Ken

15

Drupal lo fa usando user_login_finalize da user_login_submit, è possibile richiamare la stessa cosa da soli con questo codice:

$form_state['uid'] = $account->uid; 
user_login_submit(array(), $form_state); 
+0

Questa è una buona soluzione, ma mi sono imbattuto in un problema con reindirizzamenti. Nell'ispezionare questa funzione, ho scoperto che stava impostando la proprietà di reindirizzamento del modulo. Quindi, invece di chiamare user_login_submit, ho usato il codice dalla funzione: 'global $ user; $ user = user_load ($ form_state ['uid']); $ form_state ['redirect'] = 'benvenuto'; user_login_finalize ($ form_state); ' – RevNoah

9

È possibile accedere a livello di codice in D7 utilizzando il seguente codice.

global $user; 
$user = user_load($uid); 
drupal_session_regenerate(); 

Che dovrebbe accedere l'utente con l'id utente specificato.

+0

Soluzione chiara e pulita. –

2

utilizzare il seguente codice per creare un account utente a livello di codice in Drupal 8.

$language = \Drupal::languageManager()->getCurrentLanguage()->getId(); 

$user = \Drupal\user\Entity\User::create(); 


//Mandatory settings 

$user->setPassword('password'); 

$user->enforceIsNew(); 

$user->setEmail('email'); 

$user->setUsername('user_name');//This username must be unique and accept only a-Z,0-9, - _ @ . 

//Optional settings 
$user->set("init", 'email'); 

$user->set("langcode", $language); 

$user->set("preferred_langcode", $language); 

$user->set("preferred_admin_langcode", $language); 

//$user->set("setting_name", 'setting_value'); 

$user->activate(); 

//Save user 

$res = $user->save(); 
1
/** 
* Drupal 7 Programmatically user Login 
*/ 

    function hook_menu(){ 
     $itmes['user/form'] = array(
     'title' => t('Example Form'), 
     'description' => 'Drupal Example Form', 
     'page callback' => 'drupal_get_form', 
     'page arguments' => array('example_form'), 
     'access callback' => TRUE, 
     'type' => MENU_LOCAL_TASK, 
    ); 
     return $itmes; 
    } 

    function otp_login_form($form, &$form_state){ 
    $form['name'] = array(
    '#type' => 'textfield', 
    '#title' => t('Username'), 
    '#description' => t('Enter your @site_name username.', 
      array('@site_name'=> variable_get('site_name'))), 
    '#required' => TRUE, 
    '#size' => 60, 
    '#maxlength' => 60, 
    '#weight' => 2, 
    ); 
    $form['password'] = array(
    '#type' => 'password', 
    '#title' => t('Password'), 
    '#description' => t('Enter the password that accompanies your username.'), 
    '#required' => TRUE, 
    '#size' => 60, 
    '#maxlength' => 60, 
    '#weight' => 3, 
    ); 
    $form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Login'), 
    '#weight' => 4, 
    ); 

    return $form; 
    } 

    function otp_login_form_submit($form, &$form_state){ 
    if(user_authenticate($form_state['values']['name'], $form_state['values']['password'])) { 
    $user_obj = user_load_by_name($form_state['values']['name']); 
    $form_state['uid'] = $user_obj->uid;  
    user_login_submit($form,$form_state); 
    return true; 
    } 
    else { 
    form_set_error('name', t('Sorry, unrecognized username or password.')); 
    watchdog('user', 'Login attempt by unregistered user %user.', array('%user' => $form_state['values']['name'])); 

    } 
} 
+1

Vorresti aumentare la tua risposta al solo codice con qualche spiegazione? Ciò ridurrebbe l'idea sbagliata secondo cui StackOverflow è un servizio di scrittura di codice gratuito. – Yunnosch

+0

Sì, per favore spiega, cosa hai fatto in una breve frase. Grazie mille! – creyD