Programlı olarak kullanıcı durumunu “etkin” olarak ayarlama


8

Programlı olarak tüm kullanıcıları etkin olarak ayarlamak mümkün müdür?

Bu sorun, kullanıcılarını Views kullanarak görüntülemeye çalıştığımdan, ancak taşınan kullanıcılarım "engellendiğinden", Views'a gösteremediğim için ortaya çıkıyor.

Birisi, kullanıcı durumunu etkin olarak nasıl ayarlayacağınıza ilişkin bir kod snippet'i veya bir eğitim sağlayabilir mi?

Bu başlangıçta yürütmem gereken kod.

define('DRUPAL_ROOT', getcwd()); 
$_SERVER['REMOTE_ADDR'] = "localhost"; 
require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

// Set the active DB 
db_set_active('sage'); 

Yanıtlar:


7

Aşağıdaki kodu kullanırdım.

$query = new EntityFieldQuery();

$result = $query->entityCondition('entity_type', 'user')
  ->propertyCondition('status', 0)
  // Avoid loading the anonymous user.
  ->propertyCondition('uid', 0, '<>')
  // Comment out the next line if you need to enable also the super user.
  ->propertyCondition('uid', 1, '<>')
  ->execute();

if (isset($result['user'])) {
  // Disable the email sent when the user account is enabled.
  // Use this code if you don't use the code marked with (1).
  // $old_value = variable_get('user_mail_status_activated_notify', TRUE);
  // variable_set('user_mail_status_activated_notify', FALSE);

  $uids = array_keys($result['user']);
  $users = entity_load('user', $uids);

  foreach ($users as $uid => $user) {
    $user->status = 1;
    $original = clone $user;      // (1)
    $user->original = $original;  // (1)
    user_save($user);
  }
  // Restore the value of the Drupal variable.
  // Use this code if you don't use the code marked with (1).
  // variable_set('user_mail_status_activated_notify', $old_value);
}
  • Kod yalnızca etkinleştirilmemiş hesapları yükler. Zaten etkin olan hesapları yüklemek işe yaramaz.
  • Kod anonim kullanıcı hesabını yüklemekten kaçınır, bu gerçek bir hesap değildir.
  • Clive, user_save () kullanmanın Drupal'ın etkin kullanıcılara bir e-posta gönderebileceğini söylediğinde haklı . İşlevden kullanılan kod aşağıdaki gibidir.

    // Send emails after we have the new user object.
    if ($account->status != $account->original->status) {
      // The user's status is changing; conditionally send notification email.
      $op = $account->status == 1 ? 'status_activated' : 'status_blocked';
      _user_mail_notify($op, $account);
    }

    Kodumla koşul $account->status != $account->original->statusdoğrulanmadı ve e-posta gönderilmedi. Alternatif olarak, kodda gösterildiği gibi, FALSEaramadan önce "user_mail_status_activated_notify" Drupal değişkeninin değerini olarak ayarlayabilirsiniz user_save(). Bu Drupal değişkeninin değerini değiştirmek genel bir etkiye sahip olur ve diğer kod değerini değiştirdiğinde çalışmaz TRUE. Nesnenin $user->originalbir kopyasını ayarlamak , kodumla birlikte kaydedilen kullanıcı nesneleri için $userçağrının user_save()kullanıcılara etkili bir şekilde e-posta göndermediğinden emin olmanın tek yoludur .


@kiamlaluno, kodunuzu kullandım, ama aynı zamanda hata alıyorum. Yazımı güncelledim, neyin yanlış olabileceği hakkında bir fikriniz var mı?
chlong

@chlong Eğer sageveritabanınız Drupal olmayan bir doğru hatırlıyorsam , değil mi? Eğer öyleyse, db_set_active()kodu çalıştırmadan önce çağrıyı kaldırın
Clive

@chlong Kodumu kullanırken herhangi bir istisna alamıyorum. Kullandığınız veritabanının (ile bir set db_set_active()) Drupal'dan yüklenen tabloları içerdiğinden emin olun .
kiamlaluno

@kiamlaluno, benim 'adaçayı' veritabanım bir drupal veritabanı, tüm drupal tabloları içerir. Ancak 'db_set_active ()' - EDIT: 'db_set_active ()' olmadan çalışmayı denerim, kod iyi çalışır, ancak 'sage' veritabanımdaki kullanıcılar değiştirilmez. - EDIT2: Kodunuz gerçekten işe yarıyor, ancak yalnızca varsayılan sitemdeki kullanıcıların durumlarını değiştirdi, istediğim gibi değil :(
chlong

@chlong "adaçayı" bir Drupal sitesiyle ilişkilendirilmiş bir Drupal veritabanı ise, kodu o siteden çalıştırmayı deneyin; Aynı hatayı alırsanız, veritabanı gerekli tüm tabloları etkili bir şekilde içermez. Bildiğim kadarıyla, kullanmak db_set_active()herhangi bir sorgunun başarısız olmasına neden olmaz.
kiamlaluno

7

Kullanıcıların bir özelliğini user_load_multiple()ve user_save()özelliklerini güncellemek için kullanabilirsiniz status:

$uids = db_query('SELECT uid FROM {users}')->fetchCol();
foreach (user_load_multiple($uids) as $account) {
  $account->status = 1;
  user_save($account);
}

Kullanıcıları hesap durumları hakkında bilgilendirmek için ayarladığınız posta bildirimlerinin bu yöntem kullanılarak çağrılacağını unutmayın.

Bunun olmasını istemiyorsanız, doğrudan {users}tabloya girmeniz ve durumu manuel olarak ayarlamanız gerektiğini düşünüyorum (önerilmez):

db_update('users')
  ->fields(array('status' => 1))
  ->execute();

2

Bu şekilde, tüm kullanıcıların durumunu etkin olarak ayarlayabilirsiniz.

$users = entity_load('user');
foreach ($users as $user) {
  if ($user->uid != 0) {
    $user->status = 1;
    entity_save('user', $user);
  }
}

entity_save()dan uygulanan Varlık API modülü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.