/halogy/libraries/Table.php
PHP | 440 lines | 226 code | 70 blank | 144 comment | 35 complexity | ad6133e36ce5cb91b6bfad0a023e8493 MD5 | raw file
1<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 2/** 3 * CodeIgniter 4 * 5 * An open source application development framework for PHP 4.3.2 or newer 6 * 7 * @package CodeIgniter 8 * @author ExpressionEngine Dev Team 9 * @copyright Copyright (c) 2008 - 2009, EllisLab, Inc. 10 * @license http://codeigniter.com/user_guide/license.html 11 * @link http://codeigniter.com 12 * @since Version 1.3.1 13 * @filesource 14 */ 15 16// ------------------------------------------------------------------------ 17 18/** 19 * HTML Table Generating Class 20 * 21 * Lets you create tables manually or from database result objects, or arrays. 22 * 23 * @package CodeIgniter 24 * @subpackage Libraries 25 * @category HTML Tables 26 * @author ExpressionEngine Dev Team 27 * @link http://codeigniter.com/user_guide/libraries/uri.html 28 */ 29class CI_Table { 30 31 var $rows = array(); 32 var $heading = array(); 33 var $auto_heading = TRUE; 34 var $caption = NULL; 35 var $template = NULL; 36 var $newline = "\n"; 37 var $empty_cells = ""; 38 39 40 function CI_Table() 41 { 42 log_message('debug', "Table Class Initialized"); 43 } 44 45 // -------------------------------------------------------------------- 46 47 /** 48 * Set the template 49 * 50 * @access public 51 * @param array 52 * @return void 53 */ 54 function set_template($template) 55 { 56 if ( ! is_array($template)) 57 { 58 return FALSE; 59 } 60 61 $this->template = $template; 62 } 63 64 // -------------------------------------------------------------------- 65 66 /** 67 * Set the table heading 68 * 69 * Can be passed as an array or discreet params 70 * 71 * @access public 72 * @param mixed 73 * @return void 74 */ 75 function set_heading() 76 { 77 $args = func_get_args(); 78 $this->heading = (is_array($args[0])) ? $args[0] : $args; 79 } 80 81 // -------------------------------------------------------------------- 82 83 /** 84 * Set columns. Takes a one-dimensional array as input and creates 85 * a multi-dimensional array with a depth equal to the number of 86 * columns. This allows a single array with many elements to be 87 * displayed in a table that has a fixed column count. 88 * 89 * @access public 90 * @param array 91 * @param int 92 * @return void 93 */ 94 function make_columns($array = array(), $col_limit = 0) 95 { 96 if ( ! is_array($array) OR count($array) == 0) 97 { 98 return FALSE; 99 } 100 101 // Turn off the auto-heading feature since it's doubtful we 102 // will want headings from a one-dimensional array 103 $this->auto_heading = FALSE; 104 105 if ($col_limit == 0) 106 { 107 return $array; 108 } 109 110 $new = array(); 111 while(count($array) > 0) 112 { 113 $temp = array_splice($array, 0, $col_limit); 114 115 if (count($temp) < $col_limit) 116 { 117 for ($i = count($temp); $i < $col_limit; $i++) 118 { 119 $temp[] = ' '; 120 } 121 } 122 123 $new[] = $temp; 124 } 125 126 return $new; 127 } 128 129 // -------------------------------------------------------------------- 130 131 /** 132 * Set "empty" cells 133 * 134 * Can be passed as an array or discreet params 135 * 136 * @access public 137 * @param mixed 138 * @return void 139 */ 140 function set_empty($value) 141 { 142 $this->empty_cells = $value; 143 } 144 145 // -------------------------------------------------------------------- 146 147 /** 148 * Add a table row 149 * 150 * Can be passed as an array or discreet params 151 * 152 * @access public 153 * @param mixed 154 * @return void 155 */ 156 function add_row() 157 { 158 $args = func_get_args(); 159 $this->rows[] = (is_array($args[0])) ? $args[0] : $args; 160 } 161 162 // -------------------------------------------------------------------- 163 164 /** 165 * Add a table caption 166 * 167 * @access public 168 * @param string 169 * @return void 170 */ 171 function set_caption($caption) 172 { 173 $this->caption = $caption; 174 } 175 176 // -------------------------------------------------------------------- 177 178 /** 179 * Generate the table 180 * 181 * @access public 182 * @param mixed 183 * @return string 184 */ 185 function generate($table_data = NULL) 186 { 187 // The table data can optionally be passed to this function 188 // either as a database result object or an array 189 if ( ! is_null($table_data)) 190 { 191 if (is_object($table_data)) 192 { 193 $this->_set_from_object($table_data); 194 } 195 elseif (is_array($table_data)) 196 { 197 $set_heading = (count($this->heading) == 0 AND $this->auto_heading == FALSE) ? FALSE : TRUE; 198 $this->_set_from_array($table_data, $set_heading); 199 } 200 } 201 202 // Is there anything to display? No? Smite them! 203 if (count($this->heading) == 0 AND count($this->rows) == 0) 204 { 205 return 'Undefined table data'; 206 } 207 208 // Compile and validate the template date 209 $this->_compile_template(); 210 211 212 // Build the table! 213 214 $out = $this->template['table_open']; 215 $out .= $this->newline; 216 217 // Add any caption here 218 if ($this->caption) 219 { 220 $out .= $this->newline; 221 $out .= '<caption>' . $this->caption . '</caption>'; 222 $out .= $this->newline; 223 } 224 225 // Is there a table heading to display? 226 if (count($this->heading) > 0) 227 { 228 $out .= $this->template['heading_row_start']; 229 $out .= $this->newline; 230 231 foreach($this->heading as $heading) 232 { 233 $out .= $this->template['heading_cell_start']; 234 $out .= $heading; 235 $out .= $this->template['heading_cell_end']; 236 } 237 238 $out .= $this->template['heading_row_end']; 239 $out .= $this->newline; 240 } 241 242 // Build the table rows 243 if (count($this->rows) > 0) 244 { 245 $i = 1; 246 foreach($this->rows as $row) 247 { 248 if ( ! is_array($row)) 249 { 250 break; 251 } 252 253 // We use modulus to alternate the row colors 254 $name = (fmod($i++, 2)) ? '' : 'alt_'; 255 256 $out .= $this->template['row_'.$name.'start']; 257 $out .= $this->newline; 258 259 foreach($row as $cell) 260 { 261 $out .= $this->template['cell_'.$name.'start']; 262 263 if ($cell === "") 264 { 265 $out .= $this->empty_cells; 266 } 267 else 268 { 269 $out .= $cell; 270 } 271 272 $out .= $this->template['cell_'.$name.'end']; 273 } 274 275 $out .= $this->template['row_'.$name.'end']; 276 $out .= $this->newline; 277 } 278 } 279 280 $out .= $this->template['table_close']; 281 282 return $out; 283 } 284 285 // -------------------------------------------------------------------- 286 287 /** 288 * Clears the table arrays. Useful if multiple tables are being generated 289 * 290 * @access public 291 * @return void 292 */ 293 function clear() 294 { 295 $this->rows = array(); 296 $this->heading = array(); 297 $this->auto_heading = TRUE; 298 } 299 300 // -------------------------------------------------------------------- 301 302 /** 303 * Set table data from a database result object 304 * 305 * @access public 306 * @param object 307 * @return void 308 */ 309 function _set_from_object($query) 310 { 311 if ( ! is_object($query)) 312 { 313 return FALSE; 314 } 315 316 // First generate the headings from the table column names 317 if (count($this->heading) == 0) 318 { 319 if ( ! method_exists($query, 'list_fields')) 320 { 321 return FALSE; 322 } 323 324 $this->heading = $query->list_fields(); 325 } 326 327 // Next blast through the result array and build out the rows 328 329 if ($query->num_rows() > 0) 330 { 331 foreach ($query->result_array() as $row) 332 { 333 $this->rows[] = $row; 334 } 335 } 336 } 337 338 // -------------------------------------------------------------------- 339 340 /** 341 * Set table data from an array 342 * 343 * @access public 344 * @param array 345 * @return void 346 */ 347 function _set_from_array($data, $set_heading = TRUE) 348 { 349 if ( ! is_array($data) OR count($data) == 0) 350 { 351 return FALSE; 352 } 353 354 $i = 0; 355 foreach ($data as $row) 356 { 357 if ( ! is_array($row)) 358 { 359 $this->rows[] = $data; 360 break; 361 } 362 363 // If a heading hasn't already been set we'll use the first row of the array as the heading 364 if ($i == 0 AND count($data) > 1 AND count($this->heading) == 0 AND $set_heading == TRUE) 365 { 366 $this->heading = $row; 367 } 368 else 369 { 370 $this->rows[] = $row; 371 } 372 373 $i++; 374 } 375 } 376 377 // -------------------------------------------------------------------- 378 379 /** 380 * Compile Template 381 * 382 * @access private 383 * @return void 384 */ 385 function _compile_template() 386 { 387 if ($this->template == NULL) 388 { 389 $this->template = $this->_default_template(); 390 return; 391 } 392 393 $this->temp = $this->_default_template(); 394 foreach (array('table_open','heading_row_start', 'heading_row_end', 'heading_cell_start', 'heading_cell_end', 'row_start', 'row_end', 'cell_start', 'cell_end', 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close') as $val) 395 { 396 if ( ! isset($this->template[$val])) 397 { 398 $this->template[$val] = $this->temp[$val]; 399 } 400 } 401 } 402 403 // -------------------------------------------------------------------- 404 405 /** 406 * Default Template 407 * 408 * @access private 409 * @return void 410 */ 411 function _default_template() 412 { 413 return array ( 414 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">', 415 416 'heading_row_start' => '<tr>', 417 'heading_row_end' => '</tr>', 418 'heading_cell_start' => '<th>', 419 'heading_cell_end' => '</th>', 420 421 'row_start' => '<tr>', 422 'row_end' => '</tr>', 423 'cell_start' => '<td>', 424 'cell_end' => '</td>', 425 426 'row_alt_start' => '<tr>', 427 'row_alt_end' => '</tr>', 428 'cell_alt_start' => '<td>', 429 'cell_alt_end' => '</td>', 430 431 'table_close' => '</table>' 432 ); 433 } 434 435 436} 437 438 439/* End of file Table.php */ 440/* Location: ./system/libraries/Table.php */