Volání funkce z presenteru
- Zechy
- Člen | 24
Zdravím,
S nette se teprve seznamuji, prohledal jsem fórum, ale s chybou jsem nehnul. Snažím se v šabloně volat funkci z presenteru, ale stále mi to hlásí stejnou chybu.
Děkuji všem za rady :)
Presenter
class TurnajePresenter extends BasePresenter
{
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function team_name($PlayerId)
{
$team_name = $database->
query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);
}
public function renderTurnaj($turnajId)
{
$this->template->turn = $this->database->table('turnaje');
$this->template->hraci_top = $this->database->table('turnaje_players')
->order('goly, asistence');
$turnaj = $this->database->table('turnaje')->get($turnajId);
if (!$turnaj) {
$this->error('Turnaj nebyl nalezen');
}
$this->template->turnaj = $turnaj;
}
}
šablona
{foreach $hraci_top as $hrac}
<tr>
<td>2</td>
<td>{$hrac->name}</td>
<td>{$hrac->goly}</td>
<td>{? $Turnaje->team_name($hrac->id); }</td>
<td>{$hrac->pozice}</td>
</tr>
{/foreach}
Hlásí to stále chybu Undefined variable: Turnaje
- Tomáš Votruba
- Moderator | 1114
Ahoj,
monžná je chyba v názvu proměnné, tj. místo:
$this->template->turn = $this->database->table('turnaje');
zkus
$this->template->Turnaje = $this->database->table('turnaje');
- Etch
- Člen | 403
Zechy napsal(a):
Potřebuji zavolat tu funkci, aby mi vrátila název týmu hráče, dle Id hráče. Tu potřebuji zavolat a s něčím se to kope a nevím s čím přesně.
To nic nemění na tom, že tu že tu proměnou $Turnaje
do té
šablony prostě nepředáváš!
Zechy napsal(a):
To turn tam mám právě schválně, aby se to nepralo se presenterem, který se právě nešťastně jmenuje také Turnaje.
Proč by se měla proměnná $Turnaje prát s názvem presenteru? To tak nějak nechápu co tím myslíš.
- Mysteria
- Člen | 797
Chápu to správně, že chceš pomocí
$Turnaje->team_name($hrac->id);
ze šablony zavolat tuhle metodu presenteru?
public function team_name($PlayerId) {
$team_name = $database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);
}
- Zechy
- Člen | 24
Mysteria napsal(a):
Chápu to správně, že chceš pomocí
$Turnaje->team_name($hrac->id);
ze šablony zavolat tuhle metodu presenteru?
public function team_name($PlayerId) { $team_name = $database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId); }
Ano o to se snažím, předpokládám, že to volám špatně…
Editoval Zechy (22. 2. 2014 18:25)
- Pavel Macháň
- Člen | 282
Zechy napsal(a):
Zdravím,
S nette se teprve seznamuji, prohledal jsem fórum, ale s chybou jsem nehnul. Snažím se v šabloně volat funkci z presenteru, ale stále mi to hlásí stejnou chybu.
Děkuji všem za rady :)
Presenter
class TurnajePresenter extends BasePresenter { private $database; public function __construct(Nette\Database\Context $database) { $this->database = $database; } public function team_name($PlayerId) { $team_name = $database-> query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId); } ..... }
private $database;
public function team_name($PlayerId)
{
$team_name = $database->query('....');
}
Sice pěkný, že si přez konstruktor předáš DB context ale ve funkci team_name voláš nedefinované $database … když už tak zavolat $this->database
Jak uk už tady psali ostatní, nemůžeš v šabloně volat $Turnaje které si do šablony z presenteru nepředáš.
JDC napsal(a):
Zkus $presenter->team_name() nebo $_presenter->team_name() ale nezkoušel jsem. Ale teoreticky by to mělo jít, měla by tím jít zavolat funkce presenteru přímo.
Šablona nemá volat žádné funkce prezenteru. V action(render) metodě si to složíš a předáš šabloně.
Editoval EIFEL (23. 2. 2014 1:14)
- Zechy
- Člen | 24
Předal jsem to celé do renderTurnaj, jestli jsem to tedy dobře pochopil. Mám ale problém s tím, že nevím jak předat té funkci $PlayerId z té šablony.
public function renderTurnaj($turnajId, $PlayerId)
{
$this->template->team_name = $this->database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);
$this->template->turnaje = $this->database->table('turnaje');
$this->template->hraci_top = $this->database->query('SELECT tp.name, tp.cislo, tp.rocnik, tp.goly, tp.asistence, tp.pozice FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id inner join turnaje t on tt.id_turnaj = t.id where t.id =', $turnajId ,'ORDER BY tp.goly');
$turnaj = $this->database->table('turnaje')->get($turnajId);
if (!$turnaj) {
$this->error('Turnaj nebyl nalezen');
}
$this->template->turnaj = $turnaj;
}
Editoval Zechy (23. 2. 2014 16:19)
- Zechy
- Člen | 24
Bump
Mohl by mi někdo poradit?
Potřebuji v šabloně vykreslit jméno týmu, dle id hráče. Napsal jsem si
na to funkci
public function teamName($PlayerId)
{
$row = $this->database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);
return ($row) ? $row : NULL;
}
Jenom nevím jak v šabloně předat té funkci id hráče. Zkoušel jsem něco jako, ale to je určitě špatně.
{foreach $hraci_top as $hrac}
<tr>
<td></td>
<td>{$hrac->name}</td>
<td>{$hrac->rocnik}</td>
<td>{? TurnajePresenter::teamName($hrac->id); }</td>
<td>{$hrac->pozice}</td>
<td>{$hrac->goly}</td>
<td>{$hrac->asistence}</td>
</tr>
{/foreach}
Určitě jdu na to špatně, takže bych byl rád, kdyby mě někdo navedl na správnou cestu. Budu rád za každou radu, děkuji.
Editoval Zechy (20. 3. 2014 22:54)
- Mariocz
- Člen | 52
{$presenter->teamName($hrac->id)->team_name}
ale spíš bys měl použít cizí klíče v db, provázat hráče a team (sloupec team_id v tabulce hráče) a pak v šabloně tahat název týmu takhle
$hrac->team->name
- Zechy
- Člen | 24
Chápu-li to dobře, tak zápis toho by měl být takto
{$hrac->turnaje_teams->name}
Schéma db: http://prntscr.com/32v34z
- David Matějka
- Moderator | 6445
koukni jeste sem, kde se povida jen o activerow. pro „to one“ neni dulezity nazev cilove tabulky, ale nazev spojujiciho sloupecku, takze
{$hrac->turnaj->name}
(jak uz ti Mariocz poradil o nekolik prispevku vyse)
- Zechy
- Člen | 24
Teď mi to zase hlásí „Trying to get property of non-object“.
V presenteru mám zapsáno takto
public function renderTurnaj($turnajId)
{
$this->template->turnaje = $this->database->table('turnaje');
$this->template->hraci_top = $this->database->table('turnaje_players');
$turnaj = $this->database->table('turnaje')->get($turnajId);
if (!$turnaj) {
$this->error('Turnaj nebyl nalezen');
}
$this->template->turnaj = $turnaj;
}
a volám
{foreach $hraci_top as $hrac}
<tr>
<td></td>
<td>{$hrac->name}</td>
<td>{$hrac->rocnik}</td>
<td>{!$hrac->team_id->name}</td>
<td>{$hrac->pozice}</td>
<td>{$hrac->goly}</td>
<td>{$hrac->asistence}</td>
</tr>
{/foreach}
je tom tím, že se to rendruje dříve, než je tam schopen dosadit hodnotu, tudíž tam dosadí null že?
Editoval Zechy (21. 3. 2014 21:25)
- David Matějka
- Moderator | 6445
{$hrac->turnaj->name}
a ne
{$hrac->turnaj_id->name}
to prvni vrati active row na tym, to druhe vrati ID
Editoval matej21 (21. 3. 2014 21:32)
- Zechy
- Člen | 24
matej21 napsal(a):
{$hrac->turnaj->name}
a ne
{$hrac->turnaj_id->name}
to prvni vrati active row na tym, to druhe vrati ID
Díky, jenom ne $hrac->turnaj->name ale $hrac->team->name. Chci vrátit název teamu :) Ale díky moc, už to funguje. Jenom to musím ještě více prostudovat, abych to lépe pochopil.
- Mysteria
- Člen | 797
@Zechy: Na tom není skoro žádná věda, prostě ze základní tabulky A se pomocí $a->b dostaneš k tabulce B úplně stejně, jako kdyby jsi měl rovnou $b a to i vícenásobně.
Například máš tabulku User, Address a Town a provázané cizíma klíčema nebo konvencema a budeš chtět vypsat jméno města uživatele, tak prostě dáš $user->address->town->name. V $user „máš“ tabulku User, pomocí ->address se přesuneš na tabulku Address a z ní pomocí ->town do tabulky Town a ->name je už prostě název nějakýho sloupečku v tabulce Town.
Pro přesun mezi tabulkama se používají samotné názvy tabulek, tys tam místo toho „cpal“ název sloupečku, přes který jsou spojený, což je špatně.
Editoval Mysteria (21. 3. 2014 22:23)
- Zechy
- Člen | 24
Když se ale vrátím k tomu, že to jméno týmu budu volat přes fci, tak v čem je chyba?
public function teamName($PlayerId)
{
$row = $this->database->
query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.team_id = tt.id where tp.id =', $PlayerId);
return ($row) ? $row : NULL;
}
{!$presenter->TeamName($hrac->id)}
- Zechy
- Člen | 24
Mysteria napsal(a):
@Zechy: Na tom není skoro žádná věda, prostě ze základní tabulky A se pomocí $a->b dostaneš k tabulce B úplně stejně, jako kdyby jsi měl rovnou $b a to i vícenásobně.
Například máš tabulku User, Address a Town a provázané cizíma klíčema nebo konvencema a budeš chtět vypsat jméno města uživatele, tak prostě dáš $user->address->town->name. V $user „máš“ tabulku User, pomocí ->address se přesuneš na tabulku Address a z ní pomocí ->town do tabulky Town a ->name je už prostě název nějakýho sloupečku v tabulce Town.
Pro přesun mezi tabulkama se používají samotné názvy tabulek, tys tam místo toho „cpal“ název sloupečku, přes který jsou spojený, což je špatně.
Děkuji za vysvětlení, ale právě když se používají názvy tabulek,
tak proč jsem to volal přes $hrac->team->name a vypsalo to název toho
týmu, když žádnou tabulky team nemám. To mi vrtá hlavou :)
Schéma DB jsem postoval výše.
- David Matějka
- Moderator | 6445
jo tam za to sorry, nevsim jsem si :)
precti si doc, konkretne tuhle
cast
kratka verze:
Nette\Database nenajde zadny sloupecek team
v te tabulce, ale zato
najde sloupecek team_id
, ktery to slovo obsahuje a tento sloupecek
team_id
ma FK na turnaje_teams
- Zechy
- Člen | 24
matej21 napsal(a):
jo tam za to sorry, nevsim jsem si :)
precti si doc, konkretne tuhle cast
kratka verze:
Nette\Database nenajde zadny sloupecekteam
v te tabulce, ale zato najde sloupecekteam_id
, ktery to slovo obsahuje a tento sloupecekteam_id
ma FK na turnaje_teams
Jo jasný, takže on vyhledal sloupec, který tomu byl podobný. Už je mi to jasnější. Teď ale bych potřeboval poradit v tom, že abych nemusel ručně přes SQL joinovat tabulky, tak chci vytáhnout z DB všechny hráče, kteří jsou zapsáni v turnaji, kde se pomocí get předává ID turnaje a vytáhnout vše. Jenom nevím co přesně mám dát do clausule where, aby odkazovala na záznam z té tabulky turnaje_teams.id_turnaj
- Mariocz
- Člen | 52
$database->table('turnaje_players')->where('team.id_turnaj = ?', $turnajId);
a nad tím zase tahat údaje hráče který potřebuješ nebo jestli chceš celej řádek tak za to ještě ->fetchAll().
A doporučil bych ti v DB upravit názvy buďto do češtiny nebo angličtiny, vyhodit slovíčko turnaje kde neni potřeba → tabulky hrac, tym, turnaj a u cizích klíčů používat všude stejný zápis = turnaj_id a ne id_turnaj
už teď při psaní jednoho řádku mi z toho šla hlava kolem :D
Editoval Mariocz (21. 3. 2014 23:05)
- Zechy
- Člen | 24
Mariocz napsal(a):
$database->table('turnaje_players')->where('team.id_turnaj = ?', $turnajId);
a nad tím zase tahat údaje hráče který potřebuješ nebo jestli chceš celej řádek tak za to ještě ->fetchAll().
A doporučil bych ti v DB upravit názvy buďto do češtiny nebo angličtiny, vyhodit slovíčko turnaje kde neni potřeba → tabulky hrac, tym, turnaj a u cizích klíčů používat všude stejný zápis = turnaj_id a ne id_turnaj
už teď při psaní jednoho řádku mi z toho šla hlava kolem :D
Ok díky, zkusím to pak nějak zakomponovat. Teď už mi jde z toho už také slušně hlava kolem. Musím přepsat tu db :D To je tak, když to vzniká z pochodu a pak si vždycky člověk vzpomene, že tam ještě není to či ono. Ten prefix turnaje_ tam musí být, jelikož to je pro turnaje jenom a pak tam bude ještě prefix club_ a vesměs stejné názvy tabulek.
Ale díky moc všem, pomohli jste mi dost! :)