. namespace core_table; use core\exception\coding_exception; defined('MOODLE_INTERNAL') || die(); global $CFG; require_once("{$CFG->libdir}/tablelib.php"); use core\dataformat; /** * Dataformat exporter * * @package core_table * @subpackage tablelib * @copyright 2016 Brendan Heywood (brendan@catalyst-au.net) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class dataformat_export_format extends base_export_format { /** @var \core\dataformat\base $dataformat */ protected $dataformat; /** @var int $rownum */ protected $rownum = 0; /** @var array $columns */ protected $columns; /** * Constructor * * @param string $table An sql table * @param string $dataformat type of dataformat for export */ public function __construct(&$table, $dataformat) { parent::__construct($table); if (ob_get_length()) { throw new coding_exception("Output can not be buffered before instantiating table_dataformat_export_format"); } $this->dataformat = dataformat::get_format_instance($dataformat); // The dataformat export time to first byte could take a while to generate... set_time_limit(0); // Close the session so that the users other tabs in the same session are not blocked. \core\session\manager::write_close(); } /** * Whether the current dataformat supports export of HTML * * @return bool */ public function supports_html(): bool { return $this->dataformat->supports_html(); } /** * Start document * * @param string $filename * @param string $sheettitle */ public function start_document($filename, $sheettitle) { $this->documentstarted = true; $this->dataformat->set_filename($filename); $this->dataformat->send_http_headers(); $this->dataformat->set_sheettitle($sheettitle); $this->dataformat->start_output(); } /** * Start export * * @param string $sheettitle optional spreadsheet worksheet title */ public function start_table($sheettitle) { $this->dataformat->set_sheettitle($sheettitle); } /** * Output headers * * @param array $headers */ public function output_headers($headers) { $this->columns = $this->format_data($headers); if (method_exists($this->dataformat, 'write_header')) { error_log('The function write_header() does not support multiple sheets. In order to support multiple sheets you ' . 'must implement start_output() and start_sheet() and remove write_header() in your dataformat.'); $this->dataformat->write_header($this->columns); } else { $this->dataformat->start_sheet($this->columns); } } /** * Add a row of data * * @param array $row One record of data */ public function add_data($row) { if (!$this->supports_html()) { $row = $this->format_data($row); } $this->dataformat->write_record($row, $this->rownum++); return true; } /** * Finish export */ public function finish_table() { if (method_exists($this->dataformat, 'write_footer')) { error_log('The function write_footer() does not support multiple sheets. In order to support multiple sheets you ' . 'must implement close_sheet() and close_output() and remove write_footer() in your dataformat.'); $this->dataformat->write_footer($this->columns); } else { $this->dataformat->close_sheet($this->columns); } } /** * Finish download */ public function finish_document() { $this->dataformat->close_output(); exit(); } } // Alias this class to the old name. // This file will be autoloaded by the legacyclasses autoload system. // In future all uses of this class will be corrected and the legacy references will be removed. class_alias(dataformat_export_format::class, \table_dataformat_export_format::class);