forked from vergnet/site-accueil-insa
195 lines
5.6 KiB
PHP
195 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* Matomo - free/libre analytics platform
|
|
*
|
|
* @link https://matomo.org
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*
|
|
*/
|
|
namespace Piwik\DataTable\Renderer;
|
|
|
|
use Exception;
|
|
use Piwik\DataTable;
|
|
use Piwik\DataTable\DataTableInterface;
|
|
use Piwik\DataTable\Renderer;
|
|
|
|
/**
|
|
* Simple HTML output
|
|
* Does not work with recursive DataTable (i.e., when a row can be associated with a subDataTable).
|
|
*
|
|
*/
|
|
class Html extends Renderer
|
|
{
|
|
protected $tableId;
|
|
protected $allColumns;
|
|
protected $tableStructure;
|
|
protected $i;
|
|
|
|
/**
|
|
* Sets the table id
|
|
*
|
|
* @param string $id
|
|
*/
|
|
public function setTableId($id)
|
|
{
|
|
$this->tableId = str_replace('.', '_', $id);
|
|
}
|
|
|
|
/**
|
|
* Computes the dataTable output and returns the string/binary
|
|
*
|
|
* @return string
|
|
*/
|
|
public function render()
|
|
{
|
|
$this->tableStructure = array();
|
|
$this->allColumns = array();
|
|
$this->i = 0;
|
|
|
|
return $this->renderTable($this->table);
|
|
}
|
|
|
|
/**
|
|
* Computes the output for the given data table
|
|
*
|
|
* @param DataTableInterface $table
|
|
* @return string
|
|
*/
|
|
protected function renderTable($table)
|
|
{
|
|
if (is_array($table)) {
|
|
// convert array to DataTable
|
|
|
|
$table = DataTable::makeFromSimpleArray($table);
|
|
}
|
|
|
|
if ($table instanceof DataTable\Map) {
|
|
foreach ($table->getDataTables() as $date => $subtable) {
|
|
if ($subtable->getRowsCount()) {
|
|
$this->buildTableStructure($subtable, '_' . $table->getKeyName(), $date);
|
|
}
|
|
}
|
|
} else {
|
|
// Simple
|
|
|
|
if ($table->getRowsCount()) {
|
|
$this->buildTableStructure($table);
|
|
}
|
|
}
|
|
|
|
$out = $this->renderDataTable();
|
|
return $out;
|
|
}
|
|
|
|
/**
|
|
* Adds the given data table to the table structure array
|
|
*
|
|
* @param DataTable $table
|
|
* @param null|string $columnToAdd
|
|
* @param null|string $valueToAdd
|
|
* @throws Exception
|
|
*/
|
|
protected function buildTableStructure($table, $columnToAdd = null, $valueToAdd = null)
|
|
{
|
|
$i = $this->i;
|
|
$someMetadata = false;
|
|
$someIdSubTable = false;
|
|
|
|
/*
|
|
* table = array
|
|
* ROW1 = col1 | col2 | col3 | metadata | idSubTable
|
|
* ROW2 = col1 | col2 (no value but appears) | col3 | metadata | idSubTable
|
|
*/
|
|
if (!($table instanceof DataTable)) {
|
|
throw new Exception("HTML Renderer does not work with this combination of parameters");
|
|
}
|
|
foreach ($table->getRows() as $row) {
|
|
if (isset($columnToAdd) && isset($valueToAdd)) {
|
|
$this->allColumns[$columnToAdd] = true;
|
|
$this->tableStructure[$i][$columnToAdd] = $valueToAdd;
|
|
}
|
|
|
|
foreach ($row->getColumns() as $column => $value) {
|
|
$this->allColumns[$column] = true;
|
|
$this->tableStructure[$i][$column] = $value;
|
|
}
|
|
|
|
$metadata = array();
|
|
foreach ($row->getMetadata() as $name => $value) {
|
|
if (is_string($value)) {
|
|
$value = "'$value'";
|
|
} else if (is_array($value)) {
|
|
$value = var_export($value, true);
|
|
} else if ($value instanceof DataTable\DataTableInterface) {
|
|
$value = $this->renderTable($value);
|
|
}
|
|
$metadata[] = "'$name' => $value";
|
|
}
|
|
|
|
if (count($metadata) != 0) {
|
|
$someMetadata = true;
|
|
$metadata = implode("<br />", $metadata);
|
|
$this->tableStructure[$i]['_metadata'] = $metadata;
|
|
}
|
|
|
|
$idSubtable = $row->getIdSubDataTable();
|
|
if (!is_null($idSubtable)) {
|
|
$someIdSubTable = true;
|
|
$this->tableStructure[$i]['_idSubtable'] = $idSubtable;
|
|
}
|
|
|
|
$i++;
|
|
}
|
|
$this->i = $i;
|
|
|
|
$this->allColumns['_metadata'] = $someMetadata;
|
|
$this->allColumns['_idSubtable'] = $someIdSubTable;
|
|
}
|
|
|
|
/**
|
|
* Computes the output for the table structure array
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function renderDataTable()
|
|
{
|
|
$html = "<table " . ($this->tableId ? "id=\"{$this->tableId}\" " : "") . "border=\"1\">\n<thead>\n\t<tr>\n";
|
|
|
|
foreach ($this->allColumns as $name => $toDisplay) {
|
|
if ($toDisplay !== false) {
|
|
if ($name === 0) {
|
|
$name = 'value';
|
|
}
|
|
if ($this->translateColumnNames) {
|
|
$name = $this->translateColumnName($name);
|
|
}
|
|
$html .= "\t\t<th>$name</th>\n";
|
|
}
|
|
}
|
|
|
|
$html .= "\t</tr>\n</thead>\n<tbody>\n";
|
|
|
|
foreach ($this->tableStructure as $row) {
|
|
$html .= "\t<tr>\n";
|
|
foreach ($this->allColumns as $name => $toDisplay) {
|
|
if ($toDisplay !== false) {
|
|
$value = "-";
|
|
if (isset($row[$name])) {
|
|
if (is_array($row[$name])) {
|
|
$value = "<pre>" . self::formatValueXml(var_export($row[$name], true)) . "</pre>";
|
|
} else {
|
|
$value = self::formatValueXml($row[$name]);
|
|
}
|
|
}
|
|
|
|
$html .= "\t\t<td>$value</td>\n";
|
|
}
|
|
}
|
|
$html .= "\t</tr>\n";
|
|
}
|
|
|
|
$html .= "</tbody>\n</table>\n";
|
|
|
|
return $html;
|
|
}
|
|
}
|