Update table.php

This commit is contained in:
Alessandro Ferro 2022-07-19 09:07:55 +02:00
parent 3c972be8fa
commit 95822c8bb2
1 changed files with 92 additions and 23 deletions

View File

@ -1,25 +1,70 @@
<?php <?php
/**
* PhpXpress
*
* @see https://github.com/xfarrow/phpxpress The PhpXpress GitHub project
*
* @author Alessandro Ferro <>
* @note This program is distributed in the hope that it will be useful - WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*/
include "include.php"; include "include.php";
class Table{ class Table{
// Structure /* === Structure === */
/**
* The datasource to provdide to the table.
* Must be an array of arrays or an array of objects.
*
* @var array
*/
private $dataSource; private $dataSource;
/**
* The column captions
*
* @var array
*/
private $columnCaptions; private $columnCaptions;
/**
* The columns to make invisible.
* The column whose name is a key of the array
* of the datasource, will not be shown.
*
* @var array
*/
private $invisible_columns; private $invisible_columns;
// Events /* === Events === */
private $onValueDisplayingFunctionName; private $onValueDisplayingFunctionName;
// Layout /* === Layout === */
private $darkTheme = false; private $darkTheme = false;
private $stripedRows = false; private $stripedRows = false;
private $bordered = false; private $bordered = false;
private $hoverAnimation = false; private $hoverAnimation = false;
private $small = false; private $small = false;
// other /* === Other === */
/**
* If pedantic_type_check is set to true, check
* if the datasource's elements are all arrays
* or all objects. A mix of them will lead
* to unexpected results
*/
private $pedantic_type_check = false; private $pedantic_type_check = false;
/**
* Draw the Table.
*
* @return void
*/
function draw(){ function draw(){
if(!isset($this->dataSource)){ if(!isset($this->dataSource)){
@ -36,15 +81,16 @@
echo "<table class = '$tableClass'>"; echo "<table class = '$tableClass'>";
/* /**
** **
** management of invisible columns. ** management of invisible columns.
** **
** $this->invisible_columns is an array containing the name ** $this->invisible_columns is an array containing the name
** of the key values of the array/object not to be displayed. ** of the key of the array/object not to be displayed.
** **
** $invisible_column_captions is an array holding the column ** $invisible_column_captions is an array holding the column
** captions of the columns to be removed. ** captions of the columns to be removed, since the column captions
** might differ from the keys of the array/object [when using setCustomCaptions()].
*/ */
if(!empty($this->invisible_columns)){ if(!empty($this->invisible_columns)){
if(is_array($this->dataSource[0])){ if(is_array($this->dataSource[0])){
@ -64,6 +110,7 @@
// Print head // Print head
echo '<thead><tr>'; echo '<thead><tr>';
foreach($this->columnCaptions as $caption){ foreach($this->columnCaptions as $caption){
// do not show column head if it's hidden
if( isset($invisible_columns_captions) && in_array($caption, $invisible_columns_captions)) if( isset($invisible_columns_captions) && in_array($caption, $invisible_columns_captions))
continue; continue;
@ -76,16 +123,15 @@
foreach($this->dataSource as $obj){ foreach($this->dataSource as $obj){
echo '<tr>'; echo '<tr>';
foreach ($obj as $name => $value) { foreach ($obj as $name => $value) {
// do not show column value if it's hidden
if(!empty($this->invisible_columns) && in_array($name, $this->invisible_columns)){ if(!empty($this->invisible_columns) && in_array($name, $this->invisible_columns)){
continue; continue;
} }
// fire event onValueDisplaying
if(isset( $this -> onValueDisplayingFunctionName)){ if(isset( $this -> onValueDisplayingFunctionName)){
call_user_func_array($this -> onValueDisplayingFunctionName , array($name, &$value, (array)$obj)); call_user_func_array($this -> onValueDisplayingFunctionName , array($name, &$value, (array)$obj));
} }
echo '<td>' . $value . '</td>'; echo '<td>' . $value . '</td>';
} }
echo '</tr>'; echo '</tr>';
} }
@ -93,9 +139,14 @@
} }
/* /**
** Datasource can be either an array of object(s) or * Set the table's datasource.
** an array of array(s). * Datasource can be either an array of object(s) or
* an array of array(s).
*
* @param array $datasource An array of arrays or an array of objects.
*
* @return void
*/ */
function setDataSource(Array $dataSource){ function setDataSource(Array $dataSource){
if(empty($dataSource)) if(empty($dataSource))
@ -134,9 +185,9 @@
} }
} }
/* /**
** If one or more addColumn() were called before setting the datasource, * If one or more addColumn() were called before setting the datasource,
** we should add those columns in the source. * we should add those columns in the source.
*/ */
if(isset($this -> columnCaptions)){ if(isset($this -> columnCaptions)){
foreach($dataSource as &$row){ foreach($dataSource as &$row){
@ -165,6 +216,12 @@
} }
} }
/**
* By default, the columns' captions will be the keys of the
* array or object provided.
*
* You can override them by setting custom captions.
*/
function setCustomCaptions(Array $captions){ function setCustomCaptions(Array $captions){
if(empty($this->dataSource)) if(empty($this->dataSource))
@ -180,6 +237,12 @@
Provided: ' . $provided . "; Expected: " . $expected); Provided: ' . $provided . "; Expected: " . $expected);
} }
/**
* Add columns to the table (setting it before or after the datasource
* will show the column before or after the datasource)
*
* @param string $captionName The name of the new column
*/
function addColumn($captionName){ function addColumn($captionName){
if(isset($this->columnCaptions)){ if(isset($this->columnCaptions)){
@ -197,16 +260,22 @@
} }
} }
/* /**
** Expected $column_name: the key of the column to remove. * Expected $column_name: the column to remove. To be called after the datasource
** * is set.
** Making a column invisible, rather than removing it from the datasource, might *
** be useful in those circumstances where a value is needed in the datasource * Making a column invisible, rather than removing it from the datasource, might
** or in the onValueDisplaying, without actually removing it. * be useful in those circumstances where a value is needed in the datasource
** * or in the onValueDisplaying, without actually removing it.
*
* @param string $column_name: the column to remove.
*
*/ */
function invisible_column($column_name){ function invisible_column($column_name){
if(!isset($this->dataSource))
throw new BadFunctionCallException('Unable to call invisible_column() if the datasource is not set');
if(is_array($this->dataSource[0])){ if(is_array($this->dataSource[0])){
$array_keys = array_keys($this -> dataSource[0]); $array_keys = array_keys($this -> dataSource[0]);
} }