Formulare +enable | readonly
- phx
- Člen | 651
Zdravim…
Potreboval bych aby Nette\Form vytvorilo formular, ale nektere textove polozky byly pouze ke cteni nebo disabled. Zkoumal jsem zdrojaky a nenasel jsem zadnou cestu. Formulare to zatim neumi:(
Davide dockame se nejake brzke implementace nebo to bude v nove verzi formularu? A otazka zni kdy?
btw: Obecne s terminama ma Nette hodne problemy. Nekde na foru obcas nejaky termin slibis, ale nejak se nedari dodrzet. Problem to je kdyz je na app dany termin a rozhoduji se zda si onu vec udelam sam po svem nebo ten slibovany cas pockam.
- phx
- Člen | 651
Supr to funguje, ale osobne bych toto umistilo do app logiky nez do presencni! tam to bohuzel nejde, prtz Text::getControl() vraci vzdy novy prvek. Reseni by bylo udelat vraceni jedinacka. Co ty na to Davide?
UPDATE:
Jeste to rozvedu v ramci hesla nic nepsat 2×. Kdyz dam nejaky formularovy
prvek readonly pri vykresleni tak musim jeste osetrit aby mi nekdo nahodou naky
prvek nevyplnim (Development tools a spol). Tz jednou to vykreslit spravne a
podruhe si osetrit vstupy. Osobne bych si predstavoval, ze kdyz bude neco
readonly tak Nette\Forms budou tento vstup ignorovat.
I kdyz mozna resim blbosti a prvek ktery ma byt needitovatelny vypisi proste textem a ne fomr prvkem. I kdyz form prvek vypada mnohem lip…
Editoval phx (4. 8. 2008 15:58)
- David Grudl
- Nette Core | 8218
phx napsal(a):
Supr to funguje, ale osobne bych toto umistilo do app logiky nez do presencni! tam to bohuzel nejde, prtz Text::getControl() vraci vzdy novy prvek. Reseni by bylo udelat vraceni jedinacka. Co ty na to Davide?
V nových formulářích je už možné zasahovat do šablony (respektive prototypu) HTML prvků:
// což znamená:
$control = $form->addText('name', 'Your name:');
$control->getControlPrototype()->onclick = 'alert(this)';
// getControlPrototype() a getLabelPrototype() vrací objekty Nette\Web\Html
// elegantně pomocí fluent interface:
$form->addText('name', 'Your name:')->controlPrototype->onclick('alert(this)');
UPDATE:
Jeste to rozvedu v ramci hesla nic nepsat 2×. Kdyz dam nejaky formularovy prvek readonly pri vykresleni tak musim jeste osetrit aby mi nekdo nahodou naky prvek nevyplnim (Development tools a spol). Tz jednou to vykreslit spravne a podruhe si osetrit vstupy. Osobne bych si predstavoval, ze kdyz bude neco readonly tak Nette\Forms budou tento vstup ignorovat.I kdyz mozna resim blbosti a prvek ktery ma byt needitovatelny vypisi proste textem a ne fomr prvkem. I kdyz form prvek vypada mnohem lip…
Readonly nijak systémově implementované není, ale tento atribut lze
samozřejmě
nastavit: $control->getControlPrototype()->readonly = TRUE
Naopak ‚disabled‘ implementované je. Prvky takto označené
($control->setDisabled()
) se vynechají při validaci, stejně
tak se nenačítají po odeslání formuláře.
- phx
- Člen | 651
SUPR… i kdyz disabled je kapku neprakticke. ReadOnly jsem chtel pro to, ze kdyz chci udelat jen nahled na data bez moznosti zmeny tak disabled je sice fajn, ale polozka je divna a nejde v nic oznacit a zkopirovat (ctrl+c ⇒ ctrl+v). Proto ja osobne pouzivam readOnly s tim, ze podobny vzhled doresim pomoci stylu.
- David Grudl
- Nette Core | 8218
Položky readonly a disabled se po logické stránce liší v tom, že disabled se neodesílají, tudíž je formulář ani nesmí přijímat a musí je vynechat při validaci.
Tato logická stránka je zohledněna v logickém návrhu, existencí metody isDisabled() a jejím zohlednění při přijímání HTTP dat a validaci.
Vedle toho readonly položky se liší pouze vizuální stránkou. Proto
nejsou zohledněny v logickém návrhu, ale lze je nastavit vizuálně přes
$control->getControlPrototype()->readonly = TRUE
. Možná by
nebylo na škodu přidat metodu setReadOnly() – nebo můžeš ji
implementovat jako extension method:
// for PHP < 5.3:
function FormControl_prototype_setReadOnly(FormControl $thisObj)
{
$thisObj->getControlPrototype()->readonly = TRUE;
}
// for PHP 5.3
FormControl::extensionMethod('setReadOnly', function(FormControl $thisObj)
{
$thisObj->getControlPrototype()->readonly = TRUE;
});
Možná působí podivně, že readonly položky se validují – ale jsou to data přijímaná z venku, nelze jim věřit a musí se validovat. Je už pak na programátorovi, aby nedošlo k situaci, kdy aplikace bude žádat na uživateli opravu readonly položky.