Jak na template, aby předával hodnotu do presenteru nebo modelu?

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

Zdravím,
momentálně řeším takový menší problém, vytvořil jsem si funkci v modelu (zkoušel jsem i v presenteru) na získávání levlu uživatelů, podle toho kolik mají expů.

public function getUserlevel($id)
    {
      $user_exp = $this->getTable()->select('exp')->where('id = ?',$id);
      $ranks = $this->getUsersrank();
       foreach ($ranks as $rank)
       {
         if(($user_exp == $rank['exp_need']) or $user_exp > $rank['exp_need'])
         {
           $level = $rank['rank'];
         }
       }
       return $level;
    }

Ale stále nevím jak tuhle funkci bych mohl použít v template, něco myslím že by to mělo být nějak takto {$this->getUserlevel($user->getIdentity()->id)} ale tohle nefunguje, zatím jsem to pořešil tak, že jsem funkci přidal přímo do template.

        <?php
    function getUserlevel($id,$user_exp,$ranks)
    {
      foreach ($ranks as $rank)
      {
        if(($user_exp == $rank['exp_need']) or $user_exp > $rank['exp_need'])
        {
          $level = $rank['rank'];
        }
      }
       return $level;
    }
        ?>

<img src="{$basePath}/images/ranks/{getUserlevel($user->getIdentity()->id,$user->getIdentity()->exp,$user_ranks)}.png">

Nešlo by to pořešit lepším způsobem ? A ještě aby se to aktualizovalo, bez toho abych se musel vždy odhlásit a znovu přihlásit, když dosáhnu nového levlu ? Děkuji

Editoval Zuben45 (1. 12. 2013 16:28)

Robyer
Člen | 74
+
0
-

Zuben45 napsal(a):
myslím že by to mělo být nějak takto {$this->getUserlevel($user->getIdentity()->id)} ale tohle nefunguje

Z šablony se přistupuje k presenteru skrz $presenter, tedy:

{$presenter->getUserlevel($user->getIdentity()->id)}

Editoval Robyer (1. 12. 2013 16:40)

Zuben45
Člen | 268
+
0
-

Robyer napsal(a):

Zuben45 napsal(a):
myslím že by to mělo být nějak takto {$this->getUserlevel($user->getIdentity()->id)} ale tohle nefunguje

Z šablony se přistupuje k presenteru skrz $presenter, tedy:

{$presenter->getUserlevel($user->getIdentity()->id)}

Děkuji mockrát :), jen mám menší problém s tím, že se jedná o template @layout, konkrétně o část přihlášeného uživatele.

Robyer
Člen | 74
+
0
-

A v čem přesně je problém? :)

Jinak co se týče názvu vlákna „Jak na template, aby předával hodnotu do presenteru nebo modelu ?“, tak se na to díváš špatně. Template nic nepředává presenteru nebo modelu, ale v presenteru můžeš získat data od modelu a ty data pak předat šabloně, která je vykreslí.

Pokud tedy potřebuješ mít v šabloně nějaké data, tak v presenteru (v beforeRender() nebo renderXy() metodě) je jí jednoduše předáš jako $this->template->promenna = "neco"; a v šabloně je pak můžeš vykreslit jako {$promenna}. Pokud chceš mít nějaké data přístupné v globálním @layoutu (tedy na každé stránce), pak si je do té šablony vložíš v nějakém tvém BasePresenteru (ze kterého pak dědí všechny tvé ostatní presentery) v jeho beforeRender() metodě.

Editoval Robyer (1. 12. 2013 17:06)

Zuben45
Člen | 268
+
0
-

Robyer napsal(a):

A v čem přesně je problém? :)

Jinak co se týče názvu vlákna „Jak na template, aby předával hodnotu do presenteru nebo modelu ?“, tak se na to díváš špatně. Template nic nepředává presenteru nebo modelu, ale v presenteru můžeš získat data od modelu a ty data pak předat šabloně, která je vykreslí.

Pokud tedy potřebuješ mít v šabloně nějaké data, tak v presenteru (v beforeRender() nebo renderXy() metodě) je jí jednoduše předáš jako $this->template->promenna = "neco"; a v šabloně je pak můžeš vykreslit jako {$promenna}. Pokud chceš mít nějaké data přístupné v globálním @layoutu (tedy na každé stránce), pak si je do té šablony vložíš v nějakém tvém BasePresenteru (ze kterého pak dědí všechny tvé ostatní presentery) v jeho beforeRender() metodě.

Už v ničem, jen mi poprvé co jsem to použil tak hodilo chybu, že funkce není v presenteru, já zapoměl že jsem si ji zakomentoval v BasePresenteru, děkuji ještě jednout za pomoc ;)