Zpracování selectu s disabled prvky

Firest
Člen | 12
+
0
-

Ahoj,

po delší době jsem se dostal zase k Nette (2.4) a snažím se vyřešit jeden problém. Ve formuláři editace uživatele mám MultiSelect, do něhož tahám options z databáze (jedná se o labels, které danému uživateli přiřazuji). Ty však mohou být aktivní i neaktivní, u těch neaktivních proto potřebuji, aby s nimi nešlo manipulovat (např. je odznačit). Zkoušel jsem to nastavit přes setDisabled, což funguje fajn do té doby, než formulář odešlu, protože disabled prvky se neodesílají, tudíž i když mám např. selected prvky A, B, C a A je disabled, odešlou se jen B, C. Zkoušel jsem proto odstranit při odeslání formuláře z těchto prvků disabled, problém je v tom, že klasické .on(‚submit‘, …) mi s nette.ajax a netteForms netrigruje, a když kód vložím do $.nette.ext, tak proběhne (asi?) až po odeslání/zpracování formuláře.

<script>
$.nette.ext('submit', {
    before: function() {
        $('form').find('option:disabled').removeAttr('disabled');
    }
});
</script>

Zkoušel jsem dávat listenery na submit, validate, validatesuccess a všemožné další, ale výsledek je vždy stejný. Stejně tak jsem zkoušel dát prvky readonly a přepsat si CSS, aby se chovaly jako disabled. Problém je v tom, že nejsem schopný přiřadit jednotlivým prvkům readonly podle toho, jestli jsou aktivní nebo ne, pouze hromadně přes addOptionAttributes. Může mi někdo prosím poradit, jak dosáhnout požadovaného chování MultiSelectu? Díky!

Editoval Firest (7. 4. 2020 16:25)

Šaman
Člen | 2640
+
0
-

Vypadá to na víc problémů propletených dohromady, ale možná by to prozatím mohlo vyřešit použití $form->getHttpData($form::DATA_TEXT | $form::DATA_KEYS, 'inputName');. To by ti mělo vrátit i ty disabled inputy. Ale pozor, je to náchylnější k podstrčení hodnoty, která třeba v tom formuláři vůbec není na výběr. Viz https://doc.nette.org/cs/forms#…

Disabled inputy se odesílají. Nicméně při validaci příchozích dat se zahazují, protože disabled input (anebo neeistující možnost třeba v selectboxu) není validní vstup.

Editoval Šaman (7. 4. 2020 14:47)

Firest
Člen | 12
+
0
-

Šaman napsal(a):

Vypadá to na víc problémů propletených dohromady, ale možná by to prozatím mohlo vyřešit použití $form->getHttpData($form::DATA_TEXT | $form::DATA_KEYS, 'inputName');. To by ti mělo vrátit i ty disabled inputy. Ale pozor, je to náchylnější k podstrčení hodnoty, která třeba v tom formuláři vůbec není na výběr. Viz https://doc.nette.org/cs/forms#…

Disabled inputy se odesílají. Nicméně při validaci příchozích dat se zahazují, protože disabled input (anebo neeistující možnost třeba v selectboxu) není validní vstup.

Díky za odpověď, bohužel ty disabled hodnoty se ani neodešlou v requestu (podle toho co vidím ve Form Data).

Edit: Ještě by asi stálo za to zmínit že používám select2, každopádně když odeberu disabled hned (ne až při odeslání), tak se vše odešle, stejně tak když disabled odeberu v tom nette.ext a poté si vyberu prvek a dám vypsat data, opět dostanu správné výsledky. Jen se to nejspíš provede až po odeslání.

Editoval Firest (7. 4. 2020 15:50)

Šaman
Člen | 2640
+
0
-

Ou, sorry. Más pravdu, disabled inputy ani selecty se neodesílají, ani v čistém HTML. Teď jsem to zkoušel.
Nějak jsem to asi popletl s tím, že Nette v selectboxu nepřijme hodnotu, která v tom formuláři neexistuje (tedy neexistuje v tom příjmacím formuláři; v tom na nové stránce po odeslání).

Proč je vlastně chceš mít disabled na úrovni formuláře? Pokud se snimi pracuje stejně, jako s aktivními (má je jít označit a odznačit), pak podobnou věc u sebe řeším přidáním (x) k položce. Je to jen indormace pro uživatele, že tato položka není aktivní.

Editoval Šaman (7. 4. 2020 15:50)

Firest
Člen | 12
+
0
-

S těmi neaktivními se právě pracuje jinak. Aktivní máš mít možnost přiřadit/odebrat, u těch neaktivních pouze odebrat. Proto jsem zkoušel různé možnosti. Jediné co mě už napadá je jen to, že bych si vytvořil nějaký hidden select a při každé změně toho viditelného bych do něj překopíroval hodnoty, jinak už jsem v koncích.

Edit: Což podle všeho nejde, protože při volání .val() taktéž nedostanu disabled hodnoty.

Editoval Firest (7. 4. 2020 18:00)

F.Vesely
Člen | 368
+
0
-

V $items můžes použít i Nette\Utils\Html::(‚option‘) a tomu pad nastavovat nějaké atributy podle toho, jeslit je nebo není aktivní. Viz poslední odstavec v dokumentaci u addSelect() https://doc.nette.org/…rms/controls#…

Kamil Valenta
Člen | 765
+
0
-

Rozhodující je, zda má jít ty „disabled“ hodnoty odeslat nebo ne. Pokud ano, tak nemohou být disabled (nedává to smysl).
Nestačilo by Ti je jen nějak ostylovat? Třeba šedým písmem, aby vypadaly jako disabled, ale ve skutečnosti byly aktivní? Procesovat je pak můžeš jinak než ty „neostylované“, tedy aktivní se vším všudy.

Firest
Člen | 12
+
+1
-

@FVesely @kamil_v

Díky oběma, tohle jsem přesně potřeboval (mít možnost si to nastylovat podle sebe). Bohužel se mi nějak špatně autoimportovala třída a HTML::el mi blbnul, proto jsem od té možnosti upustil a zkoušel jiné věci.

m.brecher
Generous Backer | 772
+
0
-

@Firest

Zkoušel jsem to nastavit přes setDisabled, což funguje fajn do té doby, než formulář odešlu, protože disabled prvky se neodesílají, tudíž i když mám např. selected prvky A, B, C a A je disabled, odešlou se jen B, C

Tak si říkám, zda Tvůj problém s disabled prvky které po submitu „zmizí“ není ten samý, který jsem řešil na fóru zde:

https://forum.nette.org/…ba-framework

Tam jsem měl také problém, že disabled prvky v submitu formuláře „ztratily hodnotu“. Problém byl v tom, že setDefaults() neumí správně nastavit hodnoty disablovaných prvků pokud je tato metoda volána v presenteru, zatímco, když se volá uvnitř formuláře, tak funguje 100%.

Vyzkoušej to, zde by mohla být příčina problému.

Editoval m.brecher (3. 6. 2023 1:17)