From 12142298ec0092a716a0fecf738f73a55c845d59 Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Wed, 23 Mar 2016 00:25:40 +1100 Subject: [PATCH] MDL-34925 user: Convert bulk user download to dataformat --- admin/user/user_bulk_download.php | 185 +++++++++--------------------- lang/en/admin.php | 1 + 2 files changed, 56 insertions(+), 130 deletions(-) diff --git a/admin/user/user_bulk_download.php b/admin/user/user_bulk_download.php index 5d6ea51d194..08f5b32c180 100644 --- a/admin/user/user_bulk_download.php +++ b/admin/user/user_bulk_download.php @@ -1,24 +1,44 @@ . +/** + * Bulk export user into any dataformat + * + * @license http://www.gnu.org/copyleft/gpl.html GNU Public License + * @copyright 2007 Petr Skoda + * @package core + */ + +define('NO_OUTPUT_BUFFERING', true); require_once('../../config.php'); require_once($CFG->libdir.'/adminlib.php'); +require_once($CFG->libdir.'/dataformatlib.php'); +require_once($CFG->dirroot.'/user/profile/lib.php'); -$format = optional_param('format', '', PARAM_ALPHA); +$dataformat = optional_param('dataformat', '', PARAM_ALPHA); require_login(); admin_externalpage_setup('userbulk'); require_capability('moodle/user:update', context_system::instance()); -$return = $CFG->wwwroot.'/'.$CFG->admin.'/user/user_bulk.php'; - if (empty($SESSION->bulk_users)) { - redirect($return); + redirect(new moodle_url('/admin/user/user_bulk.php')); } -if ($format) { +if ($dataformat) { $fields = array('id' => 'id', 'username' => 'username', 'email' => 'email', @@ -39,142 +59,47 @@ if ($format) { 'country' => 'country'); if ($extrafields = $DB->get_records('user_info_field')) { - foreach ($extrafields as $n=>$v){ - $fields['profile_field_'.$v->shortname] = 'profile_field_'.$v->shortname; + foreach ($extrafields as $n => $field) { + $fields['profile_field_'.$field->shortname] = 'profile_field_'.$field->shortname; + require_once($CFG->dirroot.'/user/profile/field/'.$field->datatype.'/field.class.php'); } } - switch ($format) { - case 'csv' : user_download_csv($fields); - case 'ods' : user_download_ods($fields); - case 'xls' : user_download_xls($fields); - - } - die; -} - -echo $OUTPUT->header(); -echo $OUTPUT->heading(get_string('download', 'admin')); - -echo $OUTPUT->box_start(); -echo ''; -echo $OUTPUT->box_end(); - -echo $OUTPUT->continue_button($return); - -echo $OUTPUT->footer(); - -function user_download_ods($fields) { - global $CFG, $SESSION, $DB; - - require_once("$CFG->libdir/odslib.class.php"); - require_once($CFG->dirroot.'/user/profile/lib.php'); - - $filename = clean_filename(get_string('users').'.ods'); - - $workbook = new MoodleODSWorkbook('-'); - $workbook->send($filename); - - $worksheet = array(); - - $worksheet[0] = $workbook->add_worksheet(''); - $col = 0; - foreach ($fields as $fieldname) { - $worksheet[0]->write(0, $col, $fieldname); - $col++; - } - - $row = 1; - foreach ($SESSION->bulk_users as $userid) { - if (!$user = $DB->get_record('user', array('id'=>$userid))) { - continue; - } - $col = 0; - profile_load_data($user); - foreach ($fields as $field=>$unused) { - $worksheet[0]->write($row, $col, $user->$field); - $col++; - } - $row++; - } - - $workbook->close(); - die; -} - -function user_download_xls($fields) { - global $CFG, $SESSION, $DB; - - require_once("$CFG->libdir/excellib.class.php"); - require_once($CFG->dirroot.'/user/profile/lib.php'); - - $filename = clean_filename(get_string('users').'.xls'); - - $workbook = new MoodleExcelWorkbook('-'); - $workbook->send($filename); - - $worksheet = array(); - - $worksheet[0] = $workbook->add_worksheet(''); - $col = 0; - foreach ($fields as $fieldname) { - $worksheet[0]->write(0, $col, $fieldname); - $col++; - } - - $row = 1; - foreach ($SESSION->bulk_users as $userid) { - if (!$user = $DB->get_record('user', array('id'=>$userid))) { - continue; - } - $col = 0; - profile_load_data($user); - foreach ($fields as $field=>$unused) { - $worksheet[0]->write($row, $col, $user->$field); - $col++; - } - $row++; - } - - $workbook->close(); - die; -} - -function user_download_csv($fields) { - global $CFG, $SESSION, $DB; - - require_once($CFG->dirroot.'/user/profile/lib.php'); - require_once($CFG->libdir . '/csvlib.class.php'); - $filename = clean_filename(get_string('users')); - $csvexport = new csv_export_writer(); - $csvexport->set_filename($filename); - $csvexport->add_data($fields); + $downloadusers = new ArrayObject($SESSION->bulk_users); + $iterator = $downloadusers->getIterator(); - foreach ($SESSION->bulk_users as $userid) { + download_as_dataformat($filename, $dataformat, $fields, $iterator, function($userid) use ($extrafields, $fields) { + global $DB; $row = array(); - if (!$user = $DB->get_record('user', array('id'=>$userid))) { - continue; + if (!$user = $DB->get_record('user', array('id' => $userid))) { + return null; + } + foreach ($extrafields as $field) { + $newfield = 'profile_field_'.$field->datatype; + $formfield = new $newfield($field->id, $user->id); + $formfield->edit_load_user_data($user); } - profile_load_data($user); $userprofiledata = array(); - foreach ($fields as $field=>$unused) { + foreach ($fields as $field => $unused) { // Custom user profile textarea fields come in an array // The first element is the text and the second is the format. // We only take the text. if (is_array($user->$field)) { - $userprofiledata[] = reset($user->$field); + $userprofiledata[$field] = reset($user->$field); } else { - $userprofiledata[] = $user->$field; + $userprofiledata[$field] = $user->$field; } } - $csvexport->add_data($userprofiledata); - } - $csvexport->download_file(); - die; + return $userprofiledata; + }); + + exit; } + +echo $OUTPUT->header(); +echo $OUTPUT->heading(get_string('download', 'admin')); +echo $OUTPUT->download_dataformat_selector(get_string('userbulkdownload', 'admin'), 'user_bulk_download.php'); +echo $OUTPUT->footer(); + diff --git a/lang/en/admin.php b/lang/en/admin.php index 9455d539064..8607a812def 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -1146,6 +1146,7 @@ $string['useblogassociations'] = 'Enable associations'; $string['useexternalyui'] = 'Use online YUI libraries'; $string['user'] = 'User'; $string['userbulk'] = 'Bulk user actions'; +$string['userbulkdownload'] = 'Export users as'; $string['userlist'] = 'Browse list of users'; $string['userdefaultpreferences'] = 'User default preferences'; $string['userpreference'] = 'User preference';