Viewing file: Matrix.php (7.53 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/** * Main HTML_Table_Matrix class * * PHP versions 4 and 5 * * LICENSE: This source file is subject to version 3.0 of the PHP license * that is available through the world-wide-web at the following URI: * http://www.php.net/license/3_0.txt. If you did not receive a copy of * the PHP License and are unable to obtain it through the web, please * send a note to license@php.net so we can mail you a copy immediately. * * @package HTML_Table_Matrix * @author Ian Eure <ieure@php.net> * @version Release: @package_version@ * @version CVS: $Revision: 1.4 $ * @copyright (c) 2003-2005 Ian Eure * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @link http://pear.php.net/package/html_table_matrix/ * @see HTML_Table */
require_once 'PEAR.php'; require_once 'HTML/Table.php'; require_once 'HTML/Table/Matrix/Filler.php';
/** * Fills a HTML table with data. * * Simple usage: * * // This is the data to put in the table. * $data = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', * 'nine', 'ten'); * $m = &new HTML_Table_Matrix; * $m->setData($data); * // Pick a filler class. We use the stock left-to-right-top-to-bottom here. * $f = &HTML_Table_Matrix_Filler::factory('LRTB'); * $m->accept($f); * // Make the table 2 rows deep by 5 cols wide * $m->setTableSize(2, 5); * // Output the table. * print $m->toHtml(); * * * @package HTML_Table_Matrix * @category HTML * @author Ian Eure <ieure@php.net> * @version Release: @package_version@ * @version CVS: $Revision: 1.4 $ * @copyright (c) 2003-2005 Ian Eure * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @link http://pear.php.net/package/html_table_matrix/ * @see HTML_Table */ class HTML_Table_Matrix extends HTML_Table {
/** * The filler * * @type object * @access private * @see accept() */ var $_filler = '';
/** * The row to start filling at. Useful if you want to put other stuff in * the table. * * @access private * @var int * @see setFillStart() */ var $_fillStartRow = 0;
/** * The column to start filling at. Useful if you want to put other stuff in * the table. * * @access private * @var int * @see setFillStart() */ var $_fillStartCol = 0;
/** * The number of rows in the table. 0 = Undefined. * * @access private * @var int * @see setTableSize() */ var $_rows = 0;
/** * The number of columns in the table. 0 = Undefined. * * @access private * @var int * @see setTableSize() */ var $_cols = 10;
/** * Has the table been filled? * * @access private * @var boolean */ var $_isFilled = FALSE;
/** * Data to fill table with * * @access private * @var array * @see setData() */ var $_data = array();
/** * Sets data to fill table with. * * @return void * @param array $data 1-dimensional array of matrix data */ function setData(&$data) { $this->_data = $data; }
/** * Set the row & column to start filling at. * * Defaults to (0,0), which is the upper-left corner of the table. Setting * this to a larger value will leave other cells empty, e.g. if you want to * add a header or other information in the table in addition to the matrix * data. * * @param int $row Row to start filling at * @param int $col Column to start filling at * @return void */ function setFillStart($row, $col) { $this->_fillStartRow = $row; $this->_fillStartCol = $col; }
/** * Set the size of the resulting table. * * The table will be forced to this size, regardless of whether or not * there is enough (or too much) data to fill it up. If the table size * (rows * cols) is smaller than the amount of data given to us, only * (rows * cols) items are laid out. * * @param int $rows Number of rows, or zero to auto-size. * @param int $cols Number of columns, or zero to auto-size. * @return void */ function setTableSize($rows = 0, $cols = 0) { $this->_rows = $rows; $this->_cols = $cols; }
/** * Return the total table size (w * h) * * @return int Table size * @access protected */ function _getTableSize() { if ($this->_cols == 0 || $this->_rows == 0) { return count($this->_data); } return $this->_rows * $this->_cols; }
/** * Accept a Filler */ function accept(&$filler) { if (!HTML_Table_Matrix_Filler::isValid($filler)) { return PEAR::raiseError("Provided filler is of the wrong class."); } $this->_filler = $filler; return true; }
/** * Calculates the size of the table based on the data provided. * * @access private * @return void * @see setData() */ function _calculateSize() { reset($this->_data); $n = count($this->_data);
if (!$this->_rows && $this->_cols) { $this->_rows = ceil($n / $this->_cols); } else if (!$this->_cols && $this->_rows) { $this->_cols = ceil($n / $this->_rows); } }
/** * Fills table with provided data. RL & BT modes are not implemented yet. * * This function does the actual laying out of the data into the table. * It isn't necessary to call this unless you want to add or change something * in the table, as toHtml() calls this automatically if the table has not * yet been filled with data. * * @return mixed boolean true on success, PEAR_Error otherwise * @see setData() */ function fillTable() { if (!HTML_Table_Matrix_Filler::isValid($this->_filler)) { return PEAR::raiseError("No Filler has been set."); }
$this->_calculateSize(); reset($this->_data); $size = $this->_getTableSize(); $this->_data = array_slice($this->_data, 0, $size); if (isset($this->_filler->callback)) { if (!is_callable($this->_filler->callback) || !is_array($cr = call_user_func($this->_filler->callback, $this->_data))) { return PEAR::raiseError("Invalid filler callback."); } $this->_data = $cr; } for ($i = $index = 0; $i < $size; $i++, $index++) { list($row, $col) = $this->_filler->next($index); $this->_fillCell($row, $col); }
$this->_isFilled = TRUE; return true; }
/** * Fills a cell with data. * * Note: this depends on the array pointer of $_data pointing at the * right item. Possibly not be the best way to handle this. * * @access private * @param int $row Row of cell to fill. * @param int $col Column of cell to fill. */ function _fillCell($row, $col) { list($null, $data) = each($this->_data); $this->setCellContents($row, $col, $data); }
/** * Returns HTML table. Calls fillTable() if the table has not already * been filled. * * @return string HTML Table * @see HTML_Table::toHtml() */ function toHtml() { if (!$this->_isFilled) { $this->fillTable(); }
return(parent::toHtml()); } } ?>
|