diff --git a/NEWS b/NEWS
index d92926a6..d3f5c53e 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,5 @@
+ - added params vdir, hdir and inner to html_table to allow looping
+ over the data in various directions (messju)
- allow spaces in literal tags (Paul Lockaby, Monte)
- speed up compiled templates, hardcode plugin filepaths
instead of dynamically calculate at runtime. (Monte)
diff --git a/libs/plugins/function.html_table.php b/libs/plugins/function.html_table.php
index f06e435e..fe80565e 100644
--- a/libs/plugins/function.html_table.php
+++ b/libs/plugins/function.html_table.php
@@ -1,96 +1,110 @@
- * Name: html_table
- * Date: Feb 17, 2003
- * Purpose: make an html table from an array of data
- * Input:
- * - loop = array to loop through
- * - cols = number of columns
- * - table_attr = table attributes
- * - tr_attr = table row attributes (arrays are cycled)
- * - td_attr = table cell attributes (arrays are cycled)
- * - trailpad = value to pad trailing cells with
- *
- * Examples:
- *
- * {table loop=$data}
- * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
- * {table loop=$data cols=4 tr_attr=$colors}
- *
- * @author Monte Ohrt
- * @version 1.0
- * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
- * (Smarty online manual)
- * @param array
- * @param Smarty
- * @return string
- */
+* Smarty {html_table} function plugin
+*
+* Type: function
+* Name: html_table
+* Date: Feb 17, 2003
+* Purpose: make an html table from an array of data
+* Input:
+* - loop = array to loop through
+* - cols = number of columns
+* - rows = number of rows
+* - table_attr = table attributes
+* - tr_attr = table row attributes (arrays are cycled)
+* - td_attr = table cell attributes (arrays are cycled)
+* - trailpad = value to pad trailing cells with
+* - vdir = vertical direction (default: "down", means top-to-bottom)
+* - hdir = horizontal direction (default: "right", means left-to-right)
+* - inner = inner loop (default "cols": print $loop line by line,
+* $loop will be printed column by column otherwise)
+*
+*
+* Examples:
+*
+* {table loop=$data}
+* {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
+* {table loop=$data cols=4 tr_attr=$colors}
+*
+* @author Monte Ohrt
+* @version 1.0
+* @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
+* (Smarty online manual)
+* @param array
+* @param Smarty
+* @return string
+*/
function smarty_function_html_table($params, &$smarty)
{
- $table_attr = 'border="1"';
- $tr_attr = '';
- $td_attr = '';
- $cols = 3;
- $trailpad = ' ';
-
- extract($params);
+ $table_attr = 'border="1"';
+ $tr_attr = '';
+ $td_attr = '';
+ $cols = 3;
+ $rows = 3;
+ $trailpad = ' ';
+ $vdir = 'down';
+ $hdir = 'right';
+ $inner = 'cols';
+
+ extract($params);
if (!isset($loop)) {
$smarty->trigger_error("html_table: missing 'loop' parameter");
return;
- }
-
- $output = "\n";
- $output .= "\n";
+ }
- for($x = 0, $y = count($loop); $x < $y; $x++) {
- $output .= "" . $loop[$x] . " | \n";
- if((!(($x+1) % $cols)) && $x < $y-1) {
- // go to next row
- $output .= "
\n\n";
- }
- if($x == $y-1) {
- // last row, pad remaining cells
- $cells = $cols - $y % $cols;
- if($cells != $cols) {
- for($padloop = 0; $padloop < $cells; $padloop++) {
- $output .= "$trailpad | \n";
- }
- }
- $output .= "
\n";
- }
- }
-
- $output .= "
\n";
-
- return $output;
+ $loop_count = count($loop);
+ if (empty($params['rows'])) {
+ /* no rows specified */
+ $rows = ceil($loop_count/$cols);
+ } elseif (empty($params['cols'])) {
+ if (!empty($params['rows'])) {
+ /* no cols specified, but rows */
+ $cols = ceil($loop_count/$rows);
+ }
+ }
+
+ $output = "\n";
+
+ for ($r=0; $r<$rows; $r++) {
+ $output .= "\n";
+ $rx = ($vdir == 'down') ? $r*$cols : ($rows-1-$r)*$cols;
+
+ for ($c=0; $c<$cols; $c++) {
+ $x = ($hdir == 'right') ? $rx+$c : $rx+$cols-1-$c;
+ if ($inner!='cols') {
+ /* shuffle x to loop over rows*/
+ $x = floor($x/$cols) + ($x%$cols)*$rows;
+ }
+
+ if ($x<$loop_count) {
+ $output .= "" . $loop[$x] . " | \n";
+ } else {
+ $output .= "$trailpad | \n";
+ }
+ }
+ $output .= "
\n";
+ }
+ $output .= "
\n";
+
+ return $output;
}
-function smarty_function_html_table_cycle($name, $var) {
- static $names = array();
-
- if(!is_array($var)) {
- return $var;
- }
-
- if(!isset($names[$name]) || $names[$name] == count($var)-1) {
- $names[$name] = 0;
- return $var[0];
- }
-
- $names[$name]++;
- return $var[$names[$name]];
-
+function smarty_function_html_table_cycle($name, $var, $no) {
+ if(!is_array($var)) {
+ $ret = $var;
+ } else {
+ $ret = $var[$no % count($var)];
+ }
+
+ return ($ret) ? ' '.$ret : '';
}