AJAX – přepsání hodnoty proměnné v šabloně

ver07
Člen | 5
+
0
-

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
+
0
-

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
+
0
-

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
+
+2
-

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
+
0
-

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
+
+1
-

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 :)