fc13869f5a
Also: - Extend test coverage - Small bug fixes - Codestyle
142 lines
6.3 KiB
PHP
142 lines
6.3 KiB
PHP
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
namespace mod_data\local\exporter;
|
|
|
|
use context;
|
|
use context_system;
|
|
|
|
/**
|
|
* Utility class for exporting data from a mod_data instance.
|
|
*
|
|
* @package mod_data
|
|
* @copyright 2023 ISB Bayern
|
|
* @author Philipp Memmel
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class utils {
|
|
|
|
/**
|
|
* Exports the data of the mod_data instance to an entries_exporter object which then can export it to a file format.
|
|
*
|
|
* @param int $dataid
|
|
* @param array $fields
|
|
* @param array $selectedfields
|
|
* @param entries_exporter $exporter the entries_exporter object used
|
|
* @param int $currentgroup group ID of the current group. This is used for
|
|
* exporting data while maintaining group divisions.
|
|
* @param context|null $context the context in which the operation is performed (for capability checks)
|
|
* @param bool $userdetails whether to include the details of the record author
|
|
* @param bool $time whether to include time created/modified
|
|
* @param bool $approval whether to include approval status
|
|
* @param bool $tags whether to include tags
|
|
* @param bool $includefiles whether files should be exported as well
|
|
* @return void
|
|
*/
|
|
public static function data_exportdata(int $dataid, array $fields, array $selectedfields, entries_exporter $exporter,
|
|
int $currentgroup = 0, context $context = null, bool $userdetails = false, bool $time = false, bool $approval = false,
|
|
bool $tags = false, bool $includefiles = true): void {
|
|
global $DB;
|
|
|
|
if (is_null($context)) {
|
|
$context = context_system::instance();
|
|
}
|
|
// Exporting user data needs special permission.
|
|
$userdetails = $userdetails && has_capability('mod/data:exportuserinfo', $context);
|
|
|
|
// Populate the header in first row of export.
|
|
$header = [];
|
|
foreach ($fields as $key => $field) {
|
|
if (!in_array($field->field->id, $selectedfields)) {
|
|
// Ignore values we aren't exporting.
|
|
unset($fields[$key]);
|
|
} else {
|
|
$header[] = $field->field->name;
|
|
}
|
|
}
|
|
if ($tags) {
|
|
$header[] = get_string('tags', 'data');
|
|
}
|
|
if ($userdetails) {
|
|
$header[] = get_string('user');
|
|
$header[] = get_string('username');
|
|
$header[] = get_string('email');
|
|
}
|
|
if ($time) {
|
|
$header[] = get_string('timeadded', 'data');
|
|
$header[] = get_string('timemodified', 'data');
|
|
}
|
|
if ($approval) {
|
|
$header[] = get_string('approved', 'data');
|
|
}
|
|
$exporter->add_row($header);
|
|
|
|
$datarecords = $DB->get_records('data_records', array('dataid' => $dataid));
|
|
ksort($datarecords);
|
|
$line = 1;
|
|
foreach ($datarecords as $record) {
|
|
// Get content indexed by fieldid.
|
|
if ($currentgroup) {
|
|
$select = 'SELECT c.fieldid, c.content, c.content1, c.content2, c.content3, c.content4 FROM {data_content} c, '
|
|
. '{data_records} r WHERE c.recordid = ? AND r.id = c.recordid AND r.groupid = ?';
|
|
$where = array($record->id, $currentgroup);
|
|
} else {
|
|
$select = 'SELECT fieldid, content, content1, content2, content3, content4 FROM {data_content} WHERE recordid = ?';
|
|
$where = array($record->id);
|
|
}
|
|
|
|
if ($content = $DB->get_records_sql($select, $where)) {
|
|
foreach ($fields as $field) {
|
|
$contents = '';
|
|
if (isset($content[$field->field->id])) {
|
|
$contents = $field->export_text_value($content[$field->field->id]);
|
|
if (!empty($contents) && $field->file_export_supported() && $includefiles
|
|
&& !is_null($field->export_file_value($record))) {
|
|
// For exporting overwrite the content of the column with a unique
|
|
// filename, even it is not exactly the name of the file in the
|
|
// mod_data instance content. But it's more important to match the name
|
|
// of the exported file.
|
|
$contents = $exporter->create_unique_filename($contents);
|
|
$exporter->add_file_from_string($contents, $field->export_file_value($record));
|
|
}
|
|
}
|
|
// Just be double sure.
|
|
$contents = !empty($contents) ? $contents : '';
|
|
$exporter->add_to_current_row($contents);
|
|
}
|
|
if ($tags) {
|
|
$itemtags = \core_tag_tag::get_item_tags_array('mod_data', 'data_records', $record->id);
|
|
$exporter->add_to_current_row(implode(', ', $itemtags));
|
|
}
|
|
if ($userdetails) { // Add user details to the export data.
|
|
$userdata = get_complete_user_data('id', $record->userid);
|
|
$exporter->add_to_current_row(fullname($userdata));
|
|
$exporter->add_to_current_row($userdata->username);
|
|
$exporter->add_to_current_row($userdata->email);
|
|
}
|
|
if ($time) { // Add time added / modified.
|
|
$exporter->add_to_current_row(userdate($record->timecreated));
|
|
$exporter->add_to_current_row(userdate($record->timemodified));
|
|
}
|
|
if ($approval) { // Add approval status.
|
|
$exporter->add_to_current_row((int) $record->approved);
|
|
}
|
|
}
|
|
$exporter->next_row();
|
|
}
|
|
}
|
|
}
|