1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: |
|
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: | |
19: | |
20: | |
21: | |
22: | |
23: | |
24: | |
25: | |
26: | |
27: | |
28: | |
29: | |
30: | |
31: | |
32: | |
33: | |
34: | |
35: | |
36: |
|
37: | function smarty_function_html_options($params, Smarty_Internal_Template $template)
|
38: | {
|
39: | $template->_checkPlugins(
|
40: | array(
|
41: | array(
|
42: | 'function' => 'smarty_function_escape_special_chars',
|
43: | 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
|
44: | )
|
45: | )
|
46: | );
|
47: | $name = null;
|
48: | $values = null;
|
49: | $options = null;
|
50: | $selected = null;
|
51: | $output = null;
|
52: | $id = null;
|
53: | $class = null;
|
54: | $extra = '';
|
55: | foreach ($params as $_key => $_val) {
|
56: | switch ($_key) {
|
57: | case 'name':
|
58: | case 'class':
|
59: | case 'id':
|
60: | $$_key = (string)$_val;
|
61: | break;
|
62: | case 'options':
|
63: | $options = (array)$_val;
|
64: | break;
|
65: | case 'values':
|
66: | case 'output':
|
67: | $$_key = array_values((array)$_val);
|
68: | break;
|
69: | case 'selected':
|
70: | if (is_array($_val)) {
|
71: | $selected = array();
|
72: | foreach ($_val as $_sel) {
|
73: | if (is_object($_sel)) {
|
74: | if (method_exists($_sel, '__toString')) {
|
75: | $_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
|
76: | } else {
|
77: | trigger_error(
|
78: | 'html_options: selected attribute contains an object of class \'' .
|
79: | get_class($_sel) . '\' without __toString() method',
|
80: | E_USER_NOTICE
|
81: | );
|
82: | continue;
|
83: | }
|
84: | } else {
|
85: | $_sel = smarty_function_escape_special_chars((string)$_sel);
|
86: | }
|
87: | $selected[ $_sel ] = true;
|
88: | }
|
89: | } elseif (is_object($_val)) {
|
90: | if (method_exists($_val, '__toString')) {
|
91: | $selected = smarty_function_escape_special_chars((string)$_val->__toString());
|
92: | } else {
|
93: | trigger_error(
|
94: | 'html_options: selected attribute is an object of class \'' . get_class($_val) .
|
95: | '\' without __toString() method',
|
96: | E_USER_NOTICE
|
97: | );
|
98: | }
|
99: | } else {
|
100: | $selected = smarty_function_escape_special_chars((string)$_val);
|
101: | }
|
102: | break;
|
103: | case 'strict':
|
104: | break;
|
105: | case 'disabled':
|
106: | case 'readonly':
|
107: | if (!empty($params[ 'strict' ])) {
|
108: | if (!is_scalar($_val)) {
|
109: | trigger_error(
|
110: | "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
|
111: | E_USER_NOTICE
|
112: | );
|
113: | }
|
114: | if ($_val === true || $_val === $_key) {
|
115: | $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
|
116: | }
|
117: | break;
|
118: | }
|
119: |
|
120: |
|
121: | default:
|
122: | if (!is_array($_val)) {
|
123: | $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
|
124: | } else {
|
125: | trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
|
126: | }
|
127: | break;
|
128: | }
|
129: | }
|
130: | if (!isset($options) && !isset($values)) {
|
131: |
|
132: | return '';
|
133: | }
|
134: | $_html_result = '';
|
135: | $_idx = 0;
|
136: | if (isset($options)) {
|
137: | foreach ($options as $_key => $_val) {
|
138: | $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
|
139: | }
|
140: | } else {
|
141: | foreach ($values as $_i => $_key) {
|
142: | $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
|
143: | $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
|
144: | }
|
145: | }
|
146: | if (!empty($name)) {
|
147: | $_html_class = !empty($class) ? ' class="' . $class . '"' : '';
|
148: | $_html_id = !empty($id) ? ' id="' . $id . '"' : '';
|
149: | $_html_result =
|
150: | '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result .
|
151: | '</select>' . "\n";
|
152: | }
|
153: | return $_html_result;
|
154: | }
|
155: |
|
156: | |
157: | |
158: | |
159: | |
160: | |
161: | |
162: | |
163: | |
164: | |
165: |
|
166: | function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx)
|
167: | {
|
168: | if (!is_array($value)) {
|
169: | $_key = smarty_function_escape_special_chars($key);
|
170: | $_html_result = '<option value="' . $_key . '"';
|
171: | if (is_array($selected)) {
|
172: | if (isset($selected[ $_key ])) {
|
173: | $_html_result .= ' selected="selected"';
|
174: | }
|
175: | } elseif ($_key === $selected) {
|
176: | $_html_result .= ' selected="selected"';
|
177: | }
|
178: | $_html_class = !empty($class) ? ' class="' . $class . ' option"' : '';
|
179: | $_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : '';
|
180: | if (is_object($value)) {
|
181: | if (method_exists($value, '__toString')) {
|
182: | $value = smarty_function_escape_special_chars((string)$value->__toString());
|
183: | } else {
|
184: | trigger_error(
|
185: | 'html_options: value is an object of class \'' . get_class($value) .
|
186: | '\' without __toString() method',
|
187: | E_USER_NOTICE
|
188: | );
|
189: | return '';
|
190: | }
|
191: | } else {
|
192: | $value = smarty_function_escape_special_chars((string)$value);
|
193: | }
|
194: | $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
|
195: | $idx++;
|
196: | } else {
|
197: | $_idx = 0;
|
198: | $_html_result =
|
199: | smarty_function_html_options_optgroup(
|
200: | $key,
|
201: | $value,
|
202: | $selected,
|
203: | !empty($id) ? ($id . '-' . $idx) : null,
|
204: | $class,
|
205: | $_idx
|
206: | );
|
207: | $idx++;
|
208: | }
|
209: | return $_html_result;
|
210: | }
|
211: |
|
212: | |
213: | |
214: | |
215: | |
216: | |
217: | |
218: | |
219: | |
220: | |
221: |
|
222: | function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx)
|
223: | {
|
224: | $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
|
225: | foreach ($values as $key => $value) {
|
226: | $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx);
|
227: | }
|
228: | $optgroup_html .= "</optgroup>\n";
|
229: | return $optgroup_html;
|
230: | }
|
231: | |