Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 401 and 402] [Versions 401 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Common Spout class for dataformat.
  19   *
  20   * @package    core
  21   * @subpackage dataformat
  22   * @copyright  2016 Brendan Heywood (brendan@catalyst-au.net)
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  namespace core\dataformat;
  27  
  28  /**
  29   * Common Spout class for dataformat.
  30   *
  31   * @package    core
  32   * @subpackage dataformat
  33   * @copyright  2016 Brendan Heywood (brendan@catalyst-au.net)
  34   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  35   */
  36  abstract class spout_base extends \core\dataformat\base {
  37  
  38      /** @var $spouttype */
  39      protected $spouttype = '';
  40  
  41      /** @var $writer */
  42      protected $writer;
  43  
  44      /** @var $sheettitle */
  45      protected $sheettitle;
  46  
  47      /** @var $renamecurrentsheet */
  48      protected $renamecurrentsheet = false;
  49  
  50      /**
  51       * Output file headers to initialise the download of the file.
  52       */
  53      public function send_http_headers() {
  54          $this->writer = \Box\Spout\Writer\Common\Creator\WriterEntityFactory::createWriter($this->spouttype);
  55          if (method_exists($this->writer, 'setTempFolder')) {
  56              $this->writer->setTempFolder(make_request_directory());
  57          }
  58          $filename = $this->filename . $this->get_extension();
  59          if (PHPUNIT_TEST) {
  60              $this->writer->openToFile('php://output');
  61          } else {
  62              $this->writer->openToBrowser($filename);
  63          }
  64  
  65          // By default one sheet is always created, but we want to rename it when we call start_sheet().
  66          $this->renamecurrentsheet = true;
  67      }
  68  
  69      /**
  70       * Set the dataformat to be output to current file
  71       */
  72      public function start_output_to_file(): void {
  73          $this->writer = \Box\Spout\Writer\Common\Creator\WriterEntityFactory::createWriter($this->spouttype);
  74          if (method_exists($this->writer, 'setTempFolder')) {
  75              $this->writer->setTempFolder(make_request_directory());
  76          }
  77  
  78          $this->writer->openToFile($this->filepath);
  79  
  80          // By default one sheet is always created, but we want to rename it when we call start_sheet().
  81          $this->renamecurrentsheet = true;
  82  
  83          $this->start_output();
  84      }
  85  
  86      /**
  87       * Set the title of the worksheet inside a spreadsheet
  88       *
  89       * For some formats this will be ignored.
  90       *
  91       * @param string $title
  92       */
  93      public function set_sheettitle($title) {
  94          $this->sheettitle = $title;
  95      }
  96  
  97      /**
  98       * Write the start of the sheet we will be adding data to.
  99       *
 100       * @param array $columns
 101       */
 102      public function start_sheet($columns) {
 103          if ($this->sheettitle && $this->writer instanceof \Box\Spout\Writer\WriterMultiSheetsAbstract) {
 104              if ($this->renamecurrentsheet) {
 105                  $sheet = $this->writer->getCurrentSheet();
 106                  $this->renamecurrentsheet = false;
 107              } else {
 108                  $sheet = $this->writer->addNewSheetAndMakeItCurrent();
 109              }
 110              $sheet->setName($this->sheettitle);
 111          }
 112          $row = \Box\Spout\Writer\Common\Creator\WriterEntityFactory::createRowFromArray((array)$columns);
 113          $this->writer->addRow($row);
 114      }
 115  
 116      /**
 117       * Write a single record
 118       *
 119       * @param array $record
 120       * @param int $rownum
 121       */
 122      public function write_record($record, $rownum) {
 123          $row = \Box\Spout\Writer\Common\Creator\WriterEntityFactory::createRowFromArray($this->format_record($record));
 124          $this->writer->addRow($row);
 125      }
 126  
 127      /**
 128       * Write the end of the file.
 129       */
 130      public function close_output() {
 131          $this->writer->close();
 132          $this->writer = null;
 133      }
 134  
 135      /**
 136       * Write data to disk
 137       *
 138       * @return bool
 139       */
 140      public function close_output_to_file(): bool {
 141          $this->close_output();
 142  
 143          return true;
 144      }
 145  }