1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445:
<?php
/**
*
* AdiPHP : Rapid Development Tools (http://adilab.net)
* Copyright (c) Adrian Zurkiewicz
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @version 0.1
* @copyright Adrian Zurkiewicz
* @link http://adilab.net
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Adi\Html\Table;
use Adi\Css\Css;
use Adi\Html\AbstractPairedArrayTag;
use Adi\Html\AbstractPairedStringTag;
use Exception;
/**
* Helper for Table tag. Uses an array to generate code of html table.
* Array must be composed of nested array where first level items are rows and second level items are cells.
* First level item can be replaced by instances of Tr class, and second level items can be replaced by instances of Td class.
*
* <code>
* $data = array(
* array('aaa', 'bbb', Td::create('ccc')->addClass('ccc')),
* array('ddd', 'eee', 'fff'),
* Tr::create(array('ggg', 'hhh', 'iii'))->addClass('selected'),
* );
* echo Table::create($data);
* </code>
*
* <code>
* $data = array(
* array('A' => 'aaa', 'B' => 'bbb', 'C' => 'ccc'),
* array('A' => 'ddd', 'B' => 'eee', 'C' => 'fff'),
* array('A' => 'ggg', 'B' => 'hhh', 'C' => Td::create('iii')->setId('i')),
* );
* $table = new Table($data);
* $table->setColumn('B', Column::create()->addStyle('color', '#ff0000'));
* $table->setHeader('B', '[B]');
* $table->setHeader('C', Th::create('[C]')->addStyle('color', '#0000ff'));
* echo $table;
* </code>
*
*
* @author adrian
*/
class Table extends AbstractPairedArrayTag {
/**
* Default Tr instance
*
* @var Tr
*/
private $tr;
/**
* Default Column instances
*
* @var array
*/
private $column = array();
/**
*
* @var array
*/
private $headers = array();
/**
*
* @var boolean
*/
private $show_headers = true;
/**
*
* @var array
*/
private $visible_columns = array();
/**
* Returns list of visible columns
*
* @return array
*/
public function getVisibleColumns() {
return $this->visible_columns;
}
/**
* Set list of visible columns
*
* @param array $visible_columns
* @return self
*/
public function setVisibleColumns($visible_columns) {
$this->visible_columns = $visible_columns;
return $this;
}
/**
* Set show headers
*
* @param boolean $show_headers
* @return Table
*/
public function showHeaders($show_headers = TRUE) {
$this->show_headers = $show_headers;
return $this;
}
/**
* Returns default Tr instance
*
* @return Tr|NULL
*/
public function getTr() {
return $this->tr;
}
/**
* Set default Tr instance
*
* @param Tr $tr
* @return self
*/
public function setTr(Tr $tr) {
$this->tr = $tr;
return $this;
}
/**
* Returns default Column instance
*
* @param mixed $name Column name if associative table or index number
* @return Column|NULL
*/
public function getColumn($name) {
return @$this->column[$name];
}
/**
* Set default Column instance
*
* @param mixed $name Column name if associative table or index number
* @param Column $column
* @return self
*/
public function setColumn($name, Column $column) {
$this->column[$name] = $column;
return $this;
}
/**
* Assigns headers
*
* @param array $headers
*/
public function setHeaders($headers) {
foreach ($headers as $key => $title) {
$this->setHeader($key, $title);
}
}
/**
* Returns list of columns names as array of strings
*
* @return array
*/
public function getColumns() {
$result = array();
if (!is_array($this->getData())) {
return $result;
}
if (!count($this->getData())) {
return $result;
}
$row = $this->getData();
$row = $row[0];
if ($row instanceof Tr) {
$row = $row->getData();
}
foreach ($row as $column => $value) {
$result[] = $column;
}
return $result;
}
/**
* Returns TRUE if the table has headers
*
* @return boolean
*/
public function hasHeaders() {
if (!$this->show_headers) {
return FALSE;
}
if (count($this->headers)) {
return TRUE;
}
$i = 0;
foreach ($this->getColumns() as $culumn) {
if ($culumn !== $i) {
return TRUE;
}
$i++;
}
return FALSE;
}
/**
* Get header of column
*
* @param string $column Column name if associative table or index number
* @return string|Th|NULL
*/
public function getHeader($column) {
if (!$result = @$this->headers[$column]) {
$result = $column;
}
return $result;
}
/**
* Set header of column
*
* @param string $column Column name if associative table or index number
* @param string|Th $headers
* @return self
*/
public function setHeader($column, $headers) {
if (is_object($headers)) {
if (!$headers instanceof Th) {
throw new Exception('The $headers parameter must be instance of Th.');
}
} else {
$headers = (string) $headers;
}
$this->headers[$column] = $headers;
return $this;
}
/**
* Imports arguments of column
*
* @param AbstractPairedStringTag $tag
* @param string $column
*/
public function importFromColumn(AbstractPairedStringTag $tag, $column) {
if (!$column = $this->getColumn($column)) {
return;
}
$attributes = $column->getAttributes();
foreach ($attributes as $name => $value) {
$name = strtolower($name);
if ($name == 'class') {
$tag->addClass($value);
} else if ($name == 'style') {
$css = new Css($column->getStyle());
$css->set($tag->getStyle());
$tag->setAttribute('style', $css->render());
} else {
if (!$tag->getAttribute($name)) {
$tag->setAttribute($name, $value);
}
}
}
}
/**
* Prepares tr th html
*
* @return string
*/
protected function prepareHeaders() {
$result = NULL;
foreach ($this->getColumns() as $name) {
if (count($this->visible_columns)) {
if (!in_array($name, $this->visible_columns)) {
continue;
}
}
$header = $this->getHeader($name);
if (($header instanceof Column) or ( $header instanceof Th)) {
$this->importFromColumn($header, $name);
$result .= $header->render();
} else {
if ($column = $this->getColumn($name)) {
$column->setData($header);
$column->setHeader();
} else {
$column = Th::create($header);
}
$result .= $column->render();
}
}
return "<tr class='header'>{$result}</tr>\n";
}
/**
* Prepares HTML code of tag
*
* @param array $params Parameter not used in this version
* @return string
*/
protected function prepareHtml($params = array()) {
if (!$tr = $this->getTr()) {
$tr = new Tr(array());
}
// $tr->setVisibleColumns($this->getVisibleColumns());
$tr->setTable($this);
$attributes = $this->prepareAttributes();
$columns = $this->getColumns();
$result = "\n<table {$attributes}>\n";
if ($this->hasHeaders()) {
$result .= $this->prepareHeaders();
}
foreach ($this->getData() as $row) {
if (!$row instanceof Tr) {
$tr->setData($row);
$row = $tr;
} else {
// $row->setVisibleColumns($this->getVisibleColumns());
$row->setTable($this);
}
foreach ($columns as $name) {
if (!$row->getColumn($name)) {
if ($column = $this->getColumn($name)) {
$column->setRow();
$row->setColumn($name, $this->getColumn($name));
}
}
}
$row->addClass('row');
$result .= $row->render() . "\n";
}
$result .= "</table>\n";
return $result;
}
/**
*
* @return string
*/
public function render() {
return $this->prepareHtml();
}
}