2011-11-10 12 views
18

Yeni bir hesap açtıktan ve bir profil oluşturduktan sonra bir kullanıcıyı nasıl oturum açabilirim?drupal 7 programa kullanıcı olarak oturum aç

denedim:

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

veya

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

ama hiçbiri iş ve array_flip hakkında hatayla ikinci sonuçlanır.

cevap

28

Gelecekte bu referans için cevaplayacağım çünkü yukarıdaki üçüncü cevap yanlıştır ve ilk cevap işe yaramaz ancak gereksizdir (oturum açma formunu gönderen, tüm doğrulayıcıları vb. ve muhtemelen bunu zaten doğrulama yapmış veya doğrudan kullanıcıya giriş yapmaya çalışıyorsanız olmaz. beklendiği gibi

Bu, kendi form veya işlevinden $username ve $password sahip varsayarak çalışır ve kullanıcıları tanıdığınızdan Giriş Yapılmadı:

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

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

İlk önce validat e sahip olduğunuz kullanıcı adı ve şifre. Sıfır olmayan bir UID'yi geri alırsanız, kimlik doğrulaması başarılı oldu. Özgün oturum açma formunda olan gerekli bilgileri içeren bir dizi oluşturup, geri kalanını (yalnızca oturumu yenilemekle kalmaz, aynı zamanda oturumu düzgün şekilde kaydeder ve oturum açma kancalarını çağıran) user_login_finalize()'a iletirsiniz.).

+0

Cevabınız için çok teşekkürler. Bir düzenleme göndermeyi denedim ancak çok az sayıda karakter vardı - bunu işe almak için "$ login_array" öğesinden geçmek zorunda kaldım (yani "user_login_finalize (& $ login_array);"). Tekrar teşekkürler! – doubleswirve

+0

Hey, @Ken, Bu kodu fonksiyona koydum ve hook_menu(), hook_boot(), page.tpl kullanarak aramayı denedim ama benim için çalışmıyor. Ya bana mesajsız boş bir sayfa gösteriyorum ya da sayfaya giriş yaptım (hook_menu() ile oluşturuldu) ancak diğer sayfalar için otomatik olarak çıkışım var. Lütfen bana yardım edebilir misin? –

+0

@DineshSubhashPatil - mesajsız boş bir sayfa (efsanevi WSOD) neredeyse bir sunucu hatası olduğu anlamına gelir. Neyin yanlış gittiğini görmek için web sunucusu günlüklerinizi kontrol edin. Ayrıca bazı hata kontrolleri ekleyebilirsiniz; Özellikle, 'user_login_finalize' çağrılmadan önce, '$ user' öğesinin geçerli bir nesne olduğundan emin olun. İkinci sorun daha az anlaşılabilir, ancak PHP oturumundaki bir problemden kaynaklanabilir mi? WSOD hatasını izlerseniz, sorunu çözeceğinizi sanıyorum. – Ken

15

Drupal o user_login_submit den user_login_finalize kullanarak yapar, bu kod ile aynı şeyi kendiniz çağırabilir:

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

Bu iyi bir çözümdür ama yönlendirme içeren bir sorunla karşılaştık Drupal 8'de programlı bir kullanıcı hesabı oluşturmak için şu kodu kullanın. Bu işlevi incelerken, formun yönlendirme özelliğini ayarlıyordum. Bu yüzden, user_login_submit öğesini çağırmak yerine, kodu şu işlevden kullandım: 'global $ user; $ user = user_load ($ form_state ['uid']); $ form_state ['yönlendirme'] = 'hoş geldiniz'; user_login_finalize ($ form_state); – RevNoah

9

Aşağıdaki kodu kullanarak D7 programlı giriş yapabilirsiniz.

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

Bu, belirtilen kullanıcı kimliğiyle kullanıcıyla oturum açmalıdır.

+0

Güzel, temiz bir çözüm. –

2

$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

Sadece kod yanıtınızı bazı açıklamalarla güçlendirmek ister misiniz? Bu, StackOverflow'un ücretsiz bir kod yazma hizmeti olduğu konusundaki yanlış düşünceyi azaltacaktır. – Yunnosch

+0

Evet, lütfen kısa bir cümlede neler yaptığınızı açıklayın. Çok teşekkür ederim! – creyD