Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.

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

   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 = (object) [];
  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                      $creationDate = strtotime($propertyValue);
  59                      $docProps->setCreated($creationDate);
  60                      $docProps->setModified($creationDate);
  61  
  62                      break;
  63                  case 'description':
  64                      $docProps->setDescription($propertyValue);
  65  
  66                      break;
  67              }
  68          }
  69      }
  70  
  71      private function setMetaProperties(
  72          $namespacesMeta,
  73          SimpleXMLElement $propertyValue,
  74          $propertyName,
  75          DocumentProperties $docProps
  76      ): void {
  77          $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']);
  78          $propertyValue = (string) $propertyValue;
  79          switch ($propertyName) {
  80              case 'initial-creator':
  81                  $docProps->setCreator($propertyValue);
  82  
  83                  break;
  84              case 'keyword':
  85                  $docProps->setKeywords($propertyValue);
  86  
  87                  break;
  88              case 'creation-date':
  89                  $creationDate = strtotime($propertyValue);
  90                  $docProps->setCreated($creationDate);
  91  
  92                  break;
  93              case 'user-defined':
  94                  $this->setUserDefinedProperty($propertyValueAttributes, $propertyValue, $docProps);
  95  
  96                  break;
  97          }
  98      }
  99  
 100      private function setUserDefinedProperty($propertyValueAttributes, $propertyValue, DocumentProperties $docProps): void
 101      {
 102          $propertyValueName = '';
 103          $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING;
 104          foreach ($propertyValueAttributes as $key => $value) {
 105              if ($key == 'name') {
 106                  $propertyValueName = (string) $value;
 107              } elseif ($key == 'value-type') {
 108                  switch ($value) {
 109                      case 'date':
 110                          $propertyValue = DocumentProperties::convertProperty($propertyValue, 'date');
 111                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_DATE;
 112  
 113                          break;
 114                      case 'boolean':
 115                          $propertyValue = DocumentProperties::convertProperty($propertyValue, 'bool');
 116                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_BOOLEAN;
 117  
 118                          break;
 119                      case 'float':
 120                          $propertyValue = DocumentProperties::convertProperty($propertyValue, 'r4');
 121                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_FLOAT;
 122  
 123                          break;
 124                      default:
 125                          $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING;
 126                  }
 127              }
 128          }
 129  
 130          $docProps->setCustomProperty($propertyValueName, $propertyValue, $propertyValueType);
 131      }
 132  }