adaniel         Wed Mar 21 20:15:43 2001 EDT

  Added files:                 
    /php4/pear/HTML     Table.php 
  Log:
  original commit. class to create html tables
  

Index: php4/pear/HTML/Table.php
+++ php4/pear/HTML/Table.php
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Adam Daniel <[EMAIL PROTECTED]>                        |
// |          Bertrand Mansion <[EMAIL PROTECTED]>                                 |
// +----------------------------------------------------------------------+
//
// $Id: Table.php,v 1.1 2001/03/22 04:15:42 adaniel Exp $

require_once "PEAR.php";
require_once "HTML/Common.php";

/**
* Builds an HTML table
*
* @author               Adam Daniel <[EMAIL PROTECTED]>
* @author               Bertrand Mansion <[EMAIL PROTECTED]>
* @version              1.5
* @since                PHP 4.0.3pl1
*
* Example:
        $table = new HTML_Table;
        ...
*/
class HTML_Table extends HTML_Common {
        /**
        * Automatically adds a new row or column if a given row or column index does 
not exist
        * @var  bool
        * @access       private
        */
        var $_autoGrow = true;
        /**
        * Value to insert into empty cells
        * @var  string
        * @access       private
        */
        var $_autoFill = "&nbsp;";
        /**
        * Array containing the table structure
        * @var  array
        * @access       private
        */
        var $_structure = array();
        /**
        * Number of rows composing in the table
        * @var  int
        * @access       private
        */
        var $_rows = 0;
        /**
        * Number of column composing the table
        * @var  int
        * @access       private
        */
        var $_cols = 0;
        /**
        * Class constructor
        * @param        array   $attributes             Associative array of table tag 
attributes
    * @param    int     $tabOffset
        * @access       public
        */
        function HTML_Table($attributes=null, $tabOffset=0)
        {
        $commonVersion = 1.3;
        if (HTML_Common::apiVersion() < $commonVersion) {
            return new PEAR_Error("HTML_Table version " . $this->apiVersion() . " 
requires " .
                "HTML_Common version $commonVersion or greater.", 0, 
PEAR_ERROR_TRIGGER);
        }
                HTML_Common::HTML_Common($attributes, $tabOffset);
        }
        /**
        * Returns the API version
        * @access       public
    * @returns  double
        */
        function apiVersion()
        {
                return 1.5;
        }
        /**
        * Sets the table caption
        * @param        string  $caption
        * @param        mixed   $attributes             Associative array or string of 
table row attributes
        * @access       public
        */
        function setCaption($caption, $attributes=null)
        {
                $attributes = $this->_parseAttributes($attributes);
                $this->_structure["caption"] = array("attr"=>$attributes, 
"contents"=>$caption);
        }
    /**
    * Sets the autoFill value
    * @param    mixed   $fill
    * @access   public
    */
    function setAutoFill($fill)
    {
        $this->_autoFill = $fill;
    }
    /**
    * Returns the autoFill value
    * @access   public
    * @returns  mixed
    */
    function getAutoFill()
    {
        return $this->_autoFill;
    }
    /**
    * Sets the autoGrow value
    * @param    bool   $fill
    * @access   public
    */
    function setAutoGrow($grow)
    {
        $this->_autoGrow = $grow;
    }
    /**
    * Returns the autoGrow value
    * @access   public
    * @returns  mixed
    */
    function getAutoGrow()
    {
        return $this->_autoGrow;
    }
    /**
    * Sets the number of rows in the table
    * @param    int     $rows
    * @access   public
    */
    function setRowCount($rows)
    {
        $this->_rows = $rows;
    }
    /**
    * Sets the number of columns in the table
    * @param    int     $cols
    * @access   public
    */
    function setColCount($cols)
    {
        $this->_cols = $cols;
    }
    /**
    * Returns the number of rows in the table
    * @access   public
    * @returns  int
    */
    function getRowCount()
    {
        return $this->_rows;
    }
    /**
    * Sets the number of columns in the table
    * @access   public
    * @returns  int
    */
    function getColCount()
    {
        return $this->_cols;
    }
    /**
    * Sets a rows type 'TH' or 'TD'
    * @param    int         $row    Row index
    * @param    string      $type   'TH' or 'TD'
    * @access   public
    */
    function setRowType($row, $type)
    {
        for ($counter=0; $counter < $this->_cols; $counter++) {
            $this->_structure[$row][$counter]["type"] = $type;
        }
    }
    /**
    * Sets a columns type 'TH' or 'TD'
    * @param    int         $col    Column index
    * @param    string      $type   'TH' or 'TD'
    * @access   public
    */
    function setColType($col, $type)
    {
        for ($counter=0; $counter < $this->_rows; $counter++) {
            $this->_structure[$counter][$col]["type"] = $type;
        }
    }
        /**
        * Sets the cell attributes for an existing cell.
    *
    * If the given indices do not exist and autoGrow is true then the given 
    * row and/or col is automatically added.  If autoGrow is false then an 
    * error is returned.
        * @param        int             $row        Row index
        * @param        int             $col        Column index
        * @param        mixed   $attributes     Associative array or string of table 
row attributes
        * @access       public
    * @throws   PEAR_Error
        */
        function setCellAttributes($row, $col, $attributes)
        {
        if ($this->_structure[$row][$col] == "SPANNED") return;
                if ($row >= $this->_rows) {
                        if ($this->_autoGrow) {
                                $this->_rows = $row+1;
                        } else {
                                return new PEAR_Error("Invalid table row 
reference[$row] in HTML_Table::setCellAttributes");
                        }
                }
                if ($col >= $this->_cols) {
                        if ($this->_autoGrow) {
                                $this->_cols = $col+1;
                        } else {
                                return new PEAR_Error("Invalid table column 
reference[$col] in HTML_Table::setCellAttributes");
                        }
                }
                $attributes = $this->_parseAttributes($attributes);
                $this->_structure[$row][$col]["attr"] = $attributes;
                $this->_updateSpanGrid($row, $col);
        }
    /**
    * Updates the cell attributes passed but leaves other existing attributes in tact
    * @param    int     $row        Row index
    * @param    int     $col        Column index
        * @param        mixed   $attributes     Associative array or string of table 
row attributes
    * @access   public
    */
    function updateCellAttributes($row, $col, $attributes)
    {
        if ($this->_structure[$row][$col] == "SPANNED") return;
        $attributes = $this->_parseAttributes($attributes);
        $this->_updateAttrArray($this->_structure[$row][$col]["attr"], $attributes);
                $this->_updateSpanGrid($row, $col);
    }
        /**
        * Sets the cell contents for an existing cell
    *
    * If the given indices do not exist and autoGrow is true then the given 
    * row and/or col is automatically added.  If autoGrow is false then an 
    * error is returned.
        * @param        int             $row            Row index
        * @param        int             $col            Column index
        * @param        mixed   $contents       May contain html or any object with a 
toHTML method
        * @param        string  $type           (optional) Cell type either 'TH' or 
'TD'
        * @access       public
    * @throws   PEAR_Error
        */
        function setCellContents($row, $col, $contents, $type='TD')
        {
        if ($this->_structure[$row][$col] == "SPANNED") return;
                if ($row >= $this->_rows) {
                        if ($this->_autoGrow) {
                                $this->_rows = $row+1;
                        } else {
                                return new PEAR_Error("Invalid table row 
reference[$row] in HTML_Table::setCellContents");
                        }
                }
                if ($col >= $this->_cols) {
                        if ($this->_autoGrow) {
                                $this->_cols = $col+1;
                        } else {
                                return new PEAR_Error("Invalid table column 
reference[$col] in HTML_Table::setCellContents");
                        }
                }
                $this->_structure[$row][$col]["contents"] = $contents;
                $this->_structure[$row][$col]["type"] = $type;
        }
        /**
        * Returns the cell contents for an existing cell
        * @param        int             $row    Row index
        * @param        int             $col    Column index
        * @access       public
    * @return   mixed
        */
        function getCellContents($row, $col)
        {               
        if ($this->_structure[$row][$col] == "SPANNED") return;
                return $this->_structure[$row][$col]["contents"];
        }
    /**
    * Sets the contents of a header cell
    * @param    int     $row
    * @param    int     $col
    * @param    mixed   $contents
    * @access   public
    */
    function setHeaderContents($row, $col, $contents)
    {
        $this->setCellContents($row, $col, $contents, 'TH');
    }
        /**
        * Adds a table row and returns the row identifier
        * @param        array   $contents   (optional) Must be a indexed array of 
valid cell contents
        * @param        mixed   $attributes (optional) Associative array or string of 
table row attributes
        * @param        string  $type           (optional) Cell type either 'TH' or 
'TD'
        * @returns      int
        * @access       public
        */
        function addRow($contents=null, $attributes=null, $type='TD') 
        {
        if (isset($contents) && !is_array($contents)) {
            return new PEAR_Error("First parameter to HTML_Table::addRow must be an 
array");
        }
        $row = $this->_rows++;
        for ($counter=0; $counter < count($contents); $counter++) {
            if ($type == 'TD') {
                $this->setCellContents($row, $counter, $contents[$counter]);
            } elseif ($type == 'TH') {
                $this->setHeaderContents($row, $counter, $contents[$counter]);
            }
        }
        $this->setRowAttributes($row, $attributes);
        return $row;
    }
        /**
        * Sets the row attributes for an existing row
        * @param        int             $row            Row index
        * @param        mixed   $attributes             Associative array or string of 
table row attributes
        * @access       public
        */
        function setRowAttributes($row, $attributes)
        {
                for ($i = 0; $i < $this->_cols; $i++) {
                        $this->setCellAttributes($row,$i,$attributes);
                }
        }
        /**
        * Updates the row attributes for an existing row
        * @param        int             $row            Row index
        * @param        mixed   $attributes             Associative array or string of 
table row attributes
        * @access       public
        */
        function updateRowAttributes($row, $attributes=null)
        {
                for ($i = 0; $i < $this->_cols; $i++) {
                        $this->updateCellAttributes($row,$i,$attributes);
                }
        }
        /**
        * Alternates the row attributes starting at $start
        * @param        int             $start          Row index of row in which 
alternatign begins
        * @param        mixed   $attributes1    Associative array or string of table 
row attributes
        * @param        mixed   $attribute2             Associative array or string of 
table row attributes
        * @access       public
        */
        function altRowAttributes($start, $attributes1, $attributes2) 
        {
                for ($row = $start ; $row < $this->_rows ; $row++) {
                        $attributes = (($row+1+$start)%2==0) ? $attributes1 : 
$attributes2;
                        $this->updateRowAttributes($row, $attributes);
                }
        }
        /**
        * Adds a table column and returns the column identifier
        * @param        array   $contents   (optional) Must be a indexed array of 
valid cell contents
        * @param        mixed   $attributes (optional) Associative array or string of 
table row attributes
        * @param        string  $type           (optional) Cell type either 'TH' or 
'TD'
        * @returns      int
        * @access       public
        */
        function addCol($contents=null, $attributes=null, $type='TD')
        {
        if (isset($contents) && !is_array($contents)) {
            return new PEAR_Error("First parameter to HTML_Table::addCol must be an 
array");
        }
        $col = $this->_cols++;
        for ($counter=0; $counter < count($contents); $counter++) {
            $this->setCellContents($counter, $col, $contents[$counter], $type);
        }
        $this->setColAttributes($col, $attributes);
        return $col;
        }
        /**
        * Sets the column attributes for an existing column
        * @param        int             $col                    Column index
        * @param        mixed   $attributes             (optional) Associative array 
or string of table row attributes
        * @access       public
        */
        function setColAttributes($col, $attributes=null)
        {
                for ($i = 0; $i < $this->_cols; $i++) {
                        $this->setCellAttributes($i,$col,$attributes);
                }
        }
        /**
        * Updates the column attributes for an existing column
        * @param        int             $col                    Column index
        * @param        mixed   $attributes             (optional) Associative array 
or string of table row attributes
        * @access       public
        */
        function updateColAttributes($col, $attributes=null)
        {
                for ($i = 0; $i < $this->_cols; $i++) {
                        $this->updateCellAttributes($i,$col,$attributes);
                }
        }
        /**
        * Returns the table structure as HTML
        * @access       public
        */        
        function toHtml()
        {
                $tabs = $this->_getTabs();
                $strHtml .= "\n" . $tabs . "<TABLE" . 
$this->_getAttrString($this->_attributes) . ">\n";
                if ($this->_structure["caption"]) {
                        $attr = $this->_structure["caption"]["attr"];
                        $contents = $this->_structure["caption"]["contents"];
                        $strHtml .= $tabs . "\t<CAPTION" . 
$this->_getAttrString($attr) . ">";
                        if (is_array($contents)) $contents = implode(", ",$contents);
                        $strHtml .= $contents;
                        $strHtml .= "</CAPTION>\n";
                }
                for ($i = 0 ; $i < $this->_rows ; $i++) {
                        $strHtml .= $tabs ."\t<TR>\n";
                        for ($j = 0 ; $j < $this->_cols ; $j++) {
                                if ($this->_structure[$i][$j] == "SPANNED") {
                                        $strHtml .= $tabs ."\t\t<!-- span -->\n";
                                        continue;
                                }
                                $type = ($this->_structure[$i][$j]["type"] == "TH" ? 
"TH" : "TD");
                                $attr = $this->_structure[$i][$j]["attr"];
                                $contents = $this->_structure[$i][$j]["contents"];
                                $strHtml .= $tabs . "\t\t<$type" . 
$this->_getAttrString($attr) . ">";
                if (is_object($contents)) {
                    if (method_exists($contents, "toHtml")) {
                        $contents = $contents->toHtml();
                    } elseif (method_exists($contents, "toString")) {
                        $contents = $contents->toString();
                    }
                }
                if (is_array($contents)) $contents = implode(", ",$contents);
                                if (isset($this->_autoFill) && $contents == "") 
$contents = $this->_autoFill;
                                $strHtml .= $contents;
                                $strHtml .= "</$type>\n";
                        }
                        $strHtml .= $tabs ."\t</TR>\n";
                }
                $strHtml .= $tabs . "</TABLE>";
                return $strHtml;
        }        
        /**
        * Prints the HTML table to the screen
        * @access       public
        */
        function display()
        {
                print $this->toHtml();
        }        
        /**
        * Checks if rows or columns are spanned
        * @param        int             $row                    Row index
        * @param        int             $col                    Column index
        * @access       private
        */
        function _updateSpanGrid($row, $col)
        {
                $colspan = $this->_structure[$row][$col]["attr"]["colspan"];
                $rowspan = $this->_structure[$row][$col]["attr"]["rowspan"];
        if ($colspan) {
            for ($j = $col+1; (($j < $this->_cols) && ($j <= ($col + $colspan - 1))); 
$j++) {
                $this->_structure[$row][$j] = "SPANNED";
            }
        }
        if ($rowspan) {
            for ($i = $row+1; (($i < $this->_rows) && ($i <= ($row + $rowspan - 1))); 
$i++) {
                $this->_structure[$i][$col] = "SPANNED";
            }
        }
        if ($colspan && $rowspan) {
            for ($i = $row+1; (($i < $this->_rows) && ($i <= ($row + $rowspan - 1))); 
$i++) {
                for ($j = $col+1; (($j <= $this->_cols) && ($j <= ($col + $colspan - 
1))); $j++) {
                    $this->_structure[$i][$j] = "SPANNED";
                }
            }
        }
        }
}
?>

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to