FormContainer a removeCompoment
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- krajaac
- Člen | 45
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?
- krajaac
- Člen | 45
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)
- David Grudl
- Nette Core | 8218
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.