Naplnění šablony daty z databáze

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

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

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

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)

kudlajz
Člen | 70
+
0
-

A kdy se ta akce potom volá? Zapomněl sem dodat, že ten Userpanel se nachází na všech stránkách mezi headerem a obsahem, jestli to pak nebude jinak.

Jan Endel
Člen | 1016
+
0
-

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)

kudlajz
Člen | 70
+
0
-

Jojo, už to funguje. Díky moc.
Na tu dokumentaci ještě mrknu.