tao-test/app/tao/helpers/grid/class.Grid.php

432 lines
11 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2008-2010 (original work) Deutsche Institut für Internationale Pädagogische Forschung (under the project TAO-TRANSFER);
* 2009-2012 (update and modification) Public Research Centre Henri Tudor (under the project TAO-SUSTAIN & TAO-DEV);
*
*/
/**
* Short description of class tao_helpers_grid_Grid
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @package tao
*/
class tao_helpers_grid_Grid
{
// --- ASSOCIATIONS ---
// --- ATTRIBUTES ---
/**
* Short description of attribute columns
*
* @access protected
* @var array
*/
protected $columns = [];
/**
* Short description of attribute rows
*
* @access protected
* @var array
*/
protected $rows = [];
/**
* Short description of attribute options
*
* @access protected
* @var array
*/
protected $options = [];
/**
* Short description of attribute columnsModel
*
* @access protected
* @var array
*/
protected $columnsModel = [];
// --- OPERATIONS ---
/**
* Short description of method __clone
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @return tao_helpers_grid_Grid
*/
public function __clone()
{
$returnValue = null;
return $returnValue;
}
/**
* Short description of method __construct
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param array options
* @return mixed
*/
public function __construct($options = [])
{
$this->options = $options;
}
/**
* Short description of method addColumn
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param string id
* @param string title
* @param array options
* @return tao_helpers_grid_Column
*/
public function addColumn($id, $title, $options = [])
{
$returnValue = null;
$replace = false;
if (isset($options['replace'])) {
$replace = $options['replace'];
unset($options['replace']);
}
if (!$replace && isset($this->columns[$id])) {
throw new common_Exception('the column with the id ' . $id . ' already exists');
} else {
$this->columns[$id] = new tao_helpers_grid_Column($id, $title, $options);
//set order as well:
$returnValue = true;
}
return $returnValue;
}
/**
* Short description of method removeColumn
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param string id
* @return boolean
*/
public function removeColumn($id)
{
$returnValue = (bool) false;
unset($this->columns[$id]);
$returnValue = true;
return (bool) $returnValue;
}
/**
* Short description of method addRow
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param string id
* @param array cells
* @param boolean replace
* @return boolean
*/
public function addRow($id, $cells = [], $replace = false)
{
$returnValue = (bool) false;
if (!$replace && isset($this->rows[$id])) {
throw new common_Exception('the row with the id ' . $id . ' already exists');
} else {
$this->rows[$id] = $cells;
//@TODO: implement a sort funciton?
$returnValue = true;
}
return (bool) $returnValue;
}
/**
* Short description of method removeRow
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param string id
* @return boolean
*/
public function removeRow($id)
{
$returnValue = (bool) false;
unset($this->rows[$id]);
$returnValue = true;
return (bool) $returnValue;
}
/**
* Short description of method setCellValue
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param string columnId
* @param string rowId
* @param string content string or Grid
* @param boolean forceCreation
* @return boolean
*/
public function setCellValue($columnId, $rowId, $content, $forceCreation = false)
{
$returnValue = (bool) false;
//TODO: for creating row and column if not exists?
if (isset($this->columns[$columnId])) {
if (isset($this->rows[$rowId])) {
$this->rows[$rowId][$columnId] = $content;
$returnValue = true;
}
}
return (bool) $returnValue;
}
/**
* Short description of method setColumnsAdapter
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param array columnIds
* @param Adapter adapter
* @return boolean
*/
public function setColumnsAdapter($columnIds, tao_helpers_grid_Cell_Adapter $adapter)
{
$returnValue = (bool) false;
if (is_string($columnIds)) {
$columnIds = [$columnIds];
}
if (is_array($columnIds)) {
foreach ($columnIds as $colId) {
if (!isset($this->columns[$colId]) || !$this->columns[$colId] instanceof tao_helpers_grid_Column) {
throw new common_Exception('cannot set the column\'s adapter : the column with the id ' . $colId . ' does not exist');
} else {
$returnValue = $this->columns[$colId]->setAdapter($adapter);
}
}
}
return (bool) $returnValue;
}
/**
* Short description of method toArray
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @return array
*/
public function toArray()
{
$returnValue = [];
//sort columns:
$this->sortColumns();
foreach ($this->rows as $rowId => $cells) {
$returnValue[$rowId] = [];
foreach ($this->columns as $columnId => $column) {
if ($column->hasAdapter()) {
//fill content with adapter:
$data = null;
if (isset($returnValue[$rowId][$columnId])) {
$data = $returnValue[$rowId][$columnId];
} elseif (isset($cells[$columnId])) {
$data = $cells[$columnId];
}
$returnValue[$rowId][$columnId] = $column->getAdaptersData($rowId, $data);
} elseif (isset($cells[$columnId])) {
if ($cells[$columnId] instanceof tao_helpers_grid_Grid) {
$returnValue[$rowId][$columnId] = $cells[$columnId]->toArray();
} else {
$returnValue[$rowId][$columnId] = $cells[$columnId];
}
} else {
$returnValue[$rowId][$columnId] = null;//empty cell
}
}
}
return (array) $returnValue;
}
/**
* Short description of method sortColumns
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @return boolean
*/
public function sortColumns()
{
$returnValue = (bool) false;
return (bool) $returnValue;
}
/**
* Short description of method getColumns
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @return array
*/
public function getColumns()
{
$returnValue = [];
$returnValue = $this->columns;
return (array) $returnValue;
}
/**
* Short description of method getColumn
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param string id
* @return tao_helpers_grid_Column
*/
public function getColumn($id)
{
$returnValue = null;
if (isset($this->columns[$id]) && $this->columns[$id] instanceof tao_helpers_grid_Column) {
$returnValue = $this->columns[$id];
}
return $returnValue;
}
/**
* Short description of method getColumnsModel
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param boolean rebuild
* @return array
*/
public function getColumnsModel($rebuild = false)
{
$returnValue = [];
foreach ($this->columns as $column) {
if ($column instanceof tao_helpers_grid_Column) {
$returnValue[$column->getId()] = [
'id' => $column->getId(),
'title' => $column->getTitle(),
'type' => $column->getType()
];
foreach ($column->getOptions() as $optionsName => $optionValue) {
$returnValue[$column->getId()][$optionsName] = $optionValue;
}
if ($column->hasAdapter('tao_helpers_grid_Cell_SubgridAdapter')) {
$subGridAdapter = null;
$adapters = $column->getAdapters();
$adaptersLength = count($adapters);
for ($i = $adaptersLength - 1; $i >= 0; $i--) {
if ($adapters[$i] instanceof tao_helpers_grid_Cell_SubgridAdapter) {
$subGridAdapter = $adapters[$i];
break;
}
}
$returnValue[$column->getId()]['subgrids'] = $subGridAdapter->getGridContainer()->getGrid()->getColumnsModel();
}
}
}
return (array) $returnValue;
}
/**
* Short description of method setData
*
* @access public
* @author Cédric Alfonsi, <cedric.alfonsi@tudor.lu>
* @param array data
* @return mixed
*/
public function setData($data = [])
{
//empty local data
$this->rows = [];
//fill the local data
foreach ($data as $rowId => $cells) {
if (is_array($cells)) {
$this->addRow($rowId, $cells);
} elseif (is_string($cells)) {
$this->addRow($cells);
}
}
}
}