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 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Writer\Ods;
   4  
   5  use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
   6  use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
   7  use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
   8  use PhpOffice\PhpSpreadsheet\Spreadsheet;
   9  use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  10  
  11  class Settings extends WriterPart
  12  {
  13      /**
  14       * Write settings.xml to XML format.
  15       *
  16       * @return string XML Output
  17       */
  18      public function write(): string
  19      {
  20          if ($this->getParentWriter()->getUseDiskCaching()) {
  21              $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  22          } else {
  23              $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
  24          }
  25  
  26          // XML header
  27          $objWriter->startDocument('1.0', 'UTF-8');
  28  
  29          // Settings
  30          $objWriter->startElement('office:document-settings');
  31          $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');
  32          $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
  33          $objWriter->writeAttribute('xmlns:config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0');
  34          $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');
  35          $objWriter->writeAttribute('office:version', '1.2');
  36  
  37          $objWriter->startElement('office:settings');
  38          $objWriter->startElement('config:config-item-set');
  39          $objWriter->writeAttribute('config:name', 'ooo:view-settings');
  40          $objWriter->startElement('config:config-item-map-indexed');
  41          $objWriter->writeAttribute('config:name', 'Views');
  42          $objWriter->startElement('config:config-item-map-entry');
  43          $spreadsheet = $this->getParentWriter()->getSpreadsheet();
  44  
  45          $objWriter->startElement('config:config-item');
  46          $objWriter->writeAttribute('config:name', 'ViewId');
  47          $objWriter->writeAttribute('config:type', 'string');
  48          $objWriter->text('view1');
  49          $objWriter->endElement(); // ViewId
  50          $objWriter->startElement('config:config-item-map-named');
  51  
  52          $this->writeAllWorksheetSettings($objWriter, $spreadsheet);
  53  
  54          $wstitle = $spreadsheet->getActiveSheet()->getTitle();
  55          $objWriter->startElement('config:config-item');
  56          $objWriter->writeAttribute('config:name', 'ActiveTable');
  57          $objWriter->writeAttribute('config:type', 'string');
  58          $objWriter->text($wstitle);
  59          $objWriter->endElement(); // config:config-item ActiveTable
  60  
  61          $objWriter->endElement(); // config:config-item-map-entry
  62          $objWriter->endElement(); // config:config-item-map-indexed Views
  63          $objWriter->endElement(); // config:config-item-set ooo:view-settings
  64          $objWriter->startElement('config:config-item-set');
  65          $objWriter->writeAttribute('config:name', 'ooo:configuration-settings');
  66          $objWriter->endElement(); // config:config-item-set ooo:configuration-settings
  67          $objWriter->endElement(); // office:settings
  68          $objWriter->endElement(); // office:document-settings
  69  
  70          return $objWriter->getData();
  71      }
  72  
  73      private function writeAllWorksheetSettings(XMLWriter $objWriter, Spreadsheet $spreadsheet): void
  74      {
  75          $objWriter->writeAttribute('config:name', 'Tables');
  76  
  77          foreach ($spreadsheet->getWorksheetIterator() as $worksheet) {
  78              $this->writeWorksheetSettings($objWriter, $worksheet);
  79          }
  80  
  81          $objWriter->endElement(); // config:config-item-map-entry Tables
  82      }
  83  
  84      private function writeWorksheetSettings(XMLWriter $objWriter, Worksheet $worksheet): void
  85      {
  86          $objWriter->startElement('config:config-item-map-entry');
  87          $objWriter->writeAttribute('config:name', $worksheet->getTitle());
  88  
  89          $this->writeSelectedCells($objWriter, $worksheet);
  90          if ($worksheet->getFreezePane() !== null) {
  91              $this->writeFreezePane($objWriter, $worksheet);
  92          }
  93  
  94          $objWriter->endElement(); // config:config-item-map-entry Worksheet
  95      }
  96  
  97      private function writeSelectedCells(XMLWriter $objWriter, Worksheet $worksheet): void
  98      {
  99          $selected = $worksheet->getSelectedCells();
 100          if (preg_match('/^([a-z]+)([0-9]+)/i', $selected, $matches) === 1) {
 101              $colSel = Coordinate::columnIndexFromString($matches[1]) - 1;
 102              $rowSel = (int) $matches[2] - 1;
 103              $objWriter->startElement('config:config-item');
 104              $objWriter->writeAttribute('config:name', 'CursorPositionX');
 105              $objWriter->writeAttribute('config:type', 'int');
 106              $objWriter->text((string) $colSel);
 107              $objWriter->endElement();
 108              $objWriter->startElement('config:config-item');
 109              $objWriter->writeAttribute('config:name', 'CursorPositionY');
 110              $objWriter->writeAttribute('config:type', 'int');
 111              $objWriter->text((string) $rowSel);
 112              $objWriter->endElement();
 113          }
 114      }
 115  
 116      private function writeSplitValue(XMLWriter $objWriter, string $splitMode, string $type, string $value): void
 117      {
 118          $objWriter->startElement('config:config-item');
 119          $objWriter->writeAttribute('config:name', $splitMode);
 120          $objWriter->writeAttribute('config:type', $type);
 121          $objWriter->text($value);
 122          $objWriter->endElement();
 123      }
 124  
 125      private function writeFreezePane(XMLWriter $objWriter, Worksheet $worksheet): void
 126      {
 127          $freezePane = CellAddress::fromCellAddress($worksheet->getFreezePane());
 128          if ($freezePane->cellAddress() === 'A1') {
 129              return;
 130          }
 131  
 132          $columnId = $freezePane->columnId();
 133          $columnName = $freezePane->columnName();
 134          $row = $freezePane->rowId();
 135  
 136          $this->writeSplitValue($objWriter, 'HorizontalSplitMode', 'short', '2');
 137          $this->writeSplitValue($objWriter, 'HorizontalSplitPosition', 'int', (string) ($columnId - 1));
 138          $this->writeSplitValue($objWriter, 'PositionLeft', 'short', '0');
 139          $this->writeSplitValue($objWriter, 'PositionRight', 'short', (string) ($columnId - 1));
 140  
 141          for ($column = 'A'; $column !== $columnName; ++$column) {
 142              $worksheet->getColumnDimension($column)->setAutoSize(true);
 143          }
 144  
 145          $this->writeSplitValue($objWriter, 'VerticalSplitMode', 'short', '2');
 146          $this->writeSplitValue($objWriter, 'VerticalSplitPosition', 'int', (string) ($row - 1));
 147          $this->writeSplitValue($objWriter, 'PositionTop', 'short', '0');
 148          $this->writeSplitValue($objWriter, 'PositionBottom', 'short', (string) ($row - 1));
 149  
 150          $this->writeSplitValue($objWriter, 'ActiveSplitRange', 'short', '3');
 151      }
 152  }