Strom checkboxů načítaný pomocí AJAXu

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

Ahoj,

ve formuláři potřebuji použít rozsáhlou stromovou strukturu s checkboxy, kterou načítám pomocí AJAXu. U komponenty není problém, zavolám si handleLoad s id rodiče a ajaxově zapracuji do stromu, ale u formuláře si nevím moc rady :-( Jakým způsobem toto řešit u komponenty formuláře, která je zděděna z Nette\Forms\Container a postupně si přidává checkboxy podle toho, jak uživatel rozbaluje větvě stromu?

llook
Člen | 407
+
0
-

Použij Filipův Replikátor, to je něco jako Multiplier pro formuláře: https://componette.org/search/?…

Michal Schneider
Člen | 13
+
0
-

Ahoj,

moc díky, na ten jsem přesně koukal, akorát mám problém s tím, že nové komponenty formuláře vytvořené přes replikátor jsou vytvářené pomocí odeslání formuláře. Což by se dalo asi udělat tak, že by se tlačítko pro odeslání formuláře skrylo a odesílalo by se na základě nějaké události JavaScriptu… Nicméně, lze nějakým způsobem ošetřit odeslání formuláře s vypnutou validací? Ve chvíli, kdy rozbalím nějakou část podstromu, nemusím mít ještě zaškrtnutou žádnou položku.

Ještě jednou moc díky.

llook napsal(a):

Použij Filipův Replikátor, to je něco jako Multiplier pro formuláře: https://componette.org/search/?…

llook
Člen | 407
+
0
-

Odesílání formuláře není nezbytné. Replikátor se dá použít i takto:

use Nette\Forms\Container;
use Kdyby\Replicator\Container as ReplicatorContainer;

$form['containerName'] = new ReplicatorContainer(function (Container $container)
{
	$container->addCheckbox('fieldName');
});

Když potom jakkoli dostaneš do formuláře <input type="checkbox" name="containerName[index][fieldName]"/> a uživatel ho zaškrtne, tak po zpracování dostaneš něco takového:

[
	'containerName' => [
		'index' => [
			'fieldName' => true,
		],
	],
]

Jednou jsem takhle vytvářel ad-hoc inputy v šablonách, nějak jako {input containerName-something-text}. Podobně, jako se vytváří controly přes Multiplier.

Editoval llook (17. 12. 2013 0:20)

Michal Schneider
Člen | 13
+
0
-

Ahoj llooku,

tak takhle nějak to mám udělané teď. Mám komponenty, která se načítá ajaxově a pokud jako parametr komponenty uvedu id formuláře, tak jsem schopný v komponentě generovat checkboxy, které může uživatel zaškrtávat. Zároveň lze z komponenty získat kompletní seznam (pole) listů stromu, který projdu a přidám do formuláře.

Tohle mi funguje, nicméně se mi to moc nelíbí :-)

Představoval bych si něco jako:

<?php
$form->addCheckboxTree("tree", "Strom", $tree)->setLazy(TRUE);
?>

kde $tree je datová struktura stromu. V CheckboxTree formulářovém kontrolu by se pak řešilo vše další včetně ajaxového načitání chechboxů ;-)

No zatím se asi spokojím s řešením, co mám výše a budu o tom přemýšlet ;-)

Ještě jednou díky moc!

llook napsal(a):

Odesílání formuláře není nezbytné. Replikátor se dá použít i takto:

use Nette\Forms\Container;
use Kdyby\Replicator\Container as ReplicatorContainer;

$form['containerName'] = new ReplicatorContainer(function (Container $container)
{
	$container->addCheckbox('fieldName');
});

Když potom jakkoli dostaneš do formuláře <input type="checkbox" name="containerName[index][fieldName]"/> a uživatel ho zaškrtne, tak po zpracování dostaneš něco takového:

[
	'containerName' => [
		'index' => [
			'fieldName' => true,
		],
	],
]

Jednou jsem takhle vytvářel ad-hoc inputy v šablonách, nějak jako {input containerName-something-text}. Podobně, jako se vytváří controly přes Multiplier.