PHP Classes

File: Table.php

Recommend this page to a friend!
  Classes of Sam Barnett-Cormack   PHP Tables   Table.php   Download  
File: Table.php
Role: Class source
Content type: text/plain
Description: Table class
Class: PHP Tables
Generate HTML tables programmatically
Author: By
Last change: Version 0.2 update
Date: 16 years ago
Size: 4,619 bytes
 

Contents

Class file image Download
<?php

/*
* Copyright 2008 Sam Barnett-Cormack
*
* This file is part of PHPTables.
*
* PHPTables is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Foobar 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/

class Table {
   
    private
$num_columns;
    private
$rows = array();
    private
$headings;
    public
$style_class = NULL;
   
    private function
update_state() {
        if (isset(
$this->headings)) {
       
$this->num_columns = $this->headings->get_width();
        } else {
       
$this->num_columns = 0;
        }
    }
   
    function
__construct(Row $headings = NULL) {
        if (isset(
$headings)) {
           
$this->headings = $headings;
        } else {
           
$this->headings = new Row();
        }
       
$this->update_state();
    }
   
    function
empty_headings() {
       
$this->headings->empty_row();
    }
   
    function
add_heading(Cell $heading) {
       
$this->headings->add_cell($heading);
       
$this->update_state();
    }
   
    function
set_headings(Row $headings) {
       
$this->headings = $headings;
       
$this->update_state();
    }
   
    function
num_rows() {
        return
count($this->rows);
    }
   
    function
num_cols() {
        return
$this->num_columns;
    }
   
    function
clear_rows() {
       
$this->rows = array();
    }
   
    function
add_row(Row $row, $index = NULL) {
        if (
$row->get_width() != $this->num_columns) {
            throw new
Exception("Row does not have correct number of columns (want " . $this->num_columns . ", row has " . $row->get_width() . ")");
        }
        if (isset(
$index)) {
            if (!
is_int($index)) {
                throw new
InvalidArgumentException("Index must be an integer");
            }
            if (isset(
$this->rows[$index])) {
               
$rkeys = rsort(array_keys($this->rows));
                for (
$i = $rkeys[0]; i >= $index; $i++) {
                   
$this->rows[$i+1] = $this->rows[$i];
                }
            }
           
$this->rows[$index] = &$row;
           
$this->condense_rows();
        } else {
           
$this->rows[] = &$row;
        }
    }
   
    function
set_row(Row $row, $index) {
        if (
$row->get_width() != $this->num_columns) {
            throw new
Exception("Row does not have correct number of columns");
        }
        if (!
is_int($index)) {
            throw new
InvalidArgumentException("Index must be an integer");
        }
       
$this->rows[$index] = $row;
       
$this->condense_rows();
    }
   
    private function
condense_rows() {
       
$newrows = array();
        foreach (
$this->rows as $row) {
           
$newrows[] = $row;
        }
       
$this->rows = $newrows;
    }
   
    function
get_cell_at($rowindex,$columnindex) {
        if (!
is_int($rowindex)) {
            throw new
InvalidArgumentException("Row index must be an integer");
        }
        if (!
is_int($columnindex)) {
            throw new
InvalidArgumentException("Column index must be an integer");
        }
        if (
$columnindex >= $this->num_columns) {
            throw new
InvalidArgumentException("Column index out of bounds");
        }
        if (isset(
$this->rows[$rowindex])) {
            return
$this->rows[$rowindex]->get_cell_at_column($columnindex);
        } else {
            throw new
InvalidArgumentException("Row index out of bounds");
        }
    }
   
    function
get_html() {
       
$output = "<!-- PHPTables generated table follows: -->\n";
       
$output .= "<table";
        if (isset(
$this->style_class)) {
           
$output .= " class=\"" . $this->style_class . "\" ";
        }
       
$output .= ">\n";
       
// fill in headings
       
if (isset($this->headings->style_class)) {
           
$output .= "\t<tr class=\"" . $this->headings->style_class . "\" >\n";
        } else {
           
$output .= "\t<tr>\n";
        }
        foreach (
$this->headings as $head) {
            if (isset(
$head->style_class)) {
               
$output .= "\t\t<th class=\"" . $head->style_class . "\" >\n";
            } else {
               
$output .= "\t\t<th>\n";
            }
           
$output .= "\t\t\t" . $head->get_content() . "\n";
           
$output .= "\t\t</th>\n";
        }
       
$output .= "\t</tr>\n";
       
// fill in everything else
       
foreach ($this->rows as $row) {
            if (isset(
$row->style_class)) {
               
$output .= "\t<tr class=\"" . $row->style_class . "\" >\n";
            } else {
               
$output .= "\t<tr>\n";
            }
            foreach (
$row as $cell) {
                if (isset(
$cell->style_class)) {
                   
$output .= "\t\t<td class=\"" . $cell->style_class . "\" >\n";
                } else {
                   
$output .= "\t\t<td>\n";
                }
               
$output .= "\t\t\t" . $cell->get_content() . "\n";
               
$output .= "\t\t</td>\n";
            }
           
$output .= "\t</tr>\n";
        }
       
// and finish
       
$output .= "</table>";
            return
$output;
    }
}
?>