smarty/plugins/function.html_select_date.php
changeset 0 c63de9eb7045
equal deleted inserted replaced
-1:000000000000 0:c63de9eb7045
       
     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 ?>