Renderování šablony na dva způsoby
- jim.street
- Člen | 26
Ahoj, s nette jsem začátečník a potřeboval bych se zeptat na proces
renderování, konkrétně:
Mám šablonu, která zobrazuje výsledky různých řešitelů úloh.
Uživatelé mám načtené, vše funguje, jen mám problém s tím, že
v případě, že daný uživatel nebude mít
statut resitel
, tak se mi i statistiky vypíšou pro adminy,
managery, zadavatele a podobně (všichni mají 0 bodů apod.). Potřeboval
bych vědě, jak udělat, aby v případě, že uživatel není řešitelem, by
se vyrenderovala šablona se zprávou „Uživatel není řešitel“ a pro
řešitele by vše šlo normálně zobrazit.
Přikládám zde kód, který jsem napsal.
<?php
public function renderShow($id)
{
$user = dibi::query('SELECT * FROM uzivatele WHERE [id_uzivatel] = %i', $id);
$this->template->user = $user;
$resitel = false;
foreach ($user as $u) {
if ($u['profil'] == 'resitel')
{
$resitel = true;
}
}
$stats = dibi::query('SELECT * FROM reseni WHERE [resitel] = %i', $id);
$points = 0;
foreach ($stats as $s) {
$points += $s['hodnoceni'];
}
$this->template->points = $points;
}
?>
V případě, že $resitel je FALSE, aby se vyrenderovala pouze sablona s obsahem textu „Uzivatel neni resitel“. Vím, že v šabloně by se to dalo udělat pomoci např. {if}{/if}, ale nevím, jestli je to efektivní. Díky
Editoval jim.street (9. 10. 2014 22:21)
- jim.street
- Člen | 26
Něco typu
<?php
$resitel == true ? $this->template->user = $user : die("Uživatel není řešitel");
?>
ale tak, aby se mi to vypsalo v šabloně.
- vymak
- Člen | 92
Píšu z patra, takže to možná bude špatně ale řešil bych to takhle.
private $user;
public function actionShow($id)
{
$result = dibi::query('SELECT * FROM uzivatele WHERE [id_uzivatel] = %i', $id);
$user = $result->fetchSingle();
$this->user = $user;
$resitel = $user['profil'] == 'resitel' ? TRUE : FALSE;
if (!$resitel) {
$this->setView('neniResitel');
}
}
public function renderShow($id)
{
$stats = dibi::query('SELECT * FROM reseni WHERE [resitel] = %i', $id);
$points = 0;
foreach ($stats as $s) {
$points += $s['hodnoceni'];
}
$this->template->points = $points;
$this->template->user = $this->user;
}
Pak jen stačí v adresáři kde máš show.latte vytvořit soubor neniResitel.latte a do něj napsat:
Uživatel není řešitel
Trochu jsem ještě upravil to získávání uživatele, je zbytečné to procházet přes foreach, když hádám se vrací jeden řádek.
Editoval vymak (9. 10. 2014 23:24)
- Oli
- Člen | 1215
@vymak Myslím, že není rozumné si přepisovat
$this->user
. Nebo jsi to přepsal schválně?
@jim.street V zásadě bych na to šel stejně jako @vymak, ale pokud se bavíme o přihlášeném uživateli, tak jeho hodnoty si předáš do identity při přihlášení. Takže ten dotaz do databáze je zbytečný a zjistíš si ty data pomocí
// teď z hlavy nevím, jestli je identity array nebo ArrrayHash.
$this->user->identity->profil // případně $this->user->identity['profil']
- jim.street
- Člen | 26
@vymak díky, pomohlo, jenom jsem musel nechat ten foreach místo fetchSingle, protože mi pak laděnka hlásila *Illegal string offset ‚jmeno‘ *
A chtěl bych se ještě zeptat, zda je možné předat parametr do setView, aby se mi vypsalo alespoň
<?php
Uživatel {$user['jmeno']} {$user['prijmeni']} není řešitelem.
?>
Editoval jim.street (10. 10. 2014 12:29)
- vymak
- Člen | 92
@Oli jo to bylo už z únavy a neuvědomil jsem si to že se tím přepíše user. Samozřejmě by to měl uložit do jiné proměnné tedy třeba myUser
@jim.street jak píše @Oli pokud je uživatel již přihlášený budeš mít v každé šabloně dostupnou proměnnou $user s jeho daty, pokud by si to chtěl i přesto jak to řešíš ty tak stačí
public function renderNeniResitel() {
if ($this->myUser) {
$this->template->myUser = $this->myUser;
}
}
Samozřejmě změnit i u původní metody vše z user na třeba myUser, aby si nepřepisoval i proměnnou user v šabloně
Tedy komplet pro starý návrh:
private $myUser;
public function actionShow($id)
{
$result = dibi::query('SELECT * FROM uzivatele WHERE [id_uzivatel] = %i', $id);
$user = $result->fetchSingle();
$this->myUser = $user;
$resitel = $user['profil'] == 'resitel' ? TRUE : FALSE;
if (!$resitel) {
$this->setView('neniResitel');
}
}
public function renderShow($id)
{
$stats = dibi::query('SELECT * FROM reseni WHERE [resitel] = %i', $id);
$points = 0;
foreach ($stats as $s) {
$points += $s['hodnoceni'];
}
$this->template->points = $points;
$this->template->myUser = $this->myUser;
}
public function renderNeniResitel() {
if ($this->myUser) {
$this->template->myUser = $this->myUser;
}
}
A pro návrh jak píše @Oli:
public function actionShow()
{
// Nejsem si jistý teď tím získáním dat
$resitel = $this->user->identity['profil'] == 'resitel' ? TRUE : FALSE;
//$resitel = $this->user->identity->data['profil'] == 'resitel' ? TRUE : FALSE;
if (!$resitel) {
$this->setView('neniResitel');
}
}
public function renderShow()
{
$stats = dibi::query('SELECT * FROM reseni WHERE [resitel] = %i', $this->user->identity->id);
$points = 0;
foreach ($stats as $s) {
$points += $s['hodnoceni'];
}
$this->template->points = $points;
}
Editoval vymak (10. 10. 2014 20:35)