Přeskočit na hlavní obsah

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)RulesSerializersFormattersExtra parametryRenderer
1PureFieldText
2ArrayFieldArray
3DateCzFieldDateCzDateTimeDateCzText
4DateFieldDateDateTimeDateText
5DateTimeCzFieldDateTimeCzDateTimeDateTimeCzText
6DateTimeFieldDateTimeDateTimeDateTimeText
7DateTimeIntervalFieldDateTimeIntervalDateTimeIntervalDateTimeIntervalText
8DateTimeZoneFieldDateTimeZoneDateTimeZoneDateTimeZoneDateTimeZone
9DecimalFieldDecimalDecimal
10EmailFieldEmailEmail
11HiddenFieldHidden
12HourMinuteCzFieldHourMinuteCzDateTimeHourMinuteCzText
13HourMinuteFieldHourMinuteDateTimeHourMinuteText
14IntegerFieldIntegerInteger
15JsonFieldJson?Schema $schemaJson
16NumericFieldNumericNumeric
17PasswordFieldStringPassword
18PhoneCzFieldPhoneCzText
19RichTextFieldStringRichText
20SelectFieldItem[] $itemsSelect
21SlugFieldSlug?string $slugFromSlug
22TextAreaFieldStringTextArea
23TextFieldStringText
24TimeCzFieldTimeCzDateTimeTimeCzText
25TimeFieldTimeDateTimeTimeText
26ToggleBtnFieldBooleanToggleBtn
27ToManySelectFieldXXclass-string $reverseEntity
string $primaryKey
Select
28ToOneSelectFieldXXclass-string $reverseEntity
string $primaryKey
Select
29UrlFieldUrlText
30VideoLinkFieldVideoLinkText

Společné parametry fieldů​

U všech fieldů vyjma ToManySelectField a ToOneSelectField lze nastavit tyto společné parametry:

ParametrTypVýchozí hodnotaPopis
namestringNázev fieldu.
labelstringPopisek fieldu ve formuláři.
rulesIRule[]dle fielduPole pravidel implementujících IRule.
serializersISerializer[]dle fielduPole serializérů implementujících ISerializer.
formattersIFormatter[]dle fielduPole formatterů implementujících IFormatter.
attrsmixed[]dle fielduPole vlastních atributů pro formulářové pole.
disabledboolfalseZakáže field ve formuláři a v API.
mapToEntitybooltruePovolí mapování fieldu na entitu.
valuemixednew UndefinedValue()Výchozí hodnota fieldu.
defaultValuemixednew 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 rendererSouborVue renderujePoznámka
1ArrayArrayFieldRenderer.vue<v-text-field>
2DateTimeZoneDateTimeZoneFieldRenderer.vue<v-text-field> a <autocomplete>
3DecimalDecimalFieldRenderer.vue<v-text-field>
4EmailEmailFieldRenderer.vue<v-text-field>
5HiddenHiddenFieldRenderer.vue<input type="hidden">
6IntegerIntegerFieldRenderer.vue<v-text-field>
7JsonJsonFieldRenderer.vue<v-textarea>
8NumericNumericFieldRenderer.vue<v-text-field>
9PasswordPasswordFieldRenderer.vue<v-text-field type="password">
10RichTextRichTextFieldRenderer.vue<div contenteditable="true">Quill editor
11SelectSelectFieldRenderer.vue<v-select>Může být multiple
12SlugSlugFieldRenderer.vue<v-text-field>
13TextAreaTextAreaFieldRenderer.vue<v-textarea>
14TextTextFieldRenderer.vue<v-text-field>
15ToggleBtnToggleBtnFieldRenderer.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().

app/Collection/Field/MyCustomField.php
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