Sf 1.0 + Oracle + formato fechas español DD/MM/YYYY (solucionado)

845 views
Skip to first unread message

Richix

unread,
Apr 17, 2009, 10:09:55 AM4/17/09
to symfony-es
Compañeros,

Tuve esta necesidad y luego de haberla resuelto la coloco para
consideración por si a alguno le ha pasado. Espero pueda servirle a
alguien y que sea la solución correcta. Me gustaria saber si en sf 1.2
o por el propel .1.3 si esto quedó facil o configurable.

Caso: Oracle esta formateado para guardar las fechas en formato DD/MM/
YYYY.
Problema: Por defecto la configuración del SF viene en formato YYYY/MM/
DD, y las funciones php como strtotime deben recibir fechas en el
formato ingles. Al guardar, hay problemas con el formateo, etc etc
etc
Solución: Formatear el driver de Oracle.

Para dejar la aplicación trabajando y guardando en formato español,
realicé los siguientes pasos:


a) se configuró el archivo i18n.yml con default_culture: es, esto para
el formato de visualizacion de los datos, ej: fecha en filtros y
listados. En settings.yml, i18n: on, para habilitar la cultura
formateada del usuario.

b) Se configuró la constante NLS_DATE_FORMAT para el nuevo formato 'DD-
MM-YYYY HH24:MI:SS'
El cambio se realizó en symfony\vendor\creole\drivers\oracle
\OCI8Connection.php:123

Este cambio afecta todas las funciones php que reciben strings formato
inglés, como strtotime

c) Se creo la función fechaAIngles() en la clase de funciones del
proyecto

/**
* La base de datos de este proyecto esta en formato español DD/MM/
YYYY
* el sistema cuando trabaja con oracle formatea las consultas a los
campos tipo fecha
* haciendo un llamado a la funcion strtotime. Esta funcion solo
recibe fechas en inglés
* Se realiza esta funcion para reformatear el campo antes de
mandarlo a la funcion strtotime
* en php\PEAR\symfony\vendor\creole\common\ResultSetCommon.php :
354, :410, :434
* $ts = strtotime(darsoftware::fechaAIngles($this->fields[$idx]));
*
* @param string date in 'DD/MM/YYYY 00:00:00' format
* @return string in 'YYYY-MM-DD 00:00:00' format
*/
static function fechaAIngles($datestr){
if($datestr == null || $datestr == ''){
return null;
}

//separar los valores en los dos posibles separadores de - y /
if (preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/([0-9][0-9]){1,2}/",
$datestr))
list($dia,$mes,$ano) = split("/",substr($datestr,0,10));

if (preg_match("/[0-9]{1,2}-[0-9]{1,2}-([0-9][0-9]){1,2}/",
$datestr))
list($dia,$mes,$ano) = split("-",substr($datestr,0,10));

//concatenar la fecha, con la hora que puede no venir
parametrizada
//retornar en formato ingles
return $ano.'-'.$mes.'-'.$dia.( (strlen($datestr) == '19') ? substr
($datestr,10,9) : '') ;
}


d) reformatear el campo antes de mandarlo a la funcion strtotime en php
\PEAR\symfony\vendor\creole\common\ResultSetCommon.php :354, :410, :
434
$ts = strtotime(darsoftware::toOracleDate($this->fields[$idx]));

e) Se modificó el formato para guardar la fecha al armar la sentencia
para Oracle, en php\PEAR\symfony\vendor\creole\drivers\oracle
\OCI8PreparedStatement.php

+346
if (is_numeric($value)) $value = date('d-m-Y H:i:s',
$value);
elseif (is_object($value)) $value = date('d-m-Y H:i:s',
$value->getTime());

+365
if (is_numeric($value)) $value = date("d-m-Y", $value);
elseif (is_object($value)) $value = date("d-m-Y", $value-
>getTime());


oyepez003

unread,
Apr 17, 2009, 10:41:41 AM4/17/09
to symfony-es
Gracias por el aporte.
Reply all
Reply to author
Forward
0 new messages