bug en helper date_field_tag

edited septiembre 2007 in Bugs y Problemas
Sucede que cuando no se especifica un valor al helper, este asume por defecto "0-0-0", y esto puede ocasionar errores de validacion y confundir al usuario ya que por defecto en los selects, se asume al 1ero de enero de xxxx, como la fecha asignada y esto es solo en apariencia.

Corregi el bug, colocando que por defecto tome la fecha actual.

Ademas a proveche, elimine la forma de tabla, realice la estandarización de este a XHTML y agregue nuevas funcionalidades.

Nuevas Funcionalidades:
-Parametro "order":
Permite especificar el orden como se mostraran los selects
Valores para el parametro "order": sigue el formato de la funcion date de php. "d-m-Y", 'Y-m-d', "m-d-Y"

-Parametro "use_month_num":
En vez de utilizar palabras para representar los meses, se utilizan numeros.
Valor para "use_month_nums": "true".

-Parametro "start_year":
Indica la fecha en la que se inicia a generar el select para el año.
Valor para "start_year": numero entero.

-Parametro "end_year":
Indica la fecha en la que se termina de generar el select para el año.
Valor para "end_year": numero entero.

Ejemplo muy completo:
<?= date_field_tag('fecha', 'start_year: 1800', 'end_year: 2050', 'use_month_num: true', 'order: d-m-Y'); ?>

Codigo del helper:
function date_field_tag($name){
	$config = Config::read('core.ini');
	$value = get_value_from_action($name);
	$name = get_params(func_get_args());
	if(!$name[0]) $name[0] = $name['id'];
	if(!$name['name']) $name['name'] = $name[0];
	if(!$value) $value = $name['value'];

	if($value){
		$ano = substr($value, 0, 4);
		$mes = substr($value, 5, 2);
		$dia = substr($value, 8, 2);
	} else {
		$ano = date('Y');
		$mes = date('m');
		$dia = date('d');
	}
	
	$start_year = (isset($name['start_year'])) ? (int)$name['start_year'] : 1900;
	$end_year = (isset($name['end_year'])) ? (int)$name['end_year'] : date('Y');
	
	if($end_year < $start_year){
		$end_year = $start_year;
	}
	
	$meses = array(
	"01" => "Ene",
	"02" => "Feb",
	"03" => "Mar",
	"04" => "Abr",
	"05" => "May",
	"06" => "Jun",
	"07" => "Jul",
	"08" => "Ago",
	"09" => "Sep",
	"10" => "Oct",
	"11" => "Nov",
	"12" => "Dic",
	);
	
	$select_month = "<select name='{$name[0]}_month' id='{$name[0]}_month'
	onchange=\"$('{$name[0]}').value = $('{$name[0]}_year').options[$('{$name[0]}_year').selectedIndex].value+'-'+$('{$name[0]}_month').options[$('{$name[0]}_month').selectedIndex].value+'-'+$('{$name[0]}_day').options[$('{$name[0]}_day').selectedIndex].value\"
	>";
	
	if(isset($name['use_month_num'])){
		foreach($meses as $numero_mes => $nombre_mes){
			if($numero_mes==$mes){
				$select_month.="<option value='$numero_mes' selected='selected'>$numero_mes</option>\n";
			} else {
				$select_month.="<option value='$numero_mes'>$numero_mes</option>\n";
			}
		}
	} else {
		foreach($meses as $numero_mes => $nombre_mes){
			if($numero_mes==$mes){
				$select_month.="<option value='$numero_mes' selected='selected'>$nombre_mes</option>\n";
			} else {
				$select_month.="<option value='$numero_mes'>$nombre_mes</option>\n";
			}
		}	
	}
	$select_month.="</select> ";

	$select_day ="<select name='{$name[0]}_day' id='{$name[0]}_day'
	onchange=\"$('{$name[0]}').value = $('{$name[0]}_year').options[$('{$name[0]}_year').selectedIndex].value+'-'+$('{$name[0]}_month').options[$('{$name[0]}_month').selectedIndex].value+'-'+$('{$name[0]}_day').options[$('{$name[0]}_day').selectedIndex].value\">";
	for($i=1;$i<=31;$i++){
		$n = sprintf("%02s", $i);
		if($n==$dia){
			$select_day.="<option value='$n' selected='selected'>$n</option>\n";
		} else {
			$select_day.="<option value='$n'>$n\n";
		}
	}
	$select_day.='</select> ';

	$select_year ="<select name='{$name[0]}_year' id='{$name[0]}_year'
	onchange=\"$('{$name[0]}').value = $('{$name[0]}_year').options[$('{$name[0]}_year').selectedIndex].value+'-'+$('{$name[0]}_month').options[$('{$name[0]}_month').selectedIndex].value+'-'+$('{$name[0]}_day').options[$('{$name[0]}_day').selectedIndex].value\"
	>";
	for($i=$end_year;$i>=$start_year;$i--){
		if($i==$ano){
			$select_year.="<option value='$i' selected='selected'>$i\n";
		} else {
			$select_year.="<option value='$i'>$i</option>\n";
		}
	}
	$select_year.='</select>';

	if(isset($name['order'])){
		if($name['order']=='Y-m-d'){
			$code = $select_year.$select_month.$select_day;
		} elseif($name['order']=='d-m-Y'){
			$code = $select_day.$select_month.$select_year;
		} else {
			$code = $select_month.$select_day.$select_year;
		}
	} else {
		$code = $select_month.$select_day.$select_year;
	}

	$code.="<input type='hidden' id='{$name[0]}' name='{$name[0]}' value='$value'>";

	return $code;
}

Pruebenlo, y me dicen para ver cuando lo subo al svn.

Saludos.

Comentarios

  • Lo he probado y esta perfecto, gracias
  • Me faltaron unos pequeños detalles para que este correctamente codificado para XHTML (todo en comillas dobles y los CDATA para los javascript, cierre del input '/'), de cualquier forma en lo que se comience el proceso de migracion se realizará.

    Ya lo subi al svn.

    Saludos.
Sign In or Register to comment.