Eu usei esse método para adicionar seletor de data e hora no back-end do magento. Agora, o tempo de entrada está sendo armazenado no meu banco de dados corretamente.
O problema é que o fuso horário da minha loja magento está definido como Horário padrão da Índia (GMT + 05: 30); portanto, o horário mostrado no ADMIN GRID é o valor do tempo de entrada (que está no DataBase) + 05:30 horas.
- Visualização phpmyadmin:
hora no banco de dados: 7:15 e 7:52
- visualização da grade de administração do magento:
hora em admin 12:45 e 13:22
Isso não me incomoda, pois o cronômetro de contagem regressiva exibido no front-end assume o valor mostrado na grade do administrador. Eu estou feliz. Porém, ao selecionar a hora no selecionador de data e hora, ele mostra o GMT, ou seja, a hora armazenada no banco de dados.
Portanto, a pessoa que inserir a entrada de tempo deve inserir um horário que seja 5:30 horas antes do horário pretendido.
fonte
Então, depois de passar quase um dia lutando com esse mesmo problema em minha própria extensão, pensei em compartilhar minha solução aqui. Algo a observar é que minhas entidades não estão utilizando o sistema EAV, cada entidade possui sua própria tabela plana com uma coluna para cada atributo. Minha entidade possui quatro atributos de data e hora - dois dos quais são preenchidos a partir da entrada do usuário (
open_date
,close_date
) e dois são preenchidos automaticamente pelo código-fonte (create_date
,close_date
).Classe de modelo da entidade
Na classe de modelo da entidade, incluí o seguinte:
O código fonte:
O saveAction do Admin Controller da entidade
No método saveAction do meu controlador, utilizei o método getDateFields () definido na classe de modelo para saber quais atributos eu preciso alterar da hora local da loja (que foi inserida pelo usuário) para a hora GMT antes de salvar no banco de dados. Observe que este é apenas um trecho parcial do meu método de salvamento:
O bloco de formulário do administrador para editar a entidade
Ao contrário do widget de grade administrativa do Magento, que espera que os valores de data e hora das coleções sejam fornecidos no GMT, com a intenção de converter esses valores no horário local da loja antes de exibir a página, o widget de formulário administrativo do Magento não segue esse comportamento. Em vez disso, o widget de formulário aceitará o valor de data e hora como está e o exibirá sem ajustar automaticamente a hora. Portanto, como os valores são armazenados no banco de dados no GMT, primeiro devemos converter nossos atributos de data e hora inseridos pelo usuário no horário local da loja antes de fornecer esses dados ao formulário. É aqui que o nosso número 2 da classe Modelo da entidade entra em jogo.
Aqui está uma parte do método _prepareForm () da classe de bloco do meu formulário de administrador (que estende Mage_Adminhtml_Block_Widget_Form). Omiti a maioria da minha função, tentando incluir apenas o mínimo necessário para essa questão e ainda assim fornecer um método de classe válido:
A maior parte disso segue qualquer outro widget de formulário para o Magento. No entanto, a principal coisa que é importante observar aqui é que, em vez de ligar
$form->setValues($model->getData())
, chamamos$form->setValues($model->getAdminFormData())
. Que, se revisarmos meu código do primeiro segmento desta resposta, esse método leva a converter todos os atributos de data e hora, inseridos pelo usuário, de GMT para o horário local da loja.Resultado final:
Espero que isso seja um recurso valioso para ajudar alguém por aí algum dia. Na hora de trabalhar no desenvolvimento de front-end, lembre-se de que os valores de data e hora estão em GMT no DB!
fonte
$form->setValues($model->getData())
fazer.getAdminFormData()
pode ter este formato na classe 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(); }
Você pode verificar o arquivo
E comente as próximas strings
Isso deve informar ao widget para usar as configurações do navegador.
fonte
Você deve usar o método apropriado ao adicionar um campo de data usando o arquivo de configuração do mysql em Namespace> Módulo> sql> module_setup> mysql4-install / upgrade-xxxphp :
fonte
'backend' => 'eav/entity_attribute_backend_datetime', // this fixes your issue
addAttribute
não tem poder aqui.