Fields
Fields jsou jednoduché PHP třídy, které řídí validace a ukládání dat do databáze - ať už je ukládáte přes API nebo přes formuláře v datagridu.
Příklad použití fieldů
Přidání fieldu EmailField
vám umožní pracovat s property email
skrze API endpoint a zároveň i skrze formulářové
pole v datagridu. Tento field má (by default) přiřazen EmailFieldRenderer.vue
jenž zajištuje, že se ve formuláři
zobrazí pole pro e-mail. K dispozici je celá řada fieldů
a field rendererů.
public function create(WriteBuilder $builder, CollectionRequest $request): WriteBuilder
{
return $builder
->add(new EmailField(
name: 'email',
label: 'E-mail',
rules: [
new RequiredRule(),
new UniqueRule(
targetEntity: User::class,
columnName: 'email',
message: 'Tento e-mail je již použit.'
)
],
serializers: [
// Serializer pro uložení hodnoty do databáze
new CallableSerializer(fn($value) => mb_strtolower($value))
],
formatters: [
// Formatter pro zobrazení hodnoty ve formuláři
new CallableFormatter(fn($value) => mb_strtoupper($value))
]
))
//->add(...)
//->add(...)
;
}
Při ukládání záznamu se automaticky provedou validace podle pravidel v parametru rules
. Následně se hodnota
serializuje dle přiřazených serializers
, namapuje na zdrojovou entitu a uloží do databáze.
Formátery, serializéry a pravidla
Ačkoli jsou formátery určeny primárně pro columns, mohou být použity i ve fieldu. Hodí se to zejména pro naformátování výchozí hodnoty pro formulářové pole.
Nejlepší příklad je DateField
- ten z databáze dostane hodnotu typu \DateTime
, ovšem obsahuje DateFormatter
, který
ji převede na string ve formátu Y-m-d
. Když pak hodnoty ukládáte přes formulář nebo přes API, tak se na fieldu
aplikuje pravidlo DateRule
- to provede validaci a zajistí, že hodnota bude ve správném formátu. Nakonec se
aplikuje serializer DateSerializer
, jenž hodnotu převede na formát vhodný pro uložení do databáze - tedy zpět na
objekt typu \DateTime
.
K dispozici je celá řada rules, serializers a formatters .
Přehled fieldů
Field (název třídy) | Rules | Serializers | Formatters | Extra parametry | Renderer | |
---|---|---|---|---|---|---|
1 | PureField | Text | ||||
2 | ArrayField | Array | ||||
3 | DateCzField | DateCz | DateTime | DateCz | Text | |
4 | DateField | Date | DateTime | Date | Text | |
5 | DateTimeCzField | DateTimeCz | DateTime | DateTimeCz | Text | |
6 | DateTimeField | DateTime | DateTime | DateTime | Text | |
7 | DateTimeIntervalField | DateTimeInterval | DateTimeInterval | DateTimeInterval | Text | |
8 | DateTimeZoneField | DateTimeZone | DateTimeZone | DateTimeZone | DateTimeZone | |
9 | DecimalField | Decimal | Decimal | |||
10 | EmailField | |||||
11 | HiddenField | Hidden | ||||
12 | HourMinuteCzField | HourMinuteCz | DateTime | HourMinuteCz | Text | |
13 | HourMinuteField | HourMinute | DateTime | HourMinute | Text | |
14 | IntegerField | Integer | Integer | |||
15 | JsonField | Json | ?Schema $schema | Json | ||
16 | NumericField | Numeric | Numeric | |||
17 | PasswordField | String | Password | |||
18 | PhoneCzField | PhoneCz | Text | |||
19 | RichTextField | String | RichText | |||
20 | SelectField | Item[] $items | Select | |||
21 | SlugField | Slug | ?string $slugFrom | Slug | ||
22 | TextAreaField | String | TextArea | |||
23 | TextField | String | Text | |||
24 | TimeCzField | TimeCz | DateTime | TimeCz | Text | |
25 | TimeField | Time | DateTime | Time | Text | |
26 | ToggleBtnField | Boolean | ToggleBtn | |||
27 | ToManySelectField | X | X | class-string $reverseEntity string $primaryKey | Select | |
28 | ToOneSelectField | X | X | class-string $reverseEntity string $primaryKey | Select | |
29 | UrlField | Url | Text | |||
30 | VideoLinkField | VideoLink | Text |
Společné parametry fieldů
U všech fieldů vyjma ToManySelectField
a ToOneSelectField
lze nastavit tyto společné parametry:
Parametr | Typ | Výchozí hodnota | Popis |
---|---|---|---|
name | string | Název fieldu. | |
label | string | Popisek fieldu ve formuláři. | |
rules | IRule[] | dle fieldu | Pole pravidel implementujících IRule . |
serializers | ISerializer[] | dle fieldu | Pole serializérů implementujících ISerializer . |
formatters | IFormatter[] | dle fieldu | Pole formatterů implementujících IFormatter . |
attrs | mixed[] | dle fieldu | Pole vlastních atributů pro formulářové pole. |
disabled | bool | false | Zakáže field ve formuláři a v API. |
mapToEntity | bool | true | Povolí mapování fieldu na entitu. |
value | mixed | new UndefinedValue() | Výchozí hodnota fieldu. |
defaultValue | mixed | new UndefinedValue() | Výchozí hodnota fieldu, pokud není vyplněná. |
Nastavení 100% šířky fieldu
Při renderování lze zapnout 100% šířku fieldu - stačí nastavit parametr attrs
na
hodnotu ['fullWidth' => true]
.
Přehled field rendererů
Vue field renderer | Soubor | Vue renderuje | Poznámka | |
---|---|---|---|---|
1 | Array | ArrayFieldRenderer.vue | <v-text-field> | |
2 | DateTimeZone | DateTimeZoneFieldRenderer.vue | <v-text-field> a <autocomplete> | |
3 | Decimal | DecimalFieldRenderer.vue | <v-text-field> | |
4 | Email | EmailFieldRenderer.vue | <v-text-field> | |
5 | Hidden | HiddenFieldRenderer.vue | <input type="hidden"> | |
6 | Integer | IntegerFieldRenderer.vue | <v-text-field> | |
7 | Json | JsonFieldRenderer.vue | <v-textarea> | |
8 | Numeric | NumericFieldRenderer.vue | <v-text-field> | |
9 | Password | PasswordFieldRenderer.vue | <v-text-field type="password"> | |
10 | RichText | RichTextFieldRenderer.vue | <div contenteditable="true"> | Quill editor |
11 | Select | SelectFieldRenderer.vue | <v-select> | Může být multiple |
12 | Slug | SlugFieldRenderer.vue | <v-text-field> | |
13 | TextArea | TextAreaFieldRenderer.vue | <v-textarea> | |
14 | Text | TextFieldRenderer.vue | <v-text-field> | |
15 | ToggleBtn | ToggleBtnFieldRenderer.vue | <v-switch> |
Vlastní field
Pokud potřebujete ovlivnit validaci, serializaci, formátování, či vykreslení fieldu jiným způsobem, než umožňují dostupné fieldy, můžete si vytvořit vlastní field.
Vytvoření fieldu
Stačí přidat novou třídu, která podědí BaseField
a implementuje metodu renderer()
.
class MyCustomField extends BaseField
{
/**
* Definuje název Vue field-rendereru.
* Pokud Vue komponenta není zaregistrována,
* provede se fallback na TextFieldRenderer.vue.
*/
public function renderer(): string
{
return 'my-custom-field-renderer';
}
/**
* Pomocí konstruktoru lze přidat jakékoli vlastní parametry.
*
* @param \Megio\Collection\WriteBuilder\Rule\Base\IRule[] $rules
* @param \Megio\Collection\WriteBuilder\Serializer\Base\ISerializer[] $serializers
* @param \Megio\Collection\Formatter\Base\IFormatter[] $formatters
* @param array<string, string|int|float|bool|null> $attrs
*/
public function __construct(
protected string $name,
protected string $label,
protected string $myParam,
protected array $rules = [],
protected array $serializers = [new DateTimeZoneSerializer()],
protected array $formatters = [new DateTimeZoneFormatter()],
protected array $attrs = [],
protected bool $disabled = false,
protected bool $mapToEntity = true,
protected mixed $value = new UndefinedValue(),
protected mixed $defaultValue = new UndefinedValue()
)
{
$this->rules[] = new DateTimeZoneRule();
parent::__construct(
$this->name,
$this->label,
$this->rules,
$this->serializers,
$this->formatters,
$this->attrs,
$this->disabled,
$this->mapToEntity,
$this->value,
$this->defaultValue
);
}
/**
* Také je možné přidat metodu toArray(), díky které
* můžete přidat vlastní data pro field.
*
* @return array<string, mixed>
*/
public function toArray(): array
{
$data = parent::toArray();
$data['params'] = [
'items' => \DateTimeZone::listIdentifiers()
'myParam' => $this->myParam,
];
return $data;
}
}
Povinné parametry konstruktoru
Konstruktor musí obsahovat veškeré parametry, které obsahuje i konstruktor rodičovské třídy BaseField
.
/**
* @param \Megio\Collection\WriteBuilder\Rule\Base\IRule[] $rules
* @param \Megio\Collection\WriteBuilder\Serializer\Base\ISerializer[] $serializers
* @param \Megio\Collection\Formatter\Base\IFormatter[] $formatters
* @param array<string, string|int|float|bool|null> $attrs
*/
public function __construct(
// Název fieldu
protected string $name,
// Popisek fieldu ve formuláři.
protected string $label,
// Navíc - Váš rozšiřující parametr
protected string $myParam,
// Navíc - Další rozšiřující parametr
protected string $myParamX,
// Pole pravidel implementujících IRule.
protected array $rules = [],
// Pole serializérů implementujících ISerializer.
protected array $serializers = [],
// Pole formatterů implementujících IFormatter.
protected array $formatters = [],
// Pole vlastních atributů pro formulářové pole.
protected array $attrs = [],
// Zakáže field ve formuláři a v API.
protected bool $disabled = false,
// Povolí mapování fieldu na entitu.
protected bool $mapToEntity = true,
// Výchozí hodnota fieldu.
protected mixed $value = new UndefinedValue(),
// Výchozí hodnota fieldu, pokud není vyplněná.
protected mixed $defaultValue = new UndefinedValue(),
)
{
// ...
}
Vlastní field renderer
Pokud potřebujete vytvořit vlastní Vue komponentu pro vykreslení fieldu, lze to provést ideálně ve
složce assets/datagrid/fields
. Vytvoříme zde tedy nový soubor MyCustomFieldRenderer.vue
a dále budeme postupovat
podle následující kapitoly: megio panel - field