J'ai utilisé cette méthode pour ajouter un sélecteur de date et d'heure dans le backend de magento. Maintenant, le temps d'entrée est stocké correctement dans ma base de données.
Le problème est que le fuseau horaire de ma boutique magento est réglé sur l'heure standard indienne (GMT + 05: 30), donc l'heure affichée dans ADMIN GRID, est la valeur de l'heure d'entrée (qui est dans DataBase) + 05:30 heures.
- vue phpmyadmin:
heure dans la base de données: 7h15 et 7h52
- vue de la grille d'administration de magento:
heure en admin 12h45 et 13h22
Cela ne me dérange pas car le compte à rebours que j'affiche sur le frontend prend la valeur indiquée dans la grille d'administration. Je suis heureux. Mais lors de la sélection de l'heure dans le sélecteur d'heure de date, il affiche le GMT, c'est-à-dire l'heure stockée dans la base de données.
Ainsi, la personne qui saisit l'entrée de temps doit entrer une heure qui est de 5h30 à l'avance par rapport à l'heure prévue.
la source
Donc, après avoir passé près d'une journée à lutter contre ce même problème dans ma propre extension, j'ai pensé partager ma solution ici. Quelque chose à noter est que mes entités n'utilisent pas le système EAV, chaque entité a sa propre table plate avec une colonne pour chaque attribut. Mon entité possède quatre attributs datetime, dont deux sont remplis à partir de l'entrée utilisateur (
open_date
,close_date
) et deux sont remplis automatiquement par le code source (create_date
,close_date
).Classe modèle de l'entité
Dans la classe de modèle de l'entité, j'ai inclus les éléments suivants:
Le code source:
L'action saveAction du contrôleur d'administration de l'entité
Dans la méthode saveAction de mon contrôleur, j'ai utilisé la méthode getDateFields () définie dans la classe de modèle pour savoir quels attributs je dois changer de l'heure locale du magasin (qui a été entrée par l'utilisateur) à l'heure GMT avant de l'enregistrer dans la base de données. Notez que ce n'est qu'un extrait partiel de ma méthode de sauvegarde:
Le bloc de formulaire d'administration pour modifier l'entité
Contrairement au widget de la grille d'administration de Magento, qui attend que les valeurs datetime des collections soient fournies dans GMT, avec l'intention de convertir ces valeurs en heure locale du magasin avant d'afficher la page, le widget de formulaire d'administration de Magento ne suit pas ce comportement. Au lieu de cela, le widget de formulaire acceptera la valeur datetime telle quelle et l'affichera sans ajuster automatiquement l'heure. Par conséquent, étant donné que les valeurs sont stockées dans la base de données au format GMT, nous devons d'abord convertir les attributs datetime entrés par l'utilisateur en heure locale du magasin avant de fournir ces données au formulaire. C'est là que notre n ° 2 sur la classe modèle de l'entité entre en jeu.
Voici une partie de la méthode _prepareForm () de la classe de bloc de mon formulaire d'administration (qui étend Mage_Adminhtml_Block_Widget_Form). J'ai omis la majorité de ma fonction, essayant d'inclure uniquement le strict minimum qui est pertinent pour cette question, et toujours fournir une méthode de classe valide:
La plupart de ceci suit n'importe quel autre widget de formulaire pour Magento. Cependant, la chose clé qu'il est important de noter ici est que plutôt que d'appeler,
$form->setValues($model->getData())
nous appelons$form->setValues($model->getAdminFormData())
. Ce qui, si nous examinons mon code du premier segment de cette réponse, cette méthode prend de convertir tous les attributs datetime, qui sont entrés par l'utilisateur, de GMT à l'heure locale du magasin.Résultat final:
J'espère que cela s'avérera une ressource précieuse pour aider quelqu'un d'autre un jour. Lorsque vous travaillez sur le développement frontal, n'oubliez pas que les valeurs datetime sont en GMT dans la base de données!
la source
$form->setValues($model->getData())
devraient faire l'affaire.getAdminFormData()
peut avoir cette forme dans la classe de modèlepublic 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(); }
Vous pouvez vérifier le fichier
Et commenter les chaînes suivantes
Cela devrait indiquer au widget d'utiliser les paramètres du navigateur.
la source
Vous devez utiliser la méthode appropriée lors de l'ajout d'un champ de date à l'aide du fichier de configuration mysql sous Namespace> Module> sql> module_setup> mysql4-install / upgrade-xxxphp :
la source
'backend' => 'eav/entity_attribute_backend_datetime', // this fixes your issue
addAttribute
aucun pouvoir ici.