Mercurial > epgrec.yaz
comparison Smarty/plugins/function.html_select_date.php @ 1:f5a9f0eb4858
deleted: LICENSE.ja
author | Sushi-k <epgrec@park.mda.or.jp> |
---|---|
date | Wed, 08 Jul 2009 11:44:50 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:96312e6ab8d4 | 1:f5a9f0eb4858 |
---|---|
1 <?php | |
2 /** | |
3 * Smarty plugin | |
4 * @package Smarty | |
5 * @subpackage plugins | |
6 */ | |
7 | |
8 /** | |
9 * Smarty {html_select_date} plugin | |
10 * | |
11 * Type: function<br> | |
12 * Name: html_select_date<br> | |
13 * Purpose: Prints the dropdowns for date selection. | |
14 * | |
15 * ChangeLog:<br> | |
16 * - 1.0 initial release | |
17 * - 1.1 added support for +/- N syntax for begin | |
18 * and end year values. (Monte) | |
19 * - 1.2 added support for yyyy-mm-dd syntax for | |
20 * time value. (Jan Rosier) | |
21 * - 1.3 added support for choosing format for | |
22 * month values (Gary Loescher) | |
23 * - 1.3.1 added support for choosing format for | |
24 * day values (Marcus Bointon) | |
25 * - 1.3.2 support negative timestamps, force year | |
26 * dropdown to include given date unless explicitly set (Monte) | |
27 * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that | |
28 * of 0000-00-00 dates (cybot, boots) | |
29 * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date} | |
30 * (Smarty online manual) | |
31 * @version 1.3.4 | |
32 * @author Andrei Zmievski | |
33 * @author Monte Ohrt <monte at ohrt dot com> | |
34 * @param array | |
35 * @param Smarty | |
36 * @return string | |
37 */ | |
38 function smarty_function_html_select_date($params, &$smarty) | |
39 { | |
40 require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); | |
41 require_once $smarty->_get_plugin_filepath('shared','make_timestamp'); | |
42 require_once $smarty->_get_plugin_filepath('function','html_options'); | |
43 /* Default values. */ | |
44 $prefix = "Date_"; | |
45 $start_year = strftime("%Y"); | |
46 $end_year = $start_year; | |
47 $display_days = true; | |
48 $display_months = true; | |
49 $display_years = true; | |
50 $month_format = "%B"; | |
51 /* Write months as numbers by default GL */ | |
52 $month_value_format = "%m"; | |
53 $day_format = "%02d"; | |
54 /* Write day values using this format MB */ | |
55 $day_value_format = "%d"; | |
56 $year_as_text = false; | |
57 /* Display years in reverse order? Ie. 2000,1999,.... */ | |
58 $reverse_years = false; | |
59 /* Should the select boxes be part of an array when returned from PHP? | |
60 e.g. setting it to "birthday", would create "birthday[Day]", | |
61 "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ | |
62 $field_array = null; | |
63 /* <select size>'s of the different <select> tags. | |
64 If not set, uses default dropdown. */ | |
65 $day_size = null; | |
66 $month_size = null; | |
67 $year_size = null; | |
68 /* Unparsed attributes common to *ALL* the <select>/<input> tags. | |
69 An example might be in the template: all_extra ='class ="foo"'. */ | |
70 $all_extra = null; | |
71 /* Separate attributes for the tags. */ | |
72 $day_extra = null; | |
73 $month_extra = null; | |
74 $year_extra = null; | |
75 /* Order in which to display the fields. | |
76 "D" -> day, "M" -> month, "Y" -> year. */ | |
77 $field_order = 'MDY'; | |
78 /* String printed between the different fields. */ | |
79 $field_separator = "\n"; | |
80 $time = time(); | |
81 $all_empty = null; | |
82 $day_empty = null; | |
83 $month_empty = null; | |
84 $year_empty = null; | |
85 $extra_attrs = ''; | |
86 | |
87 foreach ($params as $_key=>$_value) { | |
88 switch ($_key) { | |
89 case 'prefix': | |
90 case 'time': | |
91 case 'start_year': | |
92 case 'end_year': | |
93 case 'month_format': | |
94 case 'day_format': | |
95 case 'day_value_format': | |
96 case 'field_array': | |
97 case 'day_size': | |
98 case 'month_size': | |
99 case 'year_size': | |
100 case 'all_extra': | |
101 case 'day_extra': | |
102 case 'month_extra': | |
103 case 'year_extra': | |
104 case 'field_order': | |
105 case 'field_separator': | |
106 case 'month_value_format': | |
107 case 'month_empty': | |
108 case 'day_empty': | |
109 case 'year_empty': | |
110 $$_key = (string)$_value; | |
111 break; | |
112 | |
113 case 'all_empty': | |
114 $$_key = (string)$_value; | |
115 $day_empty = $month_empty = $year_empty = $all_empty; | |
116 break; | |
117 | |
118 case 'display_days': | |
119 case 'display_months': | |
120 case 'display_years': | |
121 case 'year_as_text': | |
122 case 'reverse_years': | |
123 $$_key = (bool)$_value; | |
124 break; | |
125 | |
126 default: | |
127 if(!is_array($_value)) { | |
128 $extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"'; | |
129 } else { | |
130 $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); | |
131 } | |
132 break; | |
133 } | |
134 } | |
135 | |
136 if (preg_match('!^-\d+$!', $time)) { | |
137 // negative timestamp, use date() | |
138 $time = date('Y-m-d', $time); | |
139 } | |
140 // If $time is not in format yyyy-mm-dd | |
141 if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) { | |
142 $time = $found[1]; | |
143 } else { | |
144 // use smarty_make_timestamp to get an unix timestamp and | |
145 // strftime to make yyyy-mm-dd | |
146 $time = strftime('%Y-%m-%d', smarty_make_timestamp($time)); | |
147 } | |
148 // Now split this in pieces, which later can be used to set the select | |
149 $time = explode("-", $time); | |
150 | |
151 // make syntax "+N" or "-N" work with start_year and end_year | |
152 if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) { | |
153 if ($match[1] == '+') { | |
154 $end_year = strftime('%Y') + $match[2]; | |
155 } else { | |
156 $end_year = strftime('%Y') - $match[2]; | |
157 } | |
158 } | |
159 if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) { | |
160 if ($match[1] == '+') { | |
161 $start_year = strftime('%Y') + $match[2]; | |
162 } else { | |
163 $start_year = strftime('%Y') - $match[2]; | |
164 } | |
165 } | |
166 if (strlen($time[0]) > 0) { | |
167 if ($start_year > $time[0] && !isset($params['start_year'])) { | |
168 // force start year to include given date if not explicitly set | |
169 $start_year = $time[0]; | |
170 } | |
171 if($end_year < $time[0] && !isset($params['end_year'])) { | |
172 // force end year to include given date if not explicitly set | |
173 $end_year = $time[0]; | |
174 } | |
175 } | |
176 | |
177 $field_order = strtoupper($field_order); | |
178 | |
179 $html_result = $month_result = $day_result = $year_result = ""; | |
180 | |
181 $field_separator_count = -1; | |
182 if ($display_months) { | |
183 $field_separator_count++; | |
184 $month_names = array(); | |
185 $month_values = array(); | |
186 if(isset($month_empty)) { | |
187 $month_names[''] = $month_empty; | |
188 $month_values[''] = ''; | |
189 } | |
190 for ($i = 1; $i <= 12; $i++) { | |
191 $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000)); | |
192 $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000)); | |
193 } | |
194 | |
195 $month_result .= '<select name='; | |
196 if (null !== $field_array){ | |
197 $month_result .= '"' . $field_array . '[' . $prefix . 'Month]"'; | |
198 } else { | |
199 $month_result .= '"' . $prefix . 'Month"'; | |
200 } | |
201 if (null !== $month_size){ | |
202 $month_result .= ' size="' . $month_size . '"'; | |
203 } | |
204 if (null !== $month_extra){ | |
205 $month_result .= ' ' . $month_extra; | |
206 } | |
207 if (null !== $all_extra){ | |
208 $month_result .= ' ' . $all_extra; | |
209 } | |
210 $month_result .= $extra_attrs . '>'."\n"; | |
211 | |
212 $month_result .= smarty_function_html_options(array('output' => $month_names, | |
213 'values' => $month_values, | |
214 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '', | |
215 'print_result' => false), | |
216 $smarty); | |
217 $month_result .= '</select>'; | |
218 } | |
219 | |
220 if ($display_days) { | |
221 $field_separator_count++; | |
222 $days = array(); | |
223 if (isset($day_empty)) { | |
224 $days[''] = $day_empty; | |
225 $day_values[''] = ''; | |
226 } | |
227 for ($i = 1; $i <= 31; $i++) { | |
228 $days[] = sprintf($day_format, $i); | |
229 $day_values[] = sprintf($day_value_format, $i); | |
230 } | |
231 | |
232 $day_result .= '<select name='; | |
233 if (null !== $field_array){ | |
234 $day_result .= '"' . $field_array . '[' . $prefix . 'Day]"'; | |
235 } else { | |
236 $day_result .= '"' . $prefix . 'Day"'; | |
237 } | |
238 if (null !== $day_size){ | |
239 $day_result .= ' size="' . $day_size . '"'; | |
240 } | |
241 if (null !== $all_extra){ | |
242 $day_result .= ' ' . $all_extra; | |
243 } | |
244 if (null !== $day_extra){ | |
245 $day_result .= ' ' . $day_extra; | |
246 } | |
247 $day_result .= $extra_attrs . '>'."\n"; | |
248 $day_result .= smarty_function_html_options(array('output' => $days, | |
249 'values' => $day_values, | |
250 'selected' => $time[2], | |
251 'print_result' => false), | |
252 $smarty); | |
253 $day_result .= '</select>'; | |
254 } | |
255 | |
256 if ($display_years) { | |
257 $field_separator_count++; | |
258 if (null !== $field_array){ | |
259 $year_name = $field_array . '[' . $prefix . 'Year]'; | |
260 } else { | |
261 $year_name = $prefix . 'Year'; | |
262 } | |
263 if ($year_as_text) { | |
264 $year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"'; | |
265 if (null !== $all_extra){ | |
266 $year_result .= ' ' . $all_extra; | |
267 } | |
268 if (null !== $year_extra){ | |
269 $year_result .= ' ' . $year_extra; | |
270 } | |
271 $year_result .= ' />'; | |
272 } else { | |
273 $years = range((int)$start_year, (int)$end_year); | |
274 if ($reverse_years) { | |
275 rsort($years, SORT_NUMERIC); | |
276 } else { | |
277 sort($years, SORT_NUMERIC); | |
278 } | |
279 $yearvals = $years; | |
280 if(isset($year_empty)) { | |
281 array_unshift($years, $year_empty); | |
282 array_unshift($yearvals, ''); | |
283 } | |
284 $year_result .= '<select name="' . $year_name . '"'; | |
285 if (null !== $year_size){ | |
286 $year_result .= ' size="' . $year_size . '"'; | |
287 } | |
288 if (null !== $all_extra){ | |
289 $year_result .= ' ' . $all_extra; | |
290 } | |
291 if (null !== $year_extra){ | |
292 $year_result .= ' ' . $year_extra; | |
293 } | |
294 $year_result .= $extra_attrs . '>'."\n"; | |
295 $year_result .= smarty_function_html_options(array('output' => $years, | |
296 'values' => $yearvals, | |
297 'selected' => $time[0], | |
298 'print_result' => false), | |
299 $smarty); | |
300 $year_result .= '</select>'; | |
301 } | |
302 } | |
303 | |
304 // Loop thru the field_order field | |
305 for ($i = 0; $i <= 2; $i++){ | |
306 $c = substr($field_order, $i, 1); | |
307 switch ($c){ | |
308 case 'D': | |
309 $html_result .= $day_result; | |
310 break; | |
311 | |
312 case 'M': | |
313 $html_result .= $month_result; | |
314 break; | |
315 | |
316 case 'Y': | |
317 $html_result .= $year_result; | |
318 break; | |
319 } | |
320 // Add the field seperator | |
321 if($i < $field_separator_count) { | |
322 $html_result .= $field_separator; | |
323 } | |
324 } | |
325 | |
326 return $html_result; | |
327 } | |
328 | |
329 /* vim: set expandtab: */ | |
330 | |
331 ?> |