<?php 
/** 
 * Smarty plugin 
 * 
 * @package    Smarty 
 * @subpackage PluginsFunction 
 */ 
/** 
 * Smarty {html_checkboxes} function plugin 
 * File:       function.html_checkboxes.php 
 * Type:       function 
 * Name:       html_checkboxes 
 * Date:       24.Feb.2003 
 * Purpose:    Prints out a list of checkbox input types 
 * Examples: 
 * 
 * {html_checkboxes values=$ids output=$names} 
 * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} 
 * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} 
 * 
 * Params: 
 * 
 * - name       (optional) - string default "checkbox" 
 * - values     (required) - array 
 * - options    (optional) - associative array 
 * - checked    (optional) - array default not set 
 * - separator  (optional) - ie <br> or   
 * - output     (optional) - the output next to each checkbox 
 * - assign     (optional) - assign the output as an array to this variable 
 * - escape     (optional) - escape the content (not value), defaults to true 
 * 
 * @link    http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} 
 *             (Smarty online manual) 
 * @author  Christopher Kvarme <[email protected]> 
 * @author  credits to Monte Ohrt <monte at ohrt dot com> 
 * @version 1.0 
 * 
 * @param array                    $params   parameters 
 * @param Smarty_Internal_Template $template template object 
 * 
 * @return string 
 * @uses    smarty_function_escape_special_chars() 
 * @throws \SmartyException 
 */ 
function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template) 
{ 
    $template->_checkPlugins( 
        array( 
            array( 
                'function' => 'smarty_function_escape_special_chars', 
                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' 
            ) 
        ) 
    ); 
    $name = 'checkbox'; 
    $values = null; 
    $options = null; 
    $selected = array(); 
    $separator = ''; 
    $escape = true; 
    $labels = true; 
    $label_ids = false; 
    $output = null; 
    $extra = ''; 
    foreach ($params as $_key => $_val) { 
        switch ($_key) { 
            case 'name': 
            case 'separator': 
                $$_key = (string)$_val; 
                break; 
            case 'escape': 
            case 'labels': 
            case 'label_ids': 
                $$_key = (bool)$_val; 
                break; 
            case 'options': 
                $$_key = (array)$_val; 
                break; 
            case 'values': 
            case 'output': 
                $$_key = array_values((array)$_val); 
                break; 
            case 'checked': 
            case 'selected': 
                if (is_array($_val)) { 
                    $selected = array(); 
                    foreach ($_val as $_sel) { 
                        if (is_object($_sel)) { 
                            if (method_exists($_sel, '__toString')) { 
                                $_sel = smarty_function_escape_special_chars((string)$_sel->__toString()); 
                            } else { 
                                trigger_error( 
                                    'html_checkboxes: selected attribute contains an object of class \'' . 
                                    get_class($_sel) . '\' without __toString() method', 
                                    E_USER_NOTICE 
                                ); 
                                continue; 
                            } 
                        } else { 
                            $_sel = smarty_function_escape_special_chars((string)$_sel); 
                        } 
                        $selected[ $_sel ] = true; 
                    } 
                } elseif (is_object($_val)) { 
                    if (method_exists($_val, '__toString')) { 
                        $selected = smarty_function_escape_special_chars((string)$_val->__toString()); 
                    } else { 
                        trigger_error( 
                            'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) . 
                            '\' without __toString() method', 
                            E_USER_NOTICE 
                        ); 
                    } 
                } else { 
                    $selected = smarty_function_escape_special_chars((string)$_val); 
                } 
                break; 
            case 'checkboxes': 
                trigger_error( 
                    'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', 
                    E_USER_WARNING 
                ); 
                $options = (array)$_val; 
                break; 
            case 'assign': 
                break; 
            case 'strict': 
                break; 
            case 'disabled': 
            case 'readonly': 
                if (!empty($params[ 'strict' ])) { 
                    if (!is_scalar($_val)) { 
                        trigger_error( 
                            "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", 
                            E_USER_NOTICE 
                        ); 
                    } 
                    if ($_val === true || $_val === $_key) { 
                        $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; 
                    } 
                    break; 
                } 
            // omit break; to fall through! 
            // no break 
            default: 
                if (!is_array($_val)) { 
                    $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; 
                } else { 
                    trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); 
                } 
                break; 
        } 
    } 
    if (!isset($options) && !isset($values)) { 
        return ''; 
    } /* raise error here? */ 
    $_html_result = array(); 
    if (isset($options)) { 
        foreach ($options as $_key => $_val) { 
            $_html_result[] = 
                smarty_function_html_checkboxes_output( 
                    $name, 
                    $_key, 
                    $_val, 
                    $selected, 
                    $extra, 
                    $separator, 
                    $labels, 
                    $label_ids, 
                    $escape 
                ); 
        } 
    } else { 
        foreach ($values as $_i => $_key) { 
            $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; 
            $_html_result[] = 
                smarty_function_html_checkboxes_output( 
                    $name, 
                    $_key, 
                    $_val, 
                    $selected, 
                    $extra, 
                    $separator, 
                    $labels, 
                    $label_ids, 
                    $escape 
                ); 
        } 
    } 
    if (!empty($params[ 'assign' ])) { 
        $template->assign($params[ 'assign' ], $_html_result); 
    } else { 
        return implode("\n", $_html_result); 
    } 
} 
 
/** 
 * @param      $name 
 * @param      $value 
 * @param      $output 
 * @param      $selected 
 * @param      $extra 
 * @param      $separator 
 * @param      $labels 
 * @param      $label_ids 
 * @param bool $escape 
 * 
 * @return string 
 */ 
function smarty_function_html_checkboxes_output( 
    $name, 
    $value, 
    $output, 
    $selected, 
    $extra, 
    $separator, 
    $labels, 
    $label_ids, 
    $escape = true 
) { 
    $_output = ''; 
    if (is_object($value)) { 
        if (method_exists($value, '__toString')) { 
            $value = (string)$value->__toString(); 
        } else { 
            trigger_error( 
                'html_options: value is an object of class \'' . get_class($value) . 
                '\' without __toString() method', 
                E_USER_NOTICE 
            ); 
            return ''; 
        } 
    } else { 
        $value = (string)$value; 
    } 
    if (is_object($output)) { 
        if (method_exists($output, '__toString')) { 
            $output = (string)$output->__toString(); 
        } else { 
            trigger_error( 
                'html_options: output is an object of class \'' . get_class($output) . 
                '\' without __toString() method', 
                E_USER_NOTICE 
            ); 
            return ''; 
        } 
    } else { 
        $output = (string)$output; 
    } 
    if ($labels) { 
        if ($label_ids) { 
            $_id = smarty_function_escape_special_chars( 
                preg_replace( 
                    '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, 
                    '_', 
                    $name . '_' . $value 
                ) 
            ); 
            $_output .= '<label for="' . $_id . '">'; 
        } else { 
            $_output .= '<label>'; 
        } 
    } 
    $name = smarty_function_escape_special_chars($name); 
    $value = smarty_function_escape_special_chars($value); 
    if ($escape) { 
        $output = smarty_function_escape_special_chars($output); 
    } 
    $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; 
    if ($labels && $label_ids) { 
        $_output .= ' id="' . $_id . '"'; 
    } 
    if (is_array($selected)) { 
        if (isset($selected[ $value ])) { 
            $_output .= ' checked="checked"'; 
        } 
    } elseif ($value === $selected) { 
        $_output .= ' checked="checked"'; 
    } 
    $_output .= $extra . ' />' . $output; 
    if ($labels) { 
        $_output .= '</label>'; 
    } 
    $_output .= $separator; 
    return $_output; 
} 
 
 |