Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.
   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
   4  
   5  use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
   6  use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
   7  use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column;
   8  use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
   9  use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet as ActualWorksheet;
  10  
  11  class AutoFilter extends WriterPart
  12  {
  13      /**
  14       * Write AutoFilter.
  15       */
  16      public static function writeAutoFilter(XMLWriter $objWriter, ActualWorksheet $worksheet): void
  17      {
  18          $autoFilterRange = $worksheet->getAutoFilter()->getRange();
  19          if (!empty($autoFilterRange)) {
  20              // autoFilter
  21              $objWriter->startElement('autoFilter');
  22  
  23              // Strip any worksheet reference from the filter coordinates
  24              $range = Coordinate::splitRange($autoFilterRange);
  25              $range = $range[0];
  26              //    Strip any worksheet ref
  27              [$ws, $range[0]] = ActualWorksheet::extractSheetTitle($range[0], true);
  28              $range = implode(':', $range);
  29  
  30              $objWriter->writeAttribute('ref', str_replace('$', '', $range));
  31  
  32              $columns = $worksheet->getAutoFilter()->getColumns();
  33              if (count($columns) > 0) {
  34                  foreach ($columns as $columnID => $column) {
  35                      $colId = $worksheet->getAutoFilter()->getColumnOffset($columnID);
  36                      self::writeAutoFilterColumn($objWriter, $column, $colId);
  37                  }
  38              }
  39              $objWriter->endElement();
  40          }
  41      }
  42  
  43      /**
  44       * Write AutoFilter's filterColumn.
  45       */
  46      public static function writeAutoFilterColumn(XMLWriter $objWriter, Column $column, int $colId): void
  47      {
  48          $rules = $column->getRules();
  49          if (count($rules) > 0) {
  50              $objWriter->startElement('filterColumn');
  51              $objWriter->writeAttribute('colId', "$colId");
  52  
  53              $objWriter->startElement($column->getFilterType());
  54              if ($column->getJoin() == Column::AUTOFILTER_COLUMN_JOIN_AND) {
  55                  $objWriter->writeAttribute('and', '1');
  56              }
  57  
  58              foreach ($rules as $rule) {
  59                  self::writeAutoFilterColumnRule($column, $rule, $objWriter);
  60              }
  61  
  62              $objWriter->endElement();
  63  
  64              $objWriter->endElement();
  65          }
  66      }
  67  
  68      /**
  69       * Write AutoFilter's filterColumn Rule.
  70       */
  71      private static function writeAutoFilterColumnRule(Column $column, Rule $rule, XMLWriter $objWriter): void
  72      {
  73          if (
  74              ($column->getFilterType() === Column::AUTOFILTER_FILTERTYPE_FILTER) &&
  75              ($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&
  76              ($rule->getValue() === '')
  77          ) {
  78              //    Filter rule for Blanks
  79              $objWriter->writeAttribute('blank', '1');
  80          } elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
  81              //    Dynamic Filter Rule
  82              $objWriter->writeAttribute('type', $rule->getGrouping());
  83              $val = $column->getAttribute('val');
  84              if ($val !== null) {
  85                  $objWriter->writeAttribute('val', "$val");
  86              }
  87              $maxVal = $column->getAttribute('maxVal');
  88              if ($maxVal !== null) {
  89                  $objWriter->writeAttribute('maxVal', "$maxVal");
  90              }
  91          } elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
  92              //    Top 10 Filter Rule
  93              $ruleValue = $rule->getValue();
  94              if (!is_array($ruleValue)) {
  95                  $objWriter->writeAttribute('val', "$ruleValue");
  96              }
  97              $objWriter->writeAttribute('percent', (($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));
  98              $objWriter->writeAttribute('top', (($rule->getGrouping() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1' : '0'));
  99          } else {
 100              //    Filter, DateGroupItem or CustomFilter
 101              $objWriter->startElement($rule->getRuleType());
 102  
 103              if ($rule->getOperator() !== Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
 104                  $objWriter->writeAttribute('operator', $rule->getOperator());
 105              }
 106              if ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
 107                  // Date Group filters
 108                  $ruleValue = $rule->getValue();
 109                  if (is_array($ruleValue)) {
 110                      foreach ($ruleValue as $key => $value) {
 111                          $objWriter->writeAttribute($key, "$value");
 112                      }
 113                  }
 114                  $objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());
 115              } else {
 116                  $ruleValue = $rule->getValue();
 117                  if (!is_array($ruleValue)) {
 118                      $objWriter->writeAttribute('val', "$ruleValue");
 119                  }
 120              }
 121  
 122              $objWriter->endElement();
 123          }
 124      }
 125  }