PageRenderTime 31ms CodeModel.GetById 14ms app.highlight 12ms RepoModel.GetById 2ms app.codeStats 0ms

/halogy/libraries/Table.php

https://bitbucket.org/haloweb/halogy-1.0/
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[] = '&nbsp;';
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 */