Převod vybraného optionu v selectu na enum type

MiskynsCZ
Člen | 13
+
0
-

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
+
0
-

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
+
0
-

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
+
+4
-

Už to vidím. Nevyžaduj v onSuccess Address, Nette to zřejmě neumí namapovat automaticky

MiskynsCZ
Člen | 13
+
0
-

Díky za informaci, jasný. Dal jsem pryč to automatické mapování. 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é :)

nightfish
Člen | 497
+
0
-

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
+
+1
-

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.

David Grudl
Nette Core | 8192
+
0
-

@MarekBartoš pokud tam máš konstruktor, tak to pošle data do něj

m.brecher
Generous Backer | 814
+
+1
-

@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.