]> git.sur5r.net Git - contagged/blob - inc/smarty/plugins/function.html_select_date.php
file hierachy reordering
[contagged] / inc / smarty / plugins / function.html_select_date.php
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 ?>