ฉันสงสัยว่าจะรับผู้ใช้ทั้งหมดอย่างไรและใส่ UID ของพวกเขาทั้งหมดเข้าแถวลำดับ? ฉันได้เห็นคำถามที่คล้ายกัน แต่ไม่มีใครตอบคำถามของฉัน
ฉันสงสัยว่าจะรับผู้ใช้ทั้งหมดอย่างไรและใส่ UID ของพวกเขาทั้งหมดเข้าแถวลำดับ? ฉันได้เห็นคำถามที่คล้ายกัน แต่ไม่มีใครตอบคำถามของฉัน
คำตอบ:
ใน Drupal 7 คุณสามารถดึงข้อมูลผู้ใช้ทั้งหมดโดยใช้ entity_load ดังนี้
$users = entity_load('user');
และ array_keys (ผู้ใช้ $) จะให้อาร์เรย์ของ uid แก่คุณ
คุณสามารถบรรลุผลใน Drupal 8 โดย:
$query = \Drupal::entityQuery('user');
$uids = $query->execute();
เพียงแชร์ตัวอย่างที่ฉันสร้างขึ้นเมื่อเร็ว ๆ นี้เพื่อรับ HTML และ EMAIL ของผู้ใช้ที่มีอยู่ทั้งหมดในฐานข้อมูล
ทำงานได้ดีกับผู้ใช้มากกว่า 2,000 ราย หลังจากนั้นฉันขอแนะนำให้นำแบตช์หรือแบบสอบถามฐานข้อมูลโดยตรงอื่นมาใช้
สิ่งนี้ขึ้นอยู่กับการโหลด Drupal ผู้ใช้แต่ละคน
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user');
$html = '<table>';
$result = $query->execute();
$uids = array_keys($result['user']);
// THIS IS YOUR ARRAY OF UIDS.
$users = user_load_multiple($uids);
// EXTRA CODE.
foreach($users as $user){
$mail = $user->mail;
$name = $user->name;
$html .= '<tr><td>'.$mail.'</td>'.'<td>'.$name.'</td></tr>';
}
$html .= '</table'>;
จะส่งคืนตาราง html ที่เรียบง่ายซึ่งคุณสามารถคัดลอกไปยัง excels ได้อย่างง่ายดาย ฯลฯ
ในการรับมาในอาร์เรย์ให้ใช้ตัวแปรที่ระบุไว้ในรหัสสำหรับ UIDS
หากต้องการตอบความคิดเห็นบางส่วน: หากคุณทำงานกับผู้ใช้จำนวนมากคุณจะไม่สามารถโหลดผู้ใช้ทั้งหมดในอาเรย์โดยไม่ต้องหมดเวลาดังนั้นคุณอาจต้องดำเนินการแบตช์ ...
นี่คือวิธี (ใช่มันคือ:
function _set_batch_revench_agains_users(){
$batch = [
'operations' => [
['_revench_against_users_batch_process']
],
'finished' => '_revench_against_users_batch_finished',
'title' => t('Punishing users for ungratefulness and general insolence.'),
'init_message' => t('Batch is starting, he he he...'),
'progress_message' => t('Processed @current out of @total.'),
'error_message' => t('Batch has encountered an error, nooooo!'),
'file' => drupal_get_path('module', 'revench_agains_users') . '/user_agains_users.module'
];
batch_set($batch);
batch_process('admin');
}
/**
* Batch 'Processing' callback
*/
function _revench_against_users_batch_process(&$context){
//all this $context stuff is mandatory, it is a bit heavy, but the batchAPI need it to keep track of progresses
if (!isset($context['sandbox']['current'])) {
$context['sandbox']['count'] = 0;
$context['sandbox']['current'] = 0;
}
//don't use entity field query for such simple use cases as gettings all ids (much better performances, less code to write...)
$query = db_select('users', 'u');
$query->addField('u', 'uid');
$query->condition('u.uid', $context['sandbox']['current'], '>');
$query->orderBy('u.uid');
// Get the total amount of items to process.
if (!isset($context['sandbox']['total'])) {
$context['sandbox']['total'] = $query->countQuery()->execute()->fetchField();
// If there are no users to "update", stop immediately.
if (!$context['sandbox']['total']) {
$context['finished'] = 1;
return;
}
}
$query->range(0, 25);
$uids = $query->execute()->fetchCol();
//finaly ! here is your user array, limited to a manageable chunk of 25 users
$users_array = user_load_multiple($uids);
//send it to some function to "process"...
_burn_users_burnburnburn($users_array); // I won't reveal the content of this function for legal reasons
//more mandatory context stuff
$context['sandbox']['count'] += count($uids);
$context['sandbox']['current'] = max($uids);
$context['message'] = t('burned @uid ... feels better ...', array('@uid' => end($uids)));
if ($context['sandbox']['count'] != $context['sandbox']['total']) {
$context['finished'] = $context['sandbox']['count'] / $context['sandbox']['total'];
}
}
/**
* Batch 'finished' callback
*/
function _revench_against_users_batch_finished($success, $results, $operations) {
if ($success) {
// Here we do something meaningful with the results.
$message = t('@count users successfully burned:', array('@count' => count($results)));
drupal_set_message($message);
}
else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
$error_operation = reset($operations);
$message = t('An error occurred while processing %error_operation with arguments: @arguments some users might have escaped !', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
drupal_set_message($message, 'error');
}
}