Usé este método , para agregar el selector de fecha y hora en el backend de magento. Ahora el tiempo de entrada se está almacenando en mi base de datos correctamente.
El problema es que la zona horaria de mi tienda magento está configurada en la hora estándar de la India (GMT + 05: 30), por lo que la hora que se muestra en ADMIN GRID es el valor de la hora de entrada (que se encuentra en DataBase) + 05:30 Hrs.
- Vista phpmyadmin:
hora en la base de datos: 7:15 a.m. y 7:52 a.m.
- Vista de cuadrícula de administrador de magento:
hora en admin 12:45 pm y 1:22 pm
Esto no me molesta, ya que el temporizador de cuenta regresiva que muestro en la interfaz toma el valor que se muestra en la cuadrícula de administración. Estoy feliz. Pero al seleccionar la hora en el selector de fecha y hora, muestra el GMT, es decir, la hora almacenada en la base de datos.
Por lo tanto, la persona que ingresa la entrada de tiempo debe ingresar una hora con 5:30 horas de anticipación a la hora prevista.
fuente
Entonces, después de pasar casi un día luchando con este mismo problema en mi propia extensión, pensé en compartir mi solución aquí. Algo a tener en cuenta es que mis entidades no están utilizando el sistema EAV, cada entidad tiene su propia tabla plana con una columna para cada atributo. Mi entidad tiene cuatro atributos de fecha y hora, dos de los cuales se rellenan a partir de la entrada del usuario (
open_date
,close_date
) y dos de los cuales se rellenan automáticamente con el código fuente (create_date
,close_date
).La clase de modelo de la entidad
En la clase de modelo de la entidad incluí lo siguiente:
El código fuente:
La acción saveAction del controlador administrativo de la entidad
En el método saveAction de mi controlador, utilicé el método getDateFields () definido en la clase de modelo para saber qué atributos necesito cambiar de la hora local de la tienda (que fue ingresada por el usuario) a la hora GMT antes de guardar en la base de datos. Tenga en cuenta que esto es solo un fragmento parcial de mi método de guardar:
El bloque de formulario de administrador para editar la entidad
A diferencia del widget de cuadrícula de administración de Magento, que espera que los valores de fecha y hora de las colecciones se suministren en GMT, con la intención de convertir estos valores a la hora local de la tienda antes de mostrar la página, el widget de formulario de administración de Magento no sigue este comportamiento. En cambio, el widget de formulario aceptará el valor de fecha y hora como es, y lo mostrará sin ajustar automáticamente la hora. Por lo tanto, dado que los valores se almacenan en la base de datos en GMT, primero debemos convertir nuestros atributos de fecha y hora ingresados por el usuario a la hora local de la tienda antes de suministrar esos datos al formulario. Aquí es donde entra en juego nuestro # 2 en la clase de modelo de la entidad .
Aquí hay una PORCIÓN del método _prepareForm () de la clase de bloque de mi formulario de administrador (que extiende Mage_Adminhtml_Block_Widget_Form). He omitido la mayoría de mi función, tratando de incluir solo el mínimo básico que es relevante para esta pregunta, y aún así proporcionar un método de clase válido:
La mayor parte de esto sigue cualquier otro widget de formulario para Magento. Sin embargo, lo importante que es importante tener en cuenta aquí es que en lugar de llamar
$form->setValues($model->getData())
, llamamos$form->setValues($model->getAdminFormData())
. Lo cual, si revisamos mi código desde el primer segmento de esta respuesta, este método requiere la conversión de todos los atributos de fecha y hora, que son ingresados por el usuario, de GMT a la hora local de la tienda.Resultado final:
Espero que esto sea un recurso valioso para ayudar a alguien más algún día. Cuando llegue el momento de trabajar en el desarrollo front-end, tenga en cuenta que los valores de fecha y hora están en GMT en el DB.
fuente
$form->setValues($model->getData())
debería hacerlo.getAdminFormData()
puede tener este formulario en la clase de modelopublic function getAdminFormData() { $dateAr = $this->getDateFields(); foreach ($dateAr as $date) { $loc_date = Mage::getModel('core/date')->date('Y-m-d H:i:s',($this->getData($date))); $this->setData($date,$loc_date); } return $this->getData(); }
Puedes consultar el archivo
Y comentar las siguientes cadenas
Eso debería indicarle al widget que use la configuración del navegador.
fuente
Debe usar el método adecuado al agregar un campo de fecha usando el archivo de configuración de mysql en Espacio de nombres> Módulo> sql> module_setup> mysql4-install / upgrade-xxxphp :
fuente
'backend' => 'eav/entity_attribute_backend_datetime', // this fixes your issue
addAttribute
no tiene poder aquí.