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 &nbsp;
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