/**
  * Tests downloading multiple users with variable number of roles to csv.
  */
 public function test_download_multiple_users_to_csv()
 {
     global $DB;
     $this->resetAfterTest(true);
     $course1 = $this->getDataGenerator()->create_course();
     $course2 = $this->getDataGenerator()->create_course();
     $user1 = $this->getDataGenerator()->create_user();
     $user2 = $this->getDataGenerator()->create_user();
     $roleid1 = $this->getDataGenerator()->create_role();
     $roleid2 = $this->getDataGenerator()->create_role();
     $roles = get_all_roles();
     foreach ($roles as $r) {
         if ($roleid1 == $r->id) {
             $role1 = $r;
         } else {
             if ($roleid2 == $r->id) {
                 $role2 = $r;
             }
         }
     }
     $this->getDataGenerator()->enrol_user($user1->id, $course1->id, $role1->id);
     $this->getDataGenerator()->enrol_user($user2->id, $course1->id, $role1->id);
     $this->getDataGenerator()->enrol_user($user2->id, $course2->id, $role2->id);
     $fields = array('username');
     $options = self::$optionsuserscsv;
     // Created new roles, cannot use self::$allroles.
     $roles = tool_downloaddata_processor::get_all_valid_roles();
     $options['sortbycategorypath'] = true;
     $processor = new tool_downloaddata_processor($options, $fields, $roles);
     $processor->prepare();
     $csv = $processor->get_file_object();
     $expectedoutput = array('username,course1,role1,course2,role2', $user1->username . ',' . $course1->shortname . ',' . $role1->shortname . ',,', $user2->username . ',' . $course1->shortname . ',' . $role1->shortname . ',' . $course2->shortname . ',' . $role2->shortname);
     $expectedoutput = implode("\n", $expectedoutput);
     $output = rtrim($csv->print_csv_data(true));
     // Sorting the output lines as the user order is random.
     $output = explode("\n", $output);
     sort($output);
     $output = implode("\n", $output);
     $output = rtrim($output);
     $this->assertEquals($expectedoutput, $output);
 }
             unset($SESSION->customdata['selectedfields'][intval($fieldindex)]);
         }
     }
     // Adding all the roles.
 } else {
     if (!empty($formdata->addallroles)) {
         $SESSION->customdata['selectedroles'] = tool_downloaddata_processor::get_all_valid_roles();
         // Removing all the selected roles.
     } else {
         if (!empty($formdata->removeallroles)) {
             $SESSION->customdata['selectedroles'] = array();
             // Adding the selected roles.
         } else {
             if (!empty($formdata->addroleselection)) {
                 if (!empty($formdata->availableroles)) {
                     $allroles = tool_downloaddata_processor::get_all_valid_roles();
                     foreach ($formdata->availableroles as $roleindex) {
                         $role = $allroles[intval($roleindex)];
                         if (!in_array($role, $SESSION->customdata['selectedroles'])) {
                             $SESSION->customdata['selectedroles'][] = $role;
                         }
                     }
                 }
                 // Removing the selected roles.
             } else {
                 if (!empty($formdata->removeroleselection)) {
                     if (!empty($formdata->selectedroles) && !empty($SESSION->customdata['selectedroles'])) {
                         foreach ($formdata->selectedroles as $roleindex) {
                             unset($SESSION->customdata['selectedroles'][intval($roleindex)]);
                         }
                     }
 /**
  * The standard form definiton.
  */
 public function definition()
 {
     $mform = $this->_form;
     $selectedfields = $this->_customdata['selectedfields'];
     $selectedroles = $this->_customdata['selectedroles'];
     $overrides = $this->_customdata['overrides'];
     $fields = array_merge(tool_downloaddata_processor::get_valid_user_fields(), tool_downloaddata_processor::get_profile_fields());
     $roles = tool_downloaddata_processor::get_all_valid_roles();
     if (empty($selectedfields)) {
         $selectedfields = array(get_string('noselectedfields', 'tool_downloaddata'));
     }
     if (empty($selectedroles)) {
         $selectedroles = array(get_string('noselectedroles', 'tool_downloaddata'));
     }
     $mform->addElement('header', 'generalhdr', get_string('downloadusersbyrole', 'tool_downloaddata'));
     $formatchoices = array(tool_downloaddata_processor::FORMAT_CSV => get_string('formatcsv', 'tool_downloaddata'), tool_downloaddata_processor::FORMAT_XLS => get_string('formatxls', 'tool_downloaddata'));
     $mform->addElement('select', 'format', get_string('format', 'tool_downloaddata'), $formatchoices);
     $mform->setDefault('format', $this->_customdata['format']);
     $encodings = core_text::get_encodings();
     $mform->addElement('select', 'encoding', get_string('encoding', 'tool_downloaddata'), $encodings);
     $mform->setDefault('encoding', $this->_customdata['encoding']);
     $mform->disabledIf('encoding', 'format', 'noteq', tool_downloaddata_processor::FORMAT_CSV);
     $delimiters = csv_import_reader::get_delimiter_list();
     $mform->addElement('select', 'delimiter_name', get_string('csvdelimiter', 'tool_downloaddata'), $delimiters);
     $mform->setDefault('delimiter_name', $this->_customdata['delimiter_name']);
     $mform->disabledIf('delimiter_name', 'format', 'noteq', tool_downloaddata_processor::FORMAT_CSV);
     $useoverrides = array('true' => 'Yes', 'false' => 'No');
     $mform->addElement('select', 'useoverrides', get_string('useoverrides', 'tool_downloaddata'), $useoverrides);
     $mform->setDefault('useoverrides', $this->_customdata['useoverrides']);
     $mform->addHelpButton('useoverrides', 'useoverrides', 'tool_downloaddata');
     // Creating the role selection elements.
     $mform->addElement('header', 'roleshdr', get_string('roles', 'tool_downloaddata'));
     $mform->setExpanded('roleshdr', true);
     $objs = array();
     $objs[0] = $mform->createElement('select', 'availableroles', get_string('available', 'tool_downloaddata'), $roles, 'size="7"');
     $objs[0]->setMultiple(true);
     $objs[1] = $mform->createElement('select', 'selectedroles', get_string('selected', 'tool_downloaddata'), $selectedroles, 'size="7"');
     $objs[1]->setMultiple(true);
     $group = $mform->addElement('group', 'rolesgroup', get_string('roles', 'tool_downloaddata'), $objs, '  ', false);
     $mform->addHelpButton('rolesgroup', 'roles', 'tool_downloaddata');
     // Creating the buttons for role the selection elements.
     $objs = array();
     $objs[] = $mform->createElement('submit', 'addroleselection', get_string('addroleselection', 'tool_downloaddata'));
     $objs[] = $mform->createElement('submit', 'removeroleselection', get_string('removeroleselection', 'tool_downloaddata'));
     $objs[] = $mform->createElement('submit', 'addallroles', get_string('addallroles', 'tool_downloaddata'));
     $objs[] = $mform->createElement('submit', 'removeallroles', get_string('removeallroles', 'tool_downloaddata'));
     $group = $mform->addElement('group', 'rolesbuttonsgroup', '', $objs, array(' ', '<br/>'), false);
     // Creating the field selection elements.
     $mform->addElement('header', 'fieldshdr', get_string('fields', 'tool_downloaddata'));
     $mform->setExpanded('fieldshdr', true);
     $objs = array();
     $objs[0] = $mform->createElement('select', 'availablefields', get_string('available', 'tool_downloaddata'), $fields, 'size="10"');
     $objs[0]->setMultiple(true);
     $objs[1] = $mform->createElement('select', 'selectedfields', get_string('selected', 'tool_downloaddata'), $selectedfields, 'size="10"');
     $objs[1]->setMultiple(true);
     $group = $mform->addElement('group', 'fieldsgroup', get_string('fields', 'tool_downloaddata'), $objs, '  ', false);
     $mform->addHelpButton('fieldsgroup', 'fields', 'tool_downloaddata');
     // Creating the buttons for the field selection elements.
     $objs = array();
     $objs[] = $mform->createElement('submit', 'addfieldselection', get_string('addfieldselection', 'tool_downloaddata'));
     $objs[] = $mform->createElement('submit', 'removefieldselection', get_string('removefieldselection', 'tool_downloaddata'));
     $objs[] = $mform->createElement('submit', 'addallfields', get_string('addallfields', 'tool_downloaddata'));
     $objs[] = $mform->createElement('submit', 'removeallfields', get_string('removeallfields', 'tool_downloaddata'));
     $group = $mform->addElement('group', 'fieldsbuttonsgroup', '', $objs, array(' ', '<br/>'), false);
     $mform->addElement('header', 'overrideshdr', get_string('overrides', 'tool_downloaddata'));
     $mform->addElement('textarea', 'overrides', get_string('overrides', 'tool_downloaddata'), 'wrap="virtual" rows="3" cols="45"');
     $mform->setType('overrides', PARAM_RAW);
     $mform->setDefault('overrides', $overrides);
     $mform->addHelpButton('overrides', 'overrides', 'tool_downloaddata');
     if (empty($overrides)) {
         $mform->setExpanded('overrideshdr', false);
     } else {
         $mform->setExpanded('overrideshdr', true);
     }
     $this->add_action_buttons(false, get_string('download', 'tool_downloaddata'));
     $template = '<label class="qflabel" style="vertical-align:top">{label}</label> {element}';
     $mform->defaultRenderer()->setGroupElementTemplate($template, 'fieldsgroup');
     $mform->defaultRenderer()->setGroupElementTemplate($template, 'rolesgroup');
 }