From 26f8341438bc4f9e31777e8e5c4cc6b556dea1b0 Mon Sep 17 00:00:00 2001 From: Russell Michell Date: Tue, 11 Mar 2014 15:42:11 +1300 Subject: [PATCH] NEW Added FormatFromSettings(). Formats dates as per user preferences. - Required for silverstripe-cms/issue/965. - Separate implementations for Date and SS_Datetime. --- model/fieldtypes/Date.php | 22 ++++++++++++++++++++++ model/fieldtypes/Datetime.php | 23 +++++++++++++++++++++++ tests/model/DateTest.php | 22 ++++++++++++++++++++++ tests/model/DatetimeTest.php | 25 +++++++++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/model/fieldtypes/Date.php b/model/fieldtypes/Date.php index f9cb4c3f1..0dfe6dec7 100644 --- a/model/fieldtypes/Date.php +++ b/model/fieldtypes/Date.php @@ -152,6 +152,28 @@ class Date extends DBField { } } + /** + * Return a date formatted as per a CMS user's settings. + * + * @param Member $member + * @return boolean | string A date formatted as per user-defined settings. + */ + public function FormatFromSettings($member = null) { + require_once 'Zend/Date.php'; + + if(!$member) { + if(!Member::currentUserID()) { + return false; + } + $member = Member::currentUser(); + } + + $formatD = $member->getDateFormat(); + $zendDate = new Zend_Date($this->getValue()); + + return $zendDate->toString($formatD); + } + /* * Return a string in the form "12 - 16 Sept" or "12 Aug - 16 Sept" * @param Date $otherDateObj Another date object specifying the end of the range diff --git a/model/fieldtypes/Datetime.php b/model/fieldtypes/Datetime.php index 286abdf94..7ff556fdb 100644 --- a/model/fieldtypes/Datetime.php +++ b/model/fieldtypes/Datetime.php @@ -92,6 +92,29 @@ class SS_Datetime extends Date implements TemplateGlobalProvider { public function Time24() { if($this->value) return $this->Format('H:i'); } + + /** + * Return a date and time formatted as per a CMS user's settings. + * + * @param Member $member + * @return boolean | string A time and date pair formatted as per user-defined settings. + */ + public function FormatFromSettings($member = null) { + require_once 'Zend/Date.php'; + + if(!$member) { + if(!Member::currentUserID()) { + return false; + } + $member = Member::currentUser(); + } + + $formatD = $member->getDateFormat(); + $formatT = $member->getTimeFormat(); + + $zendDate = new Zend_Date($this->getValue()); + return $zendDate->toString($formatD).' '.$zendDate->toString($formatT); + } public function requireField() { $parts=Array('datatype'=>'datetime', 'arrayValue'=>$this->arrayValue); diff --git a/tests/model/DateTest.php b/tests/model/DateTest.php index e4f4498d6..3f471c607 100644 --- a/tests/model/DateTest.php +++ b/tests/model/DateTest.php @@ -201,5 +201,27 @@ class DateTest extends SapphireTest { SS_Datetime::clear_mock_now(); } + + public function testFormatFromSettings() { + + $memberID = $this->logInWithPermission(); + $member = DataObject::get_by_id('Member', $memberID); + $member->DateFormat = 'dd/MM/YYYY'; + $member->write(); + + $fixtures = array( + '2000-12-31' => '31/12/2000', + '31-12-2000' => '31/12/2000', + '31/12/2000' => '31/12/2000' + ); + + foreach($fixtures as $from => $to) { + $date = DBField::create_field('Date', $from); + // With member + $this->assertEquals($to, $date->FormatFromSettings($member)); + // Without member + $this->assertEquals($to, $date->FormatFromSettings()); + } + } } diff --git a/tests/model/DatetimeTest.php b/tests/model/DatetimeTest.php index 0c6ab8a83..66c97fedd 100644 --- a/tests/model/DatetimeTest.php +++ b/tests/model/DatetimeTest.php @@ -148,5 +148,30 @@ class SS_DatetimeTest extends SapphireTest { SS_Datetime::clear_mock_now(); } + + public function testFormatFromSettings() { + + $memberID = $this->logInWithPermission(); + $member = DataObject::get_by_id('Member', $memberID); + $member->DateFormat = 'dd/MM/YYYY'; + $member->TimeFormat = 'hh:mm:ss'; + $member->write(); + + $fixtures = array( + '2000-12-31 10:11:01' => '31/12/2000 10:11:01', + '2000-12-31 1:11:01' => '31/12/2000 01:11:01', + '12/12/2000 1:11:01' => '12/12/2000 01:11:01', + '2000-12-31' => '31/12/2000 12:00:00', + '10:11:01' => date('d/m/Y').' 10:11:01' + ); + + foreach($fixtures as $from => $to) { + $date = DBField::create_field('Datetime', $from); + // With member + $this->assertEquals($to, $date->FormatFromSettings($member)); + // Without member + $this->assertEquals($to, $date->FormatFromSettings()); + } + } }