Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

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