Formulare +enable | readonly

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
phx
Člen | 651
+
0
-

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.

morousej
Člen | 18
+
0
-

Stačí si před tím, než ten FormItem vykreslíš, nastavit na Nette\Web\Html elementu přímo enabled = true, disabled = true, apod. Bylo to na jedné z přednášek…

phx
Člen | 651
+
0
-

Jenze jak se k tomu elementu dostanu?

morousej
Člen | 18
+
0
-

Nesmíš vykreslovat přes render(), ale jednotlivě po prvcích, ty si pak získáváš (z hlavy) přes $form[‚název‘]->control, takže

<?php
echo $form['název']->control->disabled(true);
?>
phx
Člen | 651
+
0
-

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

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

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

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.