Nette\Forms: prace s groups

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

Dnes jsem zkousel „FormGroup“ a narazil jsem na tyto problemy:

  • Pokud pridavam skupinu v prubehu pridavani inputu a chci ji definovat tak, ze za ni uz dalsi skupina nebude nebo bude obsazena v nadrazene skupine.
<?php
$form->addText('name', 'Your name:');
$form->addText('age', 'Your age:');
$form->addGroup('Podskupina')->add($form['name'], $form['age']);
// tady bych potreboval aby skupina skoncila, neco jako ->close();
$form->addText('score', 'Your score:');
?>
  • Moznost pridat do skupiny rovnou cely container
<?php
$form->addGroup('Skupina')->add($container);
?>
  • V pripade ze klonuju pole formulare napr.:
<?php
$form->addGroup('Skupina');
$form->addText('name', 'Your name:');
$form['name2'] = clone $form['name'];
?>

potom ‚name2‘ nepatri do zadne skupiny. Nevim jestli je to umysl, ale v tomto pripade neni problem prvek do skupiny pridat.

Vim ze by to slo resit vlastni renderovaci rutinou, ale myslim ze tohle by nebylo na skodu v zakladnim renderu.

LM
Člen | 206
+
0
-

Pokud změníš aktuální skupinu na NULL tak se bude používat ta globální (žádná).

$form->setCurrentGroup(); // $group = NULL

Při vytváření containeru mu můžeš rovnou nastavit skupinu zase pomocí setCurrentGroup($group).

David Grudl
Nette Core | 8172
+
0
-

ad 1) jak píše LM, můžeš aktuální skupinu vypnout přes $form->setCurrentGroup(NULL), ale souhlasím, že to má WTF-faktor jak prase. Budu rád, pokud přijdete s lepším způsobem. Možná by pomohlo přejmenovat addGroup() na něco jiného, nebo její funkčnost rozdělit mezi addGroup() a setCurrentGroup.

ad 2) skupina může združovat pouze formulářové prvky, ale něco jako $form->addGroup('Skupina')->add($container->getControls()) zprovozním.

ad 3) to se mi nezdá, name2 by mělo patřit do právě aktivní skupiny.

AceUnihoc
Člen | 19
+
0
-

David Grudl napsal(a):

ad 1) jak píše LM, můžeš aktuální skupinu vypnout přes $form->setCurrentGroup(NULL), ale souhlasím, že to má WTF-faktor jak prase. Budu rád, pokud přijdete s lepším způsobem. Možná by pomohlo přejmenovat addGroup() na něco jiného, nebo její funkčnost rozdělit mezi addGroup() a setCurrentGroup.

ad 2) skupina může združovat pouze formulářové prvky, ale něco jako $form->addGroup('Skupina')->add($container->getControls()) zprovozním.

ad 3) to se mi nezdá, name2 by mělo patřit do právě aktivní skupiny.

ad 1) souhlas to je reseni ale ne moc idealni. Napadlo me pridat nepoviny parametr do addGroup($name, $setCurrent = TRUE); v pripade $setCurrent = FALSE by se nanastavila current group a skupina by se pouze vytvorila.

ad 2) chapu, neco takovy sem myslel aby fungovalo

ad 3) mas pravdu v tomhle pripade to funguje, nefunguje to v pripade ze se clonuje container napr.:

<?php
$group = $form->addGroup('Skupina');
//$form->setCurrentGroup();

$head = $form->addContainer('sub');
$head->setCurrentGroup($group);

$head->addText('names', 'Your name:');

$form['sub2'] = clone $head;
?>

Prvni container je ve skupine a clonovany container neni v zadne.

  • Jde nastavit aby patrila skupina do jine skupiny. Myslim jinym zpusobem nez embedNext. Napriklad kdyz budu chtit pridat do jedne skupiny vice podskupin. Neco jako setParent();

Editoval AceUnihoc (11. 9. 2008 16:17)

David Grudl
Nette Core | 8172
+
0
-

Ono otázkou je, co by se mělo od skupin očekávat.

Komponenty, které vlastní Nette\ComponentContainer a lze je získat například přes getComponents(), tvoří logickou strukturu. (Něco jako vlastnost Components v ASP.NET nebo Delphi.) Na rozdíl od struktury vizuální, kterou Nette přímo nespravuje (v ASP.NET nebo Delphi dostupná přes vlastnost Controls). Takže například logický FormContainer člení strukturu dat, která získáme z formuláře, do polí. Neříká však nic o vizuální struktuře, kde který formulářový prvek umístit je čistě věcí vykreslování. A skupiny jsou nástrojem, který by měl pomoci právě při vykreslování.

Neříkám, že jen při vykreslování, oni mohou mít i svou logickou funkci, proto přemýšlím, co by se vlastně mělo od nich očekávat, na co všechno by se mohly hodit.

Pokud zůstane u vykreslování, připadá mi zbytečné, aby skupina mohla obsahovat logický prostředek jakým je FormContainer nebo jinou skupinu. Jde spíš o to, aby se do ní daly snadno nasypat prvky containeru (bude v další revizi), nebo aby se dalo ovládat vykreslování (např. embedNext).

AceUnihoc
Člen | 19
+
0
-

Souhlasim s tim co si napsal ze container tvori logickou strukturu a group vizualni. Vim, ze skupiny jsou teprve na zacatku a pokud pujde $form->addGroup(‚Skupina‘)->add($container->getControls()) tak neni duvod nastavovat skupinu containeru.

  • Jeste jsem nasel jednu chybku v FormContainer.php na radku 48: public function setCurrentGroup(FromGroup $group = NULL) … FormGroup misto FromGroup
jm
Člen | 10
+
0
-

Taky bych hodne vyuzil moznost pridani vice podskupin do jedne skupiny. Resim formular, kde skupina controls muze mit vice podskupin a navic kazda podskupina muze obsahovat dalsi podskupiny, atd. Neslo by implementovat vice podskupin prosim?