Formatters
Formátery slouží k formátování dat před jejich vykreslením v API, datagridu a ve formulářích.
Příklad využití formáterů
Předpokládejme, že chceme vypsat datagrid se třemi sloupci: date
, paragraph
a nickname
. Sloupec date
obsahuje
datum, které chceme zobrazit ve formátu j.n.Y
. Sloupec paragraph
obsahuje text, který chceme zobrazit maximálně na
100 znaků a se třemi tečkami na konci. Sloupec nickname
obsahuje přezdívku, kterou chceme zobrazit velkými písmeny.
Navíc chceme, aby se sloupec paragraph
formátoval pouze v datagirdu (AdminPanelu).
public function readAll(ReadBuilder $builder, CollectionRequest $request): ReadBuilder
{
return $builder
->add(new TextColumn(
key: 'date',
name: 'Datum',
formatters: [
// Převede \Datetime na string ve formátu: j.n.Y
new DateCzFormatter()
]
))
->add(new TextColumn(
key: 'paragraph',
name: 'Odstavec',
formatters: [
// Odstraní HTML tagy, zkrátí text na 100 znaků a přidá tři tečky na konec
new RichTextFormatter(
max: 100,
truncate: false,
suffix: '...',
stripTags: true,
showOnlyOn: ShowOnlyOn::ADMIN_PANEL
)
]
))
->add(new TextColumn(
key: 'nickname',
name: 'Přezdívka',
formatters: [
// Převede na velká písmena
new CallableFormatter(fn($value) => mb_strtoupper($value))
]
))
;
}
Přehled formáterů
Formatter (název třídy) | Popis | Parametry | |
---|---|---|---|
1 | CallableFormatter | Umožňuje definovat vlastní callback funkci pro formátování hodnoty. | callable $callback ?ShowOnlyOn $showOnlyOn |
2 | DateCzFormatter | Převede \Datetime či \DateTimeImmutable na string ve formátu: j.n.Y . | ?ShowOnlyOn $showOnlyOn |
3 | DateFormatter | Převede \Datetime či \DateTimeImmutable na string ve formátu: Y-m-d . | ?ShowOnlyOn $showOnlyOn |
4 | DateTimeCzFormatter | Převede \Datetime či \DateTimeImmutable na string ve formátu: j.n.Y H:i:s . | ?ShowOnlyOn $showOnlyOn |
5 | DateTimeFormatter | Převede \Datetime či \DateTimeImmutable na string ve formátu: Y-m-d H:i:s . | ?ShowOnlyOn $showOnlyOn |
6 | DateTimeIntervalFormatter | Převede \DateInterval na array v tomto formátu. | ?ShowOnlyOn $showOnlyOn |
7 | DateTimeZoneCzFormatter | Převede \DateTime či \DateTimeImmutable na array v tomto formátu. | ?ShowOnlyOn $showOnlyOn |
8 | DateTimeZoneFormatter | Převede \DateTimeZone či \DateTimeImmutable na array v tomto formátu. | ?ShowOnlyOn $showOnlyOn |
9 | HourMinuteCzFormatter | Převede \DateTime či \DateTimeImmutable na string ve formátu: G:i . | ?ShowOnlyOn $showOnlyOn |
10 | HourMinuteFormatter | Převede \DateTime či \DateTimeImmutable na string ve formátu: H:i . | ?ShowOnlyOn $showOnlyOn |
11 | MaxFormatter | V případě array vrátí maximální počet položek. V případě stringu vrátí oříznutý text. | int $max ?ShowOnlyOn $showOnlyOn |
12 | RichTextFormatter | Odstraní HTML tagy, zkrátí text na zadaný počet znaků a přidá suffix. | int $max bool $truncate string $suffix bool $stripTags ?ShowOnlyOn $showOnlyOn |
13 | TimeCzFormatter | Převede \DateTime či \DateTimeImmutable na string ve formátu: G:i:s . | ?ShowOnlyOn $showOnlyOn |
14 | TimeFormatter | Převede \DateTime či \DateTimeImmutable na string ve formátu: H:i:s . | ?ShowOnlyOn $showOnlyOn |
15 | ToManyFormatter | Převede na array{label: string, value: string}[] či null . Více zde. | ?ShowOnlyOn $showOnlyOn |
16 | ToOneFormatter | Převede na array{label: string, value: string} či null . Více zde. | ?ShowOnlyOn $showOnlyOn |
Jak funguje ToManyFormatter
Tento formáter dokáže rozpoznat cílovou (relační) entitu a pokud tato cílová entita implementuje rozhraní IJoinable
a
tedy i metodu getJonableLabel()
, tak transformuje celou ArrayCollection
na array-list, kde každý prvek obsahuje
property label
a value
. Property value
je vždy id
cílové entity a label
je sestaven podle předpisu v
metodě getJonableLabel()
.
Jak funguje ToOneFormatter
Stejně jako ToManyFormatter, tak i tento formáter dokáže rozpoznat cílovou
(relační) entitu a pokud tato cílová entita implementuje rozhraní IJoinable
a tedy i metodu getJonableLabel()
, tak
transformuje celou entitu na pole - ovšem ale pouze na klasické pole viz array{label: string, value: string}
.
Návratová hodnota DateTimeIntervalFormatter
array {
is_positive: bool,
all_days: int,
each: {
years: int,
months: int,
days: int,
hours: int,
minutes: int,
seconds: int
}
}
Návratová hodnota DateTimeZoneCzFormatter
array {
value: string, // j.n.Y H:i:s
iso_8601: string, // 2021-08-26T14:00:00+02:00
zone_id: string, // Europe/Prague
utc_offset: string // +02:00
}
Návratová hodnota DateTimeZoneFormatter
array {
value: string, // Y-m-d H:i:s
iso_8601: string, // 2021-08-26T14:00:00+02:00
zone_id: string, // Europe/Prague
utc_offset: string // +02:00
}
Vlastní formáter
Pokud potřebujete ovlivnit formátování nějakých hodnot jiným způsobem než nabízí výše uvedené formátery, můžete si vytvořit vlastní formáter.
Vytvoření formáteru
Stačí přidat novou třídu, která podědí BaseFormatter
a implementuje metodu format()
.
class MyCustomFormatter extends BaseFormatter
{
public function __construct(
protected int $max = 100,
protected bool $truncate = false,
protected string $suffix = '...',
protected bool $stripTags = true,
protected ?ShowOnlyOn $showOnlyOn = null
)
{
parent::__construct($showOnlyOn);
}
public function format(mixed $value, string $key): mixed
{
if (!is_string($value)) {
return $value;
}
$value = strip_tags($value);
if (Strings::length($value) > $this->max) {
if ($this->truncate) {
$value = Strings::truncate($value, $this->max, $this->suffix);
} else {
$value = Strings::substring($value, 0, $this->max) . $this->suffix;
}
}
return $value;
}
}
Povinné parametry konstruktoru
Jediným povinným parametrem je showOnlyOn
, který určuje, kde se má formáter použít - zda jen v API nebo v AdminPanelu a
nebo v obou případech - což je výchozí nastavení.