diff --git a/lang/en_utf8/data.php b/lang/en_utf8/data.php index b44f331..5f7b550 100644 --- a/lang/en_utf8/data.php +++ b/lang/en_utf8/data.php @@ -1,6 +1,4 @@ name - $a->date'; $string['cancel'] = 'Cancel'; $string['checkbox'] = 'Checkbox'; +$string['chooseexportformat'] = 'Choose the format you wish to export in:'; +$string['chooseexportfields'] = 'Choose the fields you wish to export:'; $string['chooseorupload'] = 'Choose file'; $string['columns'] = 'columns'; $string['commentdeleted'] = 'Comment deleted'; @@ -39,7 +39,10 @@ $string['confirmdeletefield'] = 'You are about to delete this field, are you sur $string['confirmdeleterecord'] = 'Are you sure you want to delete this entry?'; $string['csstemplate'] = 'CSS template'; $string['csvfile'] = 'CSV file'; +$string['csvformat'] = 'CSV format'; $string['csvimport'] = 'CSV file import'; +$string['coursemodulenotfound'] = 'Course Module not found'; +$string['coursenotfound'] = 'Course not found'; $string['data:approve'] = 'Approve unapproved entries'; $string['data:comment'] = 'Write comments'; $string['data:managecomments'] = 'Manage comments'; @@ -80,10 +83,12 @@ $string['entry'] = 'Entry'; $string['entrysaved'] = 'Your entry has been saved'; $string['errormustbeteacher'] = 'You need to be a teacher to use this page!'; $string['example'] = 'Database module example'; +$string['excelformat'] = 'Excel format'; $string['export'] = 'Export'; $string['exportaszip'] = 'Export as zip'; $string['exportedtozip'] = 'Exported to temporary zip...'; $string['failedpresetdelete'] = 'Error deleting a preset!'; +$string['exportdatabase'] = 'Export Database'; $string['fieldadded'] = 'Field added'; $string['fieldallowautolink'] = 'Allow autolink'; $string['fielddeleted'] = 'Field deleted'; @@ -171,6 +176,7 @@ $string['number'] = 'Number'; $string['numberrssarticles'] = 'RSS articles'; $string['numnotapproved'] = 'Pending'; $string['numrecords'] = '$a entries'; +$string['odsformat'] = 'ODS Format'; $string['optionaldescription'] = 'Short description (optional)'; $string['optionalfilename'] = 'Filename (optional)'; $string['overwrite'] = 'Overwrite'; @@ -225,6 +231,7 @@ $string['text'] = 'Text'; $string['textarea'] = 'Textarea'; $string['todatabase'] = 'to this database.'; $string['type'] = 'Field type'; +$string['unsupportedexport'] = '$a->fieldname [$a->fieldtype] can not be exported.'; $string['undefinedprocessactionmethod'] = 'No action method defined in Data_Preset to handle action \"$a\".'; $string['updatefield'] = 'Update an existing field'; $string['uploadfile'] = 'Upload file'; diff --git a/mod/data/export.php b/mod/data/export.php new file mode 100755 index 0000000..6bc8c38 --- /dev/null +++ b/mod/data/export.php @@ -0,0 +1,200 @@ +id, $data->course)) { + print_error('coursemodulenotfound', 'data'); +} + +if(! $course = get_record('course', 'id', $cm->course)){ + print_error('coursenotfound', 'data'); +} + + +require_login($course->id, false, $cm); + + +// get fields for this database +$fieldrecords = get_records('data_fields','dataid', $data->id, 'id'); + +if(empty($fieldrecords)){ + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + + if (has_capability('mod/data:managetemplates', $context)) { + redirect($CFG->wwwroot.'/mod/data/field.php?d='.$data->id); + }else{ + print_error('nofieldindatabase', 'data'); + } +} + +// populate objets for this databases fields +$fields = array(); +foreach ($fieldrecords as $fieldrecord) { + $fields[]= data_get_field($fieldrecord, $data); +} + + +$mform = new mod_data_export_form('export.php?d='.$data->id, $fields); + +if($mform->is_cancelled()){ + redirect('view.php?d='.$data->id); +}elseif(!$formdata = (array) $mform->get_data()){ + + // build header to match the rest of the ui + $nav = build_navigation('', $cm); + + print_header_simple($data->name, '', $nav, + '', '', true, update_module_button($cm->id, $course->id, get_string('modulename', 'data')), + navmenu($course, $cm), '', ''); + + print_heading(format_string($data->name)); + + // these are for the tab display + $currentgroup = groups_get_activity_group($cm); + $groupmode = groups_get_activity_groupmode($cm); + $currenttab = 'export'; + include('tabs.php'); + + $mform->display(); + print_footer(); + die; +} + + +$exportdata = array(); + +// populate the header in first row of export +foreach($fields as $key => $field){ + if( empty($formdata['field_'.$field->field->id]) ){ + // ignore values we aren't exporting + unset($fields[$key]); + }else{ + $exportdata[0][] = $field->field->name; + } +} + +$datarecords = get_records('data_records', 'dataid', $data->id); + +$line = 1; +foreach($datarecords as $record){ + // get content indexed by fieldid + if( $content = get_records('data_content', 'recordid', $record->id, 'fieldid', 'fieldid, content, content1, content2, content3, content4') ){ + + foreach($fields as $field){ + $contents = ''; + if(isset($content[$field->field->id])){ + $contents = $field->export_text_value($content[$field->field->id]); + } + $exportdata[$line][] = $contents; + } + } + $line++; +} + +switch ($formdata['exporttype']){ + case 'csv': + data_export_csv($exportdata); + break; + case 'xls': + data_export_xls($exportdata); + break; + case 'ods': + data_export_ods($exportdata); + break; +} + + +function data_export_csv($export){ + $filename = clean_filename('database_export.csv'); + + header("Content-Type: application/download\n"); + header("Content-Disposition: attachment; filename=$filename"); + header("Expires: 0"); + header("Cache-Control: must-revalidate,post-check=0,pre-check=0"); + header("Pragma: public"); + + $delimiter = get_string('listsep'); + $encdelim = '&#'.ord($delimiter); + + foreach($export as $row){ + + foreach($row as $key => $column){ + $row[$key] = str_replace($delimiter, $encdelim, $column); + } + + echo implode($delimiter, $row)."\n"; + } + + die; +} + + +function data_export_xls($export) { + global $CFG; + require_once("$CFG->libdir/excellib.class.php"); + + $filename = clean_filename('database_export.xls'); + + $workbook = new MoodleExcelWorkbook('-'); + $workbook->send($filename); + + $worksheet = array(); + $worksheet[0] =& $workbook->add_worksheet(''); + + $rowno = 0; + + foreach ($export as $row) { + $colno = 0; + foreach($row as $col){ + $worksheet[0]->write($rowno, $colno, $col); + $colno++; + } + $rowno++; + } + + $workbook->close(); + die; +} + +function data_export_ods($export) { + global $CFG; + + require_once("$CFG->libdir/odslib.class.php"); + + $filename = clean_filename('database_export.ods'); + + $workbook = new MoodleODSWorkbook('-'); + $workbook->send($filename); + + $worksheet = array(); + $worksheet[0] =& $workbook->add_worksheet(''); + + $rowno = 0; + + foreach ($export as $row) { + $colno = 0; + foreach($row as $col){ + $worksheet[0]->write($rowno, $colno, $col); + $colno++; + } + $rowno++; + } + + $workbook->close(); + die; +} diff --git a/mod/data/export_form.php b/mod/data/export_form.php new file mode 100644 index 0000000..861761a --- /dev/null +++ b/mod/data/export_form.php @@ -0,0 +1,58 @@ +libdir.'/formslib.php'); + +class mod_data_export_form extends moodleform { + + var $_datafields = array(); + + /** + * Create form for exporting database + * + * @param string $url the url to post to + * @param array field objects in this database + */ + function mod_data_export_form($url, $datafields){ + $this->_datafields = $datafields; + parent::moodleform($url); + } + + function definition(){ + $mform =& $this->_form; + + $mform->addElement('header', 'notice', get_string('chooseexportformat', 'data')); + + $typesarray = array(); + $typesarray[] = &MoodleQuickForm::createElement('radio', 'exporttype', '', get_string('csvformat', 'data'), 'csv'); + $typesarray[] = &MoodleQuickForm::createElement('radio', 'exporttype', '', get_string('excelformat', 'data'), 'xls'); + $typesarray[] = &MoodleQuickForm::createElement('radio', 'exporttype', '', get_string('odsformat', 'data'), 'ods'); + + $mform->addGroup($typesarray, 'exportar', '', array(' '), false); + $mform->setDefault('exporttype', 'csv'); + $mform->addRule('exportar', null, 'required'); + + $mform->addElement('header', 'notice', get_string('chooseexportfields', 'data')); + + foreach($this->_datafields as $field) { + if($field->text_export_supported()){ + $mform->addElement('advcheckbox', 'field_'.$field->field->id, $field->field->name, null, array('group'=>1)); + $mform->setDefault('field_'.$field->field->id, 1); + }else{ + $a = new object; + $a->fieldtype = $field->name(); + $a->fieldname = $field->field->name; + + $mform->addElement('static', 'unsupported'.$field->field->id, '', get_string('unsupportedexport', 'data', $a)); + } + } + $this->add_checkbox_controller(1, null, null, 1); + $this->add_action_buttons(true, get_string('exportdatabase', 'data')); + } + +} + +?> diff --git a/mod/data/field/checkbox/field.class.php b/mod/data/field/checkbox/field.class.php index 6574c3f..9a23c22 100755 --- a/mod/data/field/checkbox/field.class.php +++ b/mod/data/field/checkbox/field.class.php @@ -129,5 +129,9 @@ class data_field_checkbox extends data_field_base { $str = clean_param($str, PARAM_NOTAGS); return $str; } + + function text_export_supported(){ + return true; + } } ?> diff --git a/mod/data/field/date/field.class.php b/mod/data/field/date/field.class.php index bc35d4a..7ed7a53 100755 --- a/mod/data/field/date/field.class.php +++ b/mod/data/field/date/field.class.php @@ -116,6 +116,13 @@ class data_field_date extends data_field_base { return 'CAST('.$fieldname.' AS unsigned)'; } + function text_export_supported(){ + return true; + } + + function export_text_value($record){ + return userdate($record->content, get_string('strftimedate'), 0); + } } diff --git a/mod/data/field/latlong/field.class.php b/mod/data/field/latlong/field.class.php index b9e4e9d..33d1c3a 100755 --- a/mod/data/field/latlong/field.class.php +++ b/mod/data/field/latlong/field.class.php @@ -203,6 +203,30 @@ class data_field_latlong extends data_field_base { return $fieldname; } } + + function text_export_supported(){ + return true; + } + + function export_text_value($record){ + + $lat = $record->content; + $long = $record->content1; + + $str = ''; + if($lat < 0) { + $str.= "" . sprintf('%01.4f', 0 - $lat) . '°S '; + } else { + $str.= "" . sprintf('%01.4f', $lat) . "°N "; + } + if($long < 0) { + $str.= "" . sprintf('%01.4f', 0 - $long) . '°W'; + } else { + $str.= "" . sprintf('%01.4f', $long) . "°E"; + } + + return $str; + } } ?> diff --git a/mod/data/field/menu/field.class.php b/mod/data/field/menu/field.class.php index 9526519..1607d00 100755 --- a/mod/data/field/menu/field.class.php +++ b/mod/data/field/menu/field.class.php @@ -78,6 +78,10 @@ class data_field_menu extends data_field_base { return " ({$tablealias}.fieldid = {$this->field->id} AND {$tablealias}.content = '$value') "; } + function text_export_supported(){ + return true; + } + } ?> diff --git a/mod/data/field/multimenu/field.class.php b/mod/data/field/multimenu/field.class.php index ec37adb..9981564 100755 --- a/mod/data/field/multimenu/field.class.php +++ b/mod/data/field/multimenu/field.class.php @@ -126,5 +126,9 @@ class data_field_multimenu extends data_field_base { } return false; } + + function text_export_supported(){ + return true; + } } ?> diff --git a/mod/data/field/number/field.class.php b/mod/data/field/number/field.class.php index 073a091..139a909 100755 --- a/mod/data/field/number/field.class.php +++ b/mod/data/field/number/field.class.php @@ -70,6 +70,10 @@ class data_field_number extends data_field_base { } } + function text_export_supported(){ + return true; + } + } ?> diff --git a/mod/data/field/radiobutton/field.class.php b/mod/data/field/radiobutton/field.class.php index 0ed4631..a1b0ce1 100755 --- a/mod/data/field/radiobutton/field.class.php +++ b/mod/data/field/radiobutton/field.class.php @@ -88,5 +88,9 @@ class data_field_radiobutton extends data_field_base { return " ({$tablealias}.fieldid = {$this->field->id} AND {$tablealias}.content = '$value') "; } + function text_export_supported(){ + return true; + } + } ?> diff --git a/mod/data/field/text/field.class.php b/mod/data/field/text/field.class.php index ba13558..ca70f53 100755 --- a/mod/data/field/text/field.class.php +++ b/mod/data/field/text/field.class.php @@ -41,7 +41,11 @@ class data_field_text extends data_field_base { function generate_sql($tablealias, $value) { return " ({$tablealias}.fieldid = {$this->field->id} AND {$tablealias}.content LIKE '%{$value}%') "; } - + + function text_export_supported(){ + return true; + } + } ?> diff --git a/mod/data/field/textarea/field.class.php b/mod/data/field/textarea/field.class.php index 92183f0..62f1445 100755 --- a/mod/data/field/textarea/field.class.php +++ b/mod/data/field/textarea/field.class.php @@ -114,5 +114,9 @@ class data_field_textarea extends data_field_base { return insert_record('data_content', $content); } } + + function text_export_supported(){ + return true; + } } ?> diff --git a/mod/data/field/url/field.class.php b/mod/data/field/url/field.class.php index 23c9138..0f3ab8c 100755 --- a/mod/data/field/url/field.class.php +++ b/mod/data/field/url/field.class.php @@ -131,6 +131,10 @@ class data_field_url extends data_field_base { return false; } + function text_export_supported(){ + return true; + } + } ?> diff --git a/mod/data/lib.php b/mod/data/lib.php index 993ef20..e9044b7 100755 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -307,6 +307,19 @@ class data_field_base { /// Base class for Database Field Types (see field/* return $str; } +/// Overide and return true if field supports text export + function text_export_supported(){ + return false; + } + +/// Return the field text value from an content record +/// which is passed in + function export_text_value($record){ + if ($this->text_export_supported()) { + return $record->content; + } + } + } //end of major class data_field_base diff --git a/mod/data/tabs.php b/mod/data/tabs.php index 75c59b4..20674cb 100755 --- a/mod/data/tabs.php +++ b/mod/data/tabs.php @@ -72,6 +72,10 @@ } } + $row[] = new tabobject('export', $CFG->wwwroot.'/mod/data/export.php?d='.$data->id, + get_string('export', 'data')); + + $tabs[] = $row; if ($currenttab == 'templates' and isset($mode)) { -- 1.5.4.2