Renderování šablony na dva způsoby

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

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

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

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

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

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

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