tabulka s několika záznamy a checkboxem před každým záznamem

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

Měl bych prosbu. Mohl by někdo, prosím, vytvořit úplně jednoduchý tutorial, jak bude vypadat továrnička formuláře a šablona, pokud mám data v poli $data(„id“,„text“) a před každým záznamem má být checkbox?

Byl bych vám velice vděčný. Děkuji.

Prosím neodkazujte sem, zachovejme jednoduchost:
https://forum.nette.org/…o-z-databaze

psimekjr
Člen | 20
+
0
-

Továrnička by mohla vypadat nějak takto:

	protected function createComponentExampleForm()
	{
		$form = new NAppForm;

	    	foreach ($table as $item) {
	        	$form->addCheckbox('chk'.$item->id, $item->text);
	    	}

		$form->addSubmit('SomeAction', 'Submit');
		$form->onSubmit[] = callback($this, 'exampleFormSubmitted');

		return $form;

	}

v šabloně by pak mohlo stačit

	{control exampleForm}
Majkl578
Moderator | 1364
+
0
-

psimekjr napsal(a):

$form->addCheckbox('chk'.$item->id, $item->text);

Fuj, přečti si něco o kontejnerech (FormContainer).

psimekjr
Člen | 20
+
0
-

Děkuju, mohl bys mě prosím ještě nasměrovat, co bych si měl přečíst, kdybych chtěl ke každému řádku přidat klasický odkaz, třeba delete? Dokumentace je pro začátečníka značně nepřehledná.

dakota
Člen | 148
+
0
-

K checkboxom:

protected function createComponentSomeForm()
{
	$form = new NAppForm;
	...
	$form->addContainer('chk');
	return $form;
}

public function actionDefault()
{
	...
	foreach ($items as $item) {
		$this['someForm']['chk']->addCheckbox($item->id);
	}
	...
}

šablona:

{var $form = $presenter['someForm']}
...
{foreach $items as $item}
<tr>
	<td>{$form['chk'][$item->id]->control}</td>
	<td>{$item->id}</td>
	<td>{$item->text}</td>
</tr>
{/foreach}

Odkazy:

{foreach $items as $item}
<td><a n:href="edit, $item->id">editovať</a></td> // odkaz na action edit v tom istom presenteri
{/foreach}

Pri odkazoch delete je potrebné umiestnit do odkazu aj protection token kvoli možnosti CSRF útoku a token kontrolovať, napr. ako na https://forum.nette.org/…duse-na-csrf.

Editoval dakota (22. 1. 2011 19:02)

psimekjr
Člen | 20
+
0
-

Děkuji mnohokrát za pěkný příklad

psimekjr
Člen | 20
+
0
-

Mohl bych se ještě zeptat, do které metody bude patřit..

	$form->addSubmit('someForm', 'Smazat vybrané');
	$form->onSubmit[] = callback($this, 'someFormSubmitted');

Pokud do createComponent.., jak potom tlačítko zobrazím v šabloně a pokud do actionDefault, jak na něj navážu onSubmit akci?

dakota
Člen | 148
+
0
-

V createComponentSomeForm:

$form->addSubmit('delete', 'Smazat vybrané');
$form->onSubmit[] = callback($this, 'someFormSubmitted');

alebo

$form->addSubmit('delete', 'Smazat vybrané')
		->onClick[] = callback($this, 'someFormDeleteClicked');

V šablone – zobrazenie tlačítka:

{$form['delete']->control}

Editoval dakota (23. 1. 2011 9:34)

psimekjr
Člen | 20
+
0
-

Děkuju, ale takhle pak tlačítko v obou případech neprovede submit fomuláře, v kódu dokonce form vůbec není, jen několik nezávislých formulářových prvků, proto asi není co submitnout.

dakota
Člen | 148
+
0
-

V šablone pri manuálnom renderovaní formulára je potrebne uviesť: $form->render('begin') a $form->render('end').

{var $form = $presenter['someForm']}

{$form->render('begin')}
{$form->render('errors')}
<table>
<tr>
	<th></th>
	<th>ID</th>
	<th>Text</th>
</tr>
{foreach $items as $item}
<tr>
        <td>{$form['chk'][$item->id]->control}</td>
        <td>{$item->id}</td>
        <td>{$item->text}</td>
</tr>
{/foreach}
</table>
{$form['delete']->control}
{$form->render('end')}

Editoval dakota (25. 1. 2011 21:27)

psimekjr
Člen | 20
+
0
-

Moc děkuju za trpělivost, tohle jsem v dokumentaci vůbec nenašel.

Filip Procházka
Moderator | 4668
+
0
-
jarks
Člen | 94
+
0
-

dakota napsal(a):

public function actionDefault() {
	foreach ($items as $item) {
		$this['someForm']['chk']->addCheckbox($item->id);}
}

Je to asi trivialita, ale kdyby se vám stalo, že při tomto dostanete chybu
Component name must be integer or string, NULL given.

může to být tím, že je prázdný údaj $item->id, tj. třeba nemáte id v SELECTu z dabatáze.

Zároveň se ujistěte, že to děláte skutečně v metodě action a ne render. Jinak dostanete jen prázdné pole. Action přijde na řadu dřív – v render je příliš pozdě.

Editoval jarks (22. 3. 2011 9:25)