1<?php 2/** 3 * Smarty plugin 4 * 5 * @package Smarty 6 * @subpackage PluginsFunction 7 */ 8/** 9 * Smarty {html_radios} function plugin 10 * File: function.html_radios.php 11 * Type: function 12 * Name: html_radios 13 * Date: 24.Feb.2003 14 * Purpose: Prints out a list of radio input types 15 * Params: 16 * 17 * - name (optional) - string default "radio" 18 * - values (required) - array 19 * - options (required) - associative array 20 * - checked (optional) - array default not set 21 * - separator (optional) - ie <br> or 22 * - output (optional) - the output next to each radio button 23 * - assign (optional) - assign the output as an array to this variable 24 * - escape (optional) - escape the content (not value), defaults to true 25 * 26 * Examples: 27 * 28 * {html_radios values=$ids output=$names} 29 * {html_radios values=$ids name='box' separator='<br>' output=$names} 30 * {html_radios values=$ids checked=$checked separator='<br>' output=$names} 31 * 32 * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} 33 * (Smarty online manual) 34 * @author Christopher Kvarme <christopher.kvarme@flashjab.com> 35 * @author credits to Monte Ohrt <monte at ohrt dot com> 36 * @version 1.0 37 * 38 * @param array $params parameters 39 * @param Smarty_Internal_Template $template template object 40 * 41 * @return string 42 * @uses smarty_function_escape_special_chars() 43 * @throws \SmartyException 44 */ 45function smarty_function_html_radios($params, Smarty_Internal_Template $template) 46{ 47 $template->_checkPlugins( 48 array( 49 array( 50 'function' => 'smarty_function_escape_special_chars', 51 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php' 52 ) 53 ) 54 ); 55 $name = 'radio'; 56 $values = null; 57 $options = null; 58 $selected = null; 59 $separator = ''; 60 $escape = true; 61 $labels = true; 62 $label_ids = false; 63 $output = null; 64 $extra = ''; 65 foreach ($params as $_key => $_val) { 66 switch ($_key) { 67 case 'name': 68 case 'separator': 69 $$_key = (string)$_val; 70 break; 71 case 'checked': 72 case 'selected': 73 if (is_array($_val)) { 74 trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); 75 } elseif (is_object($_val)) { 76 if (method_exists($_val, '__toString')) { 77 $selected = smarty_function_escape_special_chars((string)$_val->__toString()); 78 } else { 79 trigger_error( 80 'html_radios: selected attribute is an object of class \'' . get_class($_val) . 81 '\' without __toString() method', 82 E_USER_NOTICE 83 ); 84 } 85 } else { 86 $selected = (string)$_val; 87 } 88 break; 89 case 'escape': 90 case 'labels': 91 case 'label_ids': 92 $$_key = (bool)$_val; 93 break; 94 case 'options': 95 $$_key = (array)$_val; 96 break; 97 case 'values': 98 case 'output': 99 $$_key = array_values((array)$_val); 100 break; 101 case 'radios': 102 trigger_error( 103 'html_radios: the use of the "radios" attribute is deprecated, use "options" instead', 104 E_USER_WARNING 105 ); 106 $options = (array)$_val; 107 break; 108 case 'assign': 109 break; 110 case 'strict': 111 break; 112 case 'disabled': 113 case 'readonly': 114 if (!empty($params[ 'strict' ])) { 115 if (!is_scalar($_val)) { 116 trigger_error( 117 "html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", 118 E_USER_NOTICE 119 ); 120 } 121 if ($_val === true || $_val === $_key) { 122 $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; 123 } 124 break; 125 } 126 // omit break; to fall through! 127 // no break 128 default: 129 if (!is_array($_val)) { 130 $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; 131 } else { 132 trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); 133 } 134 break; 135 } 136 } 137 if (!isset($options) && !isset($values)) { 138 /* raise error here? */ 139 return ''; 140 } 141 $_html_result = array(); 142 if (isset($options)) { 143 foreach ($options as $_key => $_val) { 144 $_html_result[] = 145 smarty_function_html_radios_output( 146 $name, 147 $_key, 148 $_val, 149 $selected, 150 $extra, 151 $separator, 152 $labels, 153 $label_ids, 154 $escape 155 ); 156 } 157 } else { 158 foreach ($values as $_i => $_key) { 159 $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; 160 $_html_result[] = 161 smarty_function_html_radios_output( 162 $name, 163 $_key, 164 $_val, 165 $selected, 166 $extra, 167 $separator, 168 $labels, 169 $label_ids, 170 $escape 171 ); 172 } 173 } 174 if (!empty($params[ 'assign' ])) { 175 $template->assign($params[ 'assign' ], $_html_result); 176 } else { 177 return implode("\n", $_html_result); 178 } 179} 180 181/** 182 * @param $name 183 * @param $value 184 * @param $output 185 * @param $selected 186 * @param $extra 187 * @param $separator 188 * @param $labels 189 * @param $label_ids 190 * @param $escape 191 * 192 * @return string 193 */ 194function smarty_function_html_radios_output( 195 $name, 196 $value, 197 $output, 198 $selected, 199 $extra, 200 $separator, 201 $labels, 202 $label_ids, 203 $escape 204) { 205 $_output = ''; 206 if (is_object($value)) { 207 if (method_exists($value, '__toString')) { 208 $value = (string)$value->__toString(); 209 } else { 210 trigger_error( 211 'html_options: value is an object of class \'' . get_class($value) . 212 '\' without __toString() method', 213 E_USER_NOTICE 214 ); 215 return ''; 216 } 217 } else { 218 $value = (string)$value; 219 } 220 if (is_object($output)) { 221 if (method_exists($output, '__toString')) { 222 $output = (string)$output->__toString(); 223 } else { 224 trigger_error( 225 'html_options: output is an object of class \'' . get_class($output) . 226 '\' without __toString() method', 227 E_USER_NOTICE 228 ); 229 return ''; 230 } 231 } else { 232 $output = (string)$output; 233 } 234 if ($labels) { 235 if ($label_ids) { 236 $_id = smarty_function_escape_special_chars( 237 preg_replace( 238 '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, 239 '_', 240 $name . '_' . $value 241 ) 242 ); 243 $_output .= '<label for="' . $_id . '">'; 244 } else { 245 $_output .= '<label>'; 246 } 247 } 248 $name = smarty_function_escape_special_chars($name); 249 $value = smarty_function_escape_special_chars($value); 250 if ($escape) { 251 $output = smarty_function_escape_special_chars($output); 252 } 253 $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; 254 if ($labels && $label_ids) { 255 $_output .= ' id="' . $_id . '"'; 256 } 257 if ($value === $selected) { 258 $_output .= ' checked="checked"'; 259 } 260 $_output .= $extra . ' />' . $output; 261 if ($labels) { 262 $_output .= '</label>'; 263 } 264 $_output .= $separator; 265 return $_output; 266} 267