AJAX – přepsání hodnoty proměnné v šabloně
- ver07
- Člen | 5
Ahoj,
potřebovala bych poradit, jak docílit přepsání proměnné v šabloně
pomocí ajaxu.
Presenter vypadá takto:
public function handleUcast($hracId, $treninkId) {
$hrac_trenink = $this->trainingModel->getTrainingUcast()->where('id_hrace = ? AND id_treninku = ?', $hracId, $treninkId)->count();
if ($hrac_trenink > 0){
$this->flashMessage("Účast již byla potvrzena.", 'error');
return $this->redrawControl();
}
$this->trainingModel->getTrainingUcast()->insert(array('id_hrace' => $hracId, 'id_treninku' => $treninkId));
$this->template->ucast = 'ano';
$this->flashMessage("Účast byla potvrzena.", 'success');
if ($this->presenter->isAjax()) {
$this->redrawControl('ucast');
} else {
$this->presenter->redirect('this');
}
}
public function renderDetail()
{
$id = $this->getParameter('id');
$this->template->trenink = $this->trainingModel->getTrainings()->where('id', $id);
$id_tymu = $this->trainingModel->getTrainings()->where('id', $id)->select('id_tymu');
$this->template->hrac = $this->trainingModel->getTeamsPlayers()->where('id_tymu', $id_tymu)->order('hrac.prijmeni');
$this->template->ucast = $this->ucast;
}
A šablona vypadá takto:
{foreach $hrac as $hraci}
<tr>
<td>{$hraci->ref('hrac', 'id_hrace')->prijmeni} {$hraci->ref('hrac', 'id_hrace')->jmeno}</td>
{snippet ucast}
<td>{$ucast}</td>
{/snippet}
{foreach $trenink as $treninky}
{if $hraci->ref('hrac', 'id_hrace')->id_uzivatele == $user->getIdentity()->id}
<td><a n:href="ucast! $hraci->id_hrace, $treninky->id" class="ajax">Potvrdit účast</a></td>
{/if}{/foreach}
</tr>
{/foreach}
Po zavolání handleru Ucast se mi pomocí ajaxu data správně zapíší do
databáze, ale hodnota proměnné $ucast se nezmění.
Jak tedy docílit, aby se změnila na „ano“ a to pouze u hráče s daným
id?
Předem děkuji za odpověd.
Editoval ver07 (28. 2. 2019 11:17)
- David Matějka
- Moderator | 6445
Ahoj, viz zivotni cyklus presenteru, render metoda se vola po handle, takze se ti tam ta hodnota prepise
ale ani tak ti to nebude fungovat, musis pouzit dynamicky
snippet namisto statickeho {snippet ucast}
- ver07
- Člen | 5
Děkuji za odpověď. Na dynamický snippet jsem se dívala, ale nevím, jak
přesně to podle toho udělat pro ten můj případ. Jsem úplný
začátečník, tak se omlouvám, že chci poradit s pro někoho velmi
jednoduchými věcmi.
Mohla bych tedy poprosit o konkrétnější radu, jak toho docílit na ten můj
případ? Předem moc děkuji.
- David Matějka
- Moderator | 6445
Nejdriv si to zkus napsat bez ajaxu :) treba ta promenna $ucast
ti nemuze fungovat, musis mit pro kazdeho hrace samostatnou. potom je treba
spatne v sablone to ` {foreach $trenink as
$treninky}, pravdepobodne chces rovnou v presenteru fetchnout ten jeden trenink, to udelas tak, ze nad selection (tedy to, kde volas where) zavolas `fetch()
,
coz ti vrati prvni radek.
kdyz se ptas na zaznam dle primarniho klice, tak to muzes zkratit z
->where('id', $id)->fetch()
na ->get($id)
az budes mit tohle poresene, tak ti pomohu s ajaxem :)
mimochdem, muzes sem poslat sql dump struktury databaze?
- ver07
- Člen | 5
David Matějka napsal(a):
Nejdriv si to zkus napsat bez ajaxu :) treba ta promenna
$ucast
ti nemuze fungovat, musis mit pro kazdeho hrace samostatnou. potom je treba spatne v sablone to ` {foreach $trenink as $treninky}, pravdepobodne chces rovnou v presenteru fetchnout ten jeden trenink, to udelas tak, ze nad selection (tedy to, kde volas where) zavolas `fetch()
, coz ti vrati prvni radek.kdyz se ptas na zaznam dle primarniho klice, tak to muzes zkratit z
->where('id', $id)->fetch()
na->get($id)
az budes mit tohle poresene, tak ti pomohu s ajaxem :)
mimochdem, muzes sem poslat sql dump struktury databaze?
Děkuji za upozornění na chyby, opravila jsem je. Nakonec jsem tu účast vyřešila jiným způsobem.
- David Matějka
- Moderator | 6445
super :) v sablone pak budes mit neco jako
{snippetArea hraci}
{foreach $hrac as $hraci}
<tr>
<td>{$hraci->ref('hrac', 'id_hrace')->prijmeni} {$hraci->ref('hrac', 'id_hrace')->jmeno}</td>
{var $id = $hraci->id}
{snippet ucast-$id}
<td>{$ucast}</td>
{/snippet}
....
...
{/foreach}
{/snippetArea}
(dulezity je ten obalovaci snippet (resp snippetArea) a vnitrni snippet, ktery je dynamicky, jelikoz v sobe ma promennou)
pak musis zajistit, aby se v pripade signalu „ucast“ do sablony
v promenne hrac
(ta by se spise mela jmenovat hraci
)
posilal pouze ten konkretni hrac, u ktereho upravujes stav. jeden z moznych
zpusobu je, ze v handleUcast rovnou nastavis
$this->template->hrac
a v render to budes mit obaleny
isset($this->template->hrac), aby se to neprepsalo. a podobne
i v pripade te ucasti
a dalsi info o snippetech najdes v moji prednasce z Posledni soboty :)