Skip to content

Standalone: add a default global timezone setting - #36400

Open
mlutfy wants to merge 1 commit into
civicrm:masterfrom
mlutfy:standaloneDefaultTimezone
Open

Standalone: add a default global timezone setting#36400
mlutfy wants to merge 1 commit into
civicrm:masterfrom
mlutfy:standaloneDefaultTimezone

Conversation

@mlutfy

@mlutfy mlutfy commented Aug 3, 2026

Copy link
Copy Markdown
Member

Overview

Adds a default timezone setting for Standalone, so that it does not rely on the timezone of the server.

Before

Relies on the default PHP timezone, which is often UTC.

After

New setting so that it can be set by the admin.

Technical Details

For anonymous users, I tested things such as submitting a FormBuilder form that creates an activity, and the default time seemed OK.

Comments

cc @ufundo

@civibot

civibot Bot commented Aug 3, 2026

Copy link
Copy Markdown

🤖 Thank you for contributing to CiviCRM! ❤️ We will need to test and review this PR. 👷

Introduction for new contributors...
  • If this is your first PR, an admin will greenlight automated testing with the command ok to test or add to whitelist.
  • A series of tests will automatically run. You can see the results at the bottom of this page (if there are any problems, it will include a link to see what went wrong).
  • A demo site will be built where anyone can try out a version of CiviCRM that includes your changes.
  • If this process needs to be repeated, an admin will issue the command test this please to rerun tests and build a new demo site.
  • Before this PR can be merged, it needs to be reviewed. Please keep in mind that reviewers are volunteers, and their response time can vary from a few hours to a few weeks depending on their availability and their knowledge of this particular part of CiviCRM.
  • A great way to speed up this process is to "trade reviews" with someone - find an open PR that you feel able to review, and leave a comment like "I'm reviewing this now, could you please review mine?" (include a link to yours). You don't have to wait for a response to get started (and you don't have to stop at one!) the more you review, the faster this process goes for everyone 😄
  • To ensure that you are credited properly in the final release notes, please add yourself to contributor-key.yml
  • For more information about contributing, see CONTRIBUTING.md.
PR commands & links...
  • /rebase <branch-name> will rebase your branch and change the base of the PR.
  • /squash will combine all commits (keeping only the first commit messsage).
  • /port <branch-name> will create a copy of this PR against a different branch.
  • /lintroll will automatically fix linting errors, amending commits as needed.
  • retest this please will rerun the tests and rebuild the demo site.
  • 📖 Review standards
  • 🗒️ Review template (brief or verbose)

➡️ Online demo of this PR 🔗

@civibot civibot Bot added the master label Aug 3, 2026
@ufundo

ufundo commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Nice one thanks @mlutfy !

I think the general shape is good but I have a few quibbles about language and how "default" works... (incoming)

'name' => 'standalone_timezone_default',
'group' => 'standaloneusers',
'type' => 'String',
'default' => date_default_timezone_get(),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would avoid this kind of dynamic default. There's lots of ways it gets confusing:

  • you change the server timezone and its not reflected because this default has been cached
  • you go to the settings page and it shows as set to the specific timezone of your server, then the server timezone changes and you go back and its something else
  • same thing except you saved on the settings page so the server value literal was saved to civi db, now the server changes and it's not reflected
  • you have any kind of horizontally scaled deployment with different server timezones

All this is to say, I think it might be better to have an empty default, with a placeholder like "- use server timezone -"?

Comment on lines +14 to +17
'title' => E::ts('Default Timezone'),
'is_domain' => 1,
'is_contact' => 0,
'description' => E::ts('Default timezone for anonymous users and for users using the default timezone.'),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
'title' => E::ts('Default Timezone'),
'is_domain' => 1,
'is_contact' => 0,
'description' => E::ts('Default timezone for anonymous users and for users using the default timezone.'),
'title' => E::ts('System Timezone'),
'is_domain' => 1,
'is_contact' => 0,
'description' => E::ts('Timezone to use for dates and times - unless overridden at user-level.'),

I think "default" is confusing here, because there's a default value for Default timezone; and the default value of User timezone is "use the default timezone" and...

'default' => date_default_timezone_get(),
'html_type' => 'select',
'html_attributes' => [
'class' => 'huge crm-select2',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe something like this for the placeholder?

Suggested change
'class' => 'huge crm-select2',
'class' => 'huge crm-select2',
'placeholder' => E::ts('Use server timezone - currently %1', [1 => date_default_timezone_get()]),

use CRM_Standaloneusers_ExtensionUtil as E;

return [
'standalone_timezone_default' => [

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe also we can use settings_pages key to put this on a different page from Login settings. I'm not sure whether localization or date (the latter is date formats atm)?

Comment on lines +584 to +585
// Fallback in case the setting is not yet set during the initial upgrade
// (or cache flush)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't this be...

Suggested change
// Fallback in case the setting is not yet set during the initial upgrade
// (or cache flush)
// Global fallback if no timezone specified at user level

?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants