Převod vybraného optionu v selectu na enum type
- MiskynsCZ
- Člen | 13
Ahoj,
mám tady takový menší problém s převodem vybrané hodnoty z nette formuláře na typ enum.
Mám zde kód, kterým plním data z AddressType enumu do formuláře (konkrétně do selectu)
$form->addSelect(
name: 'addressType',
label: 'Typ adresy',
items: array_combine(
array_column(AddressType::cases(), 'value'),
array_column(AddressType::cases(), 'name')
)
);
A v případě, kdy se formulář vyplní a submitne, tak mi to vyhodí
error
Cannot assign int to property App\Database\Entity\Address\Address::$addressType of type App\Database\Entity\Address\AddressType
Jelikož type, který v entitě Address je, tak musí mít AddressType typ a nikoliv int, neví někdo co s tím? Případně je nějaká možnost transformovat IDčko z formuláře na daný Enum type?
Zde je ještě odchycení formuláře:
$form->onSuccess[] = function (Form $form, Address $address): void {
$user = $this->getEntityManager()->getUserRepository()->find($this->getUser()->getId());
$address->setUser($user);
$address->setAddressType(AddressType::from($form->getValues()['addressType']));
$this->getEntityManager()->persist($address);
$this->getEntityManager()->flush();
};
Předem moc díky za jakoukoliv radu, kdyby náhodou tak používám Doctrine.
- Marek Bartoš
- Nette Blogger | 1230
Podle té výjimky máš chybu v kódu, kde nastavuješ property $addressType, ne tady. Jinak by ti spadlo už vytvoření enumu skrze AddressType::from()
Ve formuláři chyba nevzniká, ten o žádném numerickém id neví – https://3v4l.org/sDIfi
Editoval Marek Bartoš (25. 7. 17:02)
- MiskynsCZ
- Člen | 13
Marek Bartoš napsal(a):
Podle té výjimky máš chybu v kódu, kde nastavuješ property $addressType, ne tady. Jinak by ti spadlo už vytvoření enumu skrze AddressType::from()
Data se mi předávají v objektu Address, viz výše kód. Mám tam vrácení Address $address, bohužel už při settování mi to padá. Předpokládám, že to settuje nějaká funkce nette formu.
- Marek Bartoš
- Nette Blogger | 1230
Už to vidím. Nevyžaduj v onSuccess Address, Nette to zřejmě neumí namapovat automaticky
- nightfish
- Člen | 497
MiskynsCZ napsal(a):
Každopádně by bylo moc fajn přidat do budoucna nějaký transformer přímo na nette/forms, kde určím co se má při plnění daty dělat s danou hodnotou, například převést na objekt, enum či jiné :)
Každopádně by bylo moc fajn, kdybys v tomto duchu založil issue v https://github.com/nette/forms, protože na fóru to zapadne.
- Marek Bartoš
- Nette Blogger | 1230
Já jsem nikdy moc nepochopil, k čemu to automatické mapování je :)
Validaci to nedělá, konstruktor to nepoužívá, jistotu že bude objekt po
vytvoření plně inicializovaný nemáš a první co s daty z formuláře
uděláš je stejně to, že je namapuješ na nějaký objekt.
Místo toho aby to statickou analýzu zlepšovalo ji to zhoršuje.
- m.brecher
- Generous Backer | 814
@MarekBartoš
Já jsem nikdy moc nepochopil, k čemu to automatické mapování je :)
Také ho nepoužívám, ale někomu se to hodit může a když už ho ve frameworku máme, tak ať funguje. Datový typ enum by se měl podporovat všude, kde to jde.
Jak píše @nightfish, mělo by se to řešit PR, protože reportem na fóru se nic nevyřeší. Protože to není moc složité, zkusil jsem to fixnout já a poslal PR – více informací v novém vlákně zde: https://forum.nette.org/…ot-formulare.
Případné komentáře či doplňky jsou vítány.