From 26606fd01dbf1d2a77878789114966035a8cc21f Mon Sep 17 00:00:00 2001 From: Sean Harvey Date: Thu, 11 Jun 2009 07:18:10 +0000 Subject: [PATCH] BUGFIX MSSQLDatabase returns strange formatted Datetime values, removed hacks from DateField and PopupDateTimeField and put it in DataObject::__construct() so that it fixes the problem at the source git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@78963 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- core/model/DataObject.php | 16 +++++++++++++++- forms/DateField.php | 12 ------------ forms/PopupDateTimeField.php | 12 ------------ 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/core/model/DataObject.php b/core/model/DataObject.php index b70ea19e1..237a82048 100644 --- a/core/model/DataObject.php +++ b/core/model/DataObject.php @@ -255,6 +255,20 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity if($this->db($k) == 'Boolean' && $v == 'f') $record[$k] = '0'; } } + + // Remove milliseconds from the datetime returned by MSSQL. If we don't do this, PHP will choke. + // TODO: As per the above PostgreSQLDatabase change, implement more elegantly + if(DB::getConn() instanceof MSSQLDatabase) { + $this->class = get_class($this); + foreach($record as $k => $v) { + // MSSQLDatabase::date() uses datetime for the data type for "Date" and "SSDatetime" + if($this->db($k) == 'Date' || $this->db($k) == 'SSDatetime') { + $meridiem = substr($v, strlen($v) - 2, strlen($v)); + $v = substr($v, 0, strlen($v) - 6); + $record[$k] = date('Y-m-d H:i:s', strtotime($v . ' ' . $meridiem)); + } + } + } // Set $this->record to $record, but ignore NULLs $this->record = array(); @@ -2489,7 +2503,7 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity $this->extend('augmentSQL', $query); $records = $query->execute(); - + $ret = $this->buildDataObjectSet($records, $containerClass, $query, $this->class); if($ret) $ret->parseQueryLimit($query); diff --git a/forms/DateField.php b/forms/DateField.php index fdf3cbd78..c3fe9a85a 100755 --- a/forms/DateField.php +++ b/forms/DateField.php @@ -20,18 +20,6 @@ class DateField extends TextField { public static $validation_enabled = true; function setValue($val) { - if ($val) { - if (!is_array($val) ) { //&& strlen($val) == 26) { - - $ampm = substr($val,strlen($val)-2,strlen($val)); - if ($ampm == "PM") { //correct for pm offset when cutting off 12-hour clock format - $val = substr($val,0,strlen($val)-6)."PM"; - } elseif ($ampm == "AM") { - $val = substr($val,0,strlen($val)-6); - } - } - } - if(is_string($val) && preg_match('/^([\d]{2,4})-([\d]{1,2})-([\d]{1,2})/', $val)) { $this->value = preg_replace('/^([\d]{2,4})-([\d]{1,2})-([\d]{1,2})/','\\3/\\2/\\1', $val); } else { diff --git a/forms/PopupDateTimeField.php b/forms/PopupDateTimeField.php index 54dcb2184..d4c606edd 100644 --- a/forms/PopupDateTimeField.php +++ b/forms/PopupDateTimeField.php @@ -68,18 +68,6 @@ HTML; } function setValue( $val ) { - if ($val) { - if (!is_array($val) ) { //&& strlen($val) == 26) { - - $ampm = substr($val,strlen($val)-2,strlen($val)); - if ($ampm == "PM") { //correct for pm offset when cutting off 12-hour clock format - $val = substr($val,0,strlen($val)-6)."PM"; - } elseif ($ampm == "AM") { - $val = substr($val,0,strlen($val)-6); - } - } - } - if( is_array( $val ) ) { // 1) Date