Smarty Forum Index Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon.

Modified plugin: html_table -> html_assoctable

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
quatsch
Smarty n00b


Joined: 04 Oct 2010
Posts: 1

PostPosted: Mon Oct 04, 2010 3:52 pm    Post subject: Modified plugin: html_table -> html_assoctable Reply with quote

I improved the html_table function to my needs to obtain html_assoctable in which it is possible to use arrays of arrays, and provide the structure of the content of a cell...

to make myself clear:

$DATA = array(
array("id"=>2, "file"=>"two.jpg"),
array("id"=>4, "file"=>"four.jpg")
);

if I assign this table to my smarty element I can then use the following:

{html_assoctable loop=$DATA cols=2 table_attr='border="0" width=70%' structure="file:%file%, id:%id%"}

this will create:
<table ...>
<tr>
<td>file:two.jpg, id:2</td>
<td>file:four.jpg, id:4</td>
</tr>
</table>

I hope I'm clear in my explanations! And I hope this might serve! don't hesitate to give me some comments!

Code:

<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */


/**
 * Smarty {html_assoctable} function plugin
 *
 * Type:     function<br>
 * Name:     html_assoctable<br>
 * Date:     Oct 04, 2010<br>
 * Purpose:  make an html table from an array of arrays<br>
 * Input:<br>
 *         - loop = array to loop through
 *         - cols = number of columns, comma separated list of column names
 *                  or array of column names
 *         - rows = number of rows
 *         - table_attr = table attributes
 *         - th_attr = table heading attributes (arrays are cycled)
 *         - tr_attr = table row attributes (arrays are cycled)
 *         - td_attr = table cell attributes (arrays are cycled)
 *         - trailpad = value to pad trailing cells with
 *         - caption = text for caption element
 *         - 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)
 *         - structure = structure of cell contents (ex: <img src=%filename%>%title%</img>,
 *                       will use the filename entry and title entry of the array provided)
 *
 *
 * Examples:
 * <pre>
 * {table loop=$data}
 * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
 * {table loop=$data cols="first,second,third" tr_attr=$colors}
 * </pre>
 * @Modified by: Yann Bachy <ybachy at yahoo dot com>
 * @author   Monte Ohrt <monte at ohrt dot com>
 * @author credit to Messju Mohr <messju at lammfellpuschen dot de>
 * @author credit to boots <boots dot smarty at yahoo dot com>
 * @version  1.1
 * @param array
 * @param Smarty
 * @return string
 */
function smarty_function_html_assoctable($params, &$smarty)
{
    $table_attr = 'border="1"';
    $tr_attr = '';
    $th_attr = '';
    $td_attr = '';
    $cols = $cols_count = 3;
    $rows = 3;
    $trailpad = '&nbsp;';
    $vdir = 'down';
    $hdir = 'right';
    $inner = 'cols';
    $caption = '';
    $structure= "%filename%";

    if (!isset($params['loop'])) {
        $smarty->trigger_error("html_table: missing 'loop' parameter");
        return;
    }

    foreach ($params as $_key=>$_value) {
        switch ($_key) {
            case 'loop':
                $$_key = (array)$_value;
                break;

            case 'cols':
                if (is_array($_value) && !empty($_value)) {
                    $cols = $_value;
                    $cols_count = count($_value);
                } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
                    $cols = explode(',', $_value);
                    $cols_count = count($cols);
                } elseif (!empty($_value)) {
                    $cols_count = (int)$_value;
                } else {
                    $cols_count = $cols;
                }
                break;

            case 'rows':
                $$_key = (int)$_value;
                break;

            case 'table_attr':
            case 'trailpad':
            case 'hdir':
            case 'vdir':
            case 'inner':
            case 'caption':
            case 'structure':
                $$_key = (string)$_value;
                break;

            case 'tr_attr':
            case 'td_attr':
            case 'th_attr':
                $$_key = $_value;
                break;
        }
    }

    $loop_count = count($loop);
    if (empty($params['rows'])) {
        /* no rows specified */
        $rows = ceil($loop_count/$cols_count);
    } elseif (empty($params['cols'])) {
        if (!empty($params['rows'])) {
            /* no cols specified, but rows */
            $cols_count = ceil($loop_count/$rows);
        }
    }

    $output = "<table $table_attr>\n";

    if (!empty($caption)) {
        $output .= '<caption>' . $caption . "</caption>\n";
    }

    if (is_array($cols)) {
        $cols = ($hdir == 'right') ? $cols : array_reverse($cols);
        $output .= "<thead><tr>\n";

        for ($r=0; $r<$cols_count; $r++) {
            $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
            $output .= $cols[$r];
            $output .= "</th>\n";
        }
        $output .= "</tr></thead>\n";
    }

    $output .= "<tbody>\n";
    for ($r=0; $r<$rows; $r++) {
        $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
        $rx =  ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;

        for ($c=0; $c<$cols_count; $c++) {
            $x =  ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
            if ($inner!='cols') {
                /* shuffle x to loop over rows*/
                $x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
            }

            if ($x<$loop_count) {
                $tab = $loop[$x];
                $insert = $structure;
                foreach($tab as $key=>$val){
                        $insert = str_replace("%".$key."%", $val, $insert);
                }
                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $insert . "</td>\n";
            } else {
                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
            }
        }
        $output .= "</tr>\n";
    }
    $output .= "</tbody>\n";
    $output .= "</table>\n";
   
    return $output;
}

function smarty_function_html_table_cycle($name, $var, $no) {
    if(!is_array($var)) {
        $ret = $var;
    } else {
        $ret = $var[$no % count($var)];
    }
   
    return ($ret) ? ' '.$ret : '';
}


/* vim: set expandtab: */

?>
Back to top
View user's profile Send private message
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Plugins All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP