Vypsání proměnné v šabloně

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

Zdravím, mám takový problém – nějak se mi nedaří vypsat proměnnou v šabloně – jedná se o to, že v linku je daná proměnná (id) na jejímž základě by se pak měl vypsat obsah z databáze. Tento problém jsem řešil už https://forum.nette.org/…ejici-tridou a nějak se mi to nedaří. Jde o to, že se mi načte spravné id ( v linku je …/tyden/(id) ale ne a ne se mi to vypsat. Mohl by, prosím, někdo poradit uplnému začátečníkovi?
Projistotu sem dávám Presenter i Model.
TydenPresenter:

<?php
class TydenPresenter extends BasePresenter
{
	public function renderDefault()
	{
	 $this->template->tydenId = Model\TydenModel::fetchAll();
	}

	static public function renderTyden($id){
		if(!($tydenId = Model\TydenModel::fetchAll($id))){
		}
		$this->template->tydenId = Model\TydenModel::fetchAll($id);

	}
}
?>

TydenModel:

<?php
namespace Model;
use Nette\Object,
	Nette\Enviroment,
	Nette\Database\Connection;

class TydenModel extends BaseModel{
	public function fetchAll($id){
		return dibi::query('SELECT * FROM [tyden] WHERE [id] = %i', $id);
	}
}
?>

Předem všem moc děkuji, jsem vděčný za každou radu.

Editoval milde (20. 9. 2011 18:57)

Ani
Člen | 226
+
0
-

Pro jedno id by to melo byt takhle, jinak ti to vraci cely radek.

<?php
dibi::query('SELECT id FROM [tyden] WHERE [id] = %i', $id)->fetchSingle();
?>

Mimochodem je zcesny si selectovat id, kdyz id znas.

Editoval Ani (20. 9. 2011 16:21)

milde
Člen | 52
+
0
-

Ani napsal(a):

Pro jedno id by to melo byt takhle, jinak ti to vraci cely radek.

<?php
dibi::query('SELECT id FROM [tyden] WHERE [id] = %i', $id)->fetchSingle();
?>

No přiznám se, že jsem teď vyzkoušel tvůj návod, ale stále se mi hlásí Undefined variable: tydenId a s tímto poblémem válčím už několik dní – snažil jsem se pojít dokumentaci i fórum a nepodařilo se mi najít nic co by mi pomohlo :-(

MW
Člen | 626
+
0
-

a v jaké jsi šabloně?
si tam zkus hodit

$this->template->tydenId = "hokus pokus";
hAssassin
Člen | 293
+
0
-

@midle > proc mas renderTyden() jako static? A mas ID v adrese kdyz tam pristupujes? Pripadne zkus nastavit parametr u metody jako volitelny – renderTyden($id = NULL) a uvnitr testovat jestli je ID nastaveno a pokud ne tak presmerovat nebo vyhodit flashku (ehm, flashMessage).

milde
Člen | 52
+
0
-

hAssassin napsal(a):

@midle > proc mas renderTyden() jako static?

poradili mi tu ve vlákně, které jsem uváděl v záhlaví a pomohlo to – začínám s Nette a popravdě řečeno s návodem, kteý je uveden v tomtéž vlákně jsem si nevěděl ady – pro začátek jsem šel cestou nejmenšího odporu – i když to asi nebylo správně

hAssassin napsal(a):

>A mas ID v adrese kdyz tam pristupujes?

Jestli se ptáš na to, jestli když kliknu na link v menu, se objeví id v adrese – odpověď je ano, objeví a právě to id bych potřeboval vypsat do stranky

hAssassin napsal(a):

>Pripadne zkus nastavit parametr u metody jako volitelny – renderTyden($id = NULL) a uvnitr testovat jestli je ID nastaveno a pokud ne tak presmerovat nebo vyhodit flashku (ehm, flashMessage).

popravdě, tak s tím si vůbec nevím rady :-(

parametr jsem si nastavil

Editoval milde (20. 9. 2011 19:14)

hAssassin
Člen | 293
+
0
-

@milde > ok, zkus to nejak takhle (ted sem si vsimnul jeste toho, ze ty mas statickou tu metodu v presenteru ale ta ma byt normalni a naopak volas staticky metodu v modelu, ktera static neni):

presenter:

class TydenPresenter extends BasePresenter
{
	/**
	 * sem zkus pridat nebo odmazat nasledujici radek totohle komentare, treba to taky pomuze
  	 * @persistent
	 */
	protected $tydenId = NULL;

	public function actionTyden($id = NULL)
	{
		// Test, jestli je ID zadano (kdyz ne, presmeruju)
		if($id === NULL) {
			$this->flashMessage('ID neni zadáno!', 'error');
			$this->redirect('Tyden:default');
			die;
		}
		// Jinak si ID ulozim
		$this->tydenId = $id;
	}

        public function renderTyden()
	{
		// ID je nastaveno
                $this->template->tydny = Model\TydenModel::fetchAll($this->tydenId);
        }

        public function renderDefault()
        {
		// Tady neni ID potreba, taham vsechny tydny
		$this->template->tydny = Model\TydenModel::fetchAll();
        }
}

model:

namespace Model;
use ...;

class TydenModel extends BaseModel{
        public static function fetchAll($id = NULL){
		if($id === NULL) {
			return dibi::query('SELECT * FROM [tyden] WHERE [id] = %i', $id);
		}
		else {
	                return dibi::query('SELECT * FROM [tyden]');
	        }
	}
}

sablona:

{foreach $tydny as $tyden}
	<a n:href='tyden, $id => $tyden->id' title="{$tyden->title}">{$tydel->label}</a>
{/foreach}
milde
Člen | 52
+
0
-

hAssassin napsal(a):

@milde > ok, zkus to nejak takhle (ted sem si vsimnul jeste toho, ze ty mas statickou tu metodu v presenteru ale ta ma byt normalni a naopak volas staticky metodu v modelu, ktera static neni):

děkuji za radu – nicméně to hlásí Class ‚Nette\dibi‘ not found a vyhazuje to chybu v modelu u

<?php
else {
   return dibi::query('SELECT * FROM [tyden]');
   }
?>

přiznám se, že už jsem z toho nešťastný :-(

hAssassin
Člen | 293
+
0
-

@milde > ano, neuvedl jsem u modelu namespace, takze tam pridej na zacatek:

use \dibi;

to by melo stacit.

milde
Člen | 52
+
0
-

hAssassin napsal(a):

@milde > ano, neuvedl jsem u modelu namespace, takze tam pridej na zacatek:

use \dibi;

to by melo stacit.

mám na tebe ještě jeden dotaz – hláška Undefined property: DibiRow::$title – co s tím? Jsem upný začátečník s nette – neměl bych tu mít u nicku člen ale lama…

hAssassin
Člen | 293
+
0
-

@milde > to byl jenom priklad co tam vypises. Ja nevim co mas v tabulce a jak ty sloupce mas pojmenovany… Cili to v sablone si udelej uz podle sebe, pokud mas v tabulce tyden sloupecek id, coz mas, tak si tam vypisuj treba jen ID:

{foreach $tydny as $tyden}
        <a n:href='tyden, $id => $tyden->id' title="Týden #{$tyden->id}">Týden #{$tyden->id}</a> <br />
{/foreach}
milde
Člen | 52
+
0
-

hAssassin napsal(a):

@milde > to byl jenom priklad co tam vypises. Ja nevim co mas v tabulce a jak ty sloupce mas pojmenovany… Cili to v sablone si udelej uz podle sebe, pokud mas v tabulce tyden sloupecek id, coz mas, tak si tam vypisuj treba jen ID:

{foreach $tydny as $tyden}
        <a n:href='tyden, $id => $tyden->id' title="Týden #{$tyden->id}">Týden #{$tyden->id}</a> <br />
{/foreach}

Asi jsem uplná lama – v tabulce mám dva sloupce id a test. Zkusil jsem tvuj návod ale hlasí se mi nedefinová poměnna id :-( prosím o poslední pomoc pak už dám pokoj ( doufám :-) )

hAssassin
Člen | 293
+
0
-

jo kua, sorry, ono to je DibiRow a tam se k tomu pristupuje jako k poli. Takze takhle:

{foreach $tydny as $tyden}
        <a n:href="tyden, $id => $tyden['id']" title="Týden #{$tyden['id']}">Týden #{$tyden['id']}</a> <br />
{/foreach}
milde
Člen | 52
+
0
-

hAssassin napsal(a):

jo kua, sorry, ono to je DibiRow a tam se k tomu pristupuje jako k poli. Takze takhle:

{foreach $tydny as $tyden}
        <a n:href="tyden, $id => $tyden['id']" title="Týden #{$tyden['id']}">Týden #{$tyden['id']}</a> <br />
{/foreach}

děkuji za tvou pomoc … hlasí se stále nedefinovaná proměnná id … nicméně si vážím tvých rad a jdu se s tím prát dál. snad to dám alespoň do vánoc :-)

hAssassin
Člen | 293
+
0
-

ok, tak uz snad naposledy, sem to psal nejakej unavenej :-)

{foreach $tydny as $tyden}
        <a n:href="Tyden:, id => $tyden['id']" title="Týden #{$tyden['id']}">Týden #{$tyden['id']}</a> <br />
{/foreach}
MW
Člen | 626
+
0
-

Hod sem cely kod(presenter, model a i sablonu), buh vi, co tam mas.

milde
Člen | 52
+
0
-

MW napsal(a):

Hod sem cely kod(presenter, model a i sablonu), buh vi, co tam mas.

děkuji, koukni na to, prosím.

TydenPresenter:

<?php

class TydenPresenter extends BasePresenter
{
	/** @persistent */

	protected $tydenId = NULL;

        public function actionTyden($id = NULL)
        {
                if($id === NULL) {
                        $this->flashMessage('ID neni zadáno!', 'error');
                        $this->redirect('Tyden:default');
                        die;
                }
                $this->tydenId = $id;
        }

        public function renderTyden()
        {
                $this->template->tydny = Model\TydenModel::fetchAll($this->tydenId);
        }

        public function renderDefault()
        {
                $this->template->tydny = Model\TydenModel::fetchAll();
        }
}
?>

TydenModel:

<?php
namespace Model;
use Nette\Object,
	Nette\Enviroment,
	Nette\Database\Connection;
use \dibi;

class TydenModel extends BaseModel{

	public function __construct($database){
            parent::__construct($database);
        }
	public static function fetchAll($id = NULL){
                if($id === NULL) {
                        return dibi::query('SELECT * FROM [tyden] WHERE [id] = %i', $id);
                }
                else {
                        return dibi::query('SELECT * FROM [tyden]');
                }
     }
}

?>

Menu v @layout.latte:

<?php
{for $id=1;$id<=13;$id++}
	<div id="sub_0_{$id}" class="SubItemRow">
		<a n:href="Tyden:tyden 'id'=>$id">{$id}. tyden</a>
	</div>
{/for}
?>

a vypisování hodnot z tabulky tyden (2 sloupce – id, test ) na základě id v šabloně tyden.latte:

<?php
{foreach $tydny as $tyden}
	<a n:href="tyden, $id => $tyden['id']" title="Týden #{$tyden['id']}">Týden #{$tyden['id']}</a>
{/foreach}
?>
milde
Člen | 52
+
0
-

hAssassin napsal(a):

ok, tak uz snad naposledy, sem to psal nejakej unavenej :-)

{foreach $tydny as $tyden}
        <a n:href="Tyden:, id => $tyden['id']" title="Týden #{$tyden['id']}">Týden #{$tyden['id']}</a> <br />
{/foreach}

děkuji za tvou pomoc – jsi fakt borec, moc mi to mohlo a začínám se v tom trochu orientovat. DĚKUJI