function.html_table.php (5358B)
1 <?php 2 /** 3 * Smarty plugin 4 * 5 * @package Smarty 6 * @subpackage PluginsFunction 7 */ 8 9 /** 10 * Smarty {html_table} function plugin 11 * Type: function<br> 12 * Name: html_table<br> 13 * Date: Feb 17, 2003<br> 14 * Purpose: make an html table from an array of data<br> 15 * Params: 16 * <pre> 17 * - loop - array to loop through 18 * - cols - number of columns, comma separated list of column names 19 * or array of column names 20 * - rows - number of rows 21 * - table_attr - table attributes 22 * - th_attr - table heading attributes (arrays are cycled) 23 * - tr_attr - table row attributes (arrays are cycled) 24 * - td_attr - table cell attributes (arrays are cycled) 25 * - trailpad - value to pad trailing cells with 26 * - caption - text for caption element 27 * - vdir - vertical direction (default: "down", means top-to-bottom) 28 * - hdir - horizontal direction (default: "right", means left-to-right) 29 * - inner - inner loop (default "cols": print $loop line by line, 30 * $loop will be printed column by column otherwise) 31 * </pre> 32 * Examples: 33 * <pre> 34 * {table loop=$data} 35 * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} 36 * {table loop=$data cols="first,second,third" tr_attr=$colors} 37 * </pre> 38 * 39 * @author Monte Ohrt <monte at ohrt dot com> 40 * @author credit to Messju Mohr <messju at lammfellpuschen dot de> 41 * @author credit to boots <boots dot smarty at yahoo dot com> 42 * @version 1.1 43 * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} 44 * (Smarty online manual) 45 * 46 * @param array $params parameters 47 * 48 * @return string 49 */ 50 function smarty_function_html_table($params) 51 { 52 $table_attr = 'border="1"'; 53 $tr_attr = ''; 54 $th_attr = ''; 55 $td_attr = ''; 56 $cols = $cols_count = 3; 57 $rows = 3; 58 $trailpad = ' '; 59 $vdir = 'down'; 60 $hdir = 'right'; 61 $inner = 'cols'; 62 $caption = ''; 63 $loop = null; 64 65 if (!isset($params['loop'])) { 66 trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING); 67 68 return; 69 } 70 71 foreach ($params as $_key => $_value) { 72 switch ($_key) { 73 case 'loop': 74 $$_key = (array) $_value; 75 break; 76 77 case 'cols': 78 if (is_array($_value) && !empty($_value)) { 79 $cols = $_value; 80 $cols_count = count($_value); 81 } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { 82 $cols = explode(',', $_value); 83 $cols_count = count($cols); 84 } elseif (!empty($_value)) { 85 $cols_count = (int) $_value; 86 } else { 87 $cols_count = $cols; 88 } 89 break; 90 91 case 'rows': 92 $$_key = (int) $_value; 93 break; 94 95 case 'table_attr': 96 case 'trailpad': 97 case 'hdir': 98 case 'vdir': 99 case 'inner': 100 case 'caption': 101 $$_key = (string) $_value; 102 break; 103 104 case 'tr_attr': 105 case 'td_attr': 106 case 'th_attr': 107 $$_key = $_value; 108 break; 109 } 110 } 111 112 $loop_count = count($loop); 113 if (empty($params['rows'])) { 114 /* no rows specified */ 115 $rows = ceil($loop_count / $cols_count); 116 } elseif (empty($params['cols'])) { 117 if (!empty($params['rows'])) { 118 /* no cols specified, but rows */ 119 $cols_count = ceil($loop_count / $rows); 120 } 121 } 122 123 $output = "<table $table_attr>\n"; 124 125 if (!empty($caption)) { 126 $output .= '<caption>' . $caption . "</caption>\n"; 127 } 128 129 if (is_array($cols)) { 130 $cols = ($hdir == 'right') ? $cols : array_reverse($cols); 131 $output .= "<thead><tr>\n"; 132 133 for ($r = 0; $r < $cols_count; $r ++) { 134 $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; 135 $output .= $cols[$r]; 136 $output .= "</th>\n"; 137 } 138 $output .= "</tr></thead>\n"; 139 } 140 141 $output .= "<tbody>\n"; 142 for ($r = 0; $r < $rows; $r ++) { 143 $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; 144 $rx = ($vdir == 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count; 145 146 for ($c = 0; $c < $cols_count; $c ++) { 147 $x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count - 1 - $c; 148 if ($inner != 'cols') { 149 /* shuffle x to loop over rows*/ 150 $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; 151 } 152 153 if ($x < $loop_count) { 154 $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; 155 } else { 156 $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; 157 } 158 } 159 $output .= "</tr>\n"; 160 } 161 $output .= "</tbody>\n"; 162 $output .= "</table>\n"; 163 164 return $output; 165 } 166 167 function smarty_function_html_table_cycle($name, $var, $no) 168 { 169 if (!is_array($var)) { 170 $ret = $var; 171 } else { 172 $ret = $var[$no % count($var)]; 173 } 174 175 return ($ret) ? ' ' . $ret : ''; 176 }