/**
  * The standard form definiton.
  */
 public function definition()
 {
     $mform = $this->_form;
     $selectedfields = $this->_customdata['selectedfields'];
     $overrides = $this->_customdata['overrides'];
     $fields = tool_downloaddata_processor::get_valid_course_fields();
     if (empty($selectedfields)) {
         $selectedfields = array(get_string('noselectedfields', 'tool_downloaddata'));
     }
     $mform->addElement('header', 'generalhdr', get_string('downloadcourses', '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');
     $sortbycategorypath = array('true' => 'Yes', 'false' => 'No');
     $mform->addElement('select', 'sortbycategorypath', get_string('sortbycategorypath', 'tool_downloaddata'), $sortbycategorypath);
     $mform->setDefault('sortbycategorypath', $this->_customdata['sortbycategorypath']);
     $mform->addHelpButton('sortbycategorypath', 'sortbycategorypath', 'tool_downloaddata');
     $mform->addElement('header', 'fieldshdr', get_string('fields', 'tool_downloaddata'));
     $mform->setExpanded('fieldshdr', true);
     // Creating the field selection elements.
     $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', 'buttonsgroup', '', $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');
 }
                                 }
                                 if (!empty($SESSION->customdata['selectedroles'])) {
                                     $roles = $SESSION->customdata['selectedroles'];
                                 } else {
                                     throw new moodle_exception('emptyroles', 'tool_downloaddata', $returnurl);
                                 }
                                 $overrides = array();
                                 if ($options['useoverrides']) {
                                     try {
                                         $overrides = tool_downloaddata_process_overrides($formdata->overrides);
                                     } catch (Exception $e) {
                                         $e->link = $returnurl;
                                         throw $e;
                                     }
                                 }
                                 $processor = new tool_downloaddata_processor($options, $fields, $roles, $overrides);
                                 try {
                                     $processor->prepare();
                                 } catch (Exception $e) {
                                     $e->link = $returnurl;
                                     throw $e;
                                 }
                                 $processor->download();
                             }
                         }
                     }
                 }
             }
         }
     }
 }
 /**
  * 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);
 }