Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7954d83f52 | ||
|
|
75fb7ba155 |
No files matched your search
@@ -0,0 +1,64 @@
|
|||||||
|
#### Date Field Symbol Table
|
||||||
|
|
||||||
|
source: https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table
|
||||||
|
|
||||||
|
| Symbol | Meaning | Pattern | Example Output |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| `G` | era designator | `G`, `GG`, or `GGG`<br/>`GGGG`<br/>`GGGGG` | AD<br/>Anno Domini<br/>A |
|
||||||
|
| `y` | year | `yy`<br/>`y` or `yyyy` | 96<br/>1996 |
|
||||||
|
| `Y` | year in “Week of Year” based calendars in which the year transition occurs on a week boundary; may differ from calendar year ‘y’ near a year transition. This year designation is used with pattern character ‘w’ in the ISO 8601 year-week calendar, for example. | `Y` | 1997 |
|
||||||
|
| `u` | extended year | `u` | 4601 |
|
||||||
|
| `U` | cyclic year name, as in Chinese lunar calendar | `U` | 甲子 |
|
||||||
|
| `r` | related Gregorian year | `r` | 1996 |
|
||||||
|
| `Q` | quarter | `Q`<br/>`QQ`<br/>`QQQ`<br/>`QQQQ`<br/>`QQQQQ` | 2<br/>02<br/>Q2<br/>2nd quarter<br/>2 |
|
||||||
|
| `q` | stand-alone quarter | `q`<br/>`qq`<br/>`qqq`<br/>`qqqq`<br/>`qqqqq` | 2<br/>02<br/>Q2<br/>2nd quarter<br/>2 |
|
||||||
|
| `M` | month in year | `M`<br/>`MM`<br/>`MMM`<br/>`MMMM`<br/>`MMMMM` | 9<br/>09<br/>Sep<br/>September<br/>S |
|
||||||
|
| `L` | stand-alone month in year | `L`<br/>`LL`<br/>`LLL`<br/>`LLLL`<br/>`LLLLL` | 9<br/>09<br/>Sep<br/>September<br/>S |
|
||||||
|
| `w` | week of year | `w`<br/>`ww` | 27<br/>27 |
|
||||||
|
| `W` | week of month | `W` | 2 |
|
||||||
|
| `d` | day in month | `d`<br/>`dd` | 2<br/>02 |
|
||||||
|
| `D` | day of year | `D` | 189 |
|
||||||
|
| `F` | day of week in month | `F` | 2 (2nd Wed in July) |
|
||||||
|
| `g` | modified julian day | `g` | 2451334 |
|
||||||
|
| `E` | day of week | `E,` `EE`, or `EEE`<br/>`EEEE`<br/>`EEEEE`<br/>`EEEEEE` | Tue<br/>Tuesday<br/>T<br/>Tu |
|
||||||
|
| `e` | local day of week<br/>example: if Monday is 1st day, Tuesday is 2nd ) | `e`<br>`ee`<br/>`eee`<br/>`eeee`<br/>`eeeee`<br/>`eeeeee` | 2<br>02<br/>Tue<br/>Tuesday<br/>T<br/>Tu |
|
||||||
|
| `c` | stand-alone local day of week | `c` or `cc`<br/>`ccc`<br/>`cccc`<br/>`ccccc`<br/>`cccccc` | 2<br/>Tue<br/>Tuesday<br/>T<br/>Tu |
|
||||||
|
| `a` | AM or PM | `a`, `aa`, or `aaa`<br/>`aaaa`<br/>`aaaaa` | PM [abbrev]<br/>PM [wide]<br/>p |
|
||||||
|
| `b` | am, pm, noon, midnight | `b`, `bb`, or `bbb`<br/>`bbbb`<br/>`bbbbb` | mid.<br/>midnight<br/>md |
|
||||||
|
| `B` | flexible day periods | `B`, `BB`, or `BBB`<br/>`BBBB`<br/>`BBBBB` | at night [abbrev]<br/>at night [wide]<br/>at night [narrow] |
|
||||||
|
| `h` | hour in am/pm (1~12) | `h`<br/>`hh` | 7<br/>07 |
|
||||||
|
| `H` | hour in day (0~23) | `H`<br/>`HH` | 0<br/>00 |
|
||||||
|
| `k` | hour in day (1~24) | `k`<br/>`kk` | 24<br/>24 |
|
||||||
|
| `K` | hour in am/pm (0~11) | `K`<br/>`KK` | 0<br/>00 |
|
||||||
|
| `m` | minute in hour | `m`<br/>`mm` | 4<br/>04 |
|
||||||
|
| `s` | second in minute | `s`<br/>`ss` | 5<br/>05 |
|
||||||
|
| `S` | fractional second - truncates (like other time fields)<br/>to the count of letters when formatting. Appends<br/>zeros if more than 3 letters specified. Truncates at<br/>three significant digits when parsing. | `S`<br/>`SS`<br/>`SSS`<br/>`SSSS` | 2<br/>23<br/>235<br/>2350 |
|
||||||
|
| `A` | milliseconds in day | `A` | 61201235 |
|
||||||
|
| `z` | Time Zone: specific non-location | `z`, `zz`, or `zzz`<br/>`zzzz` | PDT<br/>Pacific Daylight Time |
|
||||||
|
| `Z` | Time Zone: ISO8601 basic hms? / RFC 822<br/>Time Zone: long localized GMT (=OOOO)<br/>Time Zone: ISO8601 extended hms? (=XXXXX) | `Z`, `ZZ`, or `ZZZ`<br/>`ZZZZ`<br/>`ZZZZZ` | -0800<br/>GMT-08:00<br/>-08:00, -07:52:58, Z |
|
||||||
|
| `O` | Time Zone: short localized GMT<br/>Time Zone: long localized GMT (=ZZZZ) | `O`<br/>`OOOO` | GMT-8<br/>GMT-08:00 |
|
||||||
|
| `v` | Time Zone: generic non-location<br/>(falls back first to VVVV) | `v`<br/>`vvvv` | PT<br/>Pacific Time or Los Angeles Time |
|
||||||
|
| `V` | Time Zone: short time zone ID<br/>Time Zone: long time zone ID<br/>Time Zone: time zone exemplar city<br/>Time Zone: generic location (falls back to OOOO) | `V`<br/>`VV`<br/>`VVV`<br/>`VVVV` | uslax<br/>America/Los_Angeles<br/>Los Angeles<br/>Los Angeles Time |
|
||||||
|
| `X` | Time Zone: ISO8601 basic hm?, with Z for 0<br/>Time Zone: ISO8601 basic hm, with Z<br/>Time Zone: ISO8601 extended hm, with Z<br/>Time Zone: ISO8601 basic hms?, with Z<br/>Time Zone: ISO8601 extended hms?, with Z | `X`<br/>`XX`<br/>`XXX`<br/>`XXXX`<br/>`XXXXX` | -08, +0530, Z<br/>-0800, Z<br/>-08:00, Z<br/>-0800, -075258, Z<br/>-08:00, -07:52:58, Z |
|
||||||
|
| `x` | Time Zone: ISO8601 basic hm?, without Z for 0<br/>Time Zone: ISO8601 basic hm, without Z<br/>Time Zone: ISO8601 extended hm, without Z<br/>Time Zone: ISO8601 basic hms?, without Z<br/>Time Zone: ISO8601 extended hms?, without Z | `x`<br/>`xx`<br/>`xxx`<br/>`xxxx`<br/>`xxxxx` | -08, +0530<br/>-0800<br/>-08:00<br/>-0800, -075258<br/>-08:00, -07:52:58 |
|
||||||
|
| `'` | escape for text | `'` | (nothing) |
|
||||||
|
| `''` | two single quotes produce one | `''` | ' |
|
||||||
|
|
||||||
|
> :point_right: **Note**: *Any characters in the pattern that are not in the ranges of
|
||||||
|
['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance,
|
||||||
|
characters like `':'`, `'.'`, `' '`, `'#'` and `'@'` will appear in the resulting time
|
||||||
|
text even they are not enclosed within single quotes. The single quote is used to
|
||||||
|
'escape' letters. Two single quotes in a row, whether inside or outside a quoted
|
||||||
|
sequence, represent a 'real' single quote.*
|
||||||
|
|
||||||
|
> :point_right: **Note**: *A pattern containing any invalid pattern letter results in a failing `UErrorCode`
|
||||||
|
result during formatting or parsing.*
|
||||||
|
|
||||||
|
| Format Pattern | Result |
|
||||||
|
| --- | --- |
|
||||||
|
| `"yyyy.MM.dd G 'at' HH:mm:ss zzz"` | "1996.07.10 AD at 15:08:56 PDT" |
|
||||||
|
| `"EEE, MMM d, ''yy"` | "Wed, July 10, '96" |
|
||||||
|
| `"h:mm a"` | "12:08 PM" |
|
||||||
|
| `"hh 'o''clock' a, zzzz"` | "12 o'clock PM, Pacific Daylight Time" |
|
||||||
|
| `"K:mm a, z"` | "0:00 PM, PST" |
|
||||||
|
| `"yyyyy.MMMM.dd GGG hh:mm aaa"` | "01996.July.10 AD 12:08 PM" |
|
||||||
@@ -49,6 +49,8 @@ trait DatetimeTrait
|
|||||||
return strftime($format, $this->getTimestamp());
|
return strftime($format, $this->getTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# patterns: https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table
|
||||||
|
# see also 100-datetime-format.md file in DOC
|
||||||
public function formatLocaleIntl(int $dateFormatter = \IntlDateFormatter::LONG, int $timeFormatter = \IntlDateFormatter::NONE, ? string $pattern = null) : string
|
public function formatLocaleIntl(int $dateFormatter = \IntlDateFormatter::LONG, int $timeFormatter = \IntlDateFormatter::NONE, ? string $pattern = null) : string
|
||||||
{
|
{
|
||||||
$formatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormatter, $timeFormatter, \date_default_timezone_get(), \IntlDateFormatter::GREGORIAN, $pattern);
|
$formatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormatter, $timeFormatter, \date_default_timezone_get(), \IntlDateFormatter::GREGORIAN, $pattern);
|
||||||
|
|||||||
+7
-13
@@ -158,26 +158,20 @@ class Repository implements RepositoryInterface
|
|||||||
throw new \Exception("Your entity class `" . get_class($entity) . "` cannot match entity type of repository `{$this->entityClass}`");
|
throw new \Exception("Your entity class `" . get_class($entity) . "` cannot match entity type of repository `{$this->entityClass}`");
|
||||||
}
|
}
|
||||||
|
|
||||||
$primaryKeyDefinition = Ulmus::resolveEntity($this->entityClass)->getPrimaryKeyField();
|
if ($primaryKeyDefinition = Ulmus::resolveEntity($this->entityClass)->getPrimaryKeyField()) {
|
||||||
|
|
||||||
if ( $primaryKeyDefinition !== null ) {
|
|
||||||
$pkField = key($primaryKeyDefinition);
|
$pkField = key($primaryKeyDefinition);
|
||||||
|
|
||||||
$this->eventExecute(Event\Query\Delete::class, $this, $entity);
|
$this->eventExecute(Event\Query\Delete::class, $this, $entity);
|
||||||
|
|
||||||
return $this->deleteFromPk($entity->$pkField);
|
return $this->deleteFromPk($entity->$pkField);
|
||||||
}
|
}
|
||||||
|
elseif ($compoundKeyFields = Ulmus::resolveEntity($this->entityClass)->getCompoundKeyFields()) {
|
||||||
|
$this->eventExecute(Event\Query\Delete::class, $this, $entity);
|
||||||
|
|
||||||
|
return $this->deleteFromCompoundKeys(array_combine($compoundKeyFields->column, array_map(fn($column) => $entity->$column, $compoundKeyFields->column)));
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
$compoundKeyFields = Ulmus::resolveEntity($this->entityClass)->getCompoundKeyFields();
|
throw new \Exception(sprintf("No primary key found for entity %s", $this->entityClass));
|
||||||
|
|
||||||
if ($compoundKeyFields) {
|
|
||||||
$this->eventExecute(Event\Query\Delete::class, $this, $entity);
|
|
||||||
|
|
||||||
return $this->deleteFromCompoundKeys(array_combine($compoundKeyFields->column, array_map(fn($column) => $entity->$column, $compoundKeyFields->column)));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new \Exception(sprintf("No primary key found for entity %s", $this->entityClass));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,8 @@ trait SearchRequestFromRequestTrait
|
|||||||
{
|
{
|
||||||
$this->objectReflection = ObjectReflection::fromClass(static::class)->reflectClass();
|
$this->objectReflection = ObjectReflection::fromClass(static::class)->reflectClass();
|
||||||
|
|
||||||
$this->page = $data['page'] ?? 1;
|
# REMOVED - this could cause legacy problems, kept in case of a quick uncomment is needed
|
||||||
|
# $this->page = $data['page'] ?? 1;
|
||||||
|
|
||||||
$this->applyValues(
|
$this->applyValues(
|
||||||
fn($propertyName, $attribute) => $data[$propertyName] ?? null
|
fn($propertyName, $attribute) => $data[$propertyName] ?? null
|
||||||
@@ -86,9 +87,9 @@ trait SearchRequestFromRequestTrait
|
|||||||
$this->prepare($request);
|
$this->prepare($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
$queryParams = new \ArrayObject(array_filter($request->getQueryParams(), function($i) { return ! is_null($i) && $i !== ""; }));
|
# REMOVED - this could cause legacy problems, kept in case of a quick uncomment is needed
|
||||||
|
# $queryParams = new \ArrayObject(array_filter($request->getQueryParams(), function($i) { return ! is_null($i) && $i !== ""; }));
|
||||||
$this->page = $queryParams->offsetExists('page') ? $queryParams['page'] : 1;
|
# $this->page = $queryParams->offsetExists('page') ? $queryParams['page'] : 1;
|
||||||
|
|
||||||
$this->applyValues(
|
$this->applyValues(
|
||||||
fn($propertyName, $attribute) =>$this->getValueFromSource($request, $propertyName, $attribute)
|
fn($propertyName, $attribute) =>$this->getValueFromSource($request, $propertyName, $attribute)
|
||||||
@@ -155,6 +156,21 @@ trait SearchRequestFromRequestTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPropertyAttribute(string $name) : ? Attribute\SearchParameter
|
||||||
|
{
|
||||||
|
foreach($this->objectReflection->getProperties() as $propertyName => $property) {
|
||||||
|
if ($propertyName === $name) {
|
||||||
|
$attribute = $property->getAttribute(Attribute\SearchParameter::class)->object ?? false;
|
||||||
|
|
||||||
|
if ($attribute) {
|
||||||
|
return $attribute;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
protected function applyValues(\Closure $getValue) : void
|
protected function applyValues(\Closure $getValue) : void
|
||||||
{
|
{
|
||||||
foreach($this->objectReflection->getProperties() as $propertyName => $property) {
|
foreach($this->objectReflection->getProperties() as $propertyName => $property) {
|
||||||
|
|||||||
Reference in new issue
Block a user