On Thursday, June 20, 2002, at 09:16 PM, Justin French wrote:
> When users have to enter dates on my forms, I always provide them with > three > drop-down menus, for day (1-31), Month (1-12) and year (usually current > year, the next and the next, depending on the application). > > Then I have three values on the next page ($_POST['day'], > $_POST['month'], > $_POST['year']) which I can combine into a date format I like, or even > into > a Unix timestamp. Maybe this will help you -- it's a function that does exactly this. Of course, the mail client will probably mess up the line endings, but if you clean it up, this function will do the following things: 1. create a dropdown listbox for months, days, and years 2. allow you to specify which years should appear (by using a "start year" and a "total year" 3. you provide the name of each form input, so you can use this function multiple times on a page (using unique names each time) 4. you provide a default value for when the page loads so that you can make it "default" to a certain date 5. you decide whether or not to have a dummy "Please choose a date" or "any" choice on the listboxes (whose value will be an empty string) 6. you decide whether or not this dummy choice will persist if the default values are not empty. It is a big, ugly subroutine, but I use it in so many places in my application that it has allowed me to remove hundreds of lines of "custom" date listboxes. Here is the usage, since it may be somewhat confusing (copy this into a PHP script and see what effect it has): $current_year = date('Y', mktime()); // gets the current year $listbox_str = date_listbox_generator( 'month', 'day', 'year', $_POST['month'], $_POST['day'], $_POST['year'], $current_year, $current_year + 5, 'any', true); print $listbox_str; This will generate three date listboxes which each start with "any" as a choice which has no value when the form is submitted (you can test for an empty string to assume that is the choice). If this form has called itself and for some reason these listboxes reappear in the new instance of the page (which might be the case in, say a search engine interface), then when the page loads, the values chosen on the previous instance of the page will be the "default" values. The "any" choice will reappear in this case (so the user can still choose "any") because the last argument is "true", if the last argument was "false" then this option would disappear (this is useful for when you want to force the user to make a choice). Here is the function, hope it helps: /** * date_listbox_generator * * generates 3 HTML dropdown lists for selecting a date * * @param string $monthInputName name attribute of HTML select tag for displaying month (e.g., 'month') * @param string $dayInputName name attribute of HTML select tag for displaying days (e.g., 'day') * @param string $yearInputName name attribute of HTML select tag for displaying years (e.g., 'year') * @param string $defaultMonth one- or two-digit number representing a default month (if empty, defaults to current month + day multiplier) * @param string $defaultDay one- or two-digit number representing a default day of the month (if empty, defaults to current day + day multiplier) * @param string $defaultYear four-digit number representing a default year (if empty, defaults to current year + day multiplier) * @param string $startYear four-digit number representing a start year for the years array * @param string $totalYears total number of years to contain in the years array * @param $pleaseChooseMsg string used if there is to be a "Please Choose" option, the value of * this string is the text of the "Please Choose" option * @param $forcePleaseChoose bool forces the "Please Choose" option to persist even if there * is a default value. * @return string code to display 3 HTML select tag listboxes to accept user input for a date */ function date_listbox_generator($monthInputName, $dayInputName, $yearInputName, $defaultMonth, $defaultDay, $defaultYear, $startYear, $totalYears, $pleaseChooseMsg = '', $forcePleaseChoose = false) { // set the name of the month input from the function parameter $month_form = "\n<select name=\"{$monthInputName}\">\n"; // create an array of months $months = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); // set the counter to 1 b/c we don't want Jan = 0 $i = 1; $monthSelectedAlready = false; $monthPleaseChooseMade = false; // if the client code wants a pleaseChoose, and the default evaluates to empty, // then generate a "Please Choose" option tag. if (!empty($pleaseChooseMsg) && empty($defaultMonth)) { $month_form .= "\t<option value=\"\" selected=\"yes\">" . $pleaseChooseMsg . "</option>\n"; $monthSelectedAlready = true; $monthPleaseChooseMade = true; } if ($monthPleaseChooseMade == false && !empty($pleaseChooseMsg)) { $month_form .= "\t<option value=\"\">" . $pleaseChooseMsg . "</option>\n"; } foreach ($months as $monthname) { // if there's a default month and it's equal to the current iteration AND // we haven't already selected a "Please Choose" message, highlight that one if (!empty($defaultMonth) && $defaultMonth == $i && $monthSelectedAlready == false) { $month_form .= "\t<option value=\"{$i}\" selected=\"yes\">{$monthname}</option>\n"; // otherwise it's just a normal option, no highlight } else { $month_form .= "\t<option value=\"{$i}\">{$monthname}</option>\n"; } $i++; } $month_form .= "</select>\n"; // set the name of the day input from the function parameter $day_form = "\n<select name=\"{$dayInputName}\">\n"; // create an array of days $days = array(); for ($i = 1; $i < 32; $i++) { $days[] = $i; } $daySelectedAlready = false; $dayPleaseChooseMade = false; // if the client code wants a pleaseChoose, and the default evaluates to empty, // then generate a "Please Choose" option tag. if (!empty($pleaseChooseMsg) && empty($defaultDay)) { $day_form .= "\t<option value=\"\" selected=\"yes\">" . $pleaseChooseMsg . "</option>\n"; $daySelectedAlready = true; $dayPleaseChooseMade = true; } if ($dayPleaseChooseMade == false && !empty($pleaseChooseMsg)) { $day_form .= "\t<option value=\"\">" . $pleaseChooseMsg . "</option>\n"; } // loop through the array of days, set a default if appropriate foreach ($days as $dayname) { if (!empty($defaultDay) && $defaultDay == $dayname && $daySelectedAlready == false) { // do I need a way to exclude 'any' from this? ie, add && $defaultDay != 'any' ? $day_form .= "\t<option value=\"{$dayname}\" selected=\"yes\">{$dayname}</option>\n"; } else { $day_form .= "\t<option value=\"{$dayname}\">{$dayname}</option>\n"; } } $day_form .= "</select>\n"; // set the name of the year input from the function parameter $year_form = "\n<select name=\"{$yearInputName}\">\n"; // create an array of years -- from the function parameter $years = array(); for ($i = $startYear; $i <= ($startYear + $totalYears); $i++) { $years[] = $i; } $yearSelectedAlready = false; $yearPleaseChooseMade = false; // if the client code wants a pleaseChoose, and the default evaluates to empty, // then generate a "Please Choose" option tag. if (!empty($pleaseChooseMsg) && empty($defaultYear)) { $year_form .= "\t<option value=\"\" selected=\"yes\">" . $pleaseChooseMsg . "</option>\n"; $yearSelectedAlready = true; $yearPleaseChooseMade = true; } if ($yearPleaseChooseMade == false && !empty($pleaseChooseMsg)) { $year_form .= "\t<option value=\"\">" . $pleaseChooseMsg . "</option>\n"; } // loop through the array of years, set a default if appropriate foreach ($years as $yearname) { if (!empty($defaultYear) && $defaultYear == $yearname) { $year_form .= "\t<option value=\"{$yearname}\" selected=\"yes\">{$yearname}</option>\n"; } else { $year_form .= "\t<option value=\"{$yearname}\">{$yearname}</option>\n"; } } $year_form .= "</select>\n"; return $month_form . $day_form . $year_form; } ---- Erik Price Web Developer Temp Media Lab, H.H. Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php