tabulka s několika záznamy a checkboxem před každým záznamem
- psimekjr
- Člen | 20
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
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}
- dakota
- Člen | 148
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
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
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)
- dakota
- Člen | 148
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)
- jarks
- Člen | 94
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)