FormContainer a removeCompoment

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

Mějme formulář s Containerem:

<?php
$form = new AppForm($this, 'formular');

// vytvoreni kontejneru
$container = $form->addContainer('container1');
	//pridani inputu do containeru:
	$container->addText('text', 'Textova polozka');

$form->addSubmit('save', 'Uloz')
	->onClick[] = array($this, 'saveForm');
$form->addSubmit('remove', 'Odebrat kontainer')
	->onClick[] = array($this, 'removeContainer');
?>

V prubehu zpracovani zjistim, ze cely kontejner potrebuju zrusit:

<?php
public function removeContainer(AppForm $form)
{
	$form->removeComponent($form['container1']);
}
?>

Po zavolani removeComponent se mi uz form nevykresli, pouze se vypise:

Warning: Component is not attached to 'Form'. in C:\Program Files\VertrigoServ\www\fv-payperclick\www\libs\Nette\Forms\Form.php on line 735

Nevíte někdo co s tím?

Jod
Člen | 701
+
0
-

Skúšal si unset? :D

krajaac
Člen | 45
+
0
-

Jod napsal(a):

Skúšal si unset? :D

Zrovna jsem ho vyzkousel, vysledek je stejny :)

krajaac
Člen | 45
+
0
-

Případně, jestli jste někdo řešili dynamické přidávání/odebírání prvků (inputů) do/z formuláře, prosím poraďte jak na to. Jsem jedno velké ucho.

Našel jsem vlákno tady a tady, ale potřeboval bych ať to funguje i bez JS.

Zatím mám sepsáno něco takového:

<?php
// PREPARE DATA
$selected = array();
$post = $this->getHttpRequest()->getPost();
if(!empty($post['cat'])) {
	foreach($post['cat'] as $cat_id => $c) {
		$selected[$cat_id] = $c['name'];
	}
}
else {
	$selected = $this->dibitable->getCategories();
}

// FORM
$form = new AppForm($this, 'formular');
$form->addGroup('Kategorie');

	$form->addSelect('category', 'Kategorie', $categories);
	$form->addSubmit('category_add', 'Přidat')
		->onClick[] = array($this, 'addCategory');

	// LIST OF SELECTED CATEGORIES
	$container = $form->addContainer('cat');
	$this->fillFormInputs($container, $selected);


	// ODESLANI
	$form->addGroup();
		$form->addSubmit('save', 'Uložit')
			->onClick[] = array($this, 'saveForm');
		$form->addSubmit('save_exit', 'Uložit a zpět')
			->onClick[] = array($this, 'saveExitForm');
		$form->addSubmit('cancel', 'Storno')
			->setValidationScope(FALSE)
			->onClick[] = array($this, 'cancelForm');
?>

Pak funkce na přidávání inputů:

<?php
protected function fillFormInputs($container, $categories)
{
	foreach($categories as $cat_id => $name)
	{
		if(!empty($container[$cat_id]))	continue;


		$subform = $container->addContainer($cat_id);

		// PREPARE INPUT
		$subform->addText('category', '', 48)
			->setValue($name);
		$subform['name']->getControlPrototype()->readonly = TRUE;


		// PREPARE BUTTON
		$subform->addSubmit('category_remove', 'Odebrat')
			->setOption('cat_id', $cat_id)
			->setValidationScope(FALSE)
			->onClick[] = array($this, 'removeCategory');
	}
}
?>

Potom ješte handlery:

<?php
public function addCategory(SubmitButton $button)
{
	$form = $button->getForm(TRUE);
	$cat_id = $form['category']->getValue();
	$name = $this->dibitable->getNameById($cat_id);

	$this->fillFormInputs($form['cat'], array($cat_id => $name));

	$this->changeView('form');
}

public function removeCategory(SubmitButton $button)
{
	$form = $button->getForm(TRUE);
	$cat_id = $button->getOption('cat_id');

	$container = $form['cat'];
	$container->removeComponent($container[$cat_id]);

	$this->changeView('form');
}
?>

Je to v podstatě funkční, až na to odebírání (removeComponent).

Editoval krajaac (25. 1. 2009 22:10)

Ola
Člen | 385
+
0
-

A zkoušels unset($container); ?

krajaac
Člen | 45
+
0
-

Ola napsal(a):

A zkoušels unset($container); ?

unset($container); pouze vymaze referenci na objekt z teto promenne, se samotnym objektem nebo formem to nic neudela.

unset($form['cat']); Jsem zkousel taky – viz vyse – Stejny vysledek jako s removeComponent()

David Grudl
Nette Core | 8147
+
0
-

Je to způsobeno automatickým přidáváním nových komponent do skupin (viz addGroup), neexistuje ale automatické odstraňování. Fixnuto v ConventionalRenderer.

krajaac
Člen | 45
+
0
-

David Grudl napsal(a):

Je to způsobeno automatickým přidáváním nových komponent do skupin (viz addGroup), neexistuje ale automatické odstraňování. Fixnuto v ConventionalRenderer.

Díky Davide za rychlé zapracování. Je super, že se Nette tak rychle a dynamicky vyvíjí.