Ukládání a výpis položek CheckboxListu
- devilshark
- Člen | 1
Zdravím!
Hledal jsem na fóru diskuse, které by mi pomohly, ale bohužel bezúspěšně.
Jedná se mi o to, jak nejlépe uložit položky checkboxListu do databáze a
poté ty zaškrknuté zase ve formuláři vypsat jako zaškrknuté a ostatní
nezaškrklé. Zkusím uvést na příkladu, který mě napadl.
V presenteru při vytváření formuláře přidám checkboxList:
protected function createComponentDopravaForm()
{
...
$zpusobDopravy = [
'P' => 'pěšky',
'A' => 'autem',
'K' => 'na kole',
'V' => 'vlakem'
];
$form->addCheckboxList('zpusob_dopravy', 'Způsob dopravy:', $zpusobDopravy);
...
$form->addSubmit('send', 'Uložit záznam');
$form->onSuccess[] = [$this, 'dopravaFormSucceeded'];
return $form;
}
Uživatel zatrhne jednotlivá pole, jak je možné se k jeho obydlí dostat. Po odeslání formuláře vložím data do databáze:
public function dopravaFormSucceeded($form, $values)
{
$dopravaID = $this->getParameter('doprava_ID');
if ($dopravaID) {
$doprava = $this->dopravaManager->database->table('doprava')->get($dopravaID);
$doprava->update($values);
} else {
$doprava = $this->dopravaManager->database->table('doprava')->insert([
...
'zpusob_dopravy' => $values->zpusob_dopravy, // Tady možná jinak vkládat hodnoty?
...
]);
}
$this->flashMessage('Úspěšně uloženo.', 'success');
$this->redirect('show', $doprava->doprava_ID);
}
Defaultně potom vypisuji záznamy z databáze do tabulky následovně (default.latte):
{block content}
<div class="table">
{foreach $doprava as $dop}
{first}<table>
<tr>
<th>ID</th>
<th>Způsob</th>
...
</tr>{/first}
<tr>
<td><a n:href="Doprava:show $dop->doprava_ID">{$dop->doprava_ID}</a></td>
<td>{$dop->zpusob_dopravy}</td>
...
</tr>
{last}</table>{/last}
{/foreach}
</div>
No a mám samozřejmě i přístupný formulář, přes který je možno
přidávat záznamy do databáze přímo (dopravaForm), který by se
měl naplnit již vloženými daty z databáze, pokud daný záznam upravujeme.
Všechna data se mi tam vloží, až právě na ten checkboxList, který nevím
jak přimět, aby se vykreslil s těmi zaškrklými políčky, která byla
zvolena. Editaci provádím v edit.latte, kdy si tento formulář
vypíšu takto {control dopravaForm}
. Tuším, že si budu muset
formulář vypsat manuálně – podle dokumentace nejspíš nějak takto:
{foreach $form[gender]->items as $key => $label}
<label n:name="gender:$key"><input n:name="gender:$key"> {$label}</label>
{/foreach}
a taky změnit vkládání keys jednotlivých checků do databáze, které tak jak je napsané neprojde kvůli tomu, že se ty klíče vloží do databáze jako další položka. Zkoušel jsem dost možností, jak toho docílit, ale žádná můj problém nevyřešila.
Snad jsem svoji situaci popsal dostatečně a dá se v tom vyznat. Je to poprvé, co píšu na nějaké forum, takže kdyžtak nějaké informace ještě doplním. Případně pokud jdu na to špatně a bylo by lepší něco předělat…
Díky všem, kteří mi pomohou!
Editoval devilshark (30. 3. 2017 0:54)