Nespravne spravanie funkcie setClass() & pri Form-ConventionalRenderer

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

Pouzivam verziu Nette Framework 0.9.5 (revision 5eb03f5 released on 2010–07–01)

Pri tvorbe formulara pomocou

$f = new AppForm;
$f->addText('name', 'Meno')
  ->getControlPrototype()
  ->setClass('moj')
  ->setId('mojemeno');

Metoda setClass(‚moj‘) len prida ‚moj‘, a metoda setId(‚mojemeno‘) nenastavi id elementu vobec, preto vysledny element bude nasledovny:

<input type="text" name="name" class="moj text" id="formid-name" />

namiesto ocakavaneho

<input type="text" name="name" class="moj" id="mojename" />

Je to chyba, alebo zamer? Ako je mozne docielit efekt? Cely den sa mi nedari najst funkcne riesenie ani navod ako to spravit.

Aurielle
Člen | 1281
+
0
-

Nejspíš je to záměr, jak pak má fungovat klientská validace? (minimálně v 0.9.x, v 1.0 nemám ještě netteforms.js prozkoumaný)

toka
Člen | 253
+
0
-

Více informací o stylu se řeší v tomto vláknu. Co se týče id, je to tak podle mne kvůli validaci – hlavně ti framework usnadňuje práci, nemusíš si nic hlídat, nad ničím přemýšlet, id doplní za tebe a validační pravidla pak „vždy“ fungují.

redhead
Člen | 1313
+
0
-

Co se týče ID tak používej setHtmlId() (přímo na prvku, ne na prototypu), pak se to přenese i na validační pravidla. Co se týče class tak buď přes wrappers a nebo jsem někde viděl použití class('neco', TRUE). Kde to TRUE to nějak přemazává. Ale možná kecám blbosti..

westrem
Člen | 398
+
0
-

Ach jaj, preco postujes nieco za chybu ked to v podstate chyba nie je, Nette nie je deravy framework a vecsina veci ma svoju opodstatnenu logiku a takmer vzdy mas sposob ako to lahko zmenit!

Stihol si to tu postnut skorej ako som napisal do povodneho threadu.

Ako pise redhead na ID mas setHtmlId, setClass korektne spravi nastavenie triedy.

Renderer (ten defaultny conventional) potom funguje tak, ze k nastavenym triedam appenduje tie z wrappers. Ak ti to nevyhovuje, uprav si wrappers alebo pouzivaj vlastny renderer.

redhead napsal
class(‚neco‘, TRUE). Kde to TRUE to nějak přemazává. Ale možná kecám blbosti

Keby ste chlapci obcas dosledne studovali API tak zistite, ze to TRUE je tam na vynutenie pridavanie a nie nastavovania API #1
a nasledne ked sa prechadzaju atributy tak pokial je hodnota true, pouzije sa key ako value API #2

Nabuduce poprosim torchu menej zbehlosti v nahlasovani chyb, ked o chybu ani nejde ;)

redhead
Člen | 1313
+
0
-

Já říkal, že kecám blbosti ;) Sry. Já měl jen pocit, že to s tim něco mělo společnýho.

MIKI
Člen | 34
+
0
-

westrem napsal(a):

Nabuduce poprosim torchu menej zbehlosti v nahlasovani chyb, ked o chybu ani nejde ;)

Jasne, poucim sa a budem sa snazit byt trpezlivejsi :)

setHtmlId() uz funguje, vdaka.

setClass() som si vcera prezeral este par krat. Ani teoreticky som neprisiel na to, ako to jednoducho vyriesit bez wrappers, aby sa zachovala povodna funkcnost. V principe to nie je dolezite.

Ospravedlnujem sa, prehnal som to s chybou, poprosim o lock :)

David Grudl
Nette Core | 8220
+
0
-

CSS třídy tam přidává (tj. nepřepisuje) ConventionalRenderer a je to konfigurovatelné přes pole wrappers. Takže zrušit třídu text lze třeba takto:

$form->renderer->wrappers['control']['.text'] = NULL;

Nebo tak lze nastavit jinou třídu.

Renderer to tak dělá z historických důvodů kvůli IE6, kde nebylo jinak možné inputy nastylovat. V dnešní době používá IE6 cca 5 % uživatelů a proto bude automatické oklasování v nové verzi Nette vypnuto. Tj. půjde zapnout, ale ve výchozím nastavení bude vypnuto.