123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- <?php
-
- /*
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
- use League\Csv\Writer;
- use League\Csv\HTMLConverter;
- use odsPhpGenerator\ods;
- use odsPhpGenerator\odsTable;
- use odsPhpGenerator\odsTableRow;
- use odsPhpGenerator\odsTableColumn;
- use odsPhpGenerator\odsTableCellString;
- use odsPhpGenerator\odsStyleTableColumn;
- use odsPhpGenerator\odsStyleTableCell;
-
- class Report {
-
- private $title = "";
- private $header = [];
- private $data = [];
-
- public function __construct(string $title = "", array $header = [], array $data = []) {
- $this->title = $title;
- $this->header = $header;
- $this->data = $data;
- }
-
- public function setHeader(array $header) {
- $this->header = $header;
- }
-
- public function addDataRow(array $columns) {
- $this->data[] = $columns;
- }
-
- public function getHeader(): array {
- return $this->header;
- }
-
- public function getData(): array {
- return $this->data;
- }
-
- public function output(string $format) {
- switch ($format) {
- case "ods":
- $this->toODS();
- break;
- case "html":
- $this->toHTML();
- break;
- case "csv":
- default:
- $this->toCSV();
- break;
- }
- }
-
- private function toODS() {
- $ods = new ods();
- $styleColumn = new odsStyleTableColumn();
- $styleColumn->setUseOptimalColumnWidth(true);
- $headerstyle = new odsStyleTableCell();
- $headerstyle->setFontWeight("bold");
- $table = new odsTable($this->title);
-
- for ($i = 0; $i < count($this->header); $i++) {
- $table->addTableColumn(new odsTableColumn($styleColumn));
- }
-
- $row = new odsTableRow();
- foreach ($this->header as $cell) {
- $row->addCell(new odsTableCellString($cell, $headerstyle));
- }
- $table->addRow($row);
-
- foreach ($this->data as $cols) {
- $row = new odsTableRow();
- foreach ($cols as $cell) {
- $row->addCell(new odsTableCellString($cell));
- }
- $table->addRow($row);
- }
- $ods->addTable($table);
- // The @ is a workaround to silence the tempnam notice,
- // which breaks the file. This is apparently the intended behavior:
- // https://bugs.php.net/bug.php?id=69489
- @$ods->downloadOdsFile($this->title . "_" . date("Y-m-d_Hi") . ".ods");
- }
-
- private function toHTML() {
- global $SECURE_NONCE;
- $data = array_merge([$this->header], $this->data);
- // HTML exporter doesn't like null values
- for ($i = 0; $i < count($data); $i++) {
- for ($j = 0; $j < count($data[$i]); $j++) {
- if (is_null($data[$i][$j])) {
- $data[$i][$j] = '';
- }
- }
- }
- header('Content-type: text/html');
- $converter = new HTMLConverter();
- $out = "<!DOCTYPE html>\n"
- . "<meta charset=\"utf-8\">\n"
- . "<meta name=\"viewport\" content=\"width=device-width\">\n"
- . "<title>" . $this->title . "_" . date("Y-m-d_Hi") . "</title>\n"
- . <<<STYLE
- <style nonce="$SECURE_NONCE">
- .table-csv-data {
- border-collapse: collapse;
- }
- .table-csv-data tr:first-child {
- font-weight: bold;
- }
- .table-csv-data tr td {
- border: 1px solid black;
- }
- </style>
- STYLE
- . $converter->convert($data);
- echo $out;
- }
-
- private function toCSV() {
- $csv = Writer::createFromString('');
- $data = array_merge([$this->header], $this->data);
- $csv->insertAll($data);
- header('Content-type: text/csv');
- header('Content-Disposition: attachment; filename="' . $this->title . "_" . date("Y-m-d_Hi") . ".csv" . '"');
- echo $csv;
- }
-
- }
|