Naplnění šablony daty z databáze
- kudlajz
- Člen | 70
Zdravím.
Začal sem si hrát s Nette před pár dny a musím říct, že spolu s DiBi
mě tohle programování baví daleko víc :)
No, ale k mému problému.
Mám model:
class Model extends Nette\Object
{
public function ShowUserInfo($id) {
$data = $this->db->fetch('SELECT * FROM users WHERE id = %i', $id);
return $data->toArray();
}
}
Připojení k databázi mám vytvořeno, to funguje.
No a v presenteru mám tuto funkci:
public function renderUserpanel($data)
{
$this->template->username = $data['username'];
...
}
public function Userpanel($id) {
$mod = new Model;
$data = $mod->ShowUserInfo($id);
$this->renderUserpanel($data);
}
V šabloně tedy chci zavolat tuto funkci, do které vložím jako parametr id a chci aby se mi vrátilo to pole s daty, které následně můžu použít v šabloně, takže např. takto:
{? $presenter->Userpanel($user->getId());}
{? echo $username}
Ale ať dělám co dělám, tak mi to hlásí, že proměnná neexistuje. Zkoušel sem to kolikrát předělávat, i vytvořit userpanelu vlastní template a tam to nasypat, ale stejně nic.
Děkuju dopředu za jakoukoli pomoc.
- Jan Endel
- Člen | 1016
Nejdříve několik poznámek:
- vypisování proměnné
{? echo $promenna}
je fujík, zkus raději {$promenna} - volaní presenteru ze šablony je taky většinou fujík, dělá se to
spíše naopak přes
$this->template->promenna
a pak v sablone{$promenna}
- není potřeba předělávat usera do pole, lze k němu přistupovat jako
o objektu
$data->username
//s timhle si nejsem 100% jistý dibi jsem dlouho nepoužíval
a teď k tématu:
uživatele v presenteru získáš přes $this->getUser
nebo lze
též magickým $this->user
takže by mělo stačit něco jako (o volání actionXXX a renderXXX se stará nette):
Model:
class UserModel extends Nette\Object //lepsi je modely pojmenovavat
{
public function getUserInfo($id) {
return $this->db->query('SELECT * FROM users WHERE id = %i', $id)->fetch();
}
}
Presenter:
private $data;
public function actionNazevAkce()
{
$mod = new UserModel;
$this->data = $mod->ShowUserInfo($this->user->id);
}
public function renderNazevAkce()
{
$this->template->data = $this->data;
}
šablona:
{$data->username}
Editoval pilec (7. 9. 2011 13:17)
- Bertram
- Člen | 75
Ahoj doporučil bych ti projít si návody & screencasty najdeš tam
spoustu užitečných informací.
Samozřejmostí je pročíst dokumentaci.
akce presenteru:
public function renderUserPanel($id)
{
$mod = new Model;
$data = $mod->ShowUserInfo($id);
$this->template->username = $data['username'];
$this->template->velikostBot = $data['velikost_bot'];
}
šablona userPanel.latte
{block content}
<h1>Info o uživateli {$username}</h1>
<ul>
<li>velikost bot: {$velikostBot}</li>
</ul>
{/block}
Editoval Bertram (7. 9. 2011 13:24)
- Jan Endel
- Člen | 1016
Pakliže jsi nezasahoval do boostrap.php tak akci můžeš jednoduše zavolat
adresou http://example.com/nazev-presenteru/nazev-akce
nebo si na
ni můžeš přímo v layoutu udělat odkaz a to:
<a n:href='nazevPresenteru:nazevAkce'>Odkaz na akci</a>
.
Pokud se to bude nacházet na všech stránkách tak ten kód přesuň do BasePresenteru, z kterého budou pak všechny presentery dědit:
class BasePresenter extends Nette\Application\UI\Presenter
{
private $data;
public function startup()
{
parent::startup();
$mod = new UserModel;
$this->data = $mod->ShowUserInfo($this->user->id);
}
public function beforeRender()
{
parent::beforeRender();
$this->template->data = $this->data;
}
}
ale jak už bylo řečeno, důrazně doporučuju si pročíst celou dokumentaci.
Editoval pilec (7. 9. 2011 14:23)