From 8185aeb6093b568989ca10fb555515ac5d565e5e Mon Sep 17 00:00:00 2001 From: mjollnir_ Date: Thu, 14 Aug 2008 10:37:40 +0000 Subject: [PATCH] MDL-15758 - added export to portfolio for single database entry still to do - files stuff for entries (rest of module not converted) --- mod/data/db/upgrade.php | 12 ++++ mod/data/lib.php | 124 +++++++++++++++++++++++++++++++++++----- mod/data/templates.php | 3 + mod/data/version.php | 2 +- 4 files changed, 126 insertions(+), 15 deletions(-) diff --git a/mod/data/db/upgrade.php b/mod/data/db/upgrade.php index 730899ba06..3bc3fdb13f 100644 --- a/mod/data/db/upgrade.php +++ b/mod/data/db/upgrade.php @@ -54,6 +54,18 @@ function xmldb_data_upgrade($oldversion=0) { upgrade_mod_savepoint($result, 2007101513, 'data'); } + if ($result && $oldversion < 2008081400) { + if ($datainstances = $DB->get_records('data')) { + $pattern = '/\#\#delete\#\#(\s+)\#\#approve\#\#/'; + $replacement = '##delete##$1##approve##$1##export##'; + foreach ($datainstances as $data) { + $data->listtemplate = preg_replace($pattern, $replacement, $data->listtemplate); + $data->singletemplate = preg_replace($pattern, $replacement, $data->singletemplate); + $DB->update_record('data', $data); + } + } + } + return $result; } diff --git a/mod/data/lib.php b/mod/data/lib.php index 4042f3093d..aab332fa13 100755 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -397,9 +397,9 @@ function data_generate_default_template(&$data, $template, $recordid=0, $form=fa } if ($template == 'listtemplate') { - $str .= '##edit## ##more## ##delete## ##approve##'; + $str .= '##edit## ##more## ##delete## ##approve## ##export##'; } else if ($template == 'singletemplate') { - $str .= '##edit## ##delete## ##approve##'; + $str .= '##edit## ##delete## ##approve## ##export##'; } else if ($template == 'asearchtemplate') { $str .= ''.get_string('authorfirstname', 'data').': ##firstname##'; $str .= ''.get_string('authorlastname', 'data').': ##lastname##'; @@ -990,13 +990,23 @@ function data_print_template($template, $records, $data, $search='',$page=0, $re } $patterns[]='##more##'; $replacement[] = ''.get_string('more', 'data').''; - $patterns[]='##moreurl##'; $replacement[] = $CFG->wwwroot.'/mod/data/view.php?d='.$data->id.'&rid='.$record->id; $patterns[]='##user##'; $replacement[] = ''.fullname($record).''; + + $patterns[]='##export##'; + + if (($template == 'singletemplate' || $template == 'listtemplate') + && ((has_capability('mod/data:exportentry', $context) + || (data_isowner($record->id) && has_capability('mod/data:exportownentry', $context))))) { + require_once($CFG->libdir . '/portfoliolib.php'); + $replacement[] = portfolio_add_button('data_portfolio_caller', array('id' => $cm->id, 'record' => $record->id), null, false, true); + } else { + $replacement[] = ''; + } $patterns[] = '##timeadded##'; $replacement[] = userdate($record->timecreated); @@ -2416,6 +2426,7 @@ class data_portfolio_caller extends portfolio_module_caller_base { private $fieldtypes; private $delimiter; private $exportdata; + private $singlerecord; public function __construct($callbackargs) { global $DB; @@ -2423,14 +2434,6 @@ class data_portfolio_caller extends portfolio_module_caller_base { 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(); @@ -2439,18 +2442,60 @@ class data_portfolio_caller extends portfolio_module_caller_base { $this->fields[] = $tmp; $this->fieldtypes[] = $tmp->type; } - $this->exportdata = data_get_exportdata($this->cm->instance, $this->fields, $this->selectedfields); + + if (array_key_exists('record', $callbackargs) && !empty($callbackargs['record'])) { + //user has selected to export one single entry rather than the whole thing + // which is completely different + $this->singlerecord = $DB->get_record('data_records', array('id' => $callbackargs['record'])); + $this->singlerecord->content = $DB->get_records('data_content', array('recordid' => $this->singlerecord->id)); + $this->exporttype = 'single'; + } else { + // all records as csv or whatever + $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 = array_key_exists('exporttype', $callbackargs) ? $callbackargs['exporttype'] : 'csv'; //@todo later support more + $this->exportdata = data_get_exportdata($this->cm->instance, $this->fields, $this->selectedfields); + } + } + + public function has_export_config() { + // @todo later when we suport exporting to more than just csv, we may need to ask the user here + // if we have not already passed it + return false; } public function expected_time() { + if ($this->exporttype == 'single') { + return PORTFOLIO_TIME_LOW; + } //@todo check number of records maybe return PORTFOLIO_TIME_MODERATE; } public function get_sha1() { + $loopdata = $this->exportdata; + if ($this->exporttype == 'single') { + $loopdata = $this->singlerecord; + } $str = ''; - foreach ($this->exportdata as $data) { - $str .= implode(',', $data); + foreach ($loopdata as $data) { + if (is_array($data) || is_object($data)) { + $testkey = array_pop(array_keys($data)); + if (is_array($data[$testkey]) || is_object($data[$testkey])) { + foreach ($data as $d) { + $str .= implode(',', (array)$d); + } + } else { + $str .= implode(',', (array)$data); + } + } else { + $str .= $data; + } } return sha1($str . ',' . $this->exporttype); } @@ -2461,6 +2506,10 @@ class data_portfolio_caller extends portfolio_module_caller_base { $content = ''; $filename = ''; switch ($this->exporttype) { + case 'single': + $content = $this->exportsingle(); + $filename = clean_filename($this->cm->name . '-entry.html'); + break; case 'csv': $content = data_export_csv($this->exportdata, $this->delimiter, $this->cm->name, $count, true); $filename = clean_filename($this->cm->name . '.csv'); @@ -2473,6 +2522,9 @@ class data_portfolio_caller extends portfolio_module_caller_base { portfolio_exporter::raise_error('notimplemented', 'portfolio'); $content = data_export_ods($this->exportdata, $this->cm->name, $count, true); break; + default: + portfolio_exporter::raise_error('notimplemented', 'portfolio', '', $this->exporttype); + break; } return $this->exporter->write_new_file($content, $filename); } @@ -2495,5 +2547,49 @@ class data_portfolio_caller extends portfolio_module_caller_base { $this->fields[$key] = unserialize(serialize($this->fields[$key])); } } + + private function exportsingle() { + // Replacing tags + $patterns = array(); + $replacement = array(); + + // Then we generate strings to replace for normal tags + foreach ($this->fields as $field) { + $patterns[]='[['.$field->field->name.']]'; + if ($field instanceof data_field_file) { + // meh, do something special + // @todo extract the file and put it in the working directory + // and write out the filename here. (files api) + $replacement[] = $field->display_browse_field($this->singlerecord->id, 'singletemplate'); + } else { + $replacement[] = $field->display_browse_field($this->singlerecord->id, 'singletemplate'); + } + } + + // Replacing special tags (##Edit##, ##Delete##, ##More##) + $patterns[]='##edit##'; + $patterns[]='##delete##'; + $patterns[]='##export##'; + $patterns[]='##more##'; + $patterns[]='##moreurl##'; + $patterns[]='##user##'; + $patterns[]='##approve##'; + $patterns[]='##comments##'; + $patterns[] = '##timeadded##'; + $patterns[] = '##timemodified##'; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = ''; + $replacement[] = userdate($this->singlerecord->timecreated); + $replacement[] = userdate($this->singlerecord->timemodified); + + // actual replacement of the tags + return str_ireplace($patterns, $replacement, $this->data->singletemplate); + } } ?> diff --git a/mod/data/templates.php b/mod/data/templates.php index ad3c0b4150..a05c9afd9e 100755 --- a/mod/data/templates.php +++ b/mod/data/templates.php @@ -226,6 +226,9 @@ echo ''; echo ''; echo ''; + if ($mode != 'rsstemplate') { + echo ''; + } if ($mode != 'singletemplate') { // more points to single template - not useable there echo ''; diff --git a/mod/data/version.php b/mod/data/version.php index 2f8f7b45c1..60bb0abaa1 100644 --- a/mod/data/version.php +++ b/mod/data/version.php @@ -5,7 +5,7 @@ // This fragment is called by /admin/index.php //////////////////////////////////////////////////////////////////////////////// -$module->version = 2008081100; +$module->version = 2008081400; $module->requires = 2008080701; // Requires this Moodle version $module->cron = 60; -- 2.39.5