FormContainer nemá metodu addGroup – jak to řešit?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ot@s
Backer | 476
+
0
-

Při práci s formuláři mám tento krátký kód:

$form = new Nette\Application\AppForm();
$container = $form->addContainer( 'tmp' );
$container->addGroup( 'Some group' ); // zpusobi Call to undefined method Nette\Forms\FormContainer::addGroup
$container->addText( 'Some text' );

Skript končí na třetím řádku hláškou: Call to undefined method Nette\Forms\FormContainer::addGroup (když ho zakomentuji, skript proběhne). Co s tím? Je to záměr? Jak mám dostat kontejner do fieldsetu? Díky za nasměrování.

PHP 5.3.1 + Nette 2.0-dev (tyden stare)

Patrik Votoček
Člen | 2221
+
0
-

To ti to z té chyby není jasné? container neumí groupy!

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

fieldset se dá určitě řešit ručním vykreslováním (z hlediska přijetí dat nemá fieldset stejně žádný význam). A ruční vykreslování se dá skvěle vylepšit formulářovými makry.

Ot@s
Backer | 476
+
0
-

vojtech.dobes napsal(a):

fieldset se dá určitě řešit ručním vykreslováním (z hlediska přijetí dat nemá fieldset stejně žádný význam). A ruční vykreslování se dá skvěle vylepšit formulářovými makry.

O ručním vykreslování samozřejmě vím. Potřebuju jiné řešení, neboť prvku formuláře jsou generovány dynamicky…

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

No, a nešlo by to skloubit? Lze přeci iterovat přes prvky v containeru a podle jejich typu ci nazvu uz je vykreslit, jak bude potřeba. Nebo je tam nejaky zadrhel? Anebo stejně jako formulář generován podle nějakých dat (předpokládám), tak by také mělo být možné podle těchto stejných dat jej i ručně vykreslit.

Ot@s
Backer | 476
+
0
-

vojtech.dobes napsal(a):

No, a nešlo by to skloubit? Lze přeci iterovat přes prvky v containeru a podle jejich typu ci nazvu uz je vykreslit, jak bude potřeba. Nebo je tam nejaky zadrhel? Anebo stejně jako formulář generován podle nějakých dat (předpokládám), tak by také mělo být možné podle těchto stejných dat jej i ručně vykreslit.

Díky za tip. No, popravdě me nenapadá jak. Musel bys to asi trošku rozepsat.

Mám strom dynamickych atributů objektu, které chci ve formuláři podobným strukturovaných způsobem vykreslit (tj. kořen větve je container/fieldset s vnořenými prvky). Nakonec jsem to vyřešil tak, že si nasekám fieldsety přes addGroup přímo do formuláře. Následně generuju formulářové kontejnery s prvky a ty pomocí add metody formuláře umísťuju do příslušných grup. Není to úplně to, co bych si představoval, ale co nadělám…

Zarazilo mě, že form container má stejné možnosti (alespoň co se týče formulářových elementů), jako samotný form. Že form containeru chybí možnost addGroup, to jsem teda fakt nečekal…

Filip Procházka
Moderator | 4668
+
0
-

třeba takhle:

protected function createComponentForm($name)
{
	$form = new Nette\Application\AppForm($this, $name);
	$form->addGroup('Skupina');
	$container = $form->addContainer('c');
	$container->addText('name', 'Jmeno');

	$form->addGroup('Skupina 2');
	$form->addSubmit('s', 'Poslat');
}

nebo takle:

protected function createComponentForm($name)
{
	$form = new Nette\Application\AppForm($this, $name);
	$container = $form->addContainer('c');
	$container->currentGroup = $form->addGroup('Skupina', FALSE);
	$container->addText('name', 'Jmeno');

	$form->addGroup('Skupina 2');
	$form->addSubmit('s', 'Poslat');
}

a nebo nejsprávněji :)

Class MyContainer extends Nette\Forms\FormContainer
{
	protected function attached($obj)
	{
		parent::attached($obj);

		if (!$obj instanceof Nette\Forms\Form) { // kvůli lookups
			return ;
		}

		$this->currentGroup = $this->getForm()->addGroup('Skupina', FALSE);

		$this->addText('name', 'Jmeno');
	}
}

// ... presenter

protected function createComponentForm($name)
{
	$form = new Nette\Application\AppForm($this, $name);
	$form['c'] = new MyContainer();

	$form->addGroup('Skupina 2');
	$form->addSubmit('s', 'Poslat');
}

Editoval HosipLan (17. 3. 2011 11:49)