2009-07-25 12 views

cevap

5

(belirli kriterlere uyan varlıkları yukarı çekerek) genellikle görevin bu tür hiçbir Drupal API işlevleri vardır değildir. API'daki tek varlıklı CRUD işlevlerine odaklanma eğilimi gösterir; her şey bir geliştiricinin kendi SQL yeteneklerine kalmış.

Görünümler modülü, rol, izin vb. Tarafından filtrelenmiş kullanıcı listeleri oluşturmanıza olanak sağlar - ancak kolayca aşırıya kaçabilir.

+0

Kendi yanıtımı yapardım ama bunun üzerinde genişlemem gerektiğini hissediyorum. Kullanıcıları listelemenize ve Drupal (en azından çekirdek) içindeki role göre filtreleme yapmanıza olanak tanıyan bir işlev yoktur. Kendi fonksiyonunuzu yazabilir veya söylenen eaton gibi, kullanıcı listesini oluşturmak için görünümleri kullanabilirsiniz. – codeincarnate

+0

Burada bir görünüm kolaydır. –

+0

size __really__ görünümlerini kullanmalısınız. aradığınız çözüm budur. – alexanderpas

0

Kullanıcıları rol ile toplamaya yardımcı olabilecek herhangi bir API hakkında bilmiyorum. Burada bir şey elde edebileceğiniz bağlantı var: http://drupal.org/node/82002. SO, müthiş bir hizmet olmasına rağmen Drupal ile ilgili sorular için irc.freenode.org adresinde drupal.org veya #drupal kanalı kullanmanızı öneririz.

Ps .: bazen SQL kötülüğün :)

+0

Katılıyorum. Önceden tanımlanmış işlevleri kullanmak yerine veritabanını doğrudan sorgulayan bir sürü WordPress eklentisi görüyorum. –

+4

Sadece bu StackOverflow eklemek eklemek yorum Drupal sorular için harika ve daha fazla insan burada onlara sormalısınız. – alxp

+0

sql sorgularından kaçınılmalıdır, çünkü drupal7, SQL'i soyutlamak için yeni db api kullanacaktır (böylece mongodb gibi şeyler kullanabilirsiniz :) –

1

Kolay bir seçenek, SQL'i oluşturmak için Görünümler'i kullanmaktır (sizin için önizleme düğmesine bastığınızda görünümü altında görünür) ve daha sonra erişmek için gereken sonuçları almak için Drupal SQL abstraction layer'u kullanın. bir veri görüntülemek yerine ham veriler.

Biraz bu benzeyecektin:

$result = db_query('SELECT users.uid AS uid, 
    users.mail AS users_mail, 
    users.name AS users_name 
FROM users users'); 
while ($existing_user = db_fetch_object($result)) { 
    print_r($existing_user); // or do whatever 
    } 

Sadece tam sorgu almak için görünümüne daha fazla alan ekleyin. benim için çalıştı

+1

Görünümler SQL gereksiz yere karmaşık, deneyin 'SELECT uid, posta, adı FROM {users}' – Adaddinsane

2

SQL:

 
$users = ""; 
$result = db_query('SELECT users.name AS users_name FROM users users 
     INNER JOIN users_roles users_roles ON users.uid = users_roles.uid 
     WHERE users_roles.rid = 4'); 

while ($existing_user = db_fetch_object($result)) { 
     if ($users != "") $users .= ", "; 
     $users .= $existing_user->users_name; // or do whatever 
} 
echo $users; 

unutmayın bu Drupal 6 için ve ben büyük kullanıcı üsleri için bu performansı hakkında emin değilim. Drupal 7 hakkında emin değilim.

+1

Performans iyi olurdu. Örneğiniz D7 kodunda: 'var_dump (db_query ('SELECT adı FROM {users} u INNER JOIN {users_roles} r AÇIK u.uid = r.uid WHERE r.rid = 4') -> fetchCol()); ' – pfrenssen

9

Kullanıcı dizisini almak için entity_load özelliğini kullanabilirsiniz. İşte yönetici kullanıcıların tüm e-postaların listesi oluşturur örnektir Drupal 7

<?php 
$users = entity_load('user'); 
$emails = ''; 
foreach($users as $user) { 
    if (array_key_exists(3, $user->roles)) { 
    if (strlen($emails) > 0) { 
     $emails .= ' ' . $user->mail; 
    } else { 
     $emails = $user->mail; 
    } 
    } 
} 
?> 
+2

Eaton tarafından kabul edilen cevap genellikle Drupal,' entity_load ('user') hakkında durum böyle görünmekle birlikte, aslında tüm site kullanıcılarını, uid tarafından indekslenen bir dizide, nesne olarak yükler. –

+0

Bu, ancak son derece verimsiz ve binlerce kullanıcıya sahip sitelerde korkunç bir fikir olur. – chadpeppers

0

(bildirim göndermek için kullanılır), EntityFieldQuery doğru yoldur kullanın.

+1

bunu nasıl yapacağınıza dair bir örnek verebilir misiniz? – akalata

0

Drupal 8'de aşağıdaki eserlerini kullanıcı varlıkların listesini döndürür

\Drupal::service('entity_type.manager') 
    ->getStorage('user') 
    ->loadByProperties(['roles' => 'administrator']); 

(bu örnekte, administrator role sahip tüm kullanıcılara yük).

yerine bir varlık alanı sorgusu uid s listesini almak için:

Drupal 8'de
$query = \Drupal::service('entity_type.manager')->getStorage('user')->getQuery(); 
$query->condition('roles', 'administrator'); 
$query->execute(); 
0

:

$users = \Drupal\user\Entity\User::loadMultiple(); 

Ve mesela almak istiyorsanız sadece yöneticiler:

$admins = []; 
foreach ($users as $user) { 
    if ($user->hasRole('administrator')) { 
    $admins[] = $user; 
    } 
} 
İlgili konular