<?php namespace FluentForm\Framework\Database\Orm; use DateTimeZone; use FluentForm\Framework\Database\Orm\DateTime; trait ModelHelperTrait { public static function classBasename($class) { $class = is_object($class) ? get_class($class) : $class; return basename(str_replace('\\', '/', $class)); } public static function classUsesRecursive($class) { $results = []; foreach (array_merge([$class => $class], class_parents($class)) as $class) { if ($class != self::class) { $results += static::traitUsesRecursive($class); } } return array_unique($results); } public static function traitUsesRecursive($trait) { $traits = class_uses($trait); foreach ($traits as $trait) { $traits += static::traitUsesRecursive($trait); } return $traits; } #[\ReturnTypeWillChange] public function getTimezone() { // if site timezone string exists, return it $timezone = get_option('timezone_string'); if ($timezone) { return new DateTimeZone($timezone); } // get UTC offset, if it isn't set then return UTC $utcOffset = get_option('gmt_offset', 0); if ($utcOffset === 0) { return new DateTimeZone('UTC'); } // Adjust UTC offset from hours to seconds $utcOffset *= 3600; // Attempt to guess the timezone string from the UTC offset $timezone = timezone_name_from_abbr('', $utcOffset, 0); if ($timezone) { return new DateTimeZone($timezone); } // Guess timezone string manually $isDst = date('I'); foreach (timezone_abbreviations_list() as $abbr) { foreach ($abbr as $city) { if ($city['dst'] == $isDst && $city['offset'] == $utcOffset) { $timezoneId = $city['timezone_id']; if ($timezoneId) { $timezone = timezone_name_from_abbr('', $timezoneId, 0); if ($timezone) return new DateTimeZone($timezone); } } } } // Fallback return new DateTimeZone('UTC'); } protected function getDateFormat() { if (isset($this->dateFormat)) { return $this->dateFormat; } return 'Y-m-d H:i:s'; } #[\ReturnTypeWillChange] public static function createFromFormat($format, $datetime, $timezone = null) { $instance = new static; return new static($datetime, $instance->getTimezone()); } }