From a57a96cbddbfdad65823aeca2901f26b62c9b12d Mon Sep 17 00:00:00 2001
From: Marc Alexander <admin@m-a-styles.de>
Date: Sun, 10 Aug 2014 12:55:49 +0200
Subject: [PATCH] [ticket/12932] Add method for getting the datetime class and
 allow overriding

An extension can now override the datetime class by overwriting the
datetime.class parameter in their own yml file.

PHPBB3-12932
---
 phpBB/config/parameters.yml                   |  2 ++
 phpBB/config/services.yml                     |  3 +++
 phpBB/includes/functions.php                  |  4 ++--
 phpBB/install/index.php                       |  2 +-
 .../data/v310/soft_delete_mod_convert.php     |  2 +-
 phpBB/phpbb/user.php                          | 24 +++++++++++++++++--
 6 files changed, 31 insertions(+), 6 deletions(-)
 create mode 100644 phpBB/config/parameters.yml

diff --git a/phpBB/config/parameters.yml b/phpBB/config/parameters.yml
new file mode 100644
index 0000000000..5bf2c678ee
--- /dev/null
+++ b/phpBB/config/parameters.yml
@@ -0,0 +1,2 @@
+parameters:
+    datetime.class: \phpbb\datetime
diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml
index a9f9f5ed19..6b06deb256 100644
--- a/phpBB/config/services.yml
+++ b/phpBB/config/services.yml
@@ -10,6 +10,7 @@ imports:
     - { resource: mimetype_guessers.yml }
     - { resource: passwords.yml }
     - { resource: profilefields.yml }
+    - { resource: parameters.yml }
 
 services:
     acl.permissions:
@@ -346,6 +347,8 @@ services:
 
     user:
         class: phpbb\user
+        arguments:
+            - %datetime.class%
 
     user_loader:
         class: phpbb\user_loader
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index bd0a5795b1..065f38f4dc 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -1061,7 +1061,7 @@ function phpbb_timezone_select($user, $default = '', $truncate = false)
 		foreach ($unsorted_timezones as $timezone)
 		{
 			$tz = new DateTimeZone($timezone);
-			$dt = new \phpbb\datetime($user, 'now', $tz);
+			$dt = $user->create_datetime($user, 'now', $tz);
 			$offset = $dt->getOffset();
 			$current_time = $dt->format($user->lang['DATETIME_FORMAT'], true);
 			$offset_string = phpbb_format_timezone_offset($offset);
@@ -4881,7 +4881,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
 		}
 	}
 
-	$dt = new \phpbb\datetime($user, 'now', $user->timezone);
+	$dt = $user->create_datetime($user, 'now', $user->timezone);
 	$timezone_offset = 'GMT' . phpbb_format_timezone_offset($dt->getOffset());
 	$timezone_name = $user->timezone->getName();
 	if (isset($user->lang['timezones'][$timezone_name]))
diff --git a/phpBB/install/index.php b/phpBB/install/index.php
index 395aff6c7d..2e497da3db 100644
--- a/phpBB/install/index.php
+++ b/phpBB/install/index.php
@@ -240,7 +240,7 @@ $sub = $request->variable('sub', '');
 // Set PHP error handler to ours
 set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
 
-$user = new \phpbb\user();
+$user = new \phpbb\user('\phpbb\datetime');
 $auth = new \phpbb\auth\auth();
 
 // Add own hook handler, if present. :o
diff --git a/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php
index 6335c75398..58845b88ec 100644
--- a/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php
+++ b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php
@@ -121,7 +121,7 @@ class soft_delete_mod_convert extends \phpbb\db\migration\migration
 			new \phpbb\auth\auth(),
 			$this->config,
 			$this->db,
-			new \phpbb\user(),
+			new \phpbb\user('\phpbb\datetime'),
 			$this->phpbb_root_path,
 			$this->php_ext,
 			$this->table_prefix . 'forums',
diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php
index 4e90044395..40845b75b1 100644
--- a/phpBB/phpbb/user.php
+++ b/phpBB/phpbb/user.php
@@ -31,6 +31,11 @@ class user extends \phpbb\session
 	*/
 	public $timezone;
 
+	/**
+	* @var string Class name of datetime object
+	*/
+	protected $datetime;
+
 	var $lang_name = false;
 	var $lang_id = false;
 	var $lang_path;
@@ -42,12 +47,14 @@ class user extends \phpbb\session
 
 	/**
 	* Constructor to set the lang path
+	* @param string $datetime_class Class name of datetime class
 	*/
-	function __construct()
+	function __construct($datetime_class)
 	{
 		global $phpbb_root_path;
 
 		$this->lang_path = $phpbb_root_path . 'language/';
+		$this->datetime = $datetime_class;
 	}
 
 	/**
@@ -727,7 +734,7 @@ class user extends \phpbb\session
 	public function create_datetime($time = 'now', \DateTimeZone $timezone = null)
 	{
 		$timezone = $timezone ?: $this->timezone;
-		return new \phpbb\datetime($this, $time, $timezone);
+		return new $this->datetime($this, $time, $timezone);
 	}
 
 	/**
@@ -918,4 +925,17 @@ class user extends \phpbb\session
 
 		return $forum_ids;
 	}
+
+	/**
+	* Set class name of datetime class
+	*
+	* @param string $datetime Class name to set
+	* @return null
+	*/
+	public function set_datetime_class($datetime)
+	{
+		$this->datetime = $datetime;
+	}
+
+
 }