]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-15758 - add export whole database activity to portfolio (still one entry to do)
authormjollnir_ <mjollnir_>
Fri, 1 Aug 2008 12:30:26 +0000 (12:30 +0000)
committermjollnir_ <mjollnir_>
Fri, 1 Aug 2008 12:30:26 +0000 (12:30 +0000)
mod/data/export.php
mod/data/export_form.php
mod/data/lib.php

index 500e892fcb4372c83452fe39317003661a62e217..b819efacaee944a6956f8e2c7679779e5fcec9e2 100644 (file)
@@ -2,7 +2,6 @@
 
 require_once('../../config.php');
 require_once('lib.php');
-require_once($CFG->libdir . '/csvlib.class.php');
 require_once('export_form.php');
 
 $d = required_param('d', PARAM_INT);
@@ -72,45 +71,30 @@ if($mform->is_cancelled()) {
     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;
-    }
+if (array_key_exists('portfolio', $formdata) && !empty($formdata['portfolio'])) {
+    // fake  portfolio callback stuff and redirect
+    $formdata['id'] = $cm->id;
+    $url = portfolio_fake_add_url($formdata['portfolio'], 'data_portfolio_caller', '/mod/data/lib.php', $formdata);
+    redirect($url);
 }
 
-$datarecords = $DB->get_records('data_records', array('dataid'=>$data->id));
-ksort($datarecords);
-$line = 1;
-foreach($datarecords as $record) {
-    // get content indexed by fieldid
-    if( $content = $DB->get_records('data_content', array('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;
-        }
+$selectedfields = array();
+foreach ($formdata as $key => $value) {
+    if (strpos($key, 'field_') === 0) {
+        $selectedfields[] = substr($key, 6);
     }
-    $line++;
 }
-$line--;
-
+$exportdata = data_get_exportdata($data->id, $fields, $selectedfields);
+$count = count($exportdata);
 switch ($formdata['exporttype']) {
     case 'csv':
-        data_export_csv($exportdata, $formdata['delimiter_name'], $data->name, $line);
+        data_export_csv($exportdata, $formdata['delimiter_name'], $data->name, $count);
         break;
     case 'xls':
-        data_export_xls($exportdata, $data->name, $line);
+        data_export_xls($exportdata, $data->name, $count);
         break;
     case 'ods':
-        data_export_ods($exportdata, $data->name, $line);
+        data_export_ods($exportdata, $data->name, $count);
         break;
 }
 
index 66545851e21818ba54cf0ebf1b7f3777ba89ce00..8016bf556bd63cdac5094331baca1dc28d46b2ca 100644 (file)
@@ -4,6 +4,7 @@ if (!defined('MOODLE_INTERNAL')) {
     die('Direct access to this script is forbidden!');
 }
 require_once($CFG->libdir . '/formslib.php');
+require_once($CFG->libdir . '/csvlib.class.php');
 
 class mod_data_export_form extends moodleform {
     var $_datafields = array();
@@ -15,6 +16,7 @@ class mod_data_export_form extends moodleform {
     }
 
     function definition() {
+        global $CFG;
         $mform =& $this->_form;
         $mform->addElement('header', 'notice', get_string('chooseexportformat', 'data'));
         $choices = csv_import_reader::get_delimiter_list();
@@ -50,6 +52,13 @@ class mod_data_export_form extends moodleform {
             }
         }
         $this->add_checkbox_controller(1, null, null, 1);
+        require_once($CFG->libdir . '/portfoliolib.php');
+        if ($portfoliooptions = portfolio_instance_select(portfolio_instances(), call_user_func(array('data_portfolio_caller', 'supported_formats')), 'data_portfolio_caller', '', true, true)) {
+            $mform->addElement('header', 'notice', get_string('portfolionotfile', 'portfolio') . ':');
+            $portfoliooptions[0] = get_string('none');
+            ksort($portfoliooptions);
+            $mform->addElement('select', 'portfolio', get_string('portfolio', 'portfolio'), $portfoliooptions);
+        }
         $this->add_action_buttons(true, get_string('exportdatabaserecords', 'data'));
     }
 
index 44b9afd6f7d271bbc2065d6f29c7a8754841bc16..aaeb184f59dae3aa4703d36f1cefb9f02d0f9cfa 100755 (executable)
@@ -2281,7 +2281,9 @@ function data_supports($feature) {
         default: return null;
     }
 }
-function data_export_csv($export, $delimiter_name, $dataname, $count) {
+function data_export_csv($export, $delimiter_name, $dataname, $count, $todir=false) {
+    global $CFG;
+    require_once($CFG->libdir . '/csvlib.class.php');
     $delimiter = csv_import_reader::get_delimiter($delimiter_name);
     $filename = clean_filename("${dataname}-${count}_record");
     if ($count > 1) {
@@ -2290,22 +2292,36 @@ function data_export_csv($export, $delimiter_name, $dataname, $count) {
     $filename .= clean_filename('-' . gmdate("Ymd_Hi"));
     $filename .= clean_filename("-${delimiter_name}_separated");
     $filename .= '.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');
+    if (!$todir) {
+        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');
+    }
     $encdelim = '&#' . ord($delimiter) . ';';
+    $returnstr = '';
     foreach($export as $row) {
         foreach($row as $key => $column) {
             $row[$key] = str_replace($delimiter, $encdelim, $column);
         }
-        echo implode($delimiter, $row) . "\n";
+        $returnstr .= implode($delimiter, $row) . "\n";
+    }
+    if (empty($todir)) {
+        echo $returnstr;
+        return;
     }
+    $status = ($handle = fopen($todir . '/' . $filename, 'w'));
+    $status = $status && fwrite($handle, $returnstr);
+    $status = $status && fclose($handle);
+    if ($status) {
+        return $filename;
+    }
+    return false;
 }
 
 
-function data_export_xls($export, $dataname, $count) {
+function data_export_xls($export, $dataname, $count, $todir=false) {
     global $CFG;
     require_once("$CFG->libdir/excellib.class.php");
     $filename = clean_filename("${dataname}-${count}_record");
@@ -2314,8 +2330,15 @@ function data_export_xls($export, $dataname, $count) {
     }
     $filename .= clean_filename('-' . gmdate("Ymd_Hi"));
     $filename .= '.xls';
-    $workbook = new MoodleExcelWorkbook('-');
-    $workbook->send($filename);
+
+    $filearg = '-';
+    if ($todir) {
+        $filearg = $todir . '/' . $filename;
+    }
+    $workbook = new MoodleExcelWorkbook($filearg);
+    if (!$todir) {
+        $workbook->send($filename);
+    }
     $worksheet = array();
     $worksheet[0] =& $workbook->add_worksheet('');
     $rowno = 0;
@@ -2328,10 +2351,11 @@ function data_export_xls($export, $dataname, $count) {
         $rowno++;
     }
     $workbook->close();
+    return $filename;
 }
 
 
-function data_export_ods($export, $dataname, $count) {
+function data_export_ods($export, $dataname, $count, $todir=false) {
     global $CFG;
     require_once("$CFG->libdir/odslib.class.php");
     $filename = clean_filename("${dataname}-${count}_record");
@@ -2340,8 +2364,14 @@ function data_export_ods($export, $dataname, $count) {
     }
     $filename .= clean_filename('-' . gmdate("Ymd_Hi"));
     $filename .= '.ods';
-    $workbook = new MoodleODSWorkbook('-');
-    $workbook->send($filename);
+    $filearg = '-';
+    if ($todir) {
+        $filearg = $todir . '/' . $filename;
+    }
+    $workbook = new MoodleODSWorkbook($filearg, (empty($todir)));
+    if (!$todir) {
+        $workbook->send($filename);
+    }
     $worksheet = array();
     $worksheet[0] =& $workbook->add_worksheet('');
     $rowno = 0;
@@ -2354,5 +2384,129 @@ function data_export_ods($export, $dataname, $count) {
         $rowno++;
     }
     $workbook->close();
+    return $filename;
+}
+
+function data_get_exportdata($dataid, $fields, $selectedfields) {
+    global $DB;
+
+    $exportdata = array();
+
+    // populate the header in first row of export
+    foreach($fields as $key => $field) {
+        if (!in_array($field->field->id, $selectedfields)) {
+            // ignore values we aren't exporting
+            unset($fields[$key]);
+        } else {
+            $exportdata[0][] = $field->field->name;
+        }
+    }
+
+    $datarecords = $DB->get_records('data_records', array('dataid'=>$dataid));
+    ksort($datarecords);
+    $line = 1;
+    foreach($datarecords as $record) {
+        // get content indexed by fieldid
+        if( $content = $DB->get_records('data_content', array('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++;
+    }
+    $line--;
+    return $exportdata;
+}
+
+require_once($CFG->libdir . '/portfoliolib.php');
+class data_portfolio_caller extends portfolio_module_caller_base {
+
+    private $data;
+    private $selectedfields;
+    private $exporttype;
+    private $fields;
+    private $fieldtypes;
+    private $delimiter;
+    private $exportdata;
+
+    public function __construct($callbackargs) {
+        global $DB;
+        if (!$this->cm = get_coursemodule_from_id('data', $callbackargs['id'])) {
+            portfolio_exporter::raise_error('invalidid', 'data');
+        }
+        $this->data = $DB->get_record('data', array('id' => $this->cm->instance));
+        $this->selectedfields = array();
+        foreach ($callbackargs as $key => $value) {
+            if (strpos($key, 'field_') === 0) {
+                $this->selectedfields[] = substr($key, 6);
+            }
+        }
+        $this->delimiter = array_key_exists('delimiter_name', $callbackargs) ? $callbackargs['delimiter_name'] : null;
+        $this->exporttype = $callbackargs['exporttype'];
+        $fieldrecords = $DB->get_records('data_fields', array('dataid'=>$this->cm->instance), 'id');
+        // populate objets for this databases fields
+        $this->fields = array();
+        foreach ($fieldrecords as $fieldrecord) {
+            $tmp = data_get_field($fieldrecord, $this->data);
+            $this->fields[] = $tmp;
+            $this->fieldtypes[]  = $tmp->type;
+        }
+        $this->exportdata = data_get_exportdata($this->cm->instance, $this->fields, $this->selectedfields);
+    }
+
+    public function expected_time() {
+        //@todo check number of records maybe
+        return PORTFOLIO_TIME_MODERATE;
+    }
+
+    public function get_sha1() {
+        $str = '';
+        foreach ($this->exportdata as $data) {
+            $str .= implode(',', $data);
+        }
+        return sha1($str . ',' . $this->exporttype);
+    }
+
+    public function prepare_package($tempdir) {
+        global $DB;
+        $count = count($this->exportdata);
+        switch ($this->exporttype) {
+            case 'csv':
+                $return = data_export_csv($this->exportdata, $this->delimiter, $this->cm->name, $count, $tempdir);
+                break;
+            case 'xls':
+                $return = data_export_xls($this->exportdata, $this->cm->name, $count, $tempdir);
+                break;
+            case 'ods':
+                $return = data_export_ods($this->exportdata, $this->cm->name, $count, $tempdir);
+                break;
+        }
+        return $return;
+
+    }
+
+    public function check_permissions() {
+        // @todo
+        return true;
+    }
+
+    public static function display_name() {
+        return get_string('modulename', 'data');
+    }
+
+    public function __wakeup() {
+        global $CFG;
+        if (empty($CFG)) {
+            return true; // too early yet
+        }
+        foreach ($this->fieldtypes as $key => $field) {
+            require_once($CFG->dirroot . '/mod/data/field/' . $field .'/field.class.php');
+            $this->fields[$key] = unserialize(serialize($this->fields[$key]));
+        }
+    }
 }
 ?>