Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.

Differences Between: [Versions 310 and 400] [Versions 311 and 400] [Versions 39 and 400] [Versions 400 and 401] [Versions 400 and 402] [Versions 400 and 403]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Reader\Ods;
   4  
   5  use PhpOffice\PhpSpreadsheet\Document\Properties as DocumentProperties;
   6  use PhpOffice\PhpSpreadsheet\Spreadsheet;
   7  use SimpleXMLElement;
   8  
   9  class Properties
  10  {
  11      private $spreadsheet;
  12  
  13      public function __construct(Spreadsheet $spreadsheet)
  14      {
  15          $this->spreadsheet = $spreadsheet;
  16      }
  17  
  18      public function load(SimpleXMLElement $xml, $namespacesMeta): void
  19      {
  20          $docProps = $this->spreadsheet->getProperties();
  21          $officeProperty = $xml->children($namespacesMeta['office']);
  22          foreach ($officeProperty as $officePropertyData) {
  23              // @var \SimpleXMLElement $officePropertyData
  24              if (isset($namespacesMeta['dc'])) {
  25                  $officePropertiesDC = $officePropertyData->children($namespacesMeta['dc']);
  26                  $this->setCoreProperties($docProps, $officePropertiesDC);
  27              }
  28  
  29              $officePropertyMeta = [];
  30              if (isset($namespacesMeta['dc'])) {
  31                  $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
  32              }
  33              foreach ($officePropertyMeta as $propertyName => $propertyValue) {
  34                  $this->setMetaProperties($namespacesMeta, $propertyValue, $propertyName, $docProps);
  35              }
  36          }
  37      }
  38  
  39      private function setCoreProperties(DocumentProperties $docProps, SimpleXMLElement $officePropertyDC): void
  40      {
  41          foreach ($officePropertyDC as $propertyName => $propertyValue) {
  42              $propertyValue = (string) $propertyValue;
  43              switch ($propertyName) {
  44                  case 'title':
  45                      $docProps->setTitle($propertyValue);
  46  
  47                      break;
  48                  case 'subject':
  49                      $docProps->setSubject($propertyValue);
  50  
  51                      break;
  52                  case 'creator':
  53                      $docProps->setCreator($propertyValue);
  54                      $docProps->setLastModifiedBy($propertyValue);
  55  
  56                      break;
  57                  case 'date':
  58                      $docProps->setModified($propertyValue);
  59  
  60                      break;
  61                  case 'description':
  62                      $docProps->setDescription($propertyValue);
  63  
  64                      break;
  65              }
  66          }
  67      }
  68  
  69      private function setMetaProperties(
  70          $namespacesMeta,
  71          SimpleXMLElement $propertyValue,
  72          $propertyName,
  73          DocumentProperties $docProps
  74      ): void {
  75          $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']);
  76          $propertyValue = (string) $propertyValue;
  77          switch ($propertyName) {
  78              case 'initial-creator':
  79                  $docProps->setCreator($propertyValue);
  80  
  81                  break;
  82              case 'keyword':
  83                  $docProps->setKeywords($propertyValue);
  84  
  85                  break;
  86              case 'creation-date':
  87                  $docProps->setCreated($propertyValue);
  88  
  89                  break;
  90              case 'user-defined':
  91                  $this->setUserDefinedProperty($propertyValueAttributes, $propertyValue, $docProps);
  92  
  93                  break;
  94          }
  95      }
  96  
  97      private function setUserDefinedProperty($propertyValueAttributes, $propertyValue, DocumentProperties $docProps): void
  98      {
  99          $propertyValueName = '';
 100          $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING;
 101          foreach ($propertyValueAttributes as $key => $value) {
 102              if ($key == 'name') {
 103                  $propertyValueName = (string) $value;
 104              } elseif ($key == 'value-type') {
 105                  switch ($value) {
 106                      case 'date':
 107                          $propertyValue = DocumentProperties::convertProperty($propertyValue, 'date');
 108                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_DATE;
 109  
 110                          break;
 111                      case 'boolean':
 112                          $propertyValue = DocumentProperties::convertProperty($propertyValue, 'bool');
 113                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_BOOLEAN;
 114  
 115                          break;
 116                      case 'float':
 117                          $propertyValue = DocumentProperties::convertProperty($propertyValue, 'r4');
 118                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_FLOAT;
 119  
 120                          break;
 121                      default:
 122                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING;
 123                  }
 124              }
 125          }
 126  
 127          $docProps->setCustomProperty($propertyValueName, $propertyValue, $propertyValueType);
 128      }
 129  }