Older Newer
Thu, 13 Jan 2005 03:34:48 . . . . BenFromTokyo? [changed error message]


Changes by last author:

Added:
table_foreach is another solution for creating advanced html tables, but, according to the author, it's the best one !

Example:

<code>

{table_foreach from=$bookList item=book key=id cols=4 td_attr='bgcolor="#FFEEDD"'}

The book with id {$id} is entitled "{$book->bookname}".

{/table_foreach}

</code>

Functionalities :

* Use it the same way as foreach : normal smarty code inside each cell as with foreach. (html_table_adv lacked this functionality, in my opinion)

* $item and $key available in each cell

* possibility of html table from array of arrays or from array of objects

* possibility of nested tables:

<code>

{table_foreach from=$bookList item=book key=id cols=4 td_attr='bgcolor="#FFEEDD"'}

The book with id[{$id}] is entitled "{$book->bookname}".<br>

Authors List:

{table_foreach from=$book->writers item=writer}

{$writer->firstname} {$writer->name}

{/table_foreach}

{/table_foreach}

</code>

* same param as foreach (except name)

* same param as html_table, which it relies on.

Install :

Like the other plugins :

Create a file called 'block.table_foreach.php' in your plugin directory (where the file 'function.html_table.php' should also be). Copy the following code in this file. You can use {table_foreach } in your template.

----

<code>

<?php

/**

* Smarty plugin

* @package Smarty

* @subpackage plugins

*/

/**

* Smarty {table_foreach} block function plugin

*

* Type: block function<br>

* Name: table_foreach<br>

* Date: Jan 5, 2005<br>

* Purpose: make an html table with designable cells from an associative array.

* 'key' and 'item' available as in foreach.

* Elements of the array can be scalars, arrays, or objects, and can be accessed in the cells.

* Supports nested calls<br>

* Input:<br>

* - from = array to loop through

* - item = The name of the variable that is the current element

* - key = The name of the variable that is the current key

*

* - 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:

* $bookList is an array of objects.

*

* <pre>

*{table_foreach from=$bookList item=book key=id cols=4 td_attr='bgcolor="#FFEEDD"'}

* The book with id {$id} is entitled "{$book->bookname}".

*{/table_foreach}

* </pre>

* @author Benjamin Layet <benjamin@moonfactory.co.jp>

* @version 1.0

* @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}

* http://smarty.php.net/manual/en/language.function.foreach.php {foreach}

* (Smarty online manual)

* @return string

*/

function smarty_block_table_foreach($params, $content, &$smarty, &$repeat)

{

static $depth = 0; //depth in a nested situation :

// 1 in general, 2 in the first nested call, 3 in the second etc...

static $from_array = array(); //keep track of the from param, and the current value. Index is $depth.

static $loop_array = array(); //feed the html_table function. Index is $depth.

///////////

//check params

///////////

if (!isset($params['from'])) {

$smarty->trigger_error("table_foreach: missing 'from' parameter");

return;

}

if (!isset($params['item'])) {

$smarty->trigger_error("table_foreach: missing 'item' parameter");

return;

}

if(0 == count($params['from']))

{

return;

}

///////////

//first call (for each {table_foreach } in the tpl)

//increment $depth

///////////

if(is_null($content))

{

$depth ++;

$from_array[$depth] = (array) $params['from'];

}

///////////

//assignments of $content for next call

///////////

//get the from param corresponding to the current depth

$from = & $from_array[$depth];

//get the current key and item

//$from being static the array descriptor is kept

//between two calls

if(list($key, $item) = each($from))

{

$repeat = true;

//smarty assignments : item

$item_varname = (string) $params['item'];

$smarty->assign($item_varname, $item);

//key

if(isset($params['key']))

{

$key_varname = (string) $params['key'];

$smarty->assign($key_varname, $key);

}

}else

{

//no values left

$repeat = false;

}

///////////

//add content to loop[]

///////////

if(!is_null($content))

{

$loop = & $loop_array[$depth];

$loop[] = $content;

}

///////////

//last call : call html_table

//decrement $depth

///////////

if(!$repeat)

{

//call html_table

require_once( dirname(__FILE__)."/function.html_table.php");

$params = array_merge($params, array("loop" => $loop));

//reset the static vars

$loop = array();

$from = array();

//decrement $depth

$depth --;

return smarty_function_html_table($params, $smarty);

}

}

/* vim: set expandtab: */

?>

</code>