-
Notifications
You must be signed in to change notification settings - Fork 7.6k
HTML Table Library helper extension
Derek Jones edited this page Jul 5, 2012
·
5 revisions
Category:Contributions::Libraries::Table Here is a little extension that I wrote to table library, with the following functions
add_column <- works similarly to add_row, but adds column transpose <- transposes a table (rows become columns and columns become rows) remove_column <- removes column add_anchor <- adds an anchor to the table.
I wrote it mainly because I wanted to have a simple method to add links to each row of table, which has been built from database query. This works now with two commands:
$this->table->add_anchor($id_column_name, $value_column_name, $path); $this->table->remove_column($id_column_name);
Usage examples:
<?php
$this->table->add_row(array('John', 'red', 'small'));
$this->table->add_row(array('Mary', 'blue', 'medium'));
$this->table->add_row(array('Jim', 'green', 'large'));
$this->table->add_row(array('Peter', 'black', 'unknown'));
$this->table->set_heading(array('name', 'colour', 'size'));
echo $this->table->generate();
echo "--------------";
// Add some columns. Note that you can either add a column as array or as list
// If table heading is set, then the first name is assumed to be heading.
$this->table->add_column('availability', 'free', 'unavailable', 'available', 'later');
$this->table->add_column(array('another', 'first', 'second', 'third', 'fourth'));
echo $this->table->generate();
echo "--------------";
// Create a link for "size" column on each row that links to path "part/delete/$name"
// The search is done by the name of the column, so be aware of case sensitivity
//
// The function below adds a link <a href="http://www.example.com/index.php/part/delete/$name">$size</a> to each row of the "size" column.
//
// the function syntax is add_anchor($id_value_colum_name, $value_column_name, $path)
$this->table->add_anchor('name', 'size', 'part/delete');
echo $this->table->generate();
echo "--------------";
// Now hide the "name" column. Note that links are still working.
// Note that this gives you a nice way to build links from database query ID columns
// and hide ID columns from viewing. :)
$this->table->remove_column('name');
echo $this->table->generate();
echo "--------------";
// Transpose a table
$this->table->transpose();
echo $this->table->generate();
echo "--------------";
?>
The code to add into your Library folder:
<?php
/**
* Some helpers
*
* add_column
* remove_colum
* add_anchor($id_column_name, $value_column_name, $path)
* transpose
*
*
*/
Class MY_Table extends CI_Table {
public $columns;
/**
* Transpose array
*
* @param $array
* @return array
*/
/**
* Add column to table
*
* @return unknown_type
*/
function add_column(){
// Is heading empty?
if (empty($this->heading)){
// no heading yet
$columns = $this->_flip($this->rows);
$args = func_get_args();
$columns[] = (is_array($args[0])) ? $args[0] : $args;
$this->rows = $this->_flip($columns);
} else {
// Assume that the first element is heading
$args = func_get_args();
$col = (is_array($args[0])) ? $args[0] : $args;
$heading = array_shift($col);
// add columns...
$columns = $this->_flip($this->rows);
$columns[] = $col;
$this->rows = $this->_flip($columns);
// ...and heading
$this->heading[] = $heading;
}
}
// Remove column from table
function remove_column($name){
if(empty($this->heading))
return;
$key = array_search($name, $this->heading);
$columns = $this->_flip($this->rows);
unset($columns[$key]);
unset($this->heading[$key]);
$this->rows = $this->_flip($columns);
}
// Transpose table
function transpose(){
if (!empty($this->heading))
$this->heading = array(); // Empty heading
$this->rows = $this->_flip($this->rows);
}
// Create anchor for table row
function add_anchor($id_column, $value_column, $path){
$CI = & get_instance();
$CI->load->helper('url');
if (empty($this->heading))
return;
$id_key = array_search($id_column, $this->heading);
$val_key = array_search($value_column, $this->heading);
foreach ($this->rows as $key => $var) {
$this->rows[$key][$val_key] = $this->_add_anchor($this->rows[$key][$val_key], $this->rows[$key][$id_key], $path);
}
}
private function _add_anchor($value, $id, $path){
return anchor($path. "/" .$id, $value);
}
private function _flip($array){
$flipped = array();
foreach ($array as $key => $subarray){
foreach ($subarray as $subkey => $subvar) {
$flipped[$subkey][$key] = $subvar;
}
}
return $flipped;
}
}