Richix
unread,Apr 17, 2009, 10:09:55 AM4/17/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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());