Ich habe diese Methode verwendet , um die Datums- und Zeitauswahl im Magento-Backend hinzuzufügen. Jetzt wird die Eingabezeit korrekt in meiner Datenbank gespeichert.
Das Problem ist, dass die Zeitzone meines Magento-Geschäfts auf die indische Standardzeit (GMT + 05: 30) eingestellt ist. Die in ADMIN GRID angezeigte Zeit ist also der Eingabezeitwert (in der Datenbank) + 05:30 Uhr.
- phpmyadmin Ansicht:
Zeit in der Datenbank: 7:15 Uhr und 7:52 Uhr
- Magento Admin Grid View:
Zeit in Admin 12:45 Uhr und 13:22 Uhr
Dies stört mich nicht, da der Countdown-Timer, den ich im Frontend anzeige, den im Admin-Raster angezeigten Wert annimmt. Ich bin froh. Bei Auswahl der Uhrzeit in der Datums- und Uhrzeitauswahl wird jedoch die GMT angezeigt, dh die in der Datenbank gespeicherte Uhrzeit.
Daher sollte die Person, die die Zeiteingabe eingibt, eine Zeit eingeben, die 5:30 Stunden vor der beabsichtigten Zeit liegt.
quelle
Nachdem ich fast einen Tag damit verbracht hatte, mit demselben Problem in meiner eigenen Erweiterung zu kämpfen, dachte ich, ich würde meine Lösung hier teilen. Zu beachten ist, dass meine Entitäten das EAV-System nicht verwenden. Jede Entität verfügt über eine eigene flache Tabelle mit einer Spalte für jedes Attribut. Meine Entität verfügt über vier Datums- / Uhrzeitattribute, von denen zwei aus Benutzereingaben (
open_date
,close_date
) und zwei automatisch aus dem Quellcode (create_date
,close_date
) ausgefüllt werden .Die Modellklasse der Entität
In die Modellklasse der Entität habe ich Folgendes aufgenommen:
Der Quellcode:
Die saveAction des Admin Controllers der Entität
In der saveAction-Methode meines Controllers habe ich die in der Modellklasse definierte getDateFields () -Methode verwendet, um zu wissen, welche Attribute ich von der Ortszeit des Geschäfts (die vom Benutzer eingegeben wurde) zur GMT-Zeit ändern muss, bevor ich sie in der Datumsbasis speichere. Beachten Sie, dass dies nur ein Teil meiner Speichermethode ist:
Der Admin-Formularblock zum Bearbeiten der Entität
Im Gegensatz zum Admin-Grid-Widget von Magento, das erwartet, dass Datums- / Uhrzeitwerte aus Sammlungen in GMT bereitgestellt werden, mit der Absicht, diese Werte vor dem Anzeigen der Seite in die Ortszeit des Geschäfts zu konvertieren, folgt das Admin-Formular-Widget von Magento diesem Verhalten nicht. Stattdessen akzeptiert das Formular-Widget den Datum / Uhrzeit-Wert unverändert und zeigt ihn an, ohne die Zeit automatisch anzupassen. Da die Werte in GMT in der Datenbank gespeichert sind, müssen wir zuerst die vom Benutzer eingegebenen datetime-Attribute in die Ortszeit des Geschäfts konvertieren, bevor wir diese Daten an das Formular senden. Hier kommt unsere Nummer 2 in der Modellklasse von The Entity ins Spiel.
Hier ist ein TEIL der _prepareForm () -Methode der Blockklasse meines Administratorformulars (die Mage_Adminhtml_Block_Widget_Form erweitert). Ich habe den größten Teil meiner Funktion weggelassen und versucht, nur das absolute Minimum einzubeziehen, das für diese Frage relevant ist, und trotzdem eine gültige Klassenmethode bereitzustellen:
Das meiste davon folgt jedem anderen Formular-Widget für Magento. Das Wichtigste, was hier zu beachten ist, ist jedoch, dass
$form->setValues($model->getData())
wir nicht anrufen , sondern anrufen$form->setValues($model->getAdminFormData())
. Wenn wir meinen Code aus dem ersten Segment dieser Antwort überprüfen, konvertiert diese Methode alle vom Benutzer eingegebenen Datums- / Uhrzeitattribute von GMT in die Ortszeit des Geschäfts.Endresultat:
Ich hoffe, dies ist eine wertvolle Ressource, um eines Tages jemand anderem da draußen zu helfen. Wenn Sie an der Front-End-Entwicklung arbeiten, denken Sie daran, dass die Datums- / Uhrzeitwerte in der Datenbank in GMT angegeben sind!
quelle
$form->setValues($model->getData())
sollten Szenarien einfach reichen.getAdminFormData()
diese Form in der Modellklasse habenpublic 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(); }
Sie können die Datei überprüfen
Und kommentiere die nächsten Saiten
Das sollte das Widget anweisen, Browsereinstellungen zu verwenden.
quelle
Sie sollten die richtige Methode verwenden, wenn Sie ein Datumsfeld mithilfe der MySQL-Setup-Datei unter Namespace> Modul> SQL> Modul-Setup> MySQL-Installation / Upgrade-xxxphp hinzufügen :
quelle
'backend' => 'eav/entity_attribute_backend_datetime', // this fixes your issue
addAttribute
hier also keine Macht.